diff --git a/.babelrc b/.babelrc index 4c8702e887..0bddca3824 100644 --- a/.babelrc +++ b/.babelrc @@ -1,6 +1,12 @@ { - "plugins": [ - "transform-es2015-modules-commonjs", - "syntax-object-rest-spread", + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": true + } + } + ] ] -} +} \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index d2db8508cf..2569aef9fe 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,6 +3,8 @@ coverage/ database_reports/ website/build/ website/transpiled-babel/ +# Has its own linter +website/client/ website/common/transpiled-babel/ dist/ dist-client/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 17a4f64b77..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "root": true, - "env": { - "node": true, - }, - "extends": [ - "habitrpg", - "habitrpg/esnext" - ], -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..df826ca6a7 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,6 @@ +module.exports = { + root: true, + extends: [ + 'habitrpg/lib/node' + ], +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..ae984ca4b0 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,198 @@ +name: Test + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run lint-no-fix + apidoc: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run apidoc + sanity: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:sanity + + common: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:common + content: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:content + + api-unit: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: sudo docker run --name mongo -d -p 27017:27017 mongo + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:api:unit + env: + REQUIRES_SERVER=true: true + api-v3-integration: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: sudo docker run --name mongo -d -p 27017:27017 mongo + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:api-v3:integration + env: + REQUIRES_SERVER=true: true + api-v4-integration: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: sudo docker run --name mongo -d -p 27017:27017 mongo + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:api-v4:integration + env: + REQUIRES_SERVER=true: true + + client-unit: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [12.x] + steps: + - uses: actions/checkout@v1 + with: + fetch-depth: 1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: cp config.json.example config.json + - name: npm install + run: | + npm ci + env: + CI: true + - run: npm run test:unit + working-directory: ./website/client \ No newline at end of file diff --git a/.gitignore b/.gitignore index cd995e5489..58fc58e82d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,5 @@ .DS_Store -website/client-old/gen -website/client-old/common -website/client-old/apidoc website/build -website/client-old/js/habitrpg-shared.js* -website/client-old/css/habitrpg-shared.css website/transpiled-babel/ website/common/transpiled-babel/ node_modules @@ -15,8 +10,6 @@ apidoc_build config.json npm-debug.log* lib -website/client-old/bower_components -website/client-old/new-stuff.html newrelic_agent.log .bower-tmp .bower-registry @@ -27,15 +20,13 @@ TODO *.log src/*/*.map src/*/*/*.map -test/*.js -test/*.map -website/client-old/docs *.sublime-workspace coverage coverage.html common/dist/scripts/* dist dist-client +website/client/dist test/client/unit/coverage test/client/e2e/reports test/client-old/spec/mocks/translations.js diff --git a/.nodemonignore b/.nodemonignore index b6719b450e..4275bc9184 100644 --- a/.nodemonignore +++ b/.nodemonignore @@ -1,20 +1,9 @@ node_modules/** -.bower-cache/** -.bower-tmp/** -.bower-registry/** -website/client-old/** website/client/** -website/client/store/** -website/views/** -website/build/** -dist/** test/** .git/** -Gruntfile.js -CHANGELOG.md .idea* *.log -newrelic_agent.log *.swp *.swx website/raw_sprites/** diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a378d70294..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: node_js -node_js: - - '12' -services: - - mongodb -cache: - directories: - - 'node_modules' -addons: - chrome: stable -before_script: - - npm run test:build - - cp config.json.example config.json - - sleep 5 -script: - - npm run $TEST -env: - global: - - DISABLE_REQUEST_LOGGING=true - matrix: - - TEST="lint" - - TEST="test:api:unit" REQUIRES_SERVER=true COVERAGE=true - - TEST="test:api-v3:integration" REQUIRES_SERVER=true COVERAGE=true - - TEST="test:api-v4:integration" REQUIRES_SERVER=true COVERAGE=true - - TEST="test:sanity" - - TEST="test:content" COVERAGE=true - - TEST="test:common" COVERAGE=true - - TEST="client:unit" COVERAGE=true - - TEST="apidoc" diff --git a/Dockerfile b/Dockerfile index 65f734e1a4..fc21e9acb4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,9 +22,6 @@ RUN git clone --branch release --depth 1 https://github.com/HabitRPG/habitica.gi RUN npm install RUN gulp build:prod --force -# Create Build dir -RUN mkdir -p ./website/build - # Start Habitica EXPOSE 3000 CMD ["node", "./website/transpiled-babel/index.js"] diff --git a/README.md b/README.md index 3437bf8a36..d5466acdc1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Habitica [![Build Status](https://travis-ci.org/HabitRPG/habitica.svg?branch=develop)](https://travis-ci.org/HabitRPG/habitica) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.svg)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Open Source Helpers](https://www.codetriage.com/habitrpg/habitica/badges/users.svg)](https://www.codetriage.com/habitrpg/habitica) +Habitica ![Build Status](https://github.com/HabitRPG/habitica/workflows/Test/badge.svg) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.svg)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Open Source Helpers](https://www.codetriage.com/habitrpg/habitica/badges/users.svg)](https://www.codetriage.com/habitrpg/habitica) =============== [![Greenkeeper badge](https://badges.greenkeeper.io/HabitRPG/habitica.svg)](https://greenkeeper.io/) diff --git a/VAGRANT.md b/VAGRANT.md deleted file mode 100644 index e25c738951..0000000000 --- a/VAGRANT.md +++ /dev/null @@ -1,11 +0,0 @@ -# Vagrant # - -Vagrant is a system to create reproducible and portable development -environments. Because of the variety of systems used for Habitica -development and the various issues developers may encounter setting up -Habitica on them, vagrant provides a single development enviroment with -minimal dependencies on the developer's local platform. It can be used -on a variety of systems including Windows, Mac OS X, and Linux. - -Instructions for using the Habitica Vagrant environment are in -[Setting up Habitica Locally](http://habitica.fandom.com/wiki/Setting_up_Habitica_Locally). diff --git a/Vagrantfile.example b/Vagrantfile.example deleted file mode 100644 index 5507219c7f..0000000000 --- a/Vagrantfile.example +++ /dev/null @@ -1,22 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! -VAGRANTFILE_API_VERSION = "2" - -Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - config.vm.provider "virtualbox" do |v| - v.memory = 4096 - v.cpus = 1 - v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/vagrant", "1"] - end - config.vm.box = "thepeopleseason/habitrpg" - config.ssh.forward_agent = true - - config.vm.hostname = "habitrpg" - config.vm.network "forwarded_port", guest: 3000, host: 3000, auto_correct: true - config.vm.usable_port_range = (3000..3050) - config.vm.network "forwarded_port", guest: 8080, host: 8080, auto_correct: true - config.vm.usable_port_range = (8080..8130) - config.vm.provision :shell, :path => "vagrant_scripts/vagrant.sh" -end diff --git a/config.json.example b/config.json.example index ae805b0561..32ba8cf1a1 100644 --- a/config.json.example +++ b/config.json.example @@ -33,6 +33,7 @@ "LOGGLY_TOKEN": "example-token", "MAINTENANCE_MODE": "false", "NODE_DB_URI": "mongodb://localhost/habitrpg", + "MONGODB_POOL_SIZE": "10", "NODE_ENV": "development", "PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin", "PAYPAL_BILLING_PLANS_basic_12mo": "basic_12mo", diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ceacc2c94f..f7d0bd961c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -35,7 +35,7 @@ services: - .:/code - /code/node_modules mongo: - image: mongo:3.4 + image: mongo:3.6 networks: - habitica ports: diff --git a/docker-compose.yml b/docker-compose.yml index fbbd2f0fa8..8ef78d4eea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,7 +25,7 @@ services: - mongo mongo: - image: mongo:3.4 + image: mongo:3.6 ports: - "27017:27017" networks: diff --git a/gulp/gulp-apidoc.js b/gulp/gulp-apidoc.js index 6d34e6f026..55709fbdc2 100644 --- a/gulp/gulp-apidoc.js +++ b/gulp/gulp-apidoc.js @@ -4,12 +4,12 @@ import apidoc from 'apidoc'; const APIDOC_DEST_PATH = './apidoc_build'; const APIDOC_SRC_PATH = './website/server'; -gulp.task('apidoc:clean', (done) => { +gulp.task('apidoc:clean', done => { clean(APIDOC_DEST_PATH, done); }); -gulp.task('apidoc', gulp.series('apidoc:clean', (done) => { - let result = apidoc.createDoc({ +gulp.task('apidoc', gulp.series('apidoc:clean', done => { + const result = apidoc.createDoc({ src: APIDOC_SRC_PATH, dest: APIDOC_DEST_PATH, }); @@ -21,6 +21,4 @@ gulp.task('apidoc', gulp.series('apidoc:clean', (done) => { } })); -gulp.task('apidoc:watch', gulp.series('apidoc', (done) => { - return gulp.watch(`${APIDOC_SRC_PATH}/**/*.js`, gulp.series('apidoc', done)); -})); +gulp.task('apidoc:watch', gulp.series('apidoc', done => gulp.watch(`${APIDOC_SRC_PATH}/**/*.js`, gulp.series('apidoc', done)))); diff --git a/gulp/gulp-build.js b/gulp/gulp-build.js index ae6e2ba419..535b0178b5 100644 --- a/gulp/gulp-build.js +++ b/gulp/gulp-build.js @@ -1,43 +1,28 @@ import gulp from 'gulp'; import babel from 'gulp-babel'; -import webpackProductionBuild from '../webpack/build'; -gulp.task('build:src', () => { - return gulp.src('website/server/**/*.js') - .pipe(babel()) - .pipe(gulp.dest('website/transpiled-babel/')); -}); +gulp.task('build:src', () => gulp.src('website/server/**/*.js') + .pipe(babel()) + .pipe(gulp.dest('website/transpiled-babel/'))); -gulp.task('build:common', () => { - return gulp.src('website/common/script/**/*.js') - .pipe(babel()) - .pipe(gulp.dest('website/common/transpiled-babel/')); -}); +gulp.task('build:common', () => gulp.src('website/common/script/**/*.js') + .pipe(babel()) + .pipe(gulp.dest('website/common/transpiled-babel/'))); gulp.task('build:server', gulp.series('build:src', 'build:common', done => done())); -// Client Production Build -gulp.task('build:client', (done) => { - webpackProductionBuild((err, output) => { - if (err) return done(err); - console.log(output); // eslint-disable-line no-console - done(); - }); -}); - gulp.task('build:prod', gulp.series( 'build:server', - 'build:client', 'apidoc', - done => done() + done => done(), )); -let buildArgs = []; +const buildArgs = []; if (process.env.NODE_ENV === 'production') { // eslint-disable-line no-process-env buildArgs.push('build:prod'); } -gulp.task('build', gulp.series(buildArgs, (done) => { +gulp.task('build', gulp.series(buildArgs, done => { done(); -})); \ No newline at end of file +})); diff --git a/gulp/gulp-console.js b/gulp/gulp-console.js index 3fc83bb793..15038fd6b5 100644 --- a/gulp/gulp-console.js +++ b/gulp/gulp-console.js @@ -1,26 +1,30 @@ import mongoose from 'mongoose'; -import logger from '../website/server/libs/logger'; -import nconf from 'nconf'; -import repl from 'repl'; -import gulp from 'gulp'; +import nconf from 'nconf'; +import repl from 'repl'; +import gulp from 'gulp'; +import logger from '../website/server/libs/logger'; // Add additional properties to the repl's context -let improveRepl = (context) => { +const improveRepl = context => { // Let "exit" and "quit" terminate the console - ['exit', 'quit'].forEach((term) => { - Object.defineProperty(context, term, { get () { - process.exit(); - }}); + ['exit', 'quit'].forEach(term => { + Object.defineProperty(context, term, { + get () { // eslint-disable-line getter-return + process.exit(); + }, + }); }); // "clear" clears the screen - Object.defineProperty(context, 'clear', { get () { - process.stdout.write('\u001B[2J\u001B[0;0f'); - }}); + Object.defineProperty(context, 'clear', { + get () { // eslint-disable-line getter-return + process.stdout.write('\u001B[2J\u001B[0;0f'); + }, + }); context.Challenge = require('../website/server/models/challenge').model; // eslint-disable-line global-require - context.Group = require('../website/server/models/group').model; // eslint-disable-line global-require - context.User = require('../website/server/models/user').model; // eslint-disable-line global-require + context.Group = require('../website/server/models/group').model; // eslint-disable-line global-require + context.User = require('../website/server/models/user').model; // eslint-disable-line global-require const isProd = nconf.get('NODE_ENV') === 'production'; const mongooseOptions = !isProd ? {} : { @@ -30,14 +34,14 @@ let improveRepl = (context) => { mongoose.connect( nconf.get('NODE_DB_URI'), mongooseOptions, - (err) => { + err => { if (err) throw err; logger.info('Connected with Mongoose'); - } + }, ); }; -gulp.task('console', (done) => { +gulp.task('console', done => { improveRepl(repl.start({ prompt: 'Habitica > ', }).context); diff --git a/gulp/gulp-sprites.js b/gulp/gulp-sprites.js index c232fb475a..fce0bae980 100644 --- a/gulp/gulp-sprites.js +++ b/gulp/gulp-sprites.js @@ -4,29 +4,29 @@ import spritesmith from 'gulp.spritesmith'; import clean from 'rimraf'; import sizeOf from 'image-size'; import mergeStream from 'merge-stream'; -import {basename} from 'path'; -import {sync} from 'glob'; -import {each} from 'lodash'; +import { basename } from 'path'; +import { sync } from 'glob'; +import { each } from 'lodash'; import vinylBuffer from 'vinyl-buffer'; // https://github.com/Ensighten/grunt-spritesmith/issues/67#issuecomment-34786248 const MAX_SPRITESHEET_SIZE = 1024 * 1024 * 3; -const IMG_DIST_PATH = 'website/client/assets/images/sprites/'; -const CSS_DIST_PATH = 'website/client/assets/css/sprites/'; +const IMG_DIST_PATH = 'website/client/src/assets/images/sprites/'; +const CSS_DIST_PATH = 'website/client/src/assets/css/sprites/'; function checkForSpecialTreatment (name) { - let regex = /^hair|skin|beard|mustach|shirt|flower|^headAccessory_special_\w+Ears|^eyewear_special_\w+TopFrame|^eyewear_special_\w+HalfMoon/; + const regex = /^hair|skin|beard|mustach|shirt|flower|^headAccessory_special_\w+Ears|^eyewear_special_\w+TopFrame|^eyewear_special_\w+HalfMoon/; return name.match(regex) || name === 'head_0'; } function calculateImgDimensions (img, addPadding) { let dims = sizeOf(img); - let requiresSpecialTreatment = checkForSpecialTreatment(img); + const requiresSpecialTreatment = checkForSpecialTreatment(img); if (requiresSpecialTreatment) { - let newWidth = dims.width < 90 ? 90 : dims.width; - let newHeight = dims.height < 90 ? 90 : dims.height; + const newWidth = dims.width < 90 ? 90 : dims.width; + const newHeight = dims.height < 90 ? 90 : dims.height; dims = { width: newWidth, height: newHeight, @@ -41,17 +41,17 @@ function calculateImgDimensions (img, addPadding) { if (!dims.width || !dims.height) console.error('MISSING DIMENSIONS:', dims); // eslint-disable-line no-console - let totalPixelSize = dims.width * dims.height + padding; + const totalPixelSize = dims.width * dims.height + padding; return totalPixelSize; } function calculateSpritesheetsSrcIndicies (src) { let totalPixels = 0; - let slices = [0]; + const slices = [0]; each(src, (img, index) => { - let imageSize = calculateImgDimensions(img, true); + const imageSize = calculateImgDimensions(img, true); totalPixels += imageSize; if (totalPixels > MAX_SPRITESHEET_SIZE) { @@ -64,37 +64,35 @@ function calculateSpritesheetsSrcIndicies (src) { } function cssVarMap (sprite) { - // For hair, skins, beards, etc. we want to output a '.customize-options.WHATEVER' class, which works as a - // 60x60 image pointing at the proper part of the 90x90 sprite. + // For hair, skins, beards, etc. we want to output a '.customize-options.WHATEVER' class, + // which works as a 60x60 image pointing at the proper part of the 90x90 sprite. // We set up the custom info here, and the template makes use of it. - let requiresSpecialTreatment = checkForSpecialTreatment(sprite.name); + const requiresSpecialTreatment = checkForSpecialTreatment(sprite.name); if (requiresSpecialTreatment) { sprite.custom = { px: { - offsetX: `-${ sprite.x + 25 }px`, - offsetY: `-${ sprite.y + 15 }px`, + offsetX: `-${sprite.x + 25}px`, + offsetY: `-${sprite.y + 15}px`, width: '60px', height: '60px', }, }; } - if (sprite.name.indexOf('shirt') !== -1) - sprite.custom.px.offsetY = `-${ sprite.y + 35 }px`; // even more for shirts + if (sprite.name.indexOf('shirt') !== -1) sprite.custom.px.offsetY = `-${sprite.y + 35}px`; // even more for shirts if (sprite.name.indexOf('hair_base') !== -1) { - let styleArray = sprite.name.split('_').slice(2, 3); - if (Number(styleArray[0]) > 14) - sprite.custom.px.offsetY = `-${ sprite.y }px`; // don't crop updos + const styleArray = sprite.name.split('_').slice(2, 3); + if (Number(styleArray[0]) > 14) sprite.custom.px.offsetY = `-${sprite.y}px`; // don't crop updos } } function createSpritesStream (name, src) { - let spritesheetSliceIndicies = calculateSpritesheetsSrcIndicies(src); - let stream = mergeStream(); + const spritesheetSliceIndicies = calculateSpritesheetsSrcIndicies(src); + const stream = mergeStream(); each(spritesheetSliceIndicies, (start, index) => { - let slicedSrc = src.slice(start, spritesheetSliceIndicies[index + 1]); + const slicedSrc = src.slice(start, spritesheetSliceIndicies[index + 1]); - let spriteData = gulp.src(slicedSrc) + const spriteData = gulp.src(slicedSrc) .pipe(spritesmith({ imgName: `spritesmith-${name}-${index}.png`, cssName: `spritesmith-${name}-${index}.css`, @@ -104,12 +102,12 @@ function createSpritesStream (name, src) { cssVarMap, })); - let imgStream = spriteData.img + const imgStream = spriteData.img .pipe(vinylBuffer()) .pipe(imagemin()) .pipe(gulp.dest(IMG_DIST_PATH)); - let cssStream = spriteData.css + const cssStream = spriteData.css .pipe(gulp.dest(CSS_DIST_PATH)); stream.add(imgStream); @@ -120,32 +118,32 @@ function createSpritesStream (name, src) { } gulp.task('sprites:main', () => { - let mainSrc = sync('website/raw_sprites/spritesmith/**/*.png'); + const mainSrc = sync('website/raw_sprites/spritesmith/**/*.png'); return createSpritesStream('main', mainSrc); }); gulp.task('sprites:largeSprites', () => { - let largeSrc = sync('website/raw_sprites/spritesmith_large/**/*.png'); + const largeSrc = sync('website/raw_sprites/spritesmith_large/**/*.png'); return createSpritesStream('largeSprites', largeSrc); }); -gulp.task('sprites:clean', (done) => { +gulp.task('sprites:clean', done => { clean(`${IMG_DIST_PATH}spritesmith*,${CSS_DIST_PATH}spritesmith*}`, done); }); -gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprites:largeSprites', (done) => { +gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprites:largeSprites', done => { console.log('Verifiying that images do not exceed max dimensions'); // eslint-disable-line no-console let numberOfSheetsThatAreTooBig = 0; - let distSpritesheets = sync(`${IMG_DIST_PATH}*.png`); + const distSpritesheets = sync(`${IMG_DIST_PATH}*.png`); - each(distSpritesheets, (img) => { - let spriteSize = calculateImgDimensions(img); + each(distSpritesheets, img => { + const spriteSize = calculateImgDimensions(img); if (spriteSize > MAX_SPRITESHEET_SIZE) { - numberOfSheetsThatAreTooBig++; - let name = basename(img, '.png'); + numberOfSheetsThatAreTooBig += 1; + const name = basename(img, '.png'); console.error(`WARNING: ${name} might be too big - ${spriteSize} > ${MAX_SPRITESHEET_SIZE}`); // eslint-disable-line no-console } }); @@ -155,7 +153,8 @@ gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprite console.error( // eslint-disable-line no-console `${numberOfSheetsThatAreTooBig} sheets might too big for mobile Safari to be able to handle them, but there is a margin of error in these calculations so it is probably okay. Mention - this to an admin so they can test a staging site on mobile Safari after your PR is merged.`); + this to an admin so they can test a staging site on mobile Safari after your PR is merged.`, + ); } else { console.log('All images are within the correct dimensions'); // eslint-disable-line no-console } diff --git a/gulp/gulp-start.js b/gulp/gulp-start.js index cca07d433d..736f5cb325 100644 --- a/gulp/gulp-start.js +++ b/gulp/gulp-start.js @@ -1,16 +1,11 @@ import gulp from 'gulp'; import nodemon from 'gulp-nodemon'; -let pkg = require('../package.json'); +import pkg from '../package.json'; -gulp.task('nodemon', (done) => { +gulp.task('nodemon', done => { nodemon({ script: pkg.main, - ignore: [ - 'website/client-old/*', - 'website/views/*', - 'common/dist/script/content/*', - ], }); done(); }); diff --git a/gulp/gulp-tests.js b/gulp/gulp-tests.js index 7294a90574..47eec297ec 100644 --- a/gulp/gulp-tests.js +++ b/gulp/gulp-tests.js @@ -1,60 +1,59 @@ +import mongoose from 'mongoose'; +import { exec } from 'child_process'; +import gulp from 'gulp'; +import os from 'os'; +import nconf from 'nconf'; import { pipe, -} from './taskHelper'; -import mongoose from 'mongoose'; -import { exec } from 'child_process'; -import gulp from 'gulp'; -import os from 'os'; -import nconf from 'nconf'; +} from './taskHelper'; // TODO rewrite -const TEST_SERVER_PORT = 3003; +const TEST_SERVER_PORT = 3003; let server; -const TEST_DB_URI = nconf.get('TEST_DB_URI'); +const TEST_DB_URI = nconf.get('TEST_DB_URI'); const SANITY_TEST_COMMAND = 'npm run test:sanity'; const COMMON_TEST_COMMAND = 'npm run test:common'; const CONTENT_TEST_COMMAND = 'npm run test:content'; -const CONTENT_OPTIONS = {maxBuffer: 1024 * 500}; +const CONTENT_OPTIONS = { maxBuffer: 1024 * 500 }; /* Helper methods for reporting test summary */ -let testResults = []; -let testCount = (stdout, regexp) => { - let match = stdout.match(regexp); - return parseInt(match && match[1] || 0, 10); +const testResults = []; +const testCount = (stdout, regexp) => { + const match = stdout.match(regexp); + return parseInt(match && (match[1] || 0), 10); }; -let testBin = (string, additionalEnvVariables = '') => { +const testBin = (string, additionalEnvVariables = '') => { if (os.platform() === 'win32') { if (additionalEnvVariables !== '') { - additionalEnvVariables = additionalEnvVariables.split(' ').join('&&set '); - additionalEnvVariables = `set ${additionalEnvVariables}&&`; + additionalEnvVariables = additionalEnvVariables.split(' ').join('&&set '); // eslint-disable-line no-param-reassign + additionalEnvVariables = `set ${additionalEnvVariables}&&`; // eslint-disable-line no-param-reassign } return `set NODE_ENV=test&&${additionalEnvVariables}${string}`; - } else { - return `NODE_ENV=test ${additionalEnvVariables} ${string}`; } + return `NODE_ENV=test ${additionalEnvVariables} ${string}`; }; -gulp.task('test:nodemon', gulp.series(function setupNodemon (done) { +gulp.task('test:nodemon', gulp.series(done => { process.env.PORT = TEST_SERVER_PORT; // eslint-disable-line no-process-env process.env.NODE_DB_URI = TEST_DB_URI; // eslint-disable-line no-process-env done(); }, 'nodemon')); -gulp.task('test:prepare:mongo', (cb) => { - mongoose.connect(TEST_DB_URI, (err) => { +gulp.task('test:prepare:mongo', cb => { + mongoose.connect(TEST_DB_URI, err => { if (err) return cb(`Unable to connect to mongo database. Are you sure it's running? \n\n${err}`); - mongoose.connection.dropDatabase((err2) => { + return mongoose.connection.dropDatabase(err2 => { if (err2) return cb(err2); - mongoose.connection.close(cb); + return mongoose.connection.close(cb); }); }); }); -gulp.task('test:prepare:server', gulp.series('test:prepare:mongo', (done) => { +gulp.task('test:prepare:server', gulp.series('test:prepare:mongo', done => { if (!server) { server = exec(testBin('node ./website/server/index.js', `NODE_DB_URI=${TEST_DB_URI} PORT=${TEST_SERVER_PORT}`), (error, stdout, stderr) => { if (error) { @@ -73,45 +72,43 @@ gulp.task('test:prepare:build', gulp.series('build', done => done())); gulp.task('test:prepare', gulp.series( 'test:prepare:build', 'test:prepare:mongo', - done => done() + done => done(), )); -gulp.task('test:sanity', (cb) => { - let runner = exec( +gulp.task('test:sanity', cb => { + const runner = exec( testBin(SANITY_TEST_COMMAND), - (err) => { + err => { if (err) { process.exit(1); } cb(); - } + }, ); pipe(runner); }); -gulp.task('test:common', gulp.series('test:prepare:build', (cb) => { - let runner = exec( +gulp.task('test:common', gulp.series('test:prepare:build', cb => { + const runner = exec( testBin(COMMON_TEST_COMMAND), - (err) => { + err => { if (err) { process.exit(1); } cb(); - } + }, ); pipe(runner); })); -gulp.task('test:common:clean', (cb) => { +gulp.task('test:common:clean', cb => { pipe(exec(testBin(COMMON_TEST_COMMAND), () => cb())); }); -gulp.task('test:common:watch', gulp.series('test:common:clean', () => { - return gulp.watch(['common/script/**/*', 'test/common/**/*'], gulp.series('test:common:clean', done => done())); -})); +gulp.task('test:common:watch', gulp.series('test:common:clean', () => gulp.watch(['common/script/**/*', 'test/common/**/*'], gulp.series('test:common:clean', done => done())))); -gulp.task('test:common:safe', gulp.series('test:prepare:build', (cb) => { - let runner = exec( +gulp.task('test:common:safe', gulp.series('test:prepare:build', cb => { + const runner = exec( testBin(COMMON_TEST_COMMAND), (err, stdout) => { // eslint-disable-line handle-callback-err testResults.push({ @@ -121,38 +118,36 @@ gulp.task('test:common:safe', gulp.series('test:prepare:build', (cb) => { pend: testCount(stdout, /(\d+) pending/), }); cb(); - } + }, ); pipe(runner); })); -gulp.task('test:content', gulp.series('test:prepare:build', (cb) => { - let runner = exec( +gulp.task('test:content', gulp.series('test:prepare:build', cb => { + const runner = exec( testBin(CONTENT_TEST_COMMAND), CONTENT_OPTIONS, - (err) => { + err => { if (err) { process.exit(1); } cb(); - } + }, ); pipe(runner); })); -gulp.task('test:content:clean', (cb) => { +gulp.task('test:content:clean', cb => { pipe(exec(testBin(CONTENT_TEST_COMMAND), CONTENT_OPTIONS, () => cb())); }); -gulp.task('test:content:watch', gulp.series('test:content:clean', () => { - return gulp.watch(['common/script/content/**', 'test/**'], gulp.series('test:content:clean', done => done())); -})); +gulp.task('test:content:watch', gulp.series('test:content:clean', () => gulp.watch(['common/script/content/**', 'test/**'], gulp.series('test:content:clean', done => done())))); -gulp.task('test:content:safe', gulp.series('test:prepare:build', (cb) => { - let runner = exec( +gulp.task('test:content:safe', gulp.series('test:prepare:build', cb => { + const runner = exec( testBin(CONTENT_TEST_COMMAND), CONTENT_OPTIONS, - (err, stdout) => { // eslint-disable-line handle-callback-err + (err, stdout) => { // eslint-disable-line handle-callback-err testResults.push({ suite: 'Content Specs\t', pass: testCount(stdout, /(\d+) passing/), @@ -160,81 +155,77 @@ gulp.task('test:content:safe', gulp.series('test:prepare:build', (cb) => { pend: testCount(stdout, /(\d+) pending/), }); cb(); - } + }, ); pipe(runner); })); -gulp.task('test:api:unit', (done) => { - let runner = exec( +gulp.task('test:api:unit', done => { + const runner = exec( testBin('istanbul cover --dir coverage/api-unit node_modules/mocha/bin/_mocha -- test/api/unit --recursive --require ./test/helpers/start-server'), - (err) => { + err => { if (err) { process.exit(1); } done(); - } + }, ); pipe(runner); }); -gulp.task('test:api:unit:watch', () => { - return gulp.watch(['website/server/libs/*', 'test/api/unit/**/*', 'website/server/controllers/**/*'], gulp.series('test:api:unit', done => done())); -}); +gulp.task('test:api:unit:watch', () => gulp.watch(['website/server/libs/*', 'test/api/unit/**/*', 'website/server/controllers/**/*'], gulp.series('test:api:unit', done => done()))); -gulp.task('test:api-v3:integration', (done) => { - let runner = exec( +gulp.task('test:api-v3:integration', done => { + const runner = exec( testBin('istanbul cover --dir coverage/api-v3-integration --report lcovonly node_modules/mocha/bin/_mocha -- test/api/v3/integration --recursive --require ./test/helpers/start-server'), - {maxBuffer: 500 * 1024}, - (err) => { + { maxBuffer: 500 * 1024 }, + err => { if (err) { process.exit(1); } done(); - } + }, ); pipe(runner); }); -gulp.task('test:api-v3:integration:watch', () => { - return gulp.watch([ - 'website/server/controllers/api-v3/**/*', 'common/script/ops/*', 'website/server/libs/*.js', - 'test/api/v3/integration/**/*', - ], gulp.series('test:api-v3:integration', done => done())); -}); +gulp.task('test:api-v3:integration:watch', () => gulp.watch([ + 'website/server/controllers/api-v3/**/*', 'common/script/ops/*', 'website/server/libs/*.js', + 'test/api/v3/integration/**/*', +], gulp.series('test:api-v3:integration', done => done()))); -gulp.task('test:api-v3:integration:separate-server', (done) => { - let runner = exec( +gulp.task('test:api-v3:integration:separate-server', done => { + const runner = exec( testBin('mocha test/api/v3/integration --recursive --require ./test/helpers/start-server', 'LOAD_SERVER=0'), - {maxBuffer: 500 * 1024}, - (err) => done(err) + { maxBuffer: 500 * 1024 }, + err => done(err), ); pipe(runner); }); -gulp.task('test:api-v4:integration', (done) => { - let runner = exec( +gulp.task('test:api-v4:integration', done => { + const runner = exec( testBin('istanbul cover --dir coverage/api-v4-integration --report lcovonly node_modules/mocha/bin/_mocha -- test/api/v4 --recursive --require ./test/helpers/start-server'), - {maxBuffer: 500 * 1024}, - (err) => { + { maxBuffer: 500 * 1024 }, + err => { if (err) { process.exit(1); } done(); - } + }, ); pipe(runner); }); -gulp.task('test:api-v4:integration:separate-server', (done) => { - let runner = exec( +gulp.task('test:api-v4:integration:separate-server', done => { + const runner = exec( testBin('mocha test/api/v4 --recursive --require ./test/helpers/start-server', 'LOAD_SERVER=0'), - {maxBuffer: 500 * 1024}, - (err) => done(err) + { maxBuffer: 500 * 1024 }, + err => done(err), ); pipe(runner); @@ -247,11 +238,11 @@ gulp.task('test', gulp.series( 'test:api:unit', 'test:api-v3:integration', 'test:api-v4:integration', - done => done() + done => done(), )); gulp.task('test:api-v3', gulp.series( 'test:api:unit', 'test:api-v3:integration', - done => done() + done => done(), )); diff --git a/gulp/gulp-transifex-test.js b/gulp/gulp-transifex-test.js index 2403707ecf..5ecb013e2d 100644 --- a/gulp/gulp-transifex-test.js +++ b/gulp/gulp-transifex-test.js @@ -1,6 +1,6 @@ -import fs from 'fs'; -import _ from 'lodash'; -import gulp from 'gulp'; +import fs from 'fs'; +import _ from 'lodash'; +import gulp from 'gulp'; import { postToSlack, conf } from './taskHelper'; const SLACK_CONFIG = { @@ -14,7 +14,7 @@ const ENGLISH_LOCALE = `${LOCALES}en/`; function getArrayOfLanguages () { - let languages = fs.readdirSync(LOCALES); + const languages = fs.readdirSync(LOCALES); languages.shift(); // Remove README.md from array of languages return languages; @@ -23,18 +23,16 @@ function getArrayOfLanguages () { const ALL_LANGUAGES = getArrayOfLanguages(); function stripOutNonJsonFiles (collection) { - let onlyJson = _.filter(collection, (file) => { - return file.match(/[a-zA-Z]*\.json/); - }); + const onlyJson = _.filter(collection, file => file.match(/[a-zA-Z]*\.json/)); return onlyJson; } function eachTranslationFile (languages, cb) { - let jsonFiles = stripOutNonJsonFiles(fs.readdirSync(ENGLISH_LOCALE)); + const jsonFiles = stripOutNonJsonFiles(fs.readdirSync(ENGLISH_LOCALE)); - _.each(languages, (lang) => { - _.each(jsonFiles, (filename) => { + _.each(languages, lang => { + _.each(jsonFiles, filename => { let parsedTranslationFile; try { const translationFile = fs.readFileSync(`${LOCALES}${lang}/${filename}`); @@ -43,10 +41,10 @@ function eachTranslationFile (languages, cb) { return cb(err); } - let englishFile = fs.readFileSync(ENGLISH_LOCALE + filename); - let parsedEnglishFile = JSON.parse(englishFile); + const englishFile = fs.readFileSync(ENGLISH_LOCALE + filename); + const parsedEnglishFile = JSON.parse(englishFile); - cb(null, lang, filename, parsedEnglishFile, parsedTranslationFile); + return cb(null, lang, filename, parsedEnglishFile, parsedTranslationFile); }); }); } @@ -71,9 +69,9 @@ function formatMessageForPosting (msg, items) { } function getStringsWith (json, interpolationRegex) { - let strings = {}; + const strings = {}; - _.each(json, (fileName) => { + _.each(json, fileName => { const rawFile = fs.readFileSync(ENGLISH_LOCALE + fileName); const parsedJson = JSON.parse(rawFile); @@ -93,66 +91,69 @@ const malformedStringExceptions = { feedPet: true, }; -gulp.task('transifex:missingFiles', (done) => { - let missingStrings = []; +gulp.task('transifex:missingFiles', done => { + const missingStrings = []; - eachTranslationFile(ALL_LANGUAGES, (error) => { + eachTranslationFile(ALL_LANGUAGES, error => { if (error) { missingStrings.push(error.path); } }); if (!_.isEmpty(missingStrings)) { - let message = 'the following files were missing from the translations folder'; - let formattedMessage = formatMessageForPosting(message, missingStrings); + const message = 'the following files were missing from the translations folder'; + const formattedMessage = formatMessageForPosting(message, missingStrings); postToSlack(formattedMessage, SLACK_CONFIG); } done(); }); -gulp.task('transifex:missingStrings', (done) => { - let missingStrings = []; +gulp.task('transifex:missingStrings', done => { + const missingStrings = []; - eachTranslationString(ALL_LANGUAGES, (language, filename, key, englishString, translationString) => { + eachTranslationString(ALL_LANGUAGES, (lang, filename, key, englishString, translationString) => { if (!translationString) { - let errorString = `${language} - ${filename} - ${key} - ${englishString}`; + const errorString = `${lang} - ${filename} - ${key} - ${englishString}`; missingStrings.push(errorString); } }); if (!_.isEmpty(missingStrings)) { - let message = 'The following strings are not translated'; - let formattedMessage = formatMessageForPosting(message, missingStrings); + const message = 'The following strings are not translated'; + const formattedMessage = formatMessageForPosting(message, missingStrings); postToSlack(formattedMessage, SLACK_CONFIG); } done(); }); -gulp.task('transifex:malformedStrings', (done) => { - let jsonFiles = stripOutNonJsonFiles(fs.readdirSync(ENGLISH_LOCALE)); - let interpolationRegex = /<%= [a-zA-Z]* %>/g; - let stringsToLookFor = getStringsWith(jsonFiles, interpolationRegex); +gulp.task('transifex:malformedStrings', done => { + const jsonFiles = stripOutNonJsonFiles(fs.readdirSync(ENGLISH_LOCALE)); + const interpolationRegex = /<%= [a-zA-Z]* %>/g; + const stringsToLookFor = getStringsWith(jsonFiles, interpolationRegex); - let stringsWithMalformedInterpolations = []; - let stringsWithIncorrectNumberOfInterpolations = []; + const stringsWithMalformedInterpolations = []; + const stringsWithIncorrectNumberOfInterpolations = []; - _.each(ALL_LANGUAGES, (lang) => { + _.each(ALL_LANGUAGES, lang => { _.each(stringsToLookFor, (strings, filename) => { - let translationFile = fs.readFileSync(`${LOCALES}${lang}/${filename}`); - let parsedTranslationFile = JSON.parse(translationFile); + const translationFile = fs.readFileSync(`${LOCALES}${lang}/${filename}`); + const parsedTranslationFile = JSON.parse(translationFile); _.each(strings, (value, key) => { // eslint-disable-line max-nested-callbacks - let translationString = parsedTranslationFile[key]; + const translationString = parsedTranslationFile[key]; if (!translationString) return; - let englishOccurences = stringsToLookFor[filename][key]; - let translationOccurences = translationString.match(interpolationRegex); + const englishOccurences = stringsToLookFor[filename][key]; + const translationOccurences = translationString.match(interpolationRegex); if (!translationOccurences) { - let malformedString = `${lang} - ${filename} - ${key} - ${translationString}`; + const malformedString = `${lang} - ${filename} - ${key} - ${translationString}`; stringsWithMalformedInterpolations.push(malformedString); - } else if (englishOccurences.length !== translationOccurences.length && !malformedStringExceptions[key]) { - let missingInterpolationString = `${lang} - ${filename} - ${key} - ${translationString}`; + } else if ( + englishOccurences.length !== translationOccurences.length + && !malformedStringExceptions[key] + ) { + const missingInterpolationString = `${lang} - ${filename} - ${key} - ${translationString}`; stringsWithIncorrectNumberOfInterpolations.push(missingInterpolationString); } }); @@ -160,14 +161,17 @@ gulp.task('transifex:malformedStrings', (done) => { }); if (!_.isEmpty(stringsWithMalformedInterpolations)) { - let message = 'The following strings have malformed or missing interpolations'; - let formattedMessage = formatMessageForPosting(message, stringsWithMalformedInterpolations); + const message = 'The following strings have malformed or missing interpolations'; + const formattedMessage = formatMessageForPosting(message, stringsWithMalformedInterpolations); postToSlack(formattedMessage, SLACK_CONFIG); } if (!_.isEmpty(stringsWithIncorrectNumberOfInterpolations)) { - let message = 'The following strings have a different number of string interpolations'; - let formattedMessage = formatMessageForPosting(message, stringsWithIncorrectNumberOfInterpolations); + const message = 'The following strings have a different number of string interpolations'; + const formattedMessage = formatMessageForPosting( + message, + stringsWithIncorrectNumberOfInterpolations, + ); postToSlack(formattedMessage, SLACK_CONFIG); } done(); @@ -176,5 +180,5 @@ gulp.task('transifex:malformedStrings', (done) => { gulp.task( 'transifex', gulp.series('transifex:missingFiles', 'transifex:missingStrings', 'transifex:malformedStrings'), - (done) => done() -); \ No newline at end of file + done => done(), +); diff --git a/gulp/taskHelper.js b/gulp/taskHelper.js index 270573ba70..b22897747e 100644 --- a/gulp/taskHelper.js +++ b/gulp/taskHelper.js @@ -1,11 +1,11 @@ -import { exec } from 'child_process'; -import psTree from 'ps-tree'; -import nconf from 'nconf'; -import net from 'net'; -import { post } from 'superagent'; -import { sync as glob } from 'glob'; -import Mocha from 'mocha'; -import { resolve } from 'path'; +import { exec } from 'child_process'; +import psTree from 'ps-tree'; +import nconf from 'nconf'; +import net from 'net'; +import { post } from 'superagent'; +import { sync as glob } from 'glob'; +import Mocha from 'mocha'; // eslint-disable-line import/no-extraneous-dependencies +import { resolve } from 'path'; /* * Get access to configruable values @@ -19,15 +19,15 @@ export const conf = nconf; * its tasks. */ export function kill (proc) { - let killProcess = (pid) => { + const killProcess = pid => { psTree(pid, (_, pids) => { if (pids.length) { pids.forEach(kill); return; } try { - exec(/^win/.test(process.platform) ? - `taskkill /PID ${pid} /T /F` : - `kill -9 ${pid}`); + exec(/^win/.test(process.platform) + ? `taskkill /PID ${pid} /T /F` + : `kill -9 ${pid}`); } catch (e) { console.log(e); // eslint-disable-line no-console } @@ -46,16 +46,15 @@ export function kill (proc) { export function awaitPort (port, max = 60) { return new Promise((rej, res) => { let socket; - let timeout; let interval; - timeout = setTimeout(() => { + const timeout = setTimeout(() => { clearInterval(interval); rej(`Timed out after ${max} seconds`); }, max * 1000); interval = setInterval(() => { - socket = net.connect({port}, () => { + socket = net.connect({ port }, () => { clearInterval(interval); clearTimeout(timeout); socket.destroy(); @@ -71,10 +70,10 @@ export function awaitPort (port, max = 60) { * Pipe the child's stdin and stderr to the parent process. */ export function pipe (child) { - child.stdout.on('data', (data) => { + child.stdout.on('data', data => { process.stdout.write(data); }); - child.stderr.on('data', (data) => { + child.stderr.on('data', data => { process.stderr.write(data); }); } @@ -83,7 +82,7 @@ export function pipe (child) { * Post request to notify configured slack channel */ export function postToSlack (msg, config = {}) { - let slackUrl = nconf.get('SLACK_URL'); + const slackUrl = nconf.get('SLACK_URL'); if (!slackUrl) { console.error('No slack post url specified. Your message was:'); // eslint-disable-line no-console @@ -99,7 +98,7 @@ export function postToSlack (msg, config = {}) { text: msg, icon_emoji: `:${config.emoji || 'gulp'}:`, // eslint-disable-line camelcase }) - .end((err) => { + .end(err => { if (err) console.error('Unable to post to slack', err); // eslint-disable-line no-console }); } @@ -107,15 +106,15 @@ export function postToSlack (msg, config = {}) { export function runMochaTests (files, server, cb) { require('../test/helpers/globals.helper'); // eslint-disable-line global-require - let mocha = new Mocha({reporter: 'spec'}); - let tests = glob(files); + const mocha = new Mocha({ reporter: 'spec' }); + const tests = glob(files); - tests.forEach((test) => { + tests.forEach(test => { delete require.cache[resolve(test)]; mocha.addFile(test); }); - mocha.run((numberOfFailures) => { + mocha.run(numberOfFailures => { if (!process.env.RUN_INTEGRATION_TEST_FOREVER) { // eslint-disable-line no-process-env if (server) kill(server); process.exit(numberOfFailures); diff --git a/gulpfile.js b/gulpfile.js index f28f6b975f..9283119db9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -6,7 +6,8 @@ * directory, and it will automatically be included. */ -require('babel-register'); +/* eslint-disable import/no-commonjs */ +require('@babel/register'); const gulp = require('gulp'); diff --git a/migrations/.eslintrc b/migrations/.eslintrc deleted file mode 100644 index 6509e9ee6b..0000000000 --- a/migrations/.eslintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": false, - "rules": { - "no-console": 0, - "no-use-before-define": ["error", { "functions": false }] - } -} diff --git a/migrations/.eslintrc.js b/migrations/.eslintrc.js new file mode 100644 index 0000000000..d8d1723174 --- /dev/null +++ b/migrations/.eslintrc.js @@ -0,0 +1,8 @@ +/* eslint-disable import/no-commonjs */ +module.exports = { + root: false, + rules: { + 'no-console': 0, + 'no-use-before-define': ['error', { functions: false }] + } +} diff --git a/migrations/archive/2019/20191022_pet_color_achievements.js b/migrations/archive/2019/20191022_pet_color_achievements.js new file mode 100644 index 0000000000..493d25412b --- /dev/null +++ b/migrations/archive/2019/20191022_pet_color_achievements.js @@ -0,0 +1,82 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20191022_pet_color_achievements'; +import { model as User } from '../../../website/server/models/user'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + let set = { + migration: MIGRATION_NAME, + }; + + if (user && user.items && user.items.pets) { + const pets = user.items.pets; + if (pets['Wolf-Zombie'] > 0 + && pets['TigerCub-Zombie'] > 0 + && pets['PandaCub-Zombie'] > 0 + && pets['LionCub-Zombie'] > 0 + && pets['Fox-Zombie'] > 0 + && pets['FlyingPig-Zombie'] > 0 + && pets['Dragon-Zombie'] > 0 + && pets['Cactus-Zombie'] > 0 + && pets['BearCub-Zombie'] > 0) { + set['achievements.monsterMagus'] = true; + } + } + + if (user && user.items && user.items.mounts) { + const mounts = user.items.mounts; + if (mounts['Wolf-Zombie'] + && mounts['TigerCub-Zombie'] + && mounts['PandaCub-Zombie'] + && mounts['LionCub-Zombie'] + && mounts['Fox-Zombie'] + && mounts['FlyingPig-Zombie'] + && mounts['Dragon-Zombie'] + && mounts['Cactus-Zombie'] + && mounts['BearCub-Zombie'] ) { + set['achievements.undeadUndertaker'] = true; + } + } + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + return await User.update({ _id: user._id }, { $set: set }).exec(); +} + +module.exports = async function processUsers () { + let query = { + migration: { $ne: MIGRATION_NAME }, + 'auth.timestamps.loggedin': { $gt: new Date('2019-10-01') }, + }; + + const fields = { + _id: 1, + items: 1, + }; + + while (true) { // eslint-disable-line no-constant-condition + const users = await User // eslint-disable-line no-await-in-loop + .find(query) + .limit(250) + .sort({_id: 1}) + .select(fields) + .lean() + .exec(); + + if (users.length === 0) { + console.warn('All appropriate users found and modified.'); + console.warn(`\n${count} users processed\n`); + break; + } else { + query._id = { + $gt: users[users.length - 1]._id, + }; + } + + await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop + } +}; diff --git a/migrations/challenges/sync-all-challenges.js b/migrations/challenges/sync-all-challenges.js index 7998aecdd1..5e6e7df2e1 100644 --- a/migrations/challenges/sync-all-challenges.js +++ b/migrations/challenges/sync-all-challenges.js @@ -2,14 +2,14 @@ import { model as Challenges } from '../../website/server/models/challenge'; import { model as User } from '../../website/server/models/user'; async function syncChallengeToMembers (challenges) { - let challengSyncPromises = challenges.map(async (challenge) => { - let users = await User.find({ + const challengSyncPromises = challenges.map(async challenge => { + const users = await User.find({ // _id: '', challenges: challenge._id, }).exec(); - let promises = []; - users.forEach((user) => { + const promises = []; + users.forEach(user => { promises.push(challenge.syncToUser(user)); promises.push(challenge.save()); promises.push(user.save()); @@ -18,11 +18,11 @@ async function syncChallengeToMembers (challenges) { return Promise.all(promises); }); - return await Promise.all(challengSyncPromises); + return Promise.all(challengSyncPromises); } async function syncChallenges (lastChallengeDate) { - let query = { + const query = { // _id: '', }; @@ -30,16 +30,16 @@ async function syncChallenges (lastChallengeDate) { query.createdOn = { $lte: lastChallengeDate }; } - let challengesFound = await Challenges.find(query) + const challengesFound = await Challenges.find(query) .limit(10) .sort('-createdAt') .exec(); - let syncedChallenges = await syncChallengeToMembers(challengesFound) + const syncedChallenges = await syncChallengeToMembers(challengesFound) .catch(reason => console.error(reason)); - let lastChallenge = challengesFound[challengesFound.length - 1]; + const lastChallenge = challengesFound[challengesFound.length - 1]; if (lastChallenge) syncChallenges(lastChallenge.createdAt); return syncedChallenges; } -module.exports = syncChallenges; +export default syncChallenges; diff --git a/migrations/command-line/apology_gems.js b/migrations/command-line/apology_gems.js index 347a63d141..f56b8e6323 100644 --- a/migrations/command-line/apology_gems.js +++ b/migrations/command-line/apology_gems.js @@ -1 +1 @@ -db.users.update({_id: {$in: ['']}}, {$inc: {balance: 0.5}}, {multi: true}); \ No newline at end of file +db.users.update({ _id: { $in: [''] } }, { $inc: { balance: 0.5 } }, { multi: true }); diff --git a/migrations/command-line/cancelSubscription.js b/migrations/command-line/cancelSubscription.js index f823bed40f..a59a0a4c7f 100644 --- a/migrations/command-line/cancelSubscription.js +++ b/migrations/command-line/cancelSubscription.js @@ -1,11 +1,14 @@ // mongo habitrpg ./node_modules/moment/moment.js ./migrations/cancelSubscription.js -// For some reason people often to contact me to cancel their sub, rather than do it online. Even when I point them to +// For some reason people often to contact me to cancel their sub, +// rather than do it online. Even when I point them to // the FAQ (http://goo.gl/1uoPGQ) they insist... db.users.update( - {_id: ''}, - {$set: { - 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), - }} -); \ No newline at end of file + { _id: '' }, + { + $set: { + 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), + }, + }, +); diff --git a/migrations/command-line/contribs_plan.js b/migrations/command-line/contribs_plan.js index 548ff6f18f..3a6d66359e 100644 --- a/migrations/command-line/contribs_plan.js +++ b/migrations/command-line/contribs_plan.js @@ -1,8 +1,7 @@ // Give contrib.level 7+ free subscription for life db.users.update( - { - 'contributor.level': {$gte: 7}, + 'contributor.level': { $gte: 7 }, 'purchased.plan.customerId': null, }, @@ -18,6 +17,6 @@ db.users.update( }, }, - {multi: true} + { multi: true }, -); \ No newline at end of file +); diff --git a/migrations/command-line/current_period_end.js b/migrations/command-line/current_period_end.js index 56c9e8b45d..d91ff5a250 100644 --- a/migrations/command-line/current_period_end.js +++ b/migrations/command-line/current_period_end.js @@ -1,5 +1,5 @@ // mongo habitrpg ./node_modules/moment/moment.js ./migrations/current_period_end.js db.users.update( - {_id: ''}, - {$set: {'purchased.plan.dateTerminated': moment().add({days: 7}).toDate()}} -); \ No newline at end of file + { _id: '' }, + { $set: { 'purchased.plan.dateTerminated': moment().add({ days: 7 }).toDate() } }, +); diff --git a/migrations/command-line/duplicatedTasksFindAndRemove.js b/migrations/command-line/duplicatedTasksFindAndRemove.js index 2dcdb10e5c..d96b22356e 100644 --- a/migrations/command-line/duplicatedTasksFindAndRemove.js +++ b/migrations/command-line/duplicatedTasksFindAndRemove.js @@ -39,38 +39,52 @@ // needed. Do not miss any of them! -let uuid = '30fb2640-7121-4968-ace5-f385e60ea6c5'; +const uuid = '30fb2640-7121-4968-ace5-f385e60ea6c5'; db.users.aggregate([ - {$match: { - _id: uuid, - }}, - {$project: { - _id: 0, todos: 1, - }}, - {$unwind: '$todos'}, - {$group: { - _id: { taskid: '$todos.id' }, - count: { $sum: 1 }, - }}, - {$match: { - count: { $gt: 1 }, - }}, - {$project: { - '_id.taskid': 1, - }}, - {$group: { - _id: { taskid: '$todos.id' }, - troublesomeIds: { $addToSet: '$_id.taskid' }, - }}, - {$project: { - _id: 0, - troublesomeIds: 1, - }}, -]).forEach((data) => { + { + $match: { + _id: uuid, + }, + }, + { + $project: { + _id: 0, todos: 1, + }, + }, + { $unwind: '$todos' }, + { + $group: { + _id: { taskid: '$todos.id' }, + count: { $sum: 1 }, + }, + }, + { + $match: { + count: { $gt: 1 }, + }, + }, + { + $project: { + '_id.taskid': 1, + }, + }, + { + $group: { + _id: { taskid: '$todos.id' }, + troublesomeIds: { $addToSet: '$_id.taskid' }, + }, + }, + { + $project: { + _id: 0, + troublesomeIds: 1, + }, + }, +]).forEach(data => { // print( "\n" ); printjson(data); - data.troublesomeIds.forEach((taskid) => { - print(`non-unique task: ${ taskid}`); + data.troublesomeIds.forEach(taskid => { + print(`non-unique task: ${taskid}`); // eslint-disable-line no-restricted-globals db.users.update({ _id: uuid, todos: { $elemMatch: { id: taskid } }, @@ -81,8 +95,7 @@ db.users.aggregate([ }); db.users.update( - {_id: uuid}, - {$pull: { todos: { id: 'de666' } } }, - {multi: false } + { _id: uuid }, + { $pull: { todos: { id: 'de666' } } }, + { multi: false }, ); - diff --git a/migrations/command-line/facebook_to_local.js b/migrations/command-line/facebook_to_local.js index de707c4f05..fb9c65d324 100644 --- a/migrations/command-line/facebook_to_local.js +++ b/migrations/command-line/facebook_to_local.js @@ -1,10 +1,10 @@ -let oldId = ''; -let newId = ''; -let newUser = db.users.findOne({_id: newId}); +const oldId = ''; +const newId = ''; +const newUser = db.users.findOne({ _id: newId }); -db.users.update({_id: oldId}, {$set: {auth: newUser.auth}}); +db.users.update({ _id: oldId }, { $set: { auth: newUser.auth } }); -// remove the auth on the new user (which is a template account). The account will be preened automatically later, +// remove the auth on the new user (which is a template account). +// The account will be preened automatically later, // this allows us to keep the account around a few days in case there was a mistake -db.users.update({_id: newId}, {$unset: {auth: 1}}); - +db.users.update({ _id: newId }, { $unset: { auth: 1 } }); diff --git a/migrations/command-line/find_unique_user.js b/migrations/command-line/find_unique_user.js index 378c6c8708..bb3e590df0 100644 --- a/migrations/command-line/find_unique_user.js +++ b/migrations/command-line/find_unique_user.js @@ -5,8 +5,8 @@ * Past in the text of a unique habit here to find the user, then you can restore their UUID */ -db.users.find().forEach((user) => { +db.users.find().forEach(user => { user.tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); - let found = _.some(user.tasks, {text: ''}); - if (found) printjson({id: user._id, auth: user.auth}); -}); \ No newline at end of file + const found = _.some(user.tasks, { text: '' }); + if (found) printjson({ id: user._id, auth: user.auth }); +}); diff --git a/migrations/command-line/freeMonth.js b/migrations/command-line/freeMonth.js index 2b9b19cccd..eccf3f7cc4 100644 --- a/migrations/command-line/freeMonth.js +++ b/migrations/command-line/freeMonth.js @@ -1,32 +1,34 @@ // mongo habitrpg ./node_modules/moment/moment.js ./migrations/freeMonth.js db.users.update( - {_id: ''}, - {$set: { - 'purchased.plan.customerId': 'temporary', - 'purchased.plan.paymentMethod': 'Stripe', - 'purchased.plan.planId': 'basic_earned', - 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), - }} + { _id: '' }, + { + $set: { + 'purchased.plan.customerId': 'temporary', + 'purchased.plan.paymentMethod': 'Stripe', + 'purchased.plan.planId': 'basic_earned', + 'purchased.plan.dateTerminated': moment().add('month', 1).toDate(), + }, + }, ); // var m = 12; // db.users.update( // {_id:''}, // {$set:{'purchased.plan':{ -// planId: 'basic_'+m+'mo', -// paymentMethod: 'Paypal', -// customerId: 'Gift', -// dateCreated: new Date(), -// dateTerminated: moment().add('month',m).toDate(), -// dateUpdated: new Date(), -// extraMonths: 0, -// gemsBought: 0, -// mysteryItems: [], -// consecutive: { -// count: 0, -// offset: m, -// gemCapExtra: m/3*5, -// trinkets: m/3 -// } +// planId: 'basic_'+m+'mo', +// paymentMethod: 'Paypal', +// customerId: 'Gift', +// dateCreated: new Date(), +// dateTerminated: moment().add('month',m).toDate(), +// dateUpdated: new Date(), +// extraMonths: 0, +// gemsBought: 0, +// mysteryItems: [], +// consecutive: { +// count: 0, +// offset: m, +// gemCapExtra: m/3*5, +// trinkets: m/3 +// } // }}} -// ) \ No newline at end of file +// ) diff --git a/migrations/command-line/habitica_day.js b/migrations/command-line/habitica_day.js index 9e4fd3af5b..61787298e1 100644 --- a/migrations/command-line/habitica_day.js +++ b/migrations/command-line/habitica_day.js @@ -1,5 +1,5 @@ db.users.update( {}, - {$inc: {'achievements.habiticaDays': 1}}, - {multi: 1} + { $inc: { 'achievements.habiticaDays': 1 } }, + { multi: 1 }, ); diff --git a/migrations/command-line/missing_gems.js b/migrations/command-line/missing_gems.js index 080bfbd687..fad6c750dd 100644 --- a/migrations/command-line/missing_gems.js +++ b/migrations/command-line/missing_gems.js @@ -1 +1 @@ -db.users.update({_id: ''}, {$inc: {balance: 5}}); \ No newline at end of file +db.users.update({ _id: '' }, { $inc: { balance: 5 } }); diff --git a/migrations/groups/add-unlimited-subscription.js b/migrations/groups/add-unlimited-subscription.js index 43fbe55b5d..ede00fc74e 100644 --- a/migrations/groups/add-unlimited-subscription.js +++ b/migrations/groups/add-unlimited-subscription.js @@ -13,7 +13,7 @@ import { model as Group } from '../../website/server/models/group'; // @TODO: this should probably be a GroupManager library method async function addUnlimitedSubscription (groupId, dateTerminated) { - let group = await Group.findOne({_id: groupId}); + const group = await Group.findOne({ _id: groupId }); group.purchased.plan.customerId = 'group-unlimited'; group.purchased.plan.dateCreated = new Date(); @@ -22,7 +22,7 @@ async function addUnlimitedSubscription (groupId, dateTerminated) { group.purchased.plan.planId = 'group_monthly'; group.purchased.plan.dateTerminated = null; if (dateTerminated) { - let dateToEnd = moment(dateTerminated).toDate(); + const dateToEnd = moment(dateTerminated).toDate(); group.purchased.plan.dateTerminated = dateToEnd; } // group.purchased.plan.owner = ObjectId(); @@ -31,12 +31,12 @@ async function addUnlimitedSubscription (groupId, dateTerminated) { return group.save(); } -module.exports = async function addUnlimitedSubscriptionCreator () { - let groupId = process.argv[2]; +export default async function addUnlimitedSubscriptionCreator () { + const groupId = process.argv[2]; if (!groupId) throw Error('Group ID is required'); - let dateTerminated = process.argv[3]; + const dateTerminated = process.argv[3]; await addUnlimitedSubscription(groupId, dateTerminated); -}; +} diff --git a/migrations/groups/create-group.js b/migrations/groups/create-group.js index b1d266890f..2524edf2eb 100644 --- a/migrations/groups/create-group.js +++ b/migrations/groups/create-group.js @@ -3,9 +3,9 @@ import { model as User } from '../../website/server/models/user'; // @TODO: this should probably be a GroupManager library method async function createGroup (name, privacy, type, leaderId) { - let user = await User.findOne({_id: leaderId}); + const user = await User.findOne({ _id: leaderId }); - let group = new Group({ + const group = new Group({ name, privacy, type, @@ -17,13 +17,11 @@ async function createGroup (name, privacy, type, leaderId) { return Promise.all([group.save(), user.save()]); } -module.exports = async function groupCreator () { - let name = process.argv[2]; - let privacy = process.argv[3]; - let type = process.argv[4]; - let leaderId = process.argv[5]; +export default async function groupCreator () { + const name = process.argv[2]; + const privacy = process.argv[3]; + const type = process.argv[4]; + const leaderId = process.argv[5]; await createGroup(name, privacy, type, leaderId); -}; - - +} diff --git a/migrations/groups/habitrpg-jackalopes.js b/migrations/groups/habitrpg-jackalopes.js index a33ae3a2f3..06b18d5d52 100644 --- a/migrations/groups/habitrpg-jackalopes.js +++ b/migrations/groups/habitrpg-jackalopes.js @@ -1,44 +1,43 @@ /* let migrationName = 'Jackalopes for Unlimited Subscribers'; */ /* - * This migration will find users with unlimited subscriptions who are also eligible for Jackalope mounts, and award them + * This migration will find users with unlimited subscriptions who are also eligible + * for Jackalope mounts, and award them */ import { model as Group } from '../../website/server/models/group'; import { model as User } from '../../website/server/models/user'; async function handOutJackalopes () { - let promises = []; - let cursor = User.find({ + const promises = []; + const cursor = User.find({ 'purchased.plan.customerId': 'habitrpg', }).cursor(); - cursor.on('data', async (user) => { - console.log(`User: ${ user._id}`); + cursor.on('data', async user => { + console.log(`User: ${user._id}`); let groupList = []; if (user.party._id) groupList.push(user.party._id); groupList = groupList.concat(user.guilds); - let subscribedGroup = - await Group.findOne({ - _id: {$in: groupList}, - 'purchased.plan.planId': 'group_monthly', - 'purchased.plan.dateTerminated': null, - }, - {_id: 1} - ); + const subscribedGroup = await Group.findOne({ + _id: { $in: groupList }, + 'purchased.plan.planId': 'group_monthly', + 'purchased.plan.dateTerminated': null, + }, + { _id: 1 }); if (subscribedGroup) { - User.update({_id: user._id}, {$set: {'items.mounts.Jackalope-RoyalPurple': true}}).exec(); + User.update({ _id: user._id }, { $set: { 'items.mounts.Jackalope-RoyalPurple': true } }).exec(); promises.push(user.save()); } }); cursor.on('close', async () => { console.log('done'); - return await Promise.all(promises); + return Promise.all(promises); }); } -module.exports = handOutJackalopes; +export default handOutJackalopes; diff --git a/migrations/groups/migrate-chat.js b/migrations/groups/migrate-chat.js index 8b341952cd..61e15a636d 100644 --- a/migrations/groups/migrate-chat.js +++ b/migrations/groups/migrate-chat.js @@ -8,7 +8,7 @@ */ import { model as Group } from '../../website/server/models/group'; -import { model as Chat } from '../../website/server/models/chat'; +import { chatModel as Chat } from '../../website/server/models/message'; async function moveGroupChatToModel (skip = 0) { const groups = await Group.find({}) @@ -40,7 +40,7 @@ async function moveGroupChatToModel (skip = 0) { const reducedPromises = promises.reduce((acc, curr) => { - acc = acc.concat(curr); + acc = acc.concat(curr); // eslint-disable-line no-param-reassign return acc; }, []); @@ -49,4 +49,4 @@ async function moveGroupChatToModel (skip = 0) { moveGroupChatToModel(skip + 50); } -module.exports = moveGroupChatToModel; +export default moveGroupChatToModel; diff --git a/migrations/groups/reconcile-group-plan-members.js b/migrations/groups/reconcile-group-plan-members.js index 06296090e4..c7f5323608 100644 --- a/migrations/groups/reconcile-group-plan-members.js +++ b/migrations/groups/reconcile-group-plan-members.js @@ -1,4 +1,4 @@ -import monk from 'monk'; +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies import nconf from 'nconf'; import stripePayments from '../../website/server/libs/payments/stripe'; @@ -12,8 +12,8 @@ import stripePayments from '../../website/server/libs/payments/stripe'; const CONNECTION_STRING = nconf.get('MIGRATION_CONNECT_STRING'); -let dbGroups = monk(CONNECTION_STRING).get('groups', { castIds: false }); -let dbUsers = monk(CONNECTION_STRING).get('users', { castIds: false }); +const dbGroups = monk(CONNECTION_STRING).get('groups', { castIds: false }); +const dbUsers = monk(CONNECTION_STRING).get('users', { castIds: false }); async function fixGroupPlanMembers () { console.info('Group ID, Customer ID, Plan ID, Quantity, Recorded Member Count, Actual Member Count'); @@ -24,15 +24,15 @@ async function fixGroupPlanMembers () { { $and: [ - {'purchased.plan.planId': {$ne: null}}, - {'purchased.plan.planId': {$ne: ''}}, - {'purchased.plan.customerId': {$ne: 'cus_9f0DV4g7WHRzpM'}}, // Demo groups - {'purchased.plan.customerId': {$ne: 'cus_9maalqDOFTrvqx'}}, + { 'purchased.plan.planId': { $ne: null } }, + { 'purchased.plan.planId': { $ne: '' } }, + { 'purchased.plan.customerId': { $ne: 'cus_9f0DV4g7WHRzpM' } }, // Demo groups + { 'purchased.plan.customerId': { $ne: 'cus_9maalqDOFTrvqx' } }, ], $or: [ - {'purchased.plan.dateTerminated': null}, - {'purchased.plan.dateTerminated': ''}, + { 'purchased.plan.dateTerminated': null }, + { 'purchased.plan.dateTerminated': '' }, ], }, { @@ -40,19 +40,19 @@ async function fixGroupPlanMembers () { memberCount: 1, 'purchased.plan': 1, }, - } - ).each(async (group, {close, pause, resume}) => { // eslint-disable-line no-unused-vars + }, + ).each(async (group, { close, pause, resume }) => { // eslint-disable-line no-unused-vars pause(); - groupPlanCount++; + groupPlanCount += 1; const canonicalMemberCount = await dbUsers.count( { $or: [ - {'party._id': group._id}, - {guilds: group._id}, + { 'party._id': group._id }, + { guilds: group._id }, ], - } + }, ); const incorrectMemberCount = group.memberCount !== canonicalMemberCount; @@ -73,24 +73,24 @@ async function fixGroupPlanMembers () { $set: { memberCount: canonicalMemberCount, }, - } + }, ); if (!groupUpdate) return; - fixedGroupCount++; + fixedGroupCount += 1; if (group.purchased.plan.paymentMethod === 'Stripe') { await stripePayments.chargeForAdditionalGroupMember(group); await dbGroups.update( - {_id: group._id}, - {$set: {'purchased.plan.quantity': canonicalMemberCount + 2}} + { _id: group._id }, + { $set: { 'purchased.plan.quantity': canonicalMemberCount + 2 } }, ); } if (incorrectQuantity) { await dbGroups.update( - {_id: group._id}, - {$set: {'purchased.plan.quantity': canonicalMemberCount + 2}} + { _id: group._id }, + { $set: { 'purchased.plan.quantity': canonicalMemberCount + 2 } }, ); } @@ -98,10 +98,10 @@ async function fixGroupPlanMembers () { }).then(() => { console.info(`Fixed ${fixedGroupCount} out of ${groupPlanCount} active Group Plans`); return process.exit(0); - }).catch((err) => { + }).catch(err => { console.log(err); return process.exit(1); }); } -module.exports = fixGroupPlanMembers; +export default fixGroupPlanMembers; diff --git a/migrations/groups/update-groups-with-group-plans.js b/migrations/groups/update-groups-with-group-plans.js index d544f389ab..723f3e73b7 100644 --- a/migrations/groups/update-groups-with-group-plans.js +++ b/migrations/groups/update-groups-with-group-plans.js @@ -5,29 +5,27 @@ let authorUuid = ''; // ... own data is done */ /* - * This migrations will iterate through all groups with a group plan a subscription and resync the free - * subscription to all members + * This migrations will iterate through all groups with a group plan + * a subscription and resync the free subscription to all members */ import { model as Group } from '../../website/server/models/group'; -import * as payments from '../../website/server/libs/payments'; +import payments from '../../website/server/libs/payments/payments'; async function updateGroupsWithGroupPlans () { - let cursor = Group.find({ + const cursor = Group.find({ 'purchased.plan.planId': 'group_monthly', 'purchased.plan.dateTerminated': null, }).cursor(); - let promises = []; + const promises = []; - cursor.on('data', (group) => { + cursor.on('data', group => { promises.push(payments.addSubscriptionToGroupUsers(group)); promises.push(group.save()); }); - cursor.on('close', async () => { - return await Promise.all(promises); - }); + cursor.on('close', async () => Promise.all(promises)); } -module.exports = updateGroupsWithGroupPlans; +export default updateGroupsWithGroupPlans; diff --git a/migrations/migration-runner.js b/migrations/migration-runner.js index 39cec8b1aa..60926b4264 100644 --- a/migrations/migration-runner.js +++ b/migrations/migration-runner.js @@ -1,4 +1,5 @@ -require('babel-register'); +/* eslint-disable import/no-commonjs */ +require('@babel/register'); // eslint-disable-line import/no-extraneous-dependencies // This file must use ES5, everything required can be in ES6 @@ -17,12 +18,13 @@ function setUpServer () { setUpServer(); // Replace this with your migration -const processUsers = require(''); +const processUsers = () => {}; // require('').default; + processUsers() - .then(function success () { + .then(() => { process.exit(0); }) - .catch(function failure (err) { + .catch(err => { console.log(err); process.exit(1); }); diff --git a/migrations/new_stuff.js b/migrations/new_stuff.js index 3ee124ab6b..c3c0b44745 100644 --- a/migrations/new_stuff.js +++ b/migrations/new_stuff.js @@ -1,19 +1,21 @@ +/* eslint-disable import/no-commonjs */ /* let migrationName = 'new_stuff.js'; */ -let authorName = 'Sabe'; // in case script author needs to know when their ... -let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * set the newStuff flag in all user accounts so they see a Bailey message */ -let monk = require('monk'); -let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -let dbUsers = monk(connectionString).get('users', { castIds: false }); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +const dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - let query = { - 'flags.newStuff': {$ne: true}, + const query = { + 'flags.newStuff': { $ne: true }, }; if (lastId) { @@ -23,29 +25,31 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, - fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + // specify fields we are interested in to limit retrieved data + // (empty if we're not reading data): + fields: [], }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users found and modified.'); displayData(); - return; + return null; } - let userPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const userPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(userPromises) .then(() => { @@ -54,30 +58,31 @@ function updateUsers (users) { } function updateUser (user) { - count++; + count += 1; - let set = {'flags.newStuff': true}; + const set = { 'flags.newStuff': true }; - dbUsers.update({_id: user._id}, {$set: set}); + dbUsers.update({ _id: user._id }, { $set: set }); - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} processed`); } function displayData () { - console.warn(`\n${ count } users processed\n`); + console.warn(`\n${count} users processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } diff --git a/migrations/restock_armoire.js b/migrations/restock_armoire.js index 5046998a3b..182213b85b 100644 --- a/migrations/restock_armoire.js +++ b/migrations/restock_armoire.js @@ -1,18 +1,20 @@ -let migrationName = 'restock_armoire.js'; -let authorName = 'Sabe'; // in case script author needs to know when their ... -let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done +/* eslint-disable import/no-commonjs */ +const migrationName = 'restock_armoire.js'; +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* * Remove flag stating that the Enchanted Armoire is empty, for when new equipment is added */ -let monk = require('monk'); -let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -let dbUsers = monk(connectionString).get('users', { castIds: false }); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +const dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - let query = { + const query = { 'flags.armoireEmpty': true, }; @@ -23,29 +25,31 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, - fields: [], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + // specify fields we are interested in to limit retrieved data + // (empty if we're not reading data): + fields: [], }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users found and modified.'); displayData(); - return; + return null; } - let userPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const userPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(userPromises) .then(() => { @@ -54,30 +58,31 @@ function updateUsers (users) { } function updateUser (user) { - count++; + count += 1; - let set = {migration: migrationName, 'flags.armoireEmpty': false}; + const set = { migration: migrationName, 'flags.armoireEmpty': false }; - dbUsers.update({_id: user._id}, {$set: set}); + dbUsers.update({ _id: user._id }, { $set: set }); - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} processed`); } function displayData () { - console.warn(`\n${ count } users processed\n`); + console.warn(`\n${count} users processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } diff --git a/migrations/restock_armoire_for_users_that_need_it.js b/migrations/restock_armoire_for_users_that_need_it.js index 5bf0422d04..c1de8a9a8f 100644 --- a/migrations/restock_armoire_for_users_that_need_it.js +++ b/migrations/restock_armoire_for_users_that_need_it.js @@ -1,6 +1,7 @@ -let migrationName = 'restock_armoire_for_users_that_need_it.js'; -let authorName = 'Alys (ALittleYellowSpider)'; // in case script author needs to know when their ... -let authorUuid = '3e595299-3d8a-4a10-bfe0-88f555e4aa0c'; // ... own data is done +/* eslint-disable import/no-commonjs */ +const migrationName = 'restock_armoire_for_users_that_need_it.js'; +const authorName = 'Alys (ALittleYellowSpider)'; // in case script author needs to know when their ... +const authorUuid = '3e595299-3d8a-4a10-bfe0-88f555e4aa0c'; // ... own data is done /* * Remove flag stating that the Enchanted Armoire is empty, @@ -18,16 +19,17 @@ let authorUuid = '3e595299-3d8a-4a10-bfe0-88f555e4aa0c'; // ... own data is done * */ -let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -let monk = require('monk'); -let dbUsers = monk(connectionString).get('users', { castIds: false }); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - let query = { - 'auth.timestamps.loggedin': {$gt: new Date('2016-01-04')}, + const query = { + 'auth.timestamps.loggedin': { $gt: new Date('2016-01-04') }, // '_id': authorUuid // FOR TESTING }; @@ -35,7 +37,7 @@ function processUsers (lastId) { /* let fields = { 'flags.armoireEmpty': 1, 'items.gear.owned': 1, - };*/ + }; */ if (lastId) { query._id = { @@ -44,32 +46,34 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, + // specify fields we are interested in to limit retrieved data + // (empty if we're not reading data): fields: { 'flags.armoireEmpty': 1, 'items.gear.owned': 1, - }, // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }, }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users found and modified.'); displayData(); - return; + return null; } - let userPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const userPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(userPromises) .then(() => { @@ -78,19 +82,69 @@ function updateUsers (users) { } function updateUser (user) { - count++; + count += 1; - let set = {migration: migrationName, 'flags.armoireEmpty': false}; + const set = { migration: migrationName, 'flags.armoireEmpty': false }; if (user.flags.armoireEmpty) { // this user believes their armoire has no more items in it - if (user.items.gear.owned.weapon_armoire_barristerGavel && user.items.gear.owned.armor_armoire_barristerRobes && user.items.gear.owned.head_armoire_jesterCap && user.items.gear.owned.armor_armoire_jesterCostume && user.items.gear.owned.head_armoire_barristerWig && user.items.gear.owned.weapon_armoire_jesterBaton && user.items.gear.owned.weapon_armoire_lunarSceptre && user.items.gear.owned.armor_armoire_gladiatorArmor && user.items.gear.owned.weapon_armoire_basicCrossbow && user.items.gear.owned.head_armoire_gladiatorHelm && user.items.gear.owned.armor_armoire_lunarArmor && user.items.gear.owned.head_armoire_redHairbow && user.items.gear.owned.head_armoire_violetFloppyHat && user.items.gear.owned.head_armoire_rancherHat && user.items.gear.owned.shield_armoire_gladiatorShield && user.items.gear.owned.head_armoire_blueHairbow && user.items.gear.owned.weapon_armoire_mythmakerSword && user.items.gear.owned.head_armoire_royalCrown && user.items.gear.owned.head_armoire_hornedIronHelm && user.items.gear.owned.weapon_armoire_rancherLasso && user.items.gear.owned.armor_armoire_rancherRobes && user.items.gear.owned.armor_armoire_hornedIronArmor && user.items.gear.owned.armor_armoire_goldenToga && user.items.gear.owned.weapon_armoire_ironCrook && user.items.gear.owned.head_armoire_goldenLaurels && user.items.gear.owned.head_armoire_redFloppyHat && user.items.gear.owned.armor_armoire_plagueDoctorOvercoat && user.items.gear.owned.head_armoire_plagueDoctorHat && user.items.gear.owned.weapon_armoire_goldWingStaff && user.items.gear.owned.head_armoire_yellowHairbow && user.items.gear.owned.eyewear_armoire_plagueDoctorMask && user.items.gear.owned.head_armoire_blackCat && user.items.gear.owned.weapon_armoire_batWand && user.items.gear.owned.head_armoire_orangeCat && user.items.gear.owned.shield_armoire_midnightShield && user.items.gear.owned.armor_armoire_royalRobes && user.items.gear.owned.head_armoire_blueFloppyHat && user.items.gear.owned.shield_armoire_royalCane && user.items.gear.owned.weapon_armoire_shepherdsCrook && user.items.gear.owned.armor_armoire_shepherdRobes && user.items.gear.owned.head_armoire_shepherdHeaddress && user.items.gear.owned.weapon_armoire_blueLongbow && user.items.gear.owned.weapon_armoire_crystalCrescentStaff && user.items.gear.owned.head_armoire_crystalCrescentHat && user.items.gear.owned.armor_armoire_dragonTamerArmor && user.items.gear.owned.head_armoire_dragonTamerHelm && user.items.gear.owned.armor_armoire_crystalCrescentRobes && user.items.gear.owned.shield_armoire_dragonTamerShield && user.items.gear.owned.weapon_armoire_glowingSpear) { + if ( + user.items.gear.owned.weapon_armoire_barristerGavel + && user.items.gear.owned.armor_armoire_barristerRobes + && user.items.gear.owned.head_armoire_jesterCap + && user.items.gear.owned.armor_armoire_jesterCostume + && user.items.gear.owned.head_armoire_barristerWig + && user.items.gear.owned.weapon_armoire_jesterBaton + && user.items.gear.owned.weapon_armoire_lunarSceptre + && user.items.gear.owned.armor_armoire_gladiatorArmor + && user.items.gear.owned.weapon_armoire_basicCrossbow + && user.items.gear.owned.head_armoire_gladiatorHelm + && user.items.gear.owned.armor_armoire_lunarArmor + && user.items.gear.owned.head_armoire_redHairbow + && user.items.gear.owned.head_armoire_violetFloppyHat + && user.items.gear.owned.head_armoire_rancherHat + && user.items.gear.owned.shield_armoire_gladiatorShield + && user.items.gear.owned.head_armoire_blueHairbow + && user.items.gear.owned.weapon_armoire_mythmakerSword + && user.items.gear.owned.head_armoire_royalCrown + && user.items.gear.owned.head_armoire_hornedIronHelm + && user.items.gear.owned.weapon_armoire_rancherLasso + && user.items.gear.owned.armor_armoire_rancherRobes + && user.items.gear.owned.armor_armoire_hornedIronArmor + && user.items.gear.owned.armor_armoire_goldenToga + && user.items.gear.owned.weapon_armoire_ironCrook + && user.items.gear.owned.head_armoire_goldenLaurels + && user.items.gear.owned.head_armoire_redFloppyHat + && user.items.gear.owned.armor_armoire_plagueDoctorOvercoat + && user.items.gear.owned.head_armoire_plagueDoctorHat + && user.items.gear.owned.weapon_armoire_goldWingStaff + && user.items.gear.owned.head_armoire_yellowHairbow + && user.items.gear.owned.eyewear_armoire_plagueDoctorMask + && user.items.gear.owned.head_armoire_blackCat + && user.items.gear.owned.weapon_armoire_batWand + && user.items.gear.owned.head_armoire_orangeCat + && user.items.gear.owned.shield_armoire_midnightShield + && user.items.gear.owned.armor_armoire_royalRobes + && user.items.gear.owned.head_armoire_blueFloppyHat + && user.items.gear.owned.shield_armoire_royalCane + && user.items.gear.owned.weapon_armoire_shepherdsCrook + && user.items.gear.owned.armor_armoire_shepherdRobes + && user.items.gear.owned.head_armoire_shepherdHeaddress + && user.items.gear.owned.weapon_armoire_blueLongbow + && user.items.gear.owned.weapon_armoire_crystalCrescentStaff + && user.items.gear.owned.head_armoire_crystalCrescentHat + && user.items.gear.owned.armor_armoire_dragonTamerArmor + && user.items.gear.owned.head_armoire_dragonTamerHelm + && user.items.gear.owned.armor_armoire_crystalCrescentRobes + && user.items.gear.owned.shield_armoire_dragonTamerShield + && user.items.gear.owned.weapon_armoire_glowingSpear + ) { // this user does have all the armoire items so we don't change the flag // console.log("don't change: " + user._id); // FOR TESTING } else { // console.log("change: " + user._id); // FOR TESTING - dbUsers.update({_id: user._id}, {$set: set}); + dbUsers.update({ _id: user._id }, { $set: set }); } } else { // this user already has armoire marked as containing items to be bought @@ -98,24 +152,25 @@ function updateUser (user) { // console.log("DON'T CHANGE: " + user._id); // FOR TESTING } - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} processed`); } function displayData () { - console.warn(`\n${ count } users processed\n`); + console.warn(`\n${count} users processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } diff --git a/migrations/restore-profile-data.js b/migrations/restore-profile-data.js index 750a991efb..0fd8691b04 100644 --- a/migrations/restore-profile-data.js +++ b/migrations/restore-profile-data.js @@ -1,22 +1,25 @@ +/* eslint-disable import/no-commonjs */ /* let migrationName = 'restore_profile_data.js'; */ -let authorName = 'ThehollidayInn'; // in case script author needs to know when their ... -let authorUuid = ''; // ... own data is done +const authorName = 'ThehollidayInn'; // in case script author needs to know when their ... +const authorUuid = ''; // ... own data is done /* * Check if users have empty profile data in new database and update it with old database info */ -let monk = require('monk'); -let connectionString = ''; // FOR TEST DATABASE -let dbUsers = monk(connectionString).get('users', { castIds: false }); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies -let monk2 = require('monk'); -let oldDbConnectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -let olDbUsers = monk2(oldDbConnectionString).get('users', { castIds: false }); +const connectionString = ''; // FOR TEST DATABASE +const dbUsers = monk(connectionString).get('users', { castIds: false }); + +const monk2 = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const oldDbConnectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +const olDbUsers = monk2(oldDbConnectionString).get('users', { castIds: false }); function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - let query = { + const query = { // 'profile.name': 'profile name not found', 'profile.blurb': null, // 'auth.timestamps.loggedin': {$gt: new Date('11/30/2016')}, @@ -29,49 +32,47 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, fields: ['_id', 'profile', 'auth.timestamps.loggedin'], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users found and modified.'); setTimeout(displayData, 300000); - return; + return null; } - let userPaymentPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const userPaymentPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(userPaymentPromises) - .then(() => { - return processUsers(lastUser._id); - }); + .then(() => processUsers(lastUser._id)); } function updateUser (user) { - count++; + count += 1; if (!user.profile.name || user.profile.name === 'profile name not found' || !user.profile.imageUrl || !user.profile.blurb) { - return olDbUsers.findOne({_id: user._id}, '_id profile') - .then((oldUserData) => { - if (!oldUserData) return; + return olDbUsers.findOne({ _id: user._id }, '_id profile') + .then(oldUserData => { + if (!oldUserData) return null; // specify user data to change: - let set = {}; + const set = {}; - if (oldUserData.profile.name === 'profile name not found') return; + if (oldUserData.profile.name === 'profile name not found') return null; - let userNeedsProfileName = !user.profile.name || user.profile.name === 'profile name not found'; + const userNeedsProfileName = !user.profile.name || user.profile.name === 'profile name not found'; if (userNeedsProfileName && oldUserData.profile.name) { set['profile.name'] = oldUserData.profile.name; } @@ -86,29 +87,34 @@ function updateUser (user) { if (Object.keys(set).length !== 0 && set.constructor === Object) { console.log(set); - return dbUsers.update({_id: user._id}, {$set: set}); + return dbUsers.update({ _id: user._id }, { $set: set }); } + + return null; }); } - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} processed`); + + return null; } function displayData () { - console.warn(`\n${ count } users processed\n`); + console.warn(`\n${count} users processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } diff --git a/migrations/s3-upload.js b/migrations/s3-upload.js index 4a2d2efcd2..fabb819d7d 100644 --- a/migrations/s3-upload.js +++ b/migrations/s3-upload.js @@ -1,8 +1,10 @@ -let request = require('superagent'); -let last = require('lodash/last'); -let AWS = require('aws-sdk'); +/* eslint-disable import/no-commonjs */ +const request = require('superagent'); +const last = require('lodash/last'); +const AWS = require('aws-sdk'); + +const config = require('../config'); -let config = require('../config'); const S3_DIRECTORY = 'mobileApp/images'; // config.S3.SPRITES_DIRECTORY; AWS.config.update({ @@ -11,8 +13,8 @@ AWS.config.update({ // region: config.get('S3_REGION'), }); -let BUCKET_NAME = config.S3.bucket; -let s3 = new AWS.S3(); +const BUCKET_NAME = config.S3.bucket; +const s3 = new AWS.S3(); // Adapted from http://stackoverflow.com/a/22210077/2601552 function uploadFile (buffer, fileName) { @@ -21,7 +23,7 @@ function uploadFile (buffer, fileName) { Body: buffer, Key: fileName, Bucket: BUCKET_NAME, - }, (error) => { + }, error => { if (error) { reject(error); } else { @@ -33,9 +35,9 @@ function uploadFile (buffer, fileName) { } function getFileName (file) { - let piecesOfPath = file.split('/'); - let name = last(piecesOfPath); - let fullName = S3_DIRECTORY + name; + const piecesOfPath = file.split('/'); + const name = last(piecesOfPath); + const fullName = S3_DIRECTORY + name; return fullName; } @@ -44,36 +46,32 @@ function getFileFromUrl (url) { return new Promise((resolve, reject) => { request.get(url).end((err, res) => { if (err) return reject(err); - let file = res.body; - resolve(file); + const file = res.body; + return resolve(file); }); }); } let commit = '78f94e365c72cc58f66857d5941105638db7d35c'; commit = 'df0dbaba636c9ce424cc7040f7bd7fc1aa311015'; -let gihuburl = `https://api.github.com/repos/HabitRPG/habitica/commits/${commit}`; +const gihuburl = `https://api.github.com/repos/HabitRPG/habitica/commits/${commit}`; let currentIndex = 0; function uploadToS3 (start, end, filesUrls) { - let urls = filesUrls.slice(start, end); + const urls = filesUrls.slice(start, end); if (urls.length === 0) { console.log('done'); return; } - let promises = urls.map(fullUrl => { - return getFileFromUrl(fullUrl) - .then((buffer) => { - return uploadFile(buffer, getFileName(fullUrl)); - }); - }); + const promises = urls.map(fullUrl => getFileFromUrl(fullUrl) + .then(buffer => uploadFile(buffer, getFileName(fullUrl)))); console.log(promises.length); - return Promise.all(promises) + Promise.all(promises) .then(() => { currentIndex += 50; uploadToS3(currentIndex, currentIndex + 50, filesUrls); @@ -86,12 +84,10 @@ function uploadToS3 (start, end, filesUrls) { request.get(gihuburl) .end((err, res) => { console.log(err); - let files = res.body.files; + const { files } = res.body; let filesUrls = ['']; - filesUrls = files.map(file => { - return file.raw_url; - }); + filesUrls = files.map(file => file.raw_url); uploadToS3(currentIndex, currentIndex + 50, filesUrls); }); diff --git a/migrations/tasks/habits-one-history-entry-per-day-challenges.js b/migrations/tasks/habits-one-history-entry-per-day-challenges.js index dcb05f48bf..799e896af1 100644 --- a/migrations/tasks/habits-one-history-entry-per-day-challenges.js +++ b/migrations/tasks/habits-one-history-entry-per-day-challenges.js @@ -1,21 +1,23 @@ +/* eslint-disable import/no-commonjs */ // const migrationName = 'habits-one-history-entry-per-day'; // const authorName = 'paglias'; // in case script author needs to know when their ... // const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done /* - * Iterates over all habits and condense multiple history entries for the same day into a single entry + * Iterates over all habits and condense multiple history entries for the same day into a single one */ -const monk = require('monk'); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies const _ = require('lodash'); const moment = require('moment'); + const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE const dbTasks = monk(connectionString).get('tasks', { castIds: false }); function processChallengeHabits (lastId) { - let query = { - 'challenge.id': {$exists: true}, - userId: {$exists: false}, + const query = { + 'challenge.id': { $exists: true }, + userId: { $exists: false }, type: 'habit', }; @@ -26,37 +28,35 @@ function processChallengeHabits (lastId) { } dbTasks.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 500, }) .then(updateChallengeHabits) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateChallengeHabits (habits) { if (!habits || habits.length === 0) { console.warn('All appropriate challenge habits found and modified.'); displayData(); - return; + return null; } - let habitsPromises = habits.map(updateChallengeHabit); - let lastHabit = habits[habits.length - 1]; + const habitsPromises = habits.map(updateChallengeHabit); + const lastHabit = habits[habits.length - 1]; return Promise.all(habitsPromises) - .then(() => { - return processChallengeHabits(lastHabit._id); - }); + .then(() => processChallengeHabits(lastHabit._id)); } function updateChallengeHabit (habit) { - count++; + count += 1; if (habit && habit.history && habit.history.length > 0) { // First remove missing entries @@ -76,13 +76,12 @@ function updateChallengeHabit (habit) { entry.scoreDirection = entry.value > previousValue ? 'up' : 'down'; } }) - .groupBy(entry => { // group entries by aggregateBy - return moment(entry.date).format('YYYYMMDD'); - }) + // group entries by aggregateBy + .groupBy(entry => moment(entry.date).format('YYYYMMDD')) .toPairs() // [key, entry] .sortBy(([key]) => key) // sort by date .map(keyEntryPair => { - let entries = keyEntryPair[1]; // 1 is entry, 0 is key + const entries = keyEntryPair[1]; // 1 is entry, 0 is key let scoredUp = 0; let scoredDown = 0; @@ -107,32 +106,34 @@ function updateChallengeHabit (habit) { }) .value(); - return dbTasks.update({_id: habit._id}, { - $set: {history: habit.history}, + return dbTasks.update({ _id: habit._id }, { + $set: { history: habit.history }, }); } - if (count % progressCount === 0) console.warn(`${count } habits processed`); + if (count % progressCount === 0) console.warn(`${count} habits processed`); + return null; } function displayData () { - console.warn(`\n${ count } tasks processed\n`); + console.warn(`\n${count} tasks processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } process.exit(code); } -module.exports = processChallengeHabits; +export default processChallengeHabits; diff --git a/migrations/tasks/habits-one-history-entry-per-day-users.js b/migrations/tasks/habits-one-history-entry-per-day-users.js index 509aa71eb7..cb3d2c24b5 100644 --- a/migrations/tasks/habits-one-history-entry-per-day-users.js +++ b/migrations/tasks/habits-one-history-entry-per-day-users.js @@ -1,21 +1,23 @@ +/* eslint-disable import/no-commonjs */ const migrationName = 'habits-one-history-entry-per-day'; const authorName = 'paglias'; // in case script author needs to know when their ... const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done /* - * Iterates over all habits and condense multiple history entries for the same day into a single entry + * Iterates over all habits and condense multiple history entries for the same day into a single one */ -const monk = require('monk'); +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies const _ = require('lodash'); const moment = require('moment'); + const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE const dbTasks = monk(connectionString).get('tasks', { castIds: false }); const dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { - let query = { - migration: {$ne: migrationName}, + const query = { + migration: { $ne: migrationName }, }; if (lastId) { @@ -25,34 +27,32 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 50, // just 50 users per time since we have to process all their habits as well fields: ['_id', 'preferences.timezoneOffset', 'preferences.dayStart'], }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users and their tasks found and modified.'); displayData(); - return; + return null; } - let usersPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const usersPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(usersPromises) - .then(() => { - return processUsers(lastUser._id); - }); + .then(() => processUsers(lastUser._id)); } function updateHabit (habit, timezoneOffset, dayStart) { @@ -82,7 +82,7 @@ function updateHabit (habit, timezoneOffset, dayStart) { .toPairs() // [key, entry] .sortBy(([key]) => key) // sort by date .map(keyEntryPair => { - let entries = keyEntryPair[1]; // 1 is entry, 0 is key + const entries = keyEntryPair[1]; // 1 is entry, 0 is key let scoredUp = 0; let scoredDown = 0; @@ -107,57 +107,56 @@ function updateHabit (habit, timezoneOffset, dayStart) { }) .value(); - return dbTasks.update({_id: habit._id}, { - $set: {history: habit.history}, + return dbTasks.update({ _id: habit._id }, { + $set: { history: habit.history }, }); } + + return null; } function updateUser (user) { - count++; + count += 1; - const timezoneOffset = user.preferences.timezoneOffset; - const dayStart = user.preferences.dayStart; + const { timezoneOffset } = user.preferences; + const { dayStart } = user.preferences; - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } being processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} being processed`); return dbTasks.find({ type: 'habit', userId: user._id, }) - .then(habits => { - return Promise.all(habits.map(habit => updateHabit(habit, timezoneOffset, dayStart))); - }) - .then(() => { - return dbUsers.update({_id: user._id}, { - $set: {migration: migrationName}, - }); - }) - .catch((err) => { + .then(habits => Promise.all(habits.map(habit => updateHabit(habit, timezoneOffset, dayStart)))) + .then(() => dbUsers.update({ _id: user._id }, { + $set: { migration: migrationName }, + })) + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } function displayData () { - console.warn(`\n${ count } tasks processed\n`); + console.warn(`\n${count} tasks processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } process.exit(code); } -module.exports = processUsers; +export default processUsers; diff --git a/migrations/tasks/tasks-set-everyX.js b/migrations/tasks/tasks-set-everyX.js index c507f80356..c217d0388a 100644 --- a/migrations/tasks/tasks-set-everyX.js +++ b/migrations/tasks/tasks-set-everyX.js @@ -1,18 +1,19 @@ +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies /* let migrationName = 'tasks-set-everyX'; */ -let authorName = 'Sabe'; // in case script author needs to know when their ... -let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done /* - * Iterates over all tasks and sets invalid everyX values (less than 0 or more than 9999 or not an int) field to 0 + * Iterates over all tasks and sets invalid everyX values + * (less than 0 or more than 9999 or not an int) field to 0 */ -let monk = require('monk'); -let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; -let dbTasks = monk(connectionString).get('tasks', { castIds: false }); +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; +const dbTasks = monk(connectionString).get('tasks', { castIds: false }); function processTasks (lastId) { // specify a query to limit the affected tasks (empty for all tasks): - let query = { + const query = { type: 'daily', everyX: { $not: { @@ -30,64 +31,63 @@ function processTasks (lastId) { } dbTasks.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, fields: [], }) .then(updateTasks) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateTasks (tasks) { if (!tasks || tasks.length === 0) { console.warn('All appropriate tasks found and modified.'); displayData(); - return; + return null; } - let taskPromises = tasks.map(updatetask); - let lasttask = tasks[tasks.length - 1]; + const taskPromises = tasks.map(updatetask); + const lasttask = tasks[tasks.length - 1]; return Promise.all(taskPromises) - .then(() => { - return processTasks(lasttask._id); - }); + .then(() => processTasks(lasttask._id)); } function updatetask (task) { - count++; - let set = {everyX: 0}; + count += 1; + const set = { everyX: 0 }; - dbTasks.update({_id: task._id}, {$set: set}); + dbTasks.update({ _id: task._id }, { $set: set }); - if (count % progressCount === 0) console.warn(`${count } ${ task._id}`); - if (task._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${task._id}`); + if (task._id === authorUuid) console.warn(`${authorName} processed`); } function displayData () { - console.warn(`\n${ count } tasks processed\n`); + console.warn(`\n${count} tasks processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } process.exit(code); } -module.exports = processTasks; +export default processTasks; diff --git a/migrations/tasks/tasks-set-yesterdailies.js b/migrations/tasks/tasks-set-yesterdailies.js index 253d871612..08d1ee783a 100644 --- a/migrations/tasks/tasks-set-yesterdailies.js +++ b/migrations/tasks/tasks-set-yesterdailies.js @@ -1,28 +1,31 @@ /* let migrationName = 'tasks-set-yesterdaily'; */ -let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... -let authorUuid = ''; // ... own data is done +// ... own data is done /* * Iterates over all tasks and sets the yseterDaily field to True */ -import monk from 'monk'; +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies -let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -let dbTasks = monk(connectionString).get('tasks', { castIds: false }); +const authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +const authorUuid = ''; -let progressCount = 1000; +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +const dbTasks = monk(connectionString).get('tasks', { castIds: false }); + +const progressCount = 1000; let count = 0; function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } @@ -30,39 +33,37 @@ function exiting (code, msg) { } function displayData () { - console.warn(`\n${ count } tasks processed\n`); + console.warn(`\n${count} tasks processed\n`); return exiting(0); } function updatetask (task) { - count++; - let set = {yesterDaily: true}; + count += 1; + const set = { yesterDaily: true }; - dbTasks.update({_id: task._id}, {$set: set}); + dbTasks.update({ _id: task._id }, { $set: set }); - if (count % progressCount === 0) console.warn(`${count } ${ task._id}`); - if (task._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${task._id}`); + if (task._id === authorUuid) console.warn(`${authorName} processed`); } function updateTasks (tasks) { if (!tasks || tasks.length === 0) { console.warn('All appropriate tasks found and modified.'); displayData(); - return; + return null; } - let taskPromises = tasks.map(updatetask); - let lasttask = tasks[tasks.length - 1]; + const taskPromises = tasks.map(updatetask); + const lasttask = tasks[tasks.length - 1]; return Promise.all(taskPromises) - .then(() => { - return processTasks(lasttask._id); // eslint-disable-line no-use-before-define - }); + .then(() => processTasks(lasttask._id)); // eslint-disable-line no-use-before-define } function processTasks (lastId) { // specify a query to limit the affected tasks (empty for all tasks): - let query = { + const query = { yesterDaily: false, }; @@ -73,16 +74,18 @@ function processTasks (lastId) { } dbTasks.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, - fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + // specify fields we are interested in to limit retrieved data + // (empty if we're not reading data): + fields: [ ], }) .then(updateTasks) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -module.exports = processTasks; +export default processTasks; diff --git a/migrations/users/account-transfer.js b/migrations/users/account-transfer.js index 42a9602aa1..439858fedc 100644 --- a/migrations/users/account-transfer.js +++ b/migrations/users/account-transfer.js @@ -8,29 +8,30 @@ let authorUuid = ''; // ... own data is done * This migraition will copy user data from prod to test */ -const monk = require('monk'); +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies + const connectionString = ''; const Users = monk(connectionString).get('users', { castIds: false }); -module.exports = async function accountTransfer () { +export default async function accountTransfer () { const fromAccountId = ''; const toAccountId = ''; - const fromAccount = await Users.findOne({_id: fromAccountId}); - const toAccount = await Users.findOne({_id: toAccountId}); + const fromAccount = await Users.findOne({ _id: fromAccountId }); + const toAccount = await Users.findOne({ _id: toAccountId }); - const newMounts = Object.assign({}, fromAccount.items.mounts, toAccount.items.mounts); - const newPets = Object.assign({}, fromAccount.items.pets, toAccount.items.pets); - const newBackgrounds = Object.assign({}, fromAccount.purchased.background, toAccount.purchased.background); + const newMounts = { ...fromAccount.items.mounts, ...toAccount.items.mounts }; + const newPets = { ...fromAccount.items.pets, ...toAccount.items.pets }; + const newBackgrounds = { ...fromAccount.purchased.background, ...toAccount.purchased.background }; - await Users.update({_id: toAccountId}, { + await Users.update({ _id: toAccountId }, { $set: { 'items.pets': newPets, 'items.mounts': newMounts, 'purchased.background': newBackgrounds, }, }) - .then((result) => { + .then(result => { console.log(result); }); -}; +} diff --git a/migrations/users/achievement-restore.js b/migrations/users/achievement-restore.js index 45e7866398..e603a0f330 100644 --- a/migrations/users/achievement-restore.js +++ b/migrations/users/achievement-restore.js @@ -8,7 +8,8 @@ const authorUuid = ''; // ... own data is done * This migraition will copy user data from prod to test */ -const monk = require('monk'); +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies + const connectionString = 'mongodb://localhost/new-habit'; const Users = monk(connectionString).get('users', { castIds: false }); @@ -19,15 +20,17 @@ function getAchievementUpdate (newUser, oldUser) { const oldAchievements = oldUser.achievements; const newAchievements = newUser.achievements; - let achievementsUpdate = Object.assign({}, newAchievements); + const achievementsUpdate = { ...newAchievements }; // ultimateGearSets if (!achievementsUpdate.ultimateGearSets && oldAchievements.ultimateGearSets) { achievementsUpdate.ultimateGearSets = oldAchievements.ultimateGearSets; } else if (oldAchievements.ultimateGearSets) { - for (let index in oldAchievements.ultimateGearSets) { - if (oldAchievements.ultimateGearSets[index]) achievementsUpdate.ultimateGearSets[index] = true; - } + Object.keys(oldAchievements.ultimateGearSets).forEach(index => { + if (oldAchievements.ultimateGearSets[index]) { + achievementsUpdate.ultimateGearSets[index] = true; + } + }); } // challenges @@ -37,57 +40,57 @@ function getAchievementUpdate (newUser, oldUser) { // Quests if (!achievementsUpdate.quests) achievementsUpdate.quests = {}; - for (let index in oldAchievements.quests) { + Object.keys(oldAchievements.quests).forEach(index => { if (!achievementsUpdate.quests[index]) { achievementsUpdate.quests[index] = oldAchievements.quests[index]; } else { achievementsUpdate.quests[index] += oldAchievements.quests[index]; } - } + }); // Rebirth level if (achievementsUpdate.rebirthLevel) { - achievementsUpdate.rebirthLevel = Math.max(achievementsUpdate.rebirthLevel, oldAchievements.rebirthLevel); + achievementsUpdate.rebirthLevel = Math.max( + achievementsUpdate.rebirthLevel, oldAchievements.rebirthLevel, + ); } else if (oldAchievements.rebirthLevel) { achievementsUpdate.rebirthLevel = oldAchievements.rebirthLevel; } // All others const indexsToIgnore = ['ultimateGearSets', 'challenges', 'quests', 'rebirthLevel']; - for (let index in oldAchievements) { - if (indexsToIgnore.indexOf(index) !== -1) continue; // eslint-disable-line no-continue + Object.keys(oldAchievements).forEach(index => { + if (indexsToIgnore.indexOf(index) !== -1) return; - if (!achievementsUpdate[index]) { + if (!achievementsUpdate[index]) { achievementsUpdate[index] = oldAchievements[index]; - continue; // eslint-disable-line no-continue + return; } if (Number.isInteger(oldAchievements[index])) { achievementsUpdate[index] += oldAchievements[index]; } else if (oldAchievements[index] === true) achievementsUpdate[index] = true; - } + }); return achievementsUpdate; } -module.exports = async function achievementRestore () { +export default async function achievementRestore () { const userIds = [ ]; - /* eslint-disable no-await-in-loop */ - for (let index in userIds) { - const userId = userIds[index]; - const oldUser = await UsersOld.findOne({_id: userId}, 'achievements'); - const newUser = await Users.findOne({_id: userId}, 'achievements'); + await Promise.all(userIds.map(userId => (async () => { + const oldUser = await UsersOld.findOne({ _id: userId }, 'achievements'); + const newUser = await Users.findOne({ _id: userId }, 'achievements'); const achievementUpdate = getAchievementUpdate(newUser, oldUser); await Users.update( - {_id: userId}, + { _id: userId }, { $set: { achievements: achievementUpdate, }, - }); + }, + ); console.log(`Updated ${userId}`); - /* eslint-enable no-await-in-loop */ - } -}; + })())); +} diff --git a/migrations/users/bulk-email.js b/migrations/users/bulk-email.js index adba28f805..88f67e095f 100644 --- a/migrations/users/bulk-email.js +++ b/migrations/users/bulk-email.js @@ -1,8 +1,9 @@ /* eslint-disable no-console */ -import { sendTxn } from '../../website/server/libs/email'; -import { model as User } from '../../website/server/models/user'; import moment from 'moment'; import nconf from 'nconf'; +import { sendTxn } from '../../website/server/libs/email'; +import { model as User } from '../../website/server/models/user'; + const BASE_URL = nconf.get('BASE_URL'); const EMAIL_SLUG = 'mandrill-email-slug'; // Set email template to send const MIGRATION_NAME = 'bulk-email'; @@ -11,23 +12,23 @@ const progressCount = 1000; let count = 0; async function updateUser (user) { - count++; + count += 1; if (count % progressCount === 0) console.warn(`${count} ${user._id}`); sendTxn( user, EMAIL_SLUG, - [{name: 'BASE_URL', content: BASE_URL}] // Add variables from template + [{ name: 'BASE_URL', content: BASE_URL }], // Add variables from template ); - return await User.update({_id: user._id}, {$set: {migration: MIGRATION_NAME}}).exec(); + return User.update({ _id: user._id }, { $set: { migration: MIGRATION_NAME } }).exec(); } -module.exports = async function processUsers () { - let query = { - migration: {$ne: MIGRATION_NAME}, - 'auth.timestamps.loggedin': {$gt: moment().subtract(2, 'weeks').toDate()}, // customize or remove to target different populations +export default async function processUsers () { + const query = { + migration: { $ne: MIGRATION_NAME }, + 'auth.timestamps.loggedin': { $gt: moment().subtract(2, 'weeks').toDate() }, // customize or remove to target different populations }; const fields = { @@ -41,7 +42,7 @@ module.exports = async function processUsers () { const users = await User // eslint-disable-line no-await-in-loop .find(query) .limit(250) - .sort({_id: 1}) + .sort({ _id: 1 }) .select(fields) .lean() .exec(); @@ -58,4 +59,4 @@ module.exports = async function processUsers () { await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop } -}; +} diff --git a/migrations/users/full-stable.js b/migrations/users/full-stable.js index f41f76f359..b53bef26a9 100644 --- a/migrations/users/full-stable.js +++ b/migrations/users/full-stable.js @@ -1,11 +1,12 @@ /* eslint-disable no-console */ -const MIGRATION_NAME = 'full-stable'; import each from 'lodash/each'; import keys from 'lodash/keys'; import content from '../../website/common/script/content/index'; import { model as User } from '../../website/server/models/user'; +const MIGRATION_NAME = 'full-stable'; + const progressCount = 1000; let count = 0; @@ -14,45 +15,45 @@ let count = 0; */ async function updateUser (user) { - count++; + count += 1; const set = {}; set.migration = MIGRATION_NAME; - each(keys(content.pets), (pet) => { + each(keys(content.pets), pet => { set[`items.pets.${pet}`] = 5; }); - each(keys(content.premiumPets), (pet) => { + each(keys(content.premiumPets), pet => { set[`items.pets.${pet}`] = 5; }); - each(keys(content.questPets), (pet) => { + each(keys(content.questPets), pet => { set[`items.pets.${pet}`] = 5; }); - each(keys(content.specialPets), (pet) => { + each(keys(content.specialPets), pet => { set[`items.pets.${pet}`] = 5; }); - each(keys(content.mounts), (mount) => { + each(keys(content.mounts), mount => { set[`items.mounts.${mount}`] = true; }); - each(keys(content.premiumMounts), (mount) => { + each(keys(content.premiumMounts), mount => { set[`items.mounts.${mount}`] = true; }); - each(keys(content.questMounts), (mount) => { + each(keys(content.questMounts), mount => { set[`items.mounts.${mount}`] = true; }); - each(keys(content.specialMounts), (mount) => { + each(keys(content.specialMounts), mount => { set[`items.mounts.${mount}`] = true; }); if (count % progressCount === 0) console.warn(`${count} ${user._id}`); - return await User.update({_id: user._id}, {$set: set}).exec(); + return User.update({ _id: user._id }, { $set: set }).exec(); } -module.exports = async function processUsers () { - let query = { - migration: {$ne: MIGRATION_NAME}, +export default async function processUsers () { + const query = { + migration: { $ne: MIGRATION_NAME }, 'auth.local.username': 'olson22', }; @@ -64,7 +65,7 @@ module.exports = async function processUsers () { const users = await User // eslint-disable-line no-await-in-loop .find(query) .limit(250) - .sort({_id: 1}) + .sort({ _id: 1 }) .select(fields) .lean() .exec(); @@ -81,4 +82,4 @@ module.exports = async function processUsers () { await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop } -}; +} diff --git a/migrations/users/mystery-items.js b/migrations/users/mystery-items.js index d44743e14c..51c1a4e8ed 100644 --- a/migrations/users/mystery-items.js +++ b/migrations/users/mystery-items.js @@ -1,14 +1,15 @@ /* eslint-disable no-console */ -const MIGRATION_NAME = 'mystery_items_201909'; -const MYSTERY_ITEMS = ['armor_mystery_201909', 'head_mystery_201909']; import { model as User } from '../../website/server/models/user'; import { model as UserNotification } from '../../website/server/models/userNotification'; +const MIGRATION_NAME = 'mystery_items_201910'; +const MYSTERY_ITEMS = ['armor_mystery_201910', 'head_mystery_201910']; + const progressCount = 1000; let count = 0; async function updateUser (user) { - count++; + count += 1; const addToSet = { 'purchased.plan.mysteryItems': { @@ -29,12 +30,12 @@ async function updateUser (user) { if (count % progressCount === 0) console.warn(`${count} ${user._id}`); - return await User.update({_id: user._id}, {$set: set, $push: push, $addToSet: addToSet}).exec(); + return User.update({ _id: user._id }, { $set: set, $push: push, $addToSet: addToSet }).exec(); } -module.exports = async function processUsers () { - let query = { - migration: {$ne: MIGRATION_NAME}, +export default async function processUsers () { + const query = { + migration: { $ne: MIGRATION_NAME }, 'purchased.plan.customerId': { $ne: null }, $or: [ { 'purchased.plan.dateTerminated': { $gte: new Date() } }, @@ -51,7 +52,7 @@ module.exports = async function processUsers () { const users = await User // eslint-disable-line no-await-in-loop .find(query) .limit(250) - .sort({_id: 1}) + .sort({ _id: 1 }) .select(fields) .lean() .exec(); @@ -68,4 +69,4 @@ module.exports = async function processUsers () { await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop } -}; +} diff --git a/migrations/users/pi-day.js b/migrations/users/pi-day.js index a954ba4b5a..d1c9ed972f 100644 --- a/migrations/users/pi-day.js +++ b/migrations/users/pi-day.js @@ -1,14 +1,15 @@ /* eslint-disable no-console */ -const MIGRATION_NAME = '20190314_pi_day'; import { v4 as uuid } from 'uuid'; import { model as User } from '../../website/server/models/user'; +const MIGRATION_NAME = '20190314_pi_day'; + const progressCount = 1000; let count = 0; async function updateUser (user) { - count++; + count *= 1; const inc = { 'items.food.Pie_Skeleton': 1, @@ -29,19 +30,21 @@ async function updateUser (user) { set['items.gear.owned.head_special_piDay'] = false; set['items.gear.owned.shield_special_piDay'] = false; const push = [ - {type: 'marketGear', path: 'gear.flat.head_special_piDay', _id: uuid()}, - {type: 'marketGear', path: 'gear.flat.shield_special_piDay', _id: uuid()}, + { type: 'marketGear', path: 'gear.flat.head_special_piDay', _id: uuid() }, + { type: 'marketGear', path: 'gear.flat.shield_special_piDay', _id: uuid() }, ]; if (count % progressCount === 0) console.warn(`${count} ${user._id}`); - return await User.update({_id: user._id}, {$inc: inc, $set: set, $push: {pinnedItems: {$each: push}}}).exec(); + return User + .update({ _id: user._id }, { $inc: inc, $set: set, $push: { pinnedItems: { $each: push } } }) + .exec(); } -module.exports = async function processUsers () { - let query = { - migration: {$ne: MIGRATION_NAME}, - 'auth.timestamps.loggedin': {$gt: new Date('2019-02-15')}, +export default async function processUsers () { + const query = { + migration: { $ne: MIGRATION_NAME }, + 'auth.timestamps.loggedin': { $gt: new Date('2019-02-15') }, }; const fields = { @@ -53,7 +56,7 @@ module.exports = async function processUsers () { const users = await User // eslint-disable-line no-await-in-loop .find(query) .limit(250) - .sort({_id: 1}) + .sort({ _id: 1 }) .select(fields) .lean() .exec(); @@ -70,4 +73,4 @@ module.exports = async function processUsers () { await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop } -}; +} diff --git a/migrations/users/remove-social-users-extra-data.js b/migrations/users/remove-social-users-extra-data.js index b57a5c3ec3..ba61ad4306 100644 --- a/migrations/users/remove-social-users-extra-data.js +++ b/migrations/users/remove-social-users-extra-data.js @@ -1,3 +1,5 @@ +import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies + const migrationName = 'remove-social-users-extra-data.js'; const authorName = 'paglias'; // in case script author needs to know when their ... const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is done @@ -7,13 +9,13 @@ const authorUuid = 'ed4c688c-6652-4a92-9d03-a5a79844174a'; // ... own data is do */ const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE -const monk = require('monk'); + const dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { // specify a query to limit the affected users (empty for all users): - let query = { - migration: {$ne: migrationName}, + const query = { + migration: { $ne: migrationName }, $or: [ { 'auth.facebook.id': { $exists: true } }, { 'auth.google.id': { $exists: true } }, @@ -27,28 +29,28 @@ function processUsers (lastId) { } dbUsers.find(query, { - sort: {_id: 1}, + sort: { _id: 1 }, limit: 250, }) .then(updateUsers) - .catch((err) => { + .catch(err => { console.log(err); - return exiting(1, `ERROR! ${ err}`); + return exiting(1, `ERROR! ${err}`); }); } -let progressCount = 1000; +const progressCount = 1000; let count = 0; function updateUsers (users) { if (!users || users.length === 0) { console.warn('All appropriate users found and modified.'); displayData(); - return; + return null; } - let userPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; + const userPromises = users.map(updateUser); + const lastUser = users[users.length - 1]; return Promise.all(userPromises) .then(() => { @@ -57,7 +59,7 @@ function updateUsers (users) { } function updateUser (user) { - count++; + count *= 1; const isFacebook = user.auth.facebook && user.auth.facebook.id; const isGoogle = user.auth.google && user.auth.google.id; @@ -82,28 +84,29 @@ function updateUser (user) { _id: user._id, }, update); - if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); - if (user._id === authorUuid) console.warn(`${authorName } processed`); + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + if (user._id === authorUuid) console.warn(`${authorName} processed`); } function displayData () { - console.warn(`\n${ count } users processed\n`); + console.warn(`\n${count} users processed\n`); return exiting(0); } function exiting (code, msg) { - code = code || 0; // 0 = success + // 0 = success + code = code || 0; // eslint-disable-line no-param-reassign if (code && !msg) { - msg = 'ERROR!'; + msg = 'ERROR!'; // eslint-disable-line no-param-reassign } if (msg) { if (code) { console.error(msg); - } else { + } else { console.log(msg); } } process.exit(code); } -module.exports = processUsers; +export default processUsers; diff --git a/migrations/users/take-this.js b/migrations/users/take-this.js index 6d990b79f3..d23b72abdd 100644 --- a/migrations/users/take-this.js +++ b/migrations/users/take-this.js @@ -1,14 +1,15 @@ /* eslint-disable no-console */ -const MIGRATION_NAME = '20181203_take_this'; import { v4 as uuid } from 'uuid'; import { model as User } from '../../website/server/models/user'; +const MIGRATION_NAME = '20181203_take_this'; + const progressCount = 1000; let count = 0; async function updateUser (user) { - count++; + count += 1; const set = {}; let push; @@ -19,36 +20,35 @@ async function updateUser (user) { push = false; } else if (typeof user.items.gear.owned.body_special_takeThis !== 'undefined') { set['items.gear.owned.back_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.back_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.back_special_takeThis', _id: uuid() } }; } else if (typeof user.items.gear.owned.head_special_takeThis !== 'undefined') { set['items.gear.owned.body_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.body_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.body_special_takeThis', _id: uuid() } }; } else if (typeof user.items.gear.owned.armor_special_takeThis !== 'undefined') { set['items.gear.owned.head_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.head_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.head_special_takeThis', _id: uuid() } }; } else if (typeof user.items.gear.owned.weapon_special_takeThis !== 'undefined') { set['items.gear.owned.armor_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.armor_special_takeThis', _id: uuid() } }; } else if (typeof user.items.gear.owned.shield_special_takeThis !== 'undefined') { set['items.gear.owned.weapon_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.weapon_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.weapon_special_takeThis', _id: uuid() } }; } else { set['items.gear.owned.shield_special_takeThis'] = false; - push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.shield_special_takeThis', _id: uuid()}}; + push = { pinnedItems: { type: 'marketGear', path: 'gear.flat.shield_special_takeThis', _id: uuid() } }; } if (count % progressCount === 0) console.warn(`${count} ${user._id}`); if (push) { - return await User.update({_id: user._id}, {$set: set, $push: push}).exec(); - } else { - return await User.update({_id: user._id}, {$set: set}).exec(); + return User.update({ _id: user._id }, { $set: set, $push: push }).exec(); } + return User.update({ _id: user._id }, { $set: set }).exec(); } -module.exports = async function processUsers () { - let query = { - migration: {$ne: MIGRATION_NAME}, +export default async function processUsers () { + const query = { + migration: { $ne: MIGRATION_NAME }, challenges: '00708425-d477-41a5-bf27-6270466e7976', }; @@ -61,7 +61,7 @@ module.exports = async function processUsers () { const users = await User // eslint-disable-line no-await-in-loop .find(query) .limit(250) - .sort({_id: 1}) + .sort({ _id: 1 }) .select(fields) .lean() .exec(); @@ -78,4 +78,4 @@ module.exports = async function processUsers () { await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop } -}; +} diff --git a/migrations/users/users-to-test.js b/migrations/users/users-to-test.js index cf9f4cc92f..7af950c68c 100644 --- a/migrations/users/users-to-test.js +++ b/migrations/users/users-to-test.js @@ -1,3 +1,4 @@ +/* eslint-disable import/no-commonjs */ /* let migrationName = 'UserFromProdToTest'; let authorName = 'TheHollidayInn'; // in case script author needs to know when their ... @@ -8,22 +9,24 @@ let authorUuid = ''; // ... own data is done * This migraition will copy user data from prod to test */ -let monk = require('monk'); -let testConnectionSting = ''; // FOR TEST DATABASE -let usersTest = monk(testConnectionSting).get('users', { castIds: false }); -let groupsTest = monk(testConnectionSting).get('groups', { castIds: false }); -let challengesTest = monk(testConnectionSting).get('challenges', { castIds: false }); -let tasksTest = monk(testConnectionSting).get('tasks', { castIds: false }); - -let monk2 = require('monk'); -let liveConnectString = ''; // FOR TEST DATABASE -let userLive = monk2(liveConnectString).get('users', { castIds: false }); -let groupsLive = monk2(liveConnectString).get('groups', { castIds: false }); -let challengesLive = monk2(liveConnectString).get('challenges', { castIds: false }); -let tasksLive = monk2(liveConnectString).get('tasks', { castIds: false }); - import uniq from 'lodash/uniq'; +const monk = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const testConnectionSting = ''; // FOR TEST DATABASE +const usersTest = monk(testConnectionSting).get('users', { castIds: false }); +const groupsTest = monk(testConnectionSting).get('groups', { castIds: false }); +const challengesTest = monk(testConnectionSting).get('challenges', { castIds: false }); +const tasksTest = monk(testConnectionSting).get('tasks', { castIds: false }); + +const monk2 = require('monk'); // eslint-disable-line import/no-extraneous-dependencies + +const liveConnectString = ''; // FOR TEST DATABASE +const userLive = monk2(liveConnectString).get('users', { castIds: false }); +const groupsLive = monk2(liveConnectString).get('groups', { castIds: false }); +const challengesLive = monk2(liveConnectString).get('challenges', { castIds: false }); +const tasksLive = monk2(liveConnectString).get('tasks', { castIds: false }); + // Variabls for updating /* let userIds = [ @@ -36,11 +39,11 @@ let challengeIds = []; let tasksIds = []; async function processUsers () { - let userPromises = []; + const userPromises = []; // {_id: {$in: userIds}} - return userLive.find({guilds: 'b0764d64-8276-45a1-afa5-5ca9a5c64ca0'}) - .each((user) => { + return userLive.find({ guilds: 'b0764d64-8276-45a1-afa5-5ca9a5c64ca0' }) + .each(user => { if (user.guilds.length > 0) groupIds = groupIds.concat(user.guilds); if (user.party._id) groupIds.push(user.party._id); if (user.challenges.length > 0) challengeIds = challengeIds.concat(user.challenges); @@ -49,64 +52,56 @@ async function processUsers () { if (user.tasksOrder.dailys.length > 0) tasksIds = tasksIds.concat(user.tasksOrder.dailys); if (user.tasksOrder.habits.length > 0) tasksIds = tasksIds.concat(user.tasksOrder.habits); - let userPromise = usersTest.update({_id: user._id}, user, {upsert: true}); + const userPromise = usersTest.update({ _id: user._id }, user, { upsert: true }); userPromises.push(userPromise); - }).then(() => { - return Promise.all(userPromises); - }) + }).then(() => Promise.all(userPromises)) .then(() => { console.log('Done User'); }); } function processGroups () { - let promises = []; - let groupsToQuery = uniq(groupIds); - return groupsLive.find({_id: {$in: groupsToQuery}}) - .each((group) => { - let promise = groupsTest.update({_id: group._id}, group, {upsert: true}); + const promises = []; + const groupsToQuery = uniq(groupIds); + return groupsLive.find({ _id: { $in: groupsToQuery } }) + .each(group => { + const promise = groupsTest.update({ _id: group._id }, group, { upsert: true }); promises.push(promise); - }).then(() => { - return Promise.all(promises); - }) + }).then(() => Promise.all(promises)) .then(() => { console.log('Done Group'); }); } function processChallenges () { - let promises = []; - let challengesToQuery = uniq(challengeIds); - return challengesLive.find({_id: {$in: challengesToQuery}}) - .each((challenge) => { - let promise = challengesTest.update({_id: challenge._id}, challenge, {upsert: true}); + const promises = []; + const challengesToQuery = uniq(challengeIds); + return challengesLive.find({ _id: { $in: challengesToQuery } }) + .each(challenge => { + const promise = challengesTest.update({ _id: challenge._id }, challenge, { upsert: true }); promises.push(promise); - }).then(() => { - return Promise.all(promises); - }) + }).then(() => Promise.all(promises)) .then(() => { console.log('Done Challenge'); }); } function processTasks () { - let promises = []; - let tasksToQuery = uniq(tasksIds); - return tasksLive.find({_id: {$in: tasksToQuery}}) - .each((task) => { - let promise = tasksTest.update({_id: task._id}, task, {upsert: true}); + const promises = []; + const tasksToQuery = uniq(tasksIds); + return tasksLive.find({ _id: { $in: tasksToQuery } }) + .each(task => { + const promise = tasksTest.update({ _id: task._id }, task, { upsert: true }); promises.push(promise); - }).then(() => { - return Promise.all(promises); - }) + }).then(() => Promise.all(promises)) .then(() => { console.log('Done Tasks'); }); } -module.exports = async function prodToTest () { +export default async function prodToTest () { await processUsers(); await processGroups(); await processChallenges(); await processTasks(); -}; +} diff --git a/migrations/utils/connect.js b/migrations/utils/connect.js index 1b20d523ca..54256a773c 100644 --- a/migrations/utils/connect.js +++ b/migrations/utils/connect.js @@ -1,6 +1,5 @@ -'use strict'; - -const MongoClient = require('mongodb').MongoClient; +/* eslint-disable import/no-commonjs */ +const { MongoClient } = require('mongodb'); // eslint-disable-line import/no-extraneous-dependencies const logger = require('./logger'); let dbConnection; @@ -17,7 +16,7 @@ function connectToDb (dbUri) { logger.success(`Connected to ${dbUri}`); - resolve(database); + return resolve(database); }); }); } diff --git a/migrations/utils/logger.js b/migrations/utils/logger.js index cf6d643e76..baabeb3301 100644 --- a/migrations/utils/logger.js +++ b/migrations/utils/logger.js @@ -1,10 +1,11 @@ -'use strict'; - -const chalk = require('chalk'); +/* eslint-disable import/no-commonjs */ +const chalk = require('chalk'); // eslint-disable-line import/no-extraneous-dependencies function loggerGenerator (type, color) { return function logger () { - let args = Array.from(arguments).map(arg => chalk[color](arg)); + const args = Array + .from(arguments) // eslint-disable-line prefer-rest-params + .map(arg => chalk[color](arg)); console[type].apply(null, args); }; } diff --git a/migrations/utils/timer.js b/migrations/utils/timer.js index cacdfc1b8b..1fbed1cf8b 100644 --- a/migrations/utils/timer.js +++ b/migrations/utils/timer.js @@ -1,30 +1,30 @@ -'use strict'; - -let logger = require('./logger'); +/* eslint-disable import/no-commonjs */ +const logger = require('./logger'); class Timer { - constructor (options) { - options = options || {}; - let warningThreshold = options.minutesWarningThreshold || 10; + constructor (options = {}) { + const warningThreshold = options.minutesWarningThreshold || 10; this.count = 0; this._minutesWarningThreshold = warningThreshold * 60; if (!options.disableAutoStart) this.start(); } + start () { this._internalTimer = setInterval(() => { - this.count++; + this.count *= 1; - let shouldWarn = this._minutesWarningThreshold < this.count; - let logStyle = shouldWarn ? 'error' : 'warn'; - let dangerMessage = shouldWarn ? 'DANGER: ' : ''; + const shouldWarn = this._minutesWarningThreshold < this.count; + const logStyle = shouldWarn ? 'error' : 'warn'; + const dangerMessage = shouldWarn ? 'DANGER: ' : ''; if (this.count % 30 === 0) { logger[logStyle](`${dangerMessage}Process has been running for`, this.count / 60, 'minutes'); } }, 1000); } + stop () { if (!this._internalTimer) { throw new Error('Timer has not started'); diff --git a/migrations/utils/unique.js b/migrations/utils/unique.js index 0d222145c3..61f9c9517a 100644 --- a/migrations/utils/unique.js +++ b/migrations/utils/unique.js @@ -1,5 +1,4 @@ -'use strict'; - +/* eslint-disable import/no-commonjs */ function unique (array) { return Array.from(new Set(array)); } diff --git a/package-lock.json b/package-lock.json index 01c7464f85..fb43bf744c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,150 +1,2514 @@ { "name": "habitica", - "version": "4.116.2", + "version": "4.118.0", "lockfileVersion": 1, "requires": true, "dependencies": { - "@amplitude/ua-parser-js": { - "version": "0.7.20", - "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.20.tgz", - "integrity": "sha512-bmW++BLt1Hg+4HCExLXP+0Jhgy2eTsEevqkVc5o4yYbgwdP/gV3gEQXzyVrMVlWWNLgph/tFIkf5PVlSpCELEg==" - }, "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, "requires": { - "@babel/highlight": "7.0.0-beta.44" + "@babel/highlight": "^7.0.0" } }, - "@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "@babel/core": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", + "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", + "dev": true, "requires": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.4", + "@babel/helpers": "^7.6.2", + "@babel/parser": "^7.6.4", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.3", + "@babel/types": "^7.6.3", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" }, "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==" - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==" + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", + "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "dev": true, + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", + "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", + "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", + "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "dev": true, + "requires": { + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", + "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/preset-env": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", + "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.6.2", + "@babel/types": "^7.6.3", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/register": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.6.2.tgz", + "integrity": "sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "@google-cloud/common": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.2.2.tgz", - "integrity": "sha512-AgMdDgLeYlEG17tXtMCowE7mplm907pcugtfJYYAp06HNe9RDnunUIY5KMnn9yikYl7NXNofARC+hwG77Zsa4g==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.2.3.tgz", + "integrity": "sha512-lvw54mGKn8VqVIy2NzAk0l5fntBFX4UwQhHk6HaqkyCQ7WBl5oz4XhzKMtMilozF/3ObPcDogqwuyEWyZ6rnQQ==", "requires": { "@google-cloud/projectify": "^1.0.0", "@google-cloud/promisify": "^1.0.0", @@ -152,7 +2516,7 @@ "duplexify": "^3.6.0", "ent": "^2.2.0", "extend": "^3.0.2", - "google-auth-library": "^5.0.0", + "google-auth-library": "^5.5.0", "retry-request": "^4.0.0", "teeny-request": "^5.2.1" } @@ -168,17 +2532,17 @@ "integrity": "sha512-7WfV4R/3YV5T30WRZW0lqmvZy9hE2/p9MvpI34WuKa2Wz62mLu5XplGTFEMK6uTbJCLWUxTcZ4J4IyClKucE5g==" }, "@google-cloud/trace-agent": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-4.2.0.tgz", - "integrity": "sha512-JP+dvjzwhenwyyJRFHuREvJEfw0hWVeT6awD5bSgy5Z6sT1utyGIt34Dn8oSWYlgwOFxZWtqQOWX0geN/2W2pw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-4.2.2.tgz", + "integrity": "sha512-L1AvE07Toub6Bt1pLeW47dLzPEyjwWCKrcNx4CCYAbQpMWPZEMl5DHMrs7r8d6eX4TQdZz/vvzDiG5RmS/eL4w==", "requires": { "@google-cloud/common": "^2.0.0", - "@opencensus/propagation-stackdriver": "0.0.17", + "@opencensus/propagation-stackdriver": "0.0.18", "builtin-modules": "^3.0.0", "console-log-level": "^1.4.0", "continuation-local-storage": "^3.2.1", "extend": "^3.0.2", - "gcp-metadata": "^2.0.0", + "gcp-metadata": "^3.0.0", "hex2dec": "^1.0.1", "is": "^3.2.0", "methods": "^1.1.1", @@ -190,42 +2554,32 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.2.tgz", - "integrity": "sha512-wrIBsjA5pl13f0RN4Zx4FNWmU71lv03meGKnqRUoCyan17s4V3WL92f3w3AIuWbNnpcrQyFBU5qMavJoB8d27w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "requires": { - "@nodelib/fs.stat": "2.0.2", + "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.2.tgz", - "integrity": "sha512-z8+wGWV2dgUhLqrtRYa03yDx4HWMvXKi1z8g3m2JyxAx8F7xk74asqPk5LAETjqDSGLFML/6CDl0+yFunSYicw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" }, "@nodelib/fs.walk": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.3.tgz", - "integrity": "sha512-l6t8xEhfK9Sa4YO5mIRdau7XSOADfmh3jCr0evNHdY+HNkW6xuQhgMH7D73VV6WpZOagrW0UludvMTiifiwTfA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "requires": { - "@nodelib/fs.scandir": "2.1.2", + "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" } }, - "@nuxt/opencollective": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.0.tgz", - "integrity": "sha512-Vf09BxCdj1iT2IRqVwX5snaY2WCTkvM0O4cWWSO1ThCFuc4if0Q/nNwAgCxRU0FeYHJ7DdyMUNSdswCLKlVqeg==", - "requires": { - "chalk": "^2.4.2", - "consola": "^2.10.1", - "node-fetch": "^2.6.0" - } - }, "@opencensus/core": { - "version": "0.0.17", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.17.tgz", - "integrity": "sha512-cFaS72oQmZJZdTEFOnHEopOVbgYbyVC0kaVt2IDNgjZV6cuKxTyWEKCLEAW8/VdWPz2MnflJZfeE0cRXQ1AB0g==", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.18.tgz", + "integrity": "sha512-PgRQXLyb3bLi8Z6pQct9erYFRdnYAZNQXAEVPf6Xq6IMkZaH20wiOTNNPxEckjI31mq5utgstAbwOn4gJiPjBQ==", "requires": { "continuation-local-storage": "^3.2.1", "log-driver": "^1.2.7", @@ -235,11 +2589,11 @@ } }, "@opencensus/propagation-stackdriver": { - "version": "0.0.17", - "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.17.tgz", - "integrity": "sha512-BoZIcYCIQVk317BWlJbiJPHvjx+nM5E3ptFn3ZsxAhYi2V6CdnsHgUGZzIUU0vv4Jtc8hj/VuieDRu8KNE6WZw==", + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@opencensus/propagation-stackdriver/-/propagation-stackdriver-0.0.18.tgz", + "integrity": "sha512-BLwfszIGAfqN2mqGf/atfEu84cWeoLM/YuXGfXDO1iDN2k5GXz4QFyhS8sz5l63HtsYuQqFuV+Ze7ZM0NvJp2A==", "requires": { - "@opencensus/core": "^0.0.17", + "@opencensus/core": "^0.0.18", "hex2dec": "^1.0.1", "uuid": "^3.2.1" } @@ -351,19 +2705,6 @@ "defer-to-connect": "^1.0.1" } }, - "@types/babel-types": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", - "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==" - }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "requires": { - "@types/babel-types": "*" - } - }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -385,24 +2726,15 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "12.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", - "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==" + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.1.tgz", + "integrity": "sha512-TJtwsqZ39pqcljJpajeoofYRfeZ7/I/OMUQ5pR4q5wOKf2ocrUvBAZUMhWsOvKx3dVc/aaV5GluBivt0sWqA5A==" }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "@vue/test-utils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz", - "integrity": "sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA==", - "dev": true, - "requires": { - "dom-event-types": "^1.0.0", - "lodash": "^4.17.4" - } + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "optional": true }, "abbrev": { "version": "1.1.1", @@ -427,53 +2759,15 @@ } }, "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "requires": { - "acorn": "^4.0.3" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, "agent-base": { @@ -495,46 +2789,6 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, "amazon-payments": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/amazon-payments/-/amazon-payments-0.2.7.tgz", @@ -653,11 +2907,6 @@ } } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, "amplitude": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/amplitude/-/amplitude-3.5.0.tgz", @@ -682,9 +2931,9 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "qs": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz", - "integrity": "sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==" + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", + "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" }, "superagent": { "version": "3.8.3", @@ -705,16 +2954,6 @@ } } }, - "amplitude-js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-5.2.2.tgz", - "integrity": "sha512-yAIkVs8MLD5n30LGCBpweQjz+vvARgwM71lfq8T/YyHGJWjxAzr13Ty1gM8E2HWanLtxtIPtlWT5K0OlH48u8A==", - "requires": { - "@amplitude/ua-parser-js": "0.7.20", - "blueimp-md5": "^2.10.0", - "query-string": "5" - } - }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", @@ -752,94 +2991,6 @@ } } }, - "ansi-bgblack": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", - "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgblue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", - "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgcyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", - "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bggreen": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", - "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgmagenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", - "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgred": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", - "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgwhite": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", - "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgyellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", - "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-black": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", - "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-blue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", - "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bold": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", - "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", @@ -848,26 +2999,14 @@ "ansi-wrap": "^0.1.0" } }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-dim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", - "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } }, "ansi-gray": { "version": "0.1.1", @@ -877,123 +3016,21 @@ "ansi-wrap": "0.1.0" } }, - "ansi-green": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", - "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-grey": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", - "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-hidden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", - "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-inverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", - "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-italic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", - "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-magenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", - "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "ansi-reset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", - "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-strikethrough": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", - "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "ansi-underline": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", - "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-white": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", - "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" }, - "ansi-yellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", - "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "any-base": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", @@ -1199,14 +3236,6 @@ "make-iterator": "^1.0.0" } }, - "arr-pluck": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/arr-pluck/-/arr-pluck-0.1.0.tgz", - "integrity": "sha1-+K1tcI+HkAiB4jr9gw1SKQp2Z3U=", - "requires": { - "arr-map": "^2.0.0" - } - }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", @@ -1238,6 +3267,16 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, "array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", @@ -1306,30 +3345,11 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrayify-compact": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/arrayify-compact/-/arrayify-compact-0.2.0.tgz", - "integrity": "sha1-RZFw4VXKErtRRISDnJ1xUHyA7E0=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1338,547 +3358,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assemble-core": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/assemble-core/-/assemble-core-0.25.0.tgz", - "integrity": "sha1-ZZF7/K+c1rFNm5HQMaDdmar0OWQ=", - "requires": { - "assemble-fs": "^0.6.0", - "assemble-render-file": "^0.7.1", - "assemble-streams": "^0.6.0", - "base-task": "^0.6.1", - "define-property": "^0.2.5", - "lazy-cache": "^2.0.1", - "templates": "^0.24.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "assemble-fs": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/assemble-fs/-/assemble-fs-0.6.0.tgz", - "integrity": "sha1-uky+t0tdG97m1SipZa07fZbe8Og=", - "requires": { - "assemble-handle": "^0.1.2", - "extend-shallow": "^2.0.1", - "is-valid-app": "^0.2.0", - "lazy-cache": "^2.0.1", - "stream-combiner": "^0.2.2", - "through2": "^2.0.1", - "vinyl-fs": "^2.4.3" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "requires": { - "extend-shallow": "^2.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - } - } - } - }, - "assemble-handle": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/assemble-handle/-/assemble-handle-0.1.4.tgz", - "integrity": "sha1-6De1uyPnXJsFJX2AfhYvaSzOIW4=", - "requires": { - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "assemble-loader": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/assemble-loader/-/assemble-loader-0.6.1.tgz", - "integrity": "sha1-0GmqZBhOFzKEP+HsGAghI1dpVdg=", - "requires": { - "extend-shallow": "^2.0.1", - "file-contents": "^0.2.4", - "fs-exists-sync": "^0.1.0", - "has-glob": "^0.1.1", - "is-registered": "^0.1.5", - "is-valid-glob": "^0.3.0", - "is-valid-instance": "^0.1.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "load-templates": "^0.11.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "assemble-render-file": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/assemble-render-file/-/assemble-render-file-0.7.2.tgz", - "integrity": "sha1-g6qV9e131ctK6oq8dPIkoVRVccY=", - "requires": { - "debug": "^2.2.0", - "is-valid-app": "^0.1.2", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "through2": "^2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "assemble-streams": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/assemble-streams/-/assemble-streams-0.6.0.tgz", - "integrity": "sha1-kOkhaoNpltJoNwvtrHG7MdjJq18=", - "requires": { - "assemble-handle": "^0.1.2", - "is-registered": "^0.1.4", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1", - "match-file": "^0.2.0", - "src-stream": "^0.1.1", - "through2": "^2.0.1" - }, - "dependencies": { - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assert-plus": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", @@ -1890,37 +3369,15 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "assign-deep": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/assign-deep/-/assign-deep-0.4.8.tgz", - "integrity": "sha512-uxqXJCnNZDEjPnsaLKVzmh/ST5+Pqoz0wi06HDfHKx1ASNpSbbvz2qW2Gl8ZyHwr5jnm11X2S5eMQaP1lMZmCg==", - "requires": { - "assign-symbols": "^0.1.1", - "is-primitive": "^2.0.0", - "kind-of": "^5.0.2" - }, - "dependencies": { - "assign-symbols": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-0.1.1.tgz", - "integrity": "sha1-ywJZRO9OyKNpPwhunhEsdOOg/tk=" - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==", + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "async": { @@ -1928,11 +3385,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, - "async-array-reduce": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", - "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=" - }, "async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", @@ -1949,25 +3401,6 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "async-helpers": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/async-helpers/-/async-helpers-0.3.17.tgz", - "integrity": "sha512-LfgCyvmK6ZiC7pyqOgli2zfkWL4HYbEb+HXvGgdmqVBgsOOtQz5rSF8Ii/H/1cNNtrfj1KsdZE/lUMeIY3Qcwg==", - "requires": { - "co": "^4.6.0", - "kind-of": "^6.0.0" - } - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -2007,24 +3440,10 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", - "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" - } - }, "aws-sdk": { - "version": "2.532.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.532.0.tgz", - "integrity": "sha512-+auGlLHZlcAJaJFV6kcacLteggSdN1YsalyiXoGnLhHZTBH/s9YAwHTUftYI4ifyD3fPESr/rpdceWe1m0U2Mw==", + "version": "2.556.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.556.0.tgz", + "integrity": "sha512-qILMUNl/a7FYWU67Y24OGsXFhyDHM4qYdplMR2tps/g17pN9bEQ5ijxvGzW2T8VVyAsTanmn+dFyl/CH38pC5Q==", "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -2077,20 +3496,17 @@ "version": "0.19.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, "requires": { "follow-redirects": "1.5.10", "is-buffer": "^2.0.2" } }, - "axios-progress-bar": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/axios-progress-bar/-/axios-progress-bar-1.2.0.tgz", - "integrity": "sha512-PEgWb/b2SMyHnKJ/cxA46OdCuNeVlo8eqL0HxXPtz+6G/Jtpyo49icPbW+jpO1wUeDEjbqpseMoCyWxESxf5pA==" - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -2101,6 +3517,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -2111,76 +3528,11 @@ } } }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==" - } - } - }, "babel-generator": { "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", @@ -2195,475 +3547,34 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { "babel-runtime": "^6.22.0" } }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "^0.5.6" - } - } + "object.assign": "^4.1.0" } }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -2672,7 +3583,8 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true } } }, @@ -2680,6 +3592,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", @@ -2692,6 +3605,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", @@ -2708,6 +3622,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -2715,7 +3630,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -2723,6 +3639,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -2733,7 +3650,8 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true }, "bach": { "version": "1.2.0", @@ -2751,12 +3669,6 @@ "now-and-later": "^2.0.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2812,2008 +3724,11 @@ } } }, - "base-argv": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/base-argv/-/base-argv-0.4.5.tgz", - "integrity": "sha1-BalXHNwnaUDeGW/8h07uuJnLED0=", - "requires": { - "arr-diff": "^2.0.0", - "arr-union": "^3.1.0", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "expand-args": "^0.4.1", - "extend-shallow": "^2.0.1", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-cli": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/base-cli/-/base-cli-0.5.0.tgz", - "integrity": "sha1-U+Zdjg9bKKoRBo/sjdTpXXLvPOg=", - "requires": { - "base-argv": "^0.4.2", - "base-config": "^0.5.2" - } - }, - "base-cli-process": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/base-cli-process/-/base-cli-process-0.1.19.tgz", - "integrity": "sha1-Mg08gVTfcQltSBgY52/m1+R5NjY=", - "requires": { - "arr-union": "^3.1.0", - "arrayify-compact": "^0.2.0", - "base-cli": "^0.5.0", - "base-cli-schema": "^0.1.19", - "base-config-process": "^0.1.9", - "base-cwd": "^0.3.4", - "base-option": "^0.8.4", - "base-pkg": "^0.2.4", - "debug": "^2.6.2", - "export-files": "^2.1.1", - "fs-exists-sync": "^0.1.0", - "is-valid-app": "^0.2.1", - "kind-of": "^3.1.0", - "lazy-cache": "^2.0.2", - "log-utils": "^0.2.1", - "merge-deep": "^3.0.0", - "mixin-deep": "^1.2.0", - "object.pick": "^1.2.0", - "pad-right": "^0.2.2", - "union-value": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-cli-schema": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/base-cli-schema/-/base-cli-schema-0.1.19.tgz", - "integrity": "sha1-gfQYL0zwu4NnHxF2PknLBbkugkE=", - "requires": { - "arr-flatten": "^1.0.1", - "array-unique": "^0.2.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "export-files": "^2.1.1", - "extend-shallow": "^2.0.1", - "falsey": "^0.3.0", - "fs-exists-sync": "^0.1.0", - "has-glob": "^0.1.1", - "has-value": "^0.3.1", - "kind-of": "^3.0.3", - "lazy-cache": "^2.0.1", - "map-schema": "^0.2.3", - "merge-deep": "^3.0.0", - "mixin-deep": "^1.1.3", - "resolve": "^1.1.7", - "tableize-object": "^0.1.0" - }, - "dependencies": { - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-compose": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/base-compose/-/base-compose-0.2.1.tgz", - "integrity": "sha1-reSal/WiRIvVa8s0C090aMb74tc=", - "requires": { - "copy-task": "^0.1.0", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "base-config": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/base-config/-/base-config-0.5.2.tgz", - "integrity": "sha1-q2A8AdExWL4uYux3/7Ix4o9Ijh8=", - "requires": { - "isobject": "^2.0.0", - "lazy-cache": "^1.0.3", - "map-config": "^0.5.0", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - } - } - }, - "base-config-process": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/base-config-process/-/base-config-process-0.1.9.tgz", - "integrity": "sha1-imOmGYnuY1UMyM/cP2wCdf2gtG4=", - "requires": { - "base-config": "^0.5.2", - "base-config-schema": "^0.1.18", - "base-cwd": "^0.3.4", - "base-option": "^0.8.4", - "debug": "^2.2.0", - "export-files": "^2.1.1", - "is-valid-app": "^0.2.0", - "lazy-cache": "^2.0.1", - "micromatch": "^2.3.10", - "mixin-deep": "^1.1.3" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-config-schema": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/base-config-schema/-/base-config-schema-0.1.24.tgz", - "integrity": "sha1-T74UvsVtwa7ef+3QaSjpGfhyH6k=", - "requires": { - "arr-flatten": "^1.0.3", - "array-unique": "^0.3.2", - "base-pkg": "^0.2.4", - "camel-case": "^3.0.0", - "debug": "^2.6.6", - "define-property": "^1.0.0", - "export-files": "^2.1.1", - "extend-shallow": "^2.0.1", - "has-glob": "^1.0.0", - "has-value": "^0.3.1", - "inflection": "^1.12.0", - "kind-of": "^3.2.0", - "lazy-cache": "^2.0.2", - "load-templates": "^1.0.2", - "map-schema": "^0.2.4", - "matched": "^0.4.4", - "mixin-deep": "^1.2.0", - "resolve": "^1.3.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "file-contents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-1.0.1.tgz", - "integrity": "sha1-ryW7/T00RjhPrYBmSdiAi8/uHsg=", - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "is-buffer": "^1.1.4", - "kind-of": "^3.1.0", - "lazy-cache": "^2.0.2", - "strip-bom-buffer": "^0.1.1", - "strip-bom-string": "^0.1.2", - "through2": "^2.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - } - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "requires": { - "is-glob": "^3.0.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "load-templates": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/load-templates/-/load-templates-1.0.2.tgz", - "integrity": "sha1-CfOOlcjvS/t4W9f8qOv9MrIwvIc=", - "requires": { - "extend-shallow": "^2.0.1", - "file-contents": "^1.0.0", - "glob-parent": "^3.1.0", - "is-glob": "^3.1.0", - "kind-of": "^3.1.0", - "lazy-cache": "^2.0.2", - "matched": "^0.4.4", - "vinyl": "^2.0.1" - } - }, - "matched": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", - "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", - "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "glob": "^7.0.5", - "has-glob": "^0.1.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "has-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", - "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", - "requires": { - "is-glob": "^2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "base-cwd": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/base-cwd/-/base-cwd-0.3.4.tgz", - "integrity": "sha1-TQCrY1CgRuGtSrnCMm2heUs+TwE=", - "requires": { - "empty-dir": "^0.2.0", - "find-pkg": "^0.1.2", - "is-valid-app": "^0.2.0" - } - }, - "base-data": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/base-data/-/base-data-0.6.2.tgz", - "integrity": "sha512-wH2ViG6CUO2AaeHSEt6fJTyQAk5gl0oY456DoSC5h8mnHrWUbvdctMCuF53CXgBmi0oalZQppKNH0iamG5+uqw==", - "requires": { - "arr-flatten": "^1.1.0", - "cache-base": "^1.0.0", - "extend-shallow": "^2.0.1", - "get-value": "^2.0.6", - "has-glob": "^1.0.0", - "has-value": "^1.0.0", - "is-registered": "^0.1.5", - "is-valid-app": "^0.3.0", - "kind-of": "^5.0.0", - "lazy-cache": "^2.0.2", - "merge-value": "^1.0.0", - "mixin-deep": "^1.2.0", - "read-file": "^0.2.0", - "resolve-glob": "^1.0.0", - "set-value": "^2.0.0", - "union-value": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "requires": { - "is-glob": "^3.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-valid-app": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.3.0.tgz", - "integrity": "sha1-eBBrdR88oyOF+0VJK/KUF7WZPIA=", - "requires": { - "debug": "^2.6.3", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.3.0", - "lazy-cache": "^2.0.2" - } - }, - "is-valid-instance": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.3.0.tgz", - "integrity": "sha1-9KxzAjxNTYubw7PsPmZjBRbijp4=", - "requires": { - "isobject": "^3.0.0", - "pascalcase": "^0.1.1" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-engines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/base-engines/-/base-engines-0.2.1.tgz", - "integrity": "sha1-aXgAyoq4iKM3iXONv6zLgYoqWns=", - "requires": { - "debug": "^2.2.0", - "define-property": "^0.2.5", - "engine-cache": "^0.19.0", - "is-valid-app": "^0.1.2", - "lazy-cache": "^2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-env": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/base-env/-/base-env-0.3.1.tgz", - "integrity": "sha512-/HxC8QV1m/bWqvjcu4WZl4Um1HRpTAjuY31uiFUEukXsXge4WIvNvGKG/gCs2PrpBFPCybowA406V/ivdPknpQ==", - "requires": { - "base-namespace": "^0.2.0", - "contains-path": "^0.1.0", - "debug": "^2.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "global-modules": "^0.2.2", - "is-absolute": "^0.2.5", - "is-valid-app": "^0.1.0", - "is-valid-instance": "^0.1.0", - "kind-of": "^3.0.3", - "os-homedir": "^1.0.1", - "resolve-file": "^0.3.0" - }, - "dependencies": { - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "requires": { - "is-unc-path": "^0.1.1" - } - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "requires": { - "unc-path-regex": "^0.1.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "resolve-file": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/resolve-file/-/resolve-file-0.3.0.tgz", - "integrity": "sha1-EeH7RkVm06fFAMt+lIHo8LAKFO8=", - "requires": { - "cwd": "^0.10.0", - "expand-tilde": "^2.0.2", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "homedir-polyfill": "^1.0.1", - "lazy-cache": "^2.0.2", - "resolve": "^1.2.0" - } - } - } - }, - "base-generators": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/base-generators/-/base-generators-0.4.6.tgz", - "integrity": "sha1-4amTYh5bRCr44MgRMVoyb5h8nqY=", - "requires": { - "async-each-series": "^1.1.0", - "base-compose": "^0.2.1", - "base-cwd": "^0.3.1", - "base-data": "^0.6.0", - "base-env": "^0.3.0", - "base-option": "^0.8.4", - "base-pkg": "^0.2.4", - "base-plugins": "^0.4.13", - "base-task": "^0.6.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "global-modules": "^0.2.2", - "is-valid-app": "^0.2.0", - "is-valid-instance": "^0.2.0", - "kind-of": "^3.0.3", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-helpers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base-helpers/-/base-helpers-0.1.1.tgz", - "integrity": "sha1-2k4eKy+ACOzc6T8R79223gYzP7M=", - "requires": { - "debug": "^2.2.0", - "define-property": "^0.2.5", - "is-valid-app": "^0.1.0", - "lazy-cache": "^2.0.1", - "load-helpers": "^0.2.11" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-namespace": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base-namespace/-/base-namespace-0.2.0.tgz", - "integrity": "sha1-RLLLumZ1Y8xE5trrTv5AO7CrPaA=", - "requires": { - "is-valid-app": "^0.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-option": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/base-option/-/base-option-0.8.4.tgz", - "integrity": "sha1-EUF/qSRPInpNU3tNKRcjRieH1cc=", - "requires": { - "define-property": "^0.2.5", - "get-value": "^2.0.6", - "is-valid-app": "^0.2.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "option-cache": "^3.4.0", - "set-value": "^0.3.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - } - } - }, - "base-pkg": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/base-pkg/-/base-pkg-0.2.5.tgz", - "integrity": "sha512-/POxajlgBhVsknwLXnqnbp//bAMh7SkDgHF+z/uoYnFqk46e05c3MxSEmn5vFCB8g4rHHKxAPLKrU/4Yb3vUdA==", - "requires": { - "cache-base": "^1.0.0", - "debug": "^2.6.8", - "define-property": "^1.0.0", - "expand-pkg": "^0.1.8", - "extend-shallow": "^2.0.1", - "is-valid-app": "^0.3.0", - "log-utils": "^0.2.1", - "pkg-store": "^0.2.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-valid-app": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.3.0.tgz", - "integrity": "sha1-eBBrdR88oyOF+0VJK/KUF7WZPIA=", - "requires": { - "debug": "^2.6.3", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.3.0", - "lazy-cache": "^2.0.2" - } - }, - "is-valid-instance": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.3.0.tgz", - "integrity": "sha1-9KxzAjxNTYubw7PsPmZjBRbijp4=", - "requires": { - "isobject": "^3.0.0", - "pascalcase": "^0.1.1" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-plugins": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/base-plugins/-/base-plugins-0.4.13.tgz", - "integrity": "sha1-kd8XjcN/hoQt6ihteeSPuGtarD0=", - "requires": { - "define-property": "^0.2.5", - "is-registered": "^0.1.5", - "isobject": "^2.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "base-questions": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/base-questions/-/base-questions-0.7.4.tgz", - "integrity": "sha1-9k+EgmHtbIKPSYPXgS9A0wN4IUY=", - "requires": { - "base-store": "^0.4.4", - "clone-deep": "^0.2.4", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "is-valid-app": "^0.2.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "question-store": "^0.11.0" - }, - "dependencies": { - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - } - } - }, - "base-routes": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/base-routes/-/base-routes-0.2.2.tgz", - "integrity": "sha1-CmFNFy1JBF2Mk4dxP4YN88QFNB4=", - "requires": { - "debug": "^2.2.0", - "en-route": "^0.7.5", - "is-valid-app": "^0.2.0", - "lazy-cache": "^2.0.1", - "template-error": "^0.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-runtimes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/base-runtimes/-/base-runtimes-0.2.0.tgz", - "integrity": "sha1-GI4+ZoJMyxWYsyh7TqW5NaG4UEU=", - "requires": { - "extend-shallow": "^2.0.1", - "is-valid-app": "^0.2.0", - "lazy-cache": "^2.0.1", - "log-utils": "^0.1.4", - "micromatch": "^2.3.10", - "time-diff": "^0.3.1" - }, - "dependencies": { - "ansi-colors": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.1.0.tgz", - "integrity": "sha1-M0rDbNPq1wjeXGnhmpjRhkImtD8=", - "requires": { - "ansi-bgblack": "^0.1.1", - "ansi-bgblue": "^0.1.1", - "ansi-bgcyan": "^0.1.1", - "ansi-bggreen": "^0.1.1", - "ansi-bgmagenta": "^0.1.1", - "ansi-bgred": "^0.1.1", - "ansi-bgwhite": "^0.1.1", - "ansi-bgyellow": "^0.1.1", - "ansi-black": "^0.1.1", - "ansi-blue": "^0.1.1", - "ansi-bold": "^0.1.1", - "ansi-cyan": "^0.1.1", - "ansi-dim": "^0.1.1", - "ansi-gray": "^0.1.1", - "ansi-green": "^0.1.1", - "ansi-grey": "^0.1.1", - "ansi-hidden": "^0.1.1", - "ansi-inverse": "^0.1.1", - "ansi-italic": "^0.1.1", - "ansi-magenta": "^0.1.1", - "ansi-red": "^0.1.1", - "ansi-reset": "^0.1.1", - "ansi-strikethrough": "^0.1.1", - "ansi-underline": "^0.1.1", - "ansi-white": "^0.1.1", - "ansi-yellow": "^0.1.1", - "lazy-cache": "^0.2.4" - }, - "dependencies": { - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "log-utils": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.1.5.tgz", - "integrity": "sha1-3g84+Vf0zW69Xctoddijua4HT3c=", - "requires": { - "ansi-colors": "^0.1.0", - "error-symbol": "^0.1.0", - "info-symbol": "^0.1.0", - "log-ok": "^0.1.1", - "success-symbol": "^0.1.0", - "time-stamp": "^1.0.1", - "warning-symbol": "^0.1.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, - "base-store": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/base-store/-/base-store-0.4.4.tgz", - "integrity": "sha1-JY32uKYu4G/xUADJSdD9fCi68mY=", - "requires": { - "data-store": "^0.16.0", - "debug": "^2.2.0", - "extend-shallow": "^2.0.1", - "is-registered": "^0.1.4", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1", - "project-name": "^0.2.5" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base-task": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/base-task/-/base-task-0.6.2.tgz", - "integrity": "sha1-Rn1guuBzezuJab/1f6RElJiZgcA=", - "requires": { - "composer": "^0.13.0", - "is-valid-app": "^0.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "is-valid-app": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", - "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.1.0", - "lazy-cache": "^2.0.1" - } - }, - "is-valid-instance": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", - "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, "base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -4844,31 +3759,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "bfj-node4": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.3.1.tgz", - "integrity": "sha512-SOmOsowQWfXc7ybFARsK3C4MCOWzERaOMV/Fl3Tgjs+5dJWyzo3oa127jL44eMbQiAN17J7SvAs2TRxEScTUmg==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "tryer": "^1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, "bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -4912,19 +3802,6 @@ "find-versions": "^3.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "optional": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -4939,18 +3816,6 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true } } }, @@ -5176,35 +4041,11 @@ "safe-buffer": "^5.1.1" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, - "blueimp-md5": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.12.0.tgz", - "integrity": "sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -5255,27 +4096,10 @@ "hoek": "2.x.x" } }, - "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" - }, - "bootstrap-vue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.2.tgz", - "integrity": "sha512-hbGJjc/om9JfVNUFK76dnh+YutlZdZlKbpWw6OE9gHTkmbwstP/KxxELpZZgK/4SYtdxUPt/6W1CvdaeT1bNvQ==", - "requires": { - "@nuxt/opencollective": "^0.3.0", - "bootstrap": ">=4.3.1 <5.0.0", - "popper.js": "^1.15.0", - "portal-vue": "^2.1.6", - "vue-functional-data-merge": "^3.1.0" - } - }, "bowser": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.5.4.tgz", - "integrity": "sha512-74GGwfc2nzYD19JCiA0RwCxdq7IY5jHeEaSrrgm/5kusEuK+7UK0qDG3gyzN47c4ViNyO4osaKtZE+aSV6nlpQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.7.0.tgz", + "integrity": "sha512-aIlMvstvu8x+34KEiOHD3AsBgdrzg6sxALYiukOWhFvGMbQI6TRP/iY0LMhUrHs56aD6P1G0Z7h45PUJaa5m9w==" }, "boxen": { "version": "1.3.0", @@ -5361,86 +4185,17 @@ } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "dev": true, "requires": { "caniuse-lite": "^1.0.30000989", "electron-to-chromium": "^1.3.247", @@ -5466,6 +4221,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "optional": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -5474,7 +4230,8 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "optional": true }, "buffer-crc32": { "version": "0.2.13", @@ -5494,34 +4251,19 @@ "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "optional": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, "builtin-modules": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -5571,42 +4313,18 @@ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "normalize-url": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.4.0.tgz", - "integrity": "sha512-R1TJlbt61ZWWfeTCjKjM67RyR5Ls8BABZPhNQ2sHCVEAUoC0B4CHakvBlx/y04x/U6oc336wyFSQwqnylcVnVw==" + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.4.1.tgz", + "integrity": "sha512-rjH3yRt0Ssx19mUwS0hrDUOdG9VI+oRLpLHJ7tXRdjcuQ7v7wo6qPvOZppHRrqfslTKr0L2yBhjj4UXd7c3cQg==" } } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -5633,37 +4351,11 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - } - } - }, - "caniuse-db": { - "version": "1.0.30000996", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000996.tgz", - "integrity": "sha512-WvzxMtKe5CCBUaTVBM/EjsoFXJf6f/2s17BlWeZMhc5DSP7d9QjAZe5vdZp3T3fjxtGkJbg5W24bnRAdz9LVIw==" - }, "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" + "version": "1.0.30000997", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000997.tgz", + "integrity": "sha512-BQLFPIdj2ntgBNWp9Q64LGUIEmvhKkzzHhUHR3CD5A9Lb7ZKF20/+sgadhFap69lk5XmK1fTUleDclaRFvgVUA==", + "dev": true }, "capture-stack-trace": { "version": "1.0.1", @@ -5730,15 +4422,6 @@ "resolved": "https://registry.npmjs.org/cdata/-/cdata-0.1.3.tgz", "integrity": "sha512-z0R4cT5357OEAVkP1CEFTHz1egpu2gYiWm2WJOY/sQDhojEXUYL4m3v2kYi5wER3PkMRL+GgfDhed2kGzrHSZA==" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -5762,57 +4445,6 @@ "check-error": "^1.0.2" } }, - "chai-dom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.8.1.tgz", - "integrity": "sha512-ysWinPU3fc+Bp+xMn/u2/PQyk65jnnCZl0alWupUuFFMGaG+KxrUnsoYOgjMDhSKPkm3WqE/5RTnOowIb7asMg==", - "dev": true - }, - "chai-jquery": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chai-jquery/-/chai-jquery-2.1.0.tgz", - "integrity": "sha512-DiKSXcmInlt4d+WC5PkisDL5MsgJPd1lCSfZ3NgeSZJ34CJntEIpPOCdpalH2IhOWHeLpESJaiuHFxX1dpZ6bw==", - "dev": true - }, - "chai-nightwatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.3.0.tgz", - "integrity": "sha512-NHpHLKQO0M7uNVJ10qlPIzHN9+6f873kYh6dYAn291a1CVESrrH6crbTJwZ3376trtzb6HPa80QYt3gMTL1o4g==", - "dev": true, - "requires": { - "assertion-error": "1.0.0", - "deep-eql": "0.1.3" - }, - "dependencies": { - "assertion-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", - "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - } - }, - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "chai-things": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chai-things/-/chai-things-0.2.0.tgz", - "integrity": "sha1-xVEoN4+bs5nplPAAUhUZhO1uvnA=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5841,18 +4473,10 @@ } } }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "requires": { - "is-regex": "^1.0.3" - } - }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "check-error": { @@ -5861,12 +4485,6 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "check-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", - "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", - "dev": true - }, "cheerio": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", @@ -6003,176 +4621,15 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" - }, - "chromedriver": { - "version": "77.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-77.0.0.tgz", - "integrity": "sha512-mZa1IVx4HD8rDaItWbnS470mmypgiWsDiu98r0NkiT4uLm3qrANl4vOU6no6vtWtLQiW5kt1POcIbjeNpsLbXA==", - "dev": true, - "requires": { - "del": "^4.1.1", - "extract-zip": "^1.6.7", - "mkdirp": "^0.5.1", - "request": "^2.88.0", - "tcp-port-used": "^1.0.1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - } - } + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "^1.1.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -6194,36 +4651,25 @@ } } }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "requires": { - "source-map": "~0.6.0" - } - }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, - "cli-spinners": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" - }, "cli-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", - "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "cliui": { "version": "3.2.0", @@ -6245,16 +4691,6 @@ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -6284,19 +4720,16 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "optional": true, "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", "q": "^1.1.2" } }, - "coalescy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", - "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", - "dev": true - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -6357,36 +4790,6 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - } - } - }, "colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", @@ -6419,178 +4822,10 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, - "common-config": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/common-config/-/common-config-0.1.0.tgz", - "integrity": "sha1-0fGnQa+gy/al7wl1K9/C5nfYtO8=", - "requires": { - "composer": "^0.13.0", - "data-store": "^0.16.1", - "get-value": "^2.0.6", - "lazy-cache": "^2.0.1", - "log-utils": "^0.2.0", - "object.pick": "^1.1.2", - "omit-empty": "^0.4.1", - "question-cache": "^0.4.0", - "set-value": "^0.3.3", - "strip-color": "^0.1.0", - "tableize-object": "^0.1.0", - "text-table": "^0.2.0", - "yargs-parser": "^2.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "question-cache": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/question-cache/-/question-cache-0.4.0.tgz", - "integrity": "sha1-4rmTf8X7fcYPu58QXx+iVLM96n0=", - "requires": { - "arr-flatten": "^1.0.1", - "arr-union": "^3.1.0", - "async": "1.5.2", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "get-value": "^2.0.5", - "has-value": "^0.3.1", - "inquirer2": "^0.1.1", - "is-answer": "^0.1.0", - "isobject": "^2.0.0", - "lazy-cache": "^1.0.3", - "mixin-deep": "^1.1.3", - "omit-empty": "^0.3.6", - "option-cache": "^3.3.5", - "os-homedir": "^1.0.1", - "project-name": "^0.2.4", - "set-value": "^0.3.3", - "to-choices": "^0.2.0", - "use": "^1.1.2" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "omit-empty": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/omit-empty/-/omit-empty-0.3.6.tgz", - "integrity": "sha1-bThAXyqmHJEetQT+aIBcVm2FwxY=", - "requires": { - "has-values": "^0.1.4", - "is-date-object": "^1.0.1", - "isobject": "^2.0.0", - "reduce-object": "^0.1.3" - } - } - } - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - }, - "use": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use/-/use-1.1.2.tgz", - "integrity": "sha1-bjgy/rholXNJSsanrLX++zd7LNE=", - "requires": { - "define-property": "^0.2.5", - "isobject": "^2.0.0" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "component-emitter": { @@ -6598,218 +4833,6 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "composer": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/composer/-/composer-0.13.0.tgz", - "integrity": "sha1-HbyxXxmpBt7uSanD0TfmVLvG0OI=", - "requires": { - "array-unique": "^0.2.1", - "bach": "^0.5.0", - "co": "^4.6.0", - "component-emitter": "^1.2.1", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "is-generator": "^1.0.3", - "is-glob": "^2.0.1", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "micromatch": "^2.3.8", - "nanoseconds": "^0.1.0" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "async-settle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-0.2.1.tgz", - "integrity": "sha1-dnRi1XOACNx16sQkYiNSjyE3E5Y=", - "requires": { - "async-done": "^0.4.0" - }, - "dependencies": { - "async-done": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-0.4.0.tgz", - "integrity": "sha1-q4BT9fYikPi/xY83zZtzBwszB7k=", - "requires": { - "end-of-stream": "^0.1.4", - "next-tick": "^0.2.2", - "once": "^1.3.0", - "stream-exhaust": "^1.0.0" - } - } - } - }, - "bach": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-0.5.0.tgz", - "integrity": "sha1-P/pqN0F3PrwNJL5f2kvF6FtbHaE=", - "requires": { - "async-done": "^1.1.1", - "async-settle": "^0.2.1", - "lodash.filter": "^4.1.0", - "lodash.flatten": "^4.0.0", - "lodash.foreach": "^4.0.0", - "lodash.initial": "^4.0.1", - "lodash.last": "^3.0.0", - "lodash.map": "^4.1.0", - "now-and-later": "0.0.6" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1" - } - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "next-tick": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", - "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" - }, - "now-and-later": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-0.0.6.tgz", - "integrity": "sha1-GKFNw/xJXcBs++Ao8AvhbdrE+uo=", - "requires": { - "once": "^1.3.0" - } - } - } - }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -6891,54 +4914,12 @@ "xdg-basedir": "^3.0.0" } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", "dev": true }, - "consola": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.10.1.tgz", - "integrity": "sha512-4sxpH6SGFYLADfUip4vuY65f/gEogrzJoniVhNUYkJHtng0l8ZjnDCqxxrSVRHOHwKxsy8Vm5ONZh1wOR3/l/w==" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -6955,34 +4936,11 @@ "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", "optional": true }, - "consolidate": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", - "requires": { - "bluebird": "^3.1.1" - } - }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", - "requires": { - "@types/babel-types": "^7.0.0", - "@types/babylon": "^6.16.2", - "babel-types": "^6.26.0", - "babylon": "^6.18.0" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -7113,42 +5071,27 @@ "is-plain-object": "^2.0.1" } }, - "copy-task": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/copy-task/-/copy-task-0.1.0.tgz", - "integrity": "sha1-TDT+muVPKq9gntMvhbj3l6H0arY=" - }, "core-js": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "core-js-compat": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.2.tgz", + "integrity": "sha512-gfiK4QnNXhnnHVOIZst2XHdFfdMTPxtR0EGs0TdILMlGIft+087oH6/Sw2xTTIjpWXC9vEwsJA8VG3XTGcmO5g==", + "dev": true, + "requires": { + "browserslist": "^4.7.0", + "semver": "^6.3.0" + } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, "coupon-code": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/coupon-code/-/coupon-code-0.4.5.tgz", @@ -7157,15 +5100,6 @@ "xtend": "~4.0.0" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -7174,47 +5108,24 @@ "capture-stack-trace": "^1.0.0" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.0.tgz", - "integrity": "sha512-G/B6gtkjgthT8AP/xN1wdj5Xe18fVyk58JepK8GxpUbqcz3hyWxegocMbvnZK+KoTslwd0ACZ3woi/DVUdVjyQ==", - "requires": { - "cross-spawn": "^7.0.0" - } - }, "cross-spawn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.0.tgz", - "integrity": "sha512-6U/8SMK2FBNnB21oQ4+6Nsodxanw1gTkntYA2zBdkFYFu3ZDx65P2ONEXGSvob/QS6REjVHQ9zxzdOafwFdstw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "path-key": "^3.1.0", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true + } } }, "cryptiles": { @@ -7225,114 +5136,16 @@ "boom": "2.x.x" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-loader": { - "version": "0.28.11", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz", - "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, "css-select": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "optional": true, "requires": { "boolbase": "^1.0.0", "css-what": "^2.1.2", @@ -7343,34 +5156,14 @@ "css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "optional": true }, "css-tree": { "version": "1.0.0-alpha.33", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "optional": true, "requires": { "mdn-data": "2.0.4", "source-map": "^0.5.3" @@ -7379,149 +5172,47 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true } } }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "optional": true }, "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "optional": true, "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" + "css-tree": "1.0.0-alpha.29" }, "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "optional": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "optional": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true } } }, @@ -7538,12 +5229,6 @@ "array-find-index": "^1.0.1" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, "cwait": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cwait/-/cwait-1.1.2.tgz", @@ -7552,14 +5237,6 @@ "cdata": "^0.1.1" } }, - "cwd": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.9.1.tgz", - "integrity": "sha1-QeEKfhq4M9xZwuyoOBTH3ne1pP0=", - "requires": { - "find-pkg": "^0.1.0" - } - }, "cwise-compiler": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", @@ -7602,318 +5279,15 @@ "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" }, - "data-store": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/data-store/-/data-store-0.16.1.tgz", - "integrity": "sha1-5pwDpcrBXR/zPwJUyWeDZT5ogwQ=", - "requires": { - "cache-base": "^0.8.4", - "clone-deep": "^0.2.4", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "graceful-fs": "^4.1.4", - "has-own-deep": "^0.1.4", - "lazy-cache": "^2.0.1", - "mkdirp": "^0.5.1", - "project-name": "^0.2.5", - "resolve-dir": "^0.1.0", - "rimraf": "^2.5.3", - "union-value": "^0.2.3" - }, - "dependencies": { - "cache-base": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", - "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", - "requires": { - "collection-visit": "^0.2.1", - "component-emitter": "^1.2.1", - "get-value": "^2.0.5", - "has-value": "^0.3.1", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.1", - "set-value": "^0.4.2", - "to-object-path": "^0.3.0", - "union-value": "^0.2.3", - "unset-value": "^0.1.1" - } - }, - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } - } - }, - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "^2.0.1", - "map-visit": "^0.1.5", - "object-visit": "^0.3.4" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "^2.0.1", - "object-visit": "^0.3.4" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "union-value": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", - "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - } - }, - "unset-value": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", - "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - } - } - } - }, "data-uri-to-buffer": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz", "integrity": "sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo=" }, "date-fns": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.2.1.tgz", - "integrity": "sha512-4V1i5CnTinjBvJpXTq7sDHD4NY6JPcl15112IeSNNLUWQOQ+kIuCvRGOFZMQZNvkadw8F9QTyZxz59rIRU6K+w==" - }, - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.3.0.tgz", + "integrity": "sha512-A8o+iXBVqQayl9Z39BHgb7m/zLOfhF7LK82t+n9Fq1adds1vaUn8ByVoADqWLe4OTc6BZYc/FdbdTwufNYqkJw==" }, "debug": { "version": "3.2.6", @@ -8060,14 +5434,6 @@ } } }, - "deep-bind": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/deep-bind/-/deep-bind-0.3.0.tgz", - "integrity": "sha1-lcMd2Eoc0bOBEZosQu25DbSFvDM=", - "requires": { - "mixin-deep": "^1.1.3" - } - }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -8117,39 +5483,6 @@ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "requires": { - "clone": "^1.0.2" - } - }, - "defaults-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/defaults-deep/-/defaults-deep-0.2.4.tgz", - "integrity": "sha512-V6BtqzcMvn0EPOy7f+SfMhfmTawq+7UQdt9yZH0EBK89+IHo5f+Hse/qzTorAXOBrQpxpwb6cB/8OgtaMrT+Fg==", - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1", - "lazy-cache": "^0.2.3" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, "defer-to-connect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", @@ -8200,89 +5533,6 @@ } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8293,52 +5543,11 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "delimiter-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/delimiter-regex/-/delimiter-regex-2.0.0.tgz", - "integrity": "sha1-DQ9vYdmRVZH9Qwh6jpWF0+IRWnU=", - "requires": { - "extend-shallow": "^1.1.2", - "isobject": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - } - } - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -8353,6 +5562,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, "requires": { "repeating": "^2.0.0" } @@ -8362,12 +5572,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, "diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", @@ -8384,16 +5588,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -8415,49 +5609,19 @@ "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==" }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-event-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", - "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==", - "dev": true - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, "dom-serializer": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "optional": true, "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -8466,20 +5630,17 @@ "domelementtype": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "optional": true }, "entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "optional": true } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, "domain-middleware": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/domain-middleware/-/domain-middleware-0.1.0.tgz", @@ -8490,18 +5651,11 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "optional": true, "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -8520,12 +5674,6 @@ "is-obj": "^1.0.0" } }, - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true - }, "download": { "version": "6.2.5", "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", @@ -8648,35 +5796,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "ejs": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", - "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", - "dev": true - }, "electron-to-chromium": { - "version": "1.3.263", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.263.tgz", - "integrity": "sha512-VfPi+sE/1nEKOV7DWDqWSUGP7ztJG5FeqHbMEj6dBb/arKnxpOCnRXOSC6HBV6qTfK5v8CX7xWCqzN36UqG1oA==" - }, - "element-in-view": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/element-in-view/-/element-in-view-0.1.0.tgz", - "integrity": "sha1-Zi9B+ajTuMpFh8HdtCe30nr4i8k=" - }, - "elliptic": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", - "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } + "version": "1.3.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.266.tgz", + "integrity": "sha512-UTuTZ4v8T0gLPHI7U75PXLQePWI65MTS3mckRrnLCkNljHvsutbYs+hn2Ua/RFul3Jt/L3Ht2rLP+dU/AlBfrQ==", + "dev": true }, "emitter-listener": { "version": "1.1.2", @@ -8686,80 +5810,11 @@ "shimmer": "^1.2.0" } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "empty-dir": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/empty-dir/-/empty-dir-0.2.1.tgz", - "integrity": "sha1-gJ7kih60rRy1EMJXLWb9DthNAas=", - "requires": { - "fs-exists-sync": "^0.1.0" - } - }, - "en-route": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/en-route/-/en-route-0.7.5.tgz", - "integrity": "sha1-6CMOc4NsXpXGdX4EQtPBExJL3Zg=", - "requires": { - "arr-flatten": "^1.0.1", - "debug": "^2.2.0", - "extend-shallow": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "path-to-regexp": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - } - } - } + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "enabled": { "version": "1.0.2", @@ -8775,334 +5830,13 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, - "engine": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/engine/-/engine-0.1.12.tgz", - "integrity": "sha1-+H6MkLuAzT9YWXrFaVk+5G2idC0=", - "requires": { - "assign-deep": "^0.4.3", - "collection-visit": "^0.2.0", - "get-value": "^1.2.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "object.omit": "^2.0.0", - "set-value": "^0.2.0" - }, - "dependencies": { - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "^2.0.1", - "map-visit": "^0.1.5", - "object-visit": "^0.3.4" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "get-value": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-1.3.1.tgz", - "integrity": "sha1-isfvTyA4I5KyZGVI+bmtLcbIlkI=", - "requires": { - "arr-flatten": "^1.0.1", - "is-extendable": "^0.1.1", - "lazy-cache": "^0.2.4", - "noncharacters": "^1.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "^2.0.1", - "object-visit": "^0.3.4" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "^2.0.0" - } - }, - "set-value": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.2.0.tgz", - "integrity": "sha1-c7CmglwVjGoWqCu9yVd1vyqCX6s=", - "requires": { - "isobject": "^1.0.0", - "noncharacters": "^1.1.0" - }, - "dependencies": { - "isobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz", - "integrity": "sha1-8Pm4zpLdVA+gdAiC44NaLgIux4o=" - } - } - } - } - }, - "engine-base": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/engine-base/-/engine-base-0.1.3.tgz", - "integrity": "sha1-1ZycxS591t0rSa579ftEmU9wFqU=", - "requires": { - "component-emitter": "^1.2.1", - "delimiter-regex": "^2.0.0", - "engine": "^0.1.12", - "engine-utils": "^0.1.1", - "lazy-cache": "^2.0.2", - "mixin-deep": "^1.1.3", - "object.omit": "^2.0.1", - "object.pick": "^1.2.0" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "engine-cache": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/engine-cache/-/engine-cache-0.19.4.tgz", - "integrity": "sha1-giSWb732pl54Dsed+HtrLLgjlbI=", - "requires": { - "async-helpers": "^0.3.9", - "extend-shallow": "^2.0.1", - "helper-cache": "^0.7.2", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.2", - "mixin-deep": "^1.1.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "engine-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/engine-utils/-/engine-utils-0.1.1.tgz", - "integrity": "sha1-rd9HCN2FoFoyF6l3l+q4oBPE+A4=" - }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" - }, - "dependencies": { - "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" - } - } - }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -9118,14 +5852,6 @@ "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9141,11 +5867,6 @@ } } }, - "error-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", - "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" - }, "es-abstract": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", @@ -9193,19 +5914,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -9219,29 +5927,6 @@ "es6-promise": "^4.0.3" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, "es6-symbol": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", @@ -9272,121 +5957,64 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "ms": "^2.1.1" } }, "esprima": { @@ -9395,11 +6023,14 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } }, "globals": { "version": "11.12.0", @@ -9408,9 +6039,9 @@ "dev": true }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "js-yaml": { @@ -9423,134 +6054,210 @@ "esprima": "^4.0.0" } }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true } } }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, "eslint-config-habitrpg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-4.0.0.tgz", - "integrity": "sha512-vZc/KjnNVL2BkDBQaQBF9JV16cnZyKa6djCCqH6iKhp8Uuye8Bym3eeLNEcnGkOtZfzJE61hDqiPZXQk7BiXJQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-6.2.0.tgz", + "integrity": "sha512-tmfcNRuTu2vWPxUqbZ68miEEBGKb64u8skF1KaYTzZUODPX4BxLsMZFijTRauBBLLRxtA7+H0l8hXQ3GHqsDog==", "dev": true, "requires": { - "eslint-plugin-lodash": "^2.3.5", - "eslint-plugin-mocha": "^4.7.0" + "eslint": "^6.5.1", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-mocha": "^6.1.1", + "eslint-plugin-vue": "^5.2.3" }, "dependencies": { "eslint-plugin-mocha": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz", - "integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.2.0.tgz", + "integrity": "sha512-vE/+tHJVom2BkMOiwkOKcAM5YqGPk3C6gMvQ32DHihKkaXF6vmxtj3UEOg64wP3m8/Zk5V/UmQbFE5nqu1EXSg==", "dev": true, - "optional": true, "requires": { - "ramda": "^0.25.0" + "ramda": "^0.26.1" } } } }, - "eslint-friendly-formatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", - "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "chalk": "^2.0.1", - "coalescy": "1.0.0", - "extend": "^3.0.0", - "minimist": "^1.2.0", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0" + "debug": "^2.6.9", + "resolve": "^1.5.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "eslint-loader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", - "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "eslint-plugin-html": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.6.tgz", - "integrity": "sha512-nj6A9oK+7BKnMm0E7dMRH3r75BfpkXtcVIb3pFC4AcDdBTNyg2NGxHXyFNT1emW4VsR7P2SZvRXXQtUR+kY08w==", + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { - "htmlparser2": "^3.8.2" - } - }, - "eslint-plugin-lodash": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-2.7.0.tgz", - "integrity": "sha512-sIEzx85Sy+Higf4W+oLCIyh7ym0OEcmJCzY8ukptlGfkcyVagzYBjhUt1JfkcpT4qZC68+7TzceJSqLu+qwYMg==", - "dev": true, - "optional": true, - "requires": { - "lodash": "~4.17.0" + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "eslint-plugin-mocha": { @@ -9570,42 +6277,56 @@ } } }, + "eslint-plugin-vue": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz", + "integrity": "sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==", + "dev": true, + "requires": { + "vue-eslint-parser": "^5.0.0" + } + }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - } + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true }, "esquery": { "version": "1.0.1", @@ -9620,6 +6341,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -9627,27 +6349,20 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "event-stream": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", @@ -9677,21 +6392,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, - "eventsource-polyfill": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", - "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "exec-buffer": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", @@ -9703,6 +6403,17 @@ "pify": "^3.0.0", "rimraf": "^2.5.4", "tempfile": "^2.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "execa": { @@ -9767,88 +6478,6 @@ } } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, - "expand-args": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/expand-args/-/expand-args-0.4.3.tgz", - "integrity": "sha1-OoZiJBxYF1fIzTf7d2d6xgL/nZg=", - "requires": { - "expand-object": "^0.4.2", - "kind-of": "^3.0.3", - "lazy-cache": "^2.0.1", - "minimist": "^1.2.0", - "mixin-deep": "^1.1.3", - "omit-empty": "^0.4.1", - "set-value": "^0.3.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - } - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -9894,193 +6523,6 @@ } } }, - "expand-object": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/expand-object/-/expand-object-0.4.2.tgz", - "integrity": "sha1-t/J+9pwv3MYrD5OQwMtHvAa7Buo=", - "requires": { - "get-stdin": "^5.0.1", - "is-number": "^2.1.0", - "minimist": "^1.2.0", - "set-value": "^0.3.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - } - } - }, - "expand-pkg": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/expand-pkg/-/expand-pkg-0.1.9.tgz", - "integrity": "sha512-Qqtqzx/e8tODrDr0H8HtO7+nftN0wH9bsk3948KpKBZLrc86Cm3/8mRKJmDfNSDWWcuKsilMmFlKPhYx5gHYuA==", - "requires": { - "component-emitter": "^1.2.1", - "debug": "^2.4.1", - "defaults-deep": "^0.2.4", - "export-files": "^2.1.1", - "get-value": "^2.0.6", - "kind-of": "^3.1.0", - "lazy-cache": "^2.0.2", - "load-pkg": "^3.0.1", - "mixin-deep": "^1.1.3", - "normalize-pkg": "^0.3.20", - "omit-empty": "^0.4.1", - "parse-author": "^1.0.0", - "parse-git-config": "^1.1.1", - "repo-utils": "^0.3.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -10100,14 +6542,6 @@ "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", "dev": true }, - "export-files": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/export-files/-/export-files-2.1.1.tgz", - "integrity": "sha1-u/ZFdAU6CeTrmOX0NQHVcrLDzn8=", - "requires": { - "lazy-cache": "^1.0.3" - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -10233,13 +6667,13 @@ } }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, @@ -10302,27 +6736,6 @@ } } }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - } - } - }, "extract-zip": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", @@ -10375,21 +6788,6 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, - "falsey": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", - "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -10407,15 +6805,14 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", + "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", "requires": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", "micromatch": "^4.0.2" }, "dependencies": { @@ -10436,9 +6833,9 @@ } }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "requires": { "is-glob": "^4.0.1" } @@ -10488,11 +6885,6 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, "fastq": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", @@ -10524,122 +6916,19 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "optional": true, "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" } }, - "file-contents": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz", - "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=", - "requires": { - "extend-shallow": "^2.0.0", - "file-stat": "^0.1.0", - "graceful-fs": "^4.1.2", - "is-buffer": "^1.1.0", - "is-utf8": "^0.2.0", - "lazy-cache": "^0.2.3", - "through2": "^2.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-is-binary": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-is-binary/-/file-is-binary-1.0.0.tgz", - "integrity": "sha1-XkGAbRvK5FjI/sMv484SLbu8Q1Y=", - "requires": { - "is-binary-buffer": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "file-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", - "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz", - "integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==", - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, - "file-name": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/file-name/-/file-name-0.1.0.tgz", - "integrity": "sha1-ErEi8SD5w028F2wauBpUis7W3vc=" - }, - "file-stat": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz", - "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=", - "requires": { - "graceful-fs": "^4.1.2", - "lazy-cache": "^0.2.3", - "through2": "^2.0.0" - }, - "dependencies": { - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "flat-cache": "^2.0.1" } }, "file-type": { @@ -10647,22 +6936,11 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.3.0.tgz", "integrity": "sha512-4E4Esq9KLwjYCY32E7qSmd0h7LefcniZHX+XcdJ4Wfx1uGJX7QCigiqw/U0yT7WOslm28yhxl87DJ0wHYv0RAA==" }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "file-url": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==" }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -10715,12 +6993,6 @@ "minimatch": "^3.0.3" } }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -10771,81 +7043,11 @@ } } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", - "requires": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - } - } - }, - "find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", - "requires": { - "find-file-up": "^0.1.2" - } - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -10894,15 +7096,14 @@ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" }, "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" }, "dependencies": { "rimraf": { @@ -10922,11 +7123,6 @@ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -10940,6 +7136,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, "requires": { "debug": "=3.1.0" }, @@ -10948,6 +7145,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -10955,7 +7153,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -10987,15 +7186,6 @@ "mime-types": "^2.1.12" } }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.x" - } - }, "formidable": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", @@ -11045,11 +7235,6 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "optional": true }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -11115,22 +7300,26 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "optional": true, "requires": { "delegates": "^1.0.0", @@ -11139,12 +7328,14 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "optional": true, "requires": { "balanced-match": "^1.0.0", @@ -11153,32 +7344,38 @@ }, "chownr": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, "debug": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "optional": true, "requires": { "ms": "^2.1.1" @@ -11186,22 +7383,26 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { "minipass": "^2.2.1" @@ -11209,12 +7410,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "^1.0.3", @@ -11229,7 +7432,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -11242,12 +7446,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -11255,7 +7461,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { "minimatch": "^3.0.4" @@ -11263,7 +7470,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { "once": "^1.3.0", @@ -11272,17 +7480,20 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "optional": true, "requires": { "number-is-nan": "^1.0.0" @@ -11290,12 +7501,14 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "optional": true, "requires": { "brace-expansion": "^1.1.7" @@ -11303,12 +7516,14 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "optional": true }, "minipass": { "version": "2.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "optional": true, "requires": { "safe-buffer": "^5.1.2", @@ -11317,7 +7532,8 @@ }, "minizlib": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "optional": true, "requires": { "minipass": "^2.2.1" @@ -11325,7 +7541,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "optional": true, "requires": { "minimist": "0.0.8" @@ -11333,12 +7550,14 @@ }, "ms": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "optional": true }, "needle": { "version": "2.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "optional": true, "requires": { "debug": "^4.1.0", @@ -11348,7 +7567,8 @@ }, "node-pre-gyp": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -11365,7 +7585,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1", @@ -11374,12 +7595,14 @@ }, "npm-bundled": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "optional": true }, "npm-packlist": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -11388,7 +7611,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -11399,17 +7623,20 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "optional": true, "requires": { "wrappy": "1" @@ -11417,17 +7644,20 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -11436,17 +7666,20 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "optional": true, "requires": { "deep-extend": "^0.6.0", @@ -11457,14 +7690,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -11478,7 +7713,8 @@ }, "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "optional": true, "requires": { "glob": "^7.1.3" @@ -11486,37 +7722,44 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "optional": true }, "semver": { "version": "5.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "optional": true, "requires": { "code-point-at": "^1.0.0", @@ -11526,7 +7769,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -11534,7 +7778,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "optional": true, "requires": { "ansi-regex": "^2.0.0" @@ -11542,12 +7787,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "4.4.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "optional": true, "requires": { "chownr": "^1.1.1", @@ -11561,12 +7808,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "optional": true, "requires": { "string-width": "^1.0.2 || 2" @@ -11574,63 +7823,18 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "optional": true } } }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -11658,28 +7862,37 @@ } }, "gaxios": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.0.1.tgz", - "integrity": "sha512-c1NXovTxkgRJTIgB2FrFmOFg4YIV6N/bAa4f/FZ4jIw13Ql9ya/82x69CswvotJhbV3DiGnlTZwoq2NVXk2Irg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.1.0.tgz", + "integrity": "sha512-Gtpb5sdQmb82sgVkT2GnS2n+Kx4dlFwbeMYcDlD395aEvsLCSQXJJcHt7oJ2LrGxDEAeiOkK79Zv2A8Pzt6CFg==", "requires": { "abort-controller": "^3.0.0", "extend": "^3.0.2", - "https-proxy-agent": "^2.2.1", + "https-proxy-agent": "^3.0.0", + "is-stream": "^2.0.0", "node-fetch": "^2.3.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "^1.0.0" + }, + "dependencies": { + "https-proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz", + "integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + } } }, "gcp-metadata": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-2.0.4.tgz", - "integrity": "sha512-p1lXhJvcKvJHWfQXhkd4Za1kyXRsGZA0JH7Cjs07W9hrg84d/j5tqQhbGewlSLx9gNyuQUid69uLux48YbggLg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.2.0.tgz", + "integrity": "sha512-ympv+yQ6k5QuWCuwQqnGEvFGS7MBKdcQdj1i188v3bW9QLFIchTGaBCEZxSQapT0jffdn1vdt8oJhB5VBWQO1Q==", "requires": { "gaxios": "^2.0.1", "json-bigint": "^0.3.0" @@ -11761,71 +7974,11 @@ "pump": "^3.0.0" } }, - "get-uri": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz", - "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==", - "dev": true, - "requires": { - "data-uri-to-buffer": "2", - "debug": "4", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "3" - }, - "dependencies": { - "@types/node": { - "version": "8.10.54", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", - "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", - "dev": true - }, - "data-uri-to-buffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz", - "integrity": "sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==", - "dev": true, - "requires": { - "@types/node": "^8.0.7" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "get-view": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/get-view/-/get-view-0.1.3.tgz", - "integrity": "sha1-NmCsBYuhPfl0nKvKpry5bUGqDqA=", - "requires": { - "isobject": "^3.0.0", - "match-file": "^0.2.1" - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -11884,19 +8037,6 @@ "logalot": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "optional": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -11911,56 +8051,13 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true } } }, - "git-config-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", - "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", - "requires": { - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "homedir-polyfill": "^1.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "git-repo-name": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/git-repo-name/-/git-repo-name-0.6.0.tgz", - "integrity": "sha1-rwmIRlaqU37GJccIcAgXXNYSKP8=", - "requires": { - "cwd": "^0.9.1", - "file-name": "^0.1.0", - "lazy-cache": "^1.0.4", - "remote-origin-url": "^0.5.1" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11970,38 +8067,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -12084,7 +8149,8 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true }, "globby": { "version": "10.0.1", @@ -12099,23 +8165,6 @@ "ignore": "^5.1.1", "merge2": "^1.2.3", "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" } }, "glogg": { @@ -12127,29 +8176,18 @@ } }, "google-auth-library": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.2.2.tgz", - "integrity": "sha512-0vzniXbjD5SE9aenAMqhjVR99wvqLpyd5Fw6zC3WxJ15GIMGx96tq+Cu1WRviqsnQqhrmnad6T69kv6qkj/w2Q==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.5.0.tgz", + "integrity": "sha512-TNeraw4miu6/FhO0jDrHiJuRx3SBrAhxHSPj7+rhif43bKE34UItXX9lejKxo3E8FNytuY4LIVIvpcqMQHSYZw==", "requires": { "arrify": "^2.0.0", "base64-js": "^1.3.0", "fast-text-encoding": "^1.0.0", "gaxios": "^2.0.0", - "gcp-metadata": "^3.0.0", - "gtoken": "^4.0.0", + "gcp-metadata": "^3.2.0", + "gtoken": "^4.1.0", "jws": "^3.1.5", "lru-cache": "^5.0.0" - }, - "dependencies": { - "gcp-metadata": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.0.0.tgz", - "integrity": "sha512-WP5/TZWri9TrD41jNr8ukY9dKYLL+8jwQVwbtUbmprjWuyybdnJNkbXbwqD2sdbXIVXD1WCqzfj7QftSLB6K8Q==", - "requires": { - "gaxios": "^2.0.1", - "json-bigint": "^0.3.0" - } - } } }, "google-p12-pem": { @@ -12189,103 +8227,6 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "optional": true }, - "gray-matter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-3.1.1.tgz", - "integrity": "sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==", - "requires": { - "extend-shallow": "^2.0.1", - "js-yaml": "^3.10.0", - "kind-of": "^5.0.2", - "strip-bom-string": "^1.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - } - } - }, - "group-array": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/group-array/-/group-array-0.3.4.tgz", - "integrity": "sha512-YAmNsgsi1uQ7Ai3T4FFkMoskqbLEUPRajAmrn8FclwZQQnV98NLrNWjQ3n2+i1pANxdO3n6wsNEkKq5XrYy0Ow==", - "requires": { - "arr-flatten": "^1.0.1", - "for-own": "^0.1.4", - "get-value": "^2.0.6", - "kind-of": "^3.1.0", - "split-string": "^1.0.1", - "union-value": "^1.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "split-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-1.0.1.tgz", - "integrity": "sha1-vLqz9BUqzuOg1qskecDSh5w9s84=", - "requires": { - "extend-shallow": "^2.0.1" - } - } - } - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -12293,9 +8234,9 @@ "dev": true }, "gtoken": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.0.0.tgz", - "integrity": "sha512-XaRCfHJxhj06LmnWNBzVTAr85NfAErq0W1oabkdqwbq3uL/QTB1kyvGog361Uu2FMG/8e3115sIy/97Rnd4GjQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.0.tgz", + "integrity": "sha512-wqyn2gf5buzEZN4QNmmiiW2i2JkEdZnL7Z/9p44RtZqgt4077m4khRgAYNuu8cBwHWCc6MsP6eDUn/KkF6jFIw==", "requires": { "gaxios": "^2.0.0", "google-p12-pem": "^2.0.0", @@ -12342,50 +8283,16 @@ } }, "gulp-babel": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-7.0.1.tgz", - "integrity": "sha512-UqHS3AdxZyJCRxqnAX603Dj3k/Wx6hzcgmav3QcxvsIFq3Y8ZkU7iXd0O+JwD5ivqCc6o0r1S7tCB/xxLnuSNw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz", + "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==", "requires": { "plugin-error": "^1.0.1", - "replace-ext": "0.0.1", + "replace-ext": "^1.0.0", "through2": "^2.0.0", "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-choose-files": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/gulp-choose-files/-/gulp-choose-files-0.1.3.tgz", - "integrity": "sha1-hrFfBjAHOrZz1XJb7sY+qhSFUPk=", - "requires": { - "extend-shallow": "^2.0.1", - "question-cache": "^0.5.1", - "through2": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -12398,9 +8305,9 @@ } }, "gulp-imagemin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-6.1.0.tgz", - "integrity": "sha512-0TPkak5BsiRfw+kfcKwIcODbOHHcTyvBM9arlRSwXdUVzrGAcq/7urZoOQD5n4uWvKhjg+l9/yn1GDZsDuWUow==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-6.1.1.tgz", + "integrity": "sha512-fqaSR8bMc5lhqa6HzRPuJaDY6lY7rcCipe6WtqQ5+hNYTCSPYjXic+1gvFG1+8X879gjVJmIxwmqIbfjuMqTpQ==", "requires": { "chalk": "^2.4.1", "fancy-log": "^1.3.2", @@ -12426,52 +8333,9 @@ }, "dependencies": { "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" - } - } - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" } } }, @@ -12535,16 +8399,6 @@ "glogg": "^1.0.0" } }, - "gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - } - }, "habitica-markdown": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.0.tgz", @@ -12640,62 +8494,11 @@ "ansi-regex": "^2.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "has-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", - "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", - "requires": { - "is-glob": "^2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "has-own-deep": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-own-deep/-/has-own-deep-0.1.4.tgz", - "integrity": "sha1-kesM2ieAgxWPgEKigxZDTpr+eHY=" - }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -12755,29 +8558,6 @@ } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=" - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", @@ -12789,20 +8569,10 @@ "sntp": "1.x.x" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hellojs": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/hellojs/-/hellojs-1.18.1.tgz", - "integrity": "sha512-T673GW3RSuM4xzYfJpp/wNPDbUG9FlNSNkQn0thII8DOpl3NphcmtmNrHrmv8hyk1fosJHkgzDfbcpJvmeq5Gw==" - }, "helmet": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.0.tgz", - "integrity": "sha512-TS3GryQMPR7n/heNnGC0Cl3Ess30g8C6EtqZyylf+Y2/kF4lM8JinOR90rzIICsw4ymWTvji4OhDmqsqxkLrcg==", + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", + "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", "requires": { "depd": "2.0.0", "dns-prefetch-control": "0.2.0", @@ -12811,7 +8581,7 @@ "feature-policy": "0.3.0", "frameguard": "3.1.0", "helmet-crossdomain": "0.4.0", - "helmet-csp": "2.9.1", + "helmet-csp": "2.9.4", "hide-powered-by": "1.1.0", "hpkp": "2.0.0", "hsts": "2.2.0", @@ -12834,41 +8604,16 @@ "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" }, "helmet-csp": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.1.tgz", - "integrity": "sha512-HgdXSJ6AVyXiy5ohVGpK6L7DhjI9KVdKVB1xRoixxYKsFXFwoVqtLKgDnfe3u8FGGKf9Ml9k//C9rnncIIAmyA==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", + "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", "requires": { - "bowser": "2.5.4", + "bowser": "^2.7.0", "camelize": "1.0.0", "content-security-policy-builder": "2.1.0", "dasherize": "2.0.0" } }, - "helper-cache": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/helper-cache/-/helper-cache-0.7.2.tgz", - "integrity": "sha1-AkVixLS4sqsqtTHQC+FuxJZRi5A=", - "requires": { - "extend-shallow": "^2.0.1", - "lazy-cache": "^0.2.3", - "lodash.bind": "^3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, "hex2dec": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz", @@ -12879,30 +8624,11 @@ "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -12939,107 +8665,8 @@ "html-comment-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - } - } - } - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "optional": true }, "http-cache-semantics": { "version": "4.0.3", @@ -13065,25 +8692,6 @@ } } }, - "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", - "dev": true - } - } - }, "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", @@ -13108,63 +8716,6 @@ } } }, - "http-proxy-middleware": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.20.0.tgz", - "integrity": "sha512-dNJAk71nEJhPiAczQH9hGvE/MT9kEs+zn2Dh+Hi94PGZe1GluQirC7mw5rdREUtWx6qGS1Gu0bZd4qEAg+REgw==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.1", - "lodash": "^4.17.14", - "micromatch": "^4.0.2" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", @@ -13179,11 +8730,6 @@ "version": "https://github.com/node-apn/node-http2/archive/apn-2.1.4.tar.gz", "integrity": "sha512-ad4u4I88X9AcUgxCRW3RLnbh7xHWQ1f5HbrXa7gEy2x4Xgq+rq+auGx5I+nUDE2YYuqteGIlbxrwQXkIaYTfnQ==" }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, "https-proxy-agent": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", @@ -13210,39 +8756,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -13272,9 +8785,9 @@ } }, "image-size": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.1.tgz", - "integrity": "sha512-X2HcWljsuWJPMTb1CGAN2+xuAAjQK5kdSzhqQXZlJBf0MpdXqfIeQCMJKYKS2OEVDwReS2zO5i7MlikWPBTotQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", "requires": { "queue": "6.0.1" } @@ -13325,9 +8838,9 @@ } }, "imagemin-optipng": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-7.0.0.tgz", - "integrity": "sha512-N40bmLgiyv5H8xFp/RYmWKdg6Z19MGqzcNW+IWXG7VPrLV75NbcOn8y6A7eZcSHOCNW+DqBx+b95yw+Tf6Sl/g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz", + "integrity": "sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==", "optional": true, "requires": { "exec-buffer": "^3.0.0", @@ -13343,16 +8856,23 @@ "requires": { "is-svg": "^3.0.0", "svgo": "^1.0.5" + } + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "dependencies": { - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "optional": true, - "requires": { - "html-comment-regex": "^1.1.0" - } + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true } } }, @@ -13478,11 +8998,6 @@ } } }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" - }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -13491,22 +9006,6 @@ "repeating": "^2.0.0" } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -13516,11 +9015,6 @@ "wrappy": "1" } }, - "info-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", - "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -13532,197 +9026,65 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "inquirer2": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inquirer2/-/inquirer2-0.1.1.tgz", - "integrity": "sha1-vFQkqBQ1fEHmXi6Vf+U2ruqb8fY=", - "requires": { - "ansi-escapes": "^1.1.1", - "ansi-regex": "^2.0.0", - "arr-flatten": "^1.0.1", - "arr-pluck": "^0.1.0", - "array-unique": "^0.2.1", - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-width": "^1.1.0", - "extend-shallow": "^2.0.1", - "figures": "^1.4.0", - "is-number": "^2.1.0", - "is-plain-object": "^2.0.1", - "lazy-cache": "^1.0.3", - "lodash.where": "^3.1.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^4.0.7", - "strip-color": "^0.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "ansi-regex": "^4.1.0" } } } @@ -13742,15 +9104,11 @@ "p-is-promise": "^1.1.0" } }, - "intro.js": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/intro.js/-/intro.js-2.9.3.tgz", - "integrity": "sha512-hC+EXWnEuJeA3CveGMat3XHePd2iaXNFJIVfvJh2E9IzBMGLTlhWvPIVHAgKlOpO4lNayCxEqzr4N02VmHFr9Q==" - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -13765,12 +9123,6 @@ "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -13800,11 +9152,6 @@ "is-windows": "^1.0.1" } }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -13828,48 +9175,11 @@ } } }, - "is-answer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-answer/-/is-answer-0.1.1.tgz", - "integrity": "sha1-zBwvGG+FzyZQIgveNZ2GIYfUnLY=", - "requires": { - "has-values": "^0.1.4", - "is-primitive": "^2.0.0", - "omit-empty": "^0.4.1" - }, - "dependencies": { - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "is-binary-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-binary-buffer/-/is-binary-buffer-1.0.0.tgz", - "integrity": "sha1-vGAxKQtly/eZudlQK1D9U3VSQAc=", - "requires": { - "is-buffer": "^1.1.5" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -13881,7 +9191,8 @@ "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true }, "is-callable": { "version": "1.1.4", @@ -13941,40 +9252,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", - "requires": { - "acorn": "~4.0.2", - "object-assign": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -14001,11 +9278,6 @@ "number-is-nan": "^1.0.0" } }, - "is-generator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", - "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=" - }, "is-gif": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", @@ -14113,32 +9385,6 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "optional": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", @@ -14166,20 +9412,11 @@ "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", "optional": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-property": { "version": "1.0.2", @@ -14199,33 +9436,6 @@ "has": "^1.0.1" } }, - "is-registered": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/is-registered/-/is-registered-0.1.5.tgz", - "integrity": "sha1-HTRpd0GdZl4qxshAE1NWheb3b38=", - "requires": { - "define-property": "^0.2.5", - "isobject": "^2.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -14234,12 +9444,6 @@ "is-unc-path": "^1.0.0" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", @@ -14251,9 +9455,10 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "optional": true, "requires": { "html-comment-regex": "^1.1.0" } @@ -14279,110 +9484,26 @@ "unc-path-regex": "^0.1.2" } }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "is-valid-app": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.2.1.tgz", - "integrity": "sha1-Zc8ZW71xvXdssWGZHGhCSNZd/4k=", - "requires": { - "debug": "^2.2.0", - "is-registered": "^0.1.5", - "is-valid-instance": "^0.2.0", - "lazy-cache": "^2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "is-valid-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" }, - "is-valid-instance": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.2.0.tgz", - "integrity": "sha1-4an/EQa4y64AB+pqIPidVGoqWg8=", - "requires": { - "isobject": "^2.1.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=" - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, - "is2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", - "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "ip-regex": "^2.1.0", - "is-url": "^1.2.2" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -14547,6 +9668,15 @@ "source-map": "^0.5.3" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -14595,30 +9725,23 @@ "logalot": "^2.0.0" } }, - "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^2.6.0" @@ -14640,7 +9763,8 @@ "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true }, "json-bigint": { "version": "0.3.0", @@ -14660,11 +9784,6 @@ "resolved": "https://registry.npmjs.org/json-content-demux/-/json-content-demux-0.1.3.tgz", "integrity": "sha1-XBJ3v387dRKoa3Mt3UGzLU38scw=" }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -14685,11 +9804,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, "jsonfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", @@ -14745,15 +9859,6 @@ } } }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "requires": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, "junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", @@ -14799,489 +9904,6 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" }, - "karma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz", - "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", - "core-js": "^3.1.3", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", - "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.1.tgz", - "integrity": "sha512-df4o16uZmMHzVQwECZRHwfguOt5ixpuQVaZHjYMvYisgKhE+JXwcj/Tcr3+3bu/XeOJQ9ycYmzu7Mv8XrGxJDQ==", - "dev": true, - "requires": { - "anymatch": "^3.1.0", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.1.1" - } - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "core-js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", - "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "karma-babel-preprocessor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/karma-babel-preprocessor/-/karma-babel-preprocessor-7.0.0.tgz", - "integrity": "sha512-k8YUot8ZAAYhAeUxOsOGUEXW7AlB6SkoIVGfavEBCAdGHzWuraOBoR2wCxxdePUCvcItIxSUyQnOj6DuZdEJYA==", - "dev": true - }, - "karma-chai-plugins": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/karma-chai-plugins/-/karma-chai-plugins-0.9.0.tgz", - "integrity": "sha1-sqGn6AfwsbsZ+2bEdEljulwxqn0=", - "dev": true, - "requires": { - "chai": "^3.4.1", - "chai-as-promised": "^5.1.0", - "chai-dom": "^1.2.2", - "chai-jquery": "^2.0.0", - "chai-things": "^0.2.0", - "sinon": "^2.1.0", - "sinon-chai": "^2.8.0" - }, - "dependencies": { - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" - } - }, - "chai-as-promised": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-5.3.0.tgz", - "integrity": "sha1-CdekApCKpw39vq1T5YU/x50+8hw=", - "dev": true - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "sinon": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", - "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", - "dev": true, - "requires": { - "diff": "^3.1.0", - "formatio": "1.2.0", - "lolex": "^1.6.0", - "native-promise-only": "^0.8.1", - "path-to-regexp": "^1.7.0", - "samsam": "^1.1.3", - "text-encoding": "0.6.4", - "type-detect": "^4.0.0" - }, - "dependencies": { - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - } - } - }, - "sinon-chai": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", - "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", - "dev": true - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz", - "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", - "dev": true, - "requires": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "lodash": "^4.17.0", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "karma-mocha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "karma-mocha-reporter": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "karma-sinon-chai": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-2.0.2.tgz", - "integrity": "sha512-SDgh6V0CUd+7ruL1d3yG6lFzmJNGRNQuEuCYXLaorruNP9nwQfA7hpsp4clx4CbOo5Gsajh3qUOT7CrVStUKMw==", - "dev": true - }, - "karma-sinon-stub-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/karma-sinon-stub-promise/-/karma-sinon-stub-promise-1.0.0.tgz", - "integrity": "sha1-YX6WZub8531jCCy5S2N5dMhKNrw=", - "dev": true - }, - "karma-sourcemap-loader": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", - "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", - "dev": true, - "requires": { - "colors": "^1.1.2" - }, - "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - } - } - }, - "karma-webpack": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz", - "integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==", - "dev": true, - "requires": { - "async": "^2.0.0", - "babel-runtime": "^6.0.0", - "loader-utils": "^1.0.0", - "lodash": "^4.0.0", - "source-map": "^0.5.6", - "webpack-dev-middleware": "^2.0.6" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "keygrip": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", @@ -15341,45 +9963,6 @@ "bin-pack": "~1.0.1" } }, - "layouts": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/layouts/-/layouts-0.11.0.tgz", - "integrity": "sha1-xiDos8uI/IxJLbRTin3VQKTffyI=", - "requires": { - "delimiter-regex": "^1.3.1", - "falsey": "^0.3.0", - "get-view": "^0.1.1", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "delimiter-regex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/delimiter-regex/-/delimiter-regex-1.3.1.tgz", - "integrity": "sha1-Y4XK4UAE28DBzY3//+uGPVGZnv8=", - "requires": { - "extend-shallow": "^1.1.2" - } - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -15437,99 +10020,6 @@ "uc.micro": "^1.0.1" } }, - "load-helpers": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/load-helpers/-/load-helpers-0.2.11.tgz", - "integrity": "sha1-9L2LIYQ1wFLl4536dxMinVcepCM=", - "requires": { - "extend-shallow": "^2.0.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "matched": "^0.4.1", - "resolve-dir": "^0.1.0" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "matched": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", - "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", - "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "glob": "^7.0.5", - "has-glob": "^0.1.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "resolve-dir": "^0.1.0" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - } - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -15549,224 +10039,11 @@ } } }, - "load-pkg": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/load-pkg/-/load-pkg-3.0.1.tgz", - "integrity": "sha1-kjCzfsBOVpADBgvFiVHj7VCNWU8=", - "requires": { - "find-pkg": "^0.1.0" - } - }, - "load-templates": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/load-templates/-/load-templates-0.11.4.tgz", - "integrity": "sha1-zyk977a1hg/1uMRJ2qHAx7tyjek=", - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "glob-parent": "^2.0.0", - "has-glob": "^0.1.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "matched": "^0.4.1", - "to-file": "^0.2.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "matched": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", - "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", - "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "glob": "^7.0.5", - "has-glob": "^0.1.1", - "is-valid-glob": "^0.3.0", - "lazy-cache": "^2.0.1", - "resolve-dir": "^0.1.0" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - } - } - }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -15777,234 +10054,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._arrayfilter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayfilter/-/lodash._arrayfilter-3.0.0.tgz", - "integrity": "sha1-LevhHuxp5dzG9LhhNxKKSPFSQjc=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecallback": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", - "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", - "requires": { - "lodash._baseisequal": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.pairs": "^3.0.0" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._baseeach": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", - "requires": { - "lodash.keys": "^3.0.0" - } - }, - "lodash._basefilter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basefilter/-/lodash._basefilter-3.0.0.tgz", - "integrity": "sha1-S3ZAPfDihtA9Xg9yle00QeEB0SE=", - "requires": { - "lodash._baseeach": "^3.0.0" - } - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._baseisequal": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", - "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", - "requires": { - "lodash.isarray": "^3.0.0", - "lodash.istypedarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._baseismatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz", - "integrity": "sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U=", - "requires": { - "lodash._baseisequal": "^3.0.0" - } - }, - "lodash._basematches": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._basematches/-/lodash._basematches-3.2.0.tgz", - "integrity": "sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg=", - "requires": { - "lodash._baseismatch": "^3.0.0", - "lodash.pairs": "^3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" - }, - "lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, - "lodash._replaceholders": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._replaceholders/-/lodash._replaceholders-3.0.0.tgz", - "integrity": "sha1-iru3EmxDH37XRPe6rznwi8m9nVg=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.bind": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-3.1.0.tgz", - "integrity": "sha1-+V9IY419i7tYVPkIJmUnmZ+/pLs=", - "requires": { - "lodash._createwrapper": "^3.0.0", - "lodash._replaceholders": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.clone": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", - "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=", - "dev": true, - "requires": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" }, - "lodash.initial": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.initial/-/lodash.initial-4.1.1.tgz", - "integrity": "sha1-5T9kiRJl3cQE6YbSwo93vtlDWRo=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -16025,60 +10089,11 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.last": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", - "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.pairs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", - "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", - "requires": { - "lodash.keys": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -16096,127 +10111,11 @@ "lodash._reinterpolate": "^3.0.0" } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "lodash.where": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.where/-/lodash.where-3.1.0.tgz", - "integrity": "sha1-LnhLnJM2jV11qu4zLOF2Ai8rlVM=", - "requires": { - "lodash._arrayfilter": "^3.0.0", - "lodash._basecallback": "^3.0.0", - "lodash._basefilter": "^3.0.0", - "lodash._basematches": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, - "log-ok": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", - "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", - "requires": { - "ansi-green": "^0.1.1", - "success-symbol": "^0.1.0" - } - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "log-utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", - "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", - "requires": { - "ansi-colors": "^0.2.0", - "error-symbol": "^0.1.0", - "info-symbol": "^0.1.0", - "log-ok": "^0.1.1", - "success-symbol": "^0.1.0", - "time-stamp": "^1.0.1", - "warning-symbol": "^0.1.0" - }, - "dependencies": { - "ansi-colors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", - "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", - "requires": { - "ansi-bgblack": "^0.1.1", - "ansi-bgblue": "^0.1.1", - "ansi-bgcyan": "^0.1.1", - "ansi-bggreen": "^0.1.1", - "ansi-bgmagenta": "^0.1.1", - "ansi-bgred": "^0.1.1", - "ansi-bgwhite": "^0.1.1", - "ansi-bgyellow": "^0.1.1", - "ansi-black": "^0.1.1", - "ansi-blue": "^0.1.1", - "ansi-bold": "^0.1.1", - "ansi-cyan": "^0.1.1", - "ansi-dim": "^0.1.1", - "ansi-gray": "^0.1.1", - "ansi-green": "^0.1.1", - "ansi-grey": "^0.1.1", - "ansi-hidden": "^0.1.1", - "ansi-inverse": "^0.1.1", - "ansi-italic": "^0.1.1", - "ansi-magenta": "^0.1.1", - "ansi-red": "^0.1.1", - "ansi-reset": "^0.1.1", - "ansi-strikethrough": "^0.1.1", - "ansi-underline": "^0.1.1", - "ansi-white": "^0.1.1", - "ansi-yellow": "^0.1.1", - "lazy-cache": "^2.0.1" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", - "dev": true, - "requires": { - "date-format": "^2.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.0", - "rfdc": "^1.1.4", - "streamroller": "^1.0.6" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "logalot": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", @@ -16240,37 +10139,23 @@ }, "dependencies": { "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" } } }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dev": true, - "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true - }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "optional": true }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } @@ -16284,11 +10169,6 @@ "signal-exit": "^3.0.0" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -16343,163 +10223,11 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, - "map-config": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/map-config/-/map-config-0.5.0.tgz", - "integrity": "sha1-FwJgfiZ696NwyKnQxiumUk/rb+U=", - "requires": { - "array-unique": "^0.2.1", - "async": "^1.5.2" - }, - "dependencies": { - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - } - } - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, - "map-schema": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/map-schema/-/map-schema-0.2.4.tgz", - "integrity": "sha1-wZVRg0/DwHoEWXt6WvtEpHWvlbQ=", - "requires": { - "arr-union": "^3.1.0", - "collection-visit": "^0.2.3", - "component-emitter": "^1.2.1", - "debug": "^2.6.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "get-value": "^2.0.6", - "is-primitive": "^2.0.0", - "kind-of": "^3.1.0", - "lazy-cache": "^2.0.2", - "log-utils": "^0.2.1", - "longest": "^1.0.1", - "mixin-deep": "^1.1.3", - "object.omit": "^2.0.1", - "object.pick": "^1.2.0", - "omit-empty": "^0.4.1", - "pad-right": "^0.2.2", - "set-value": "^0.4.0", - "sort-object-arrays": "^0.1.1", - "union-value": "^0.2.3" - }, - "dependencies": { - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "^2.0.1", - "map-visit": "^0.1.5", - "object-visit": "^0.3.4" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "^2.0.1", - "object-visit": "^0.3.4" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "^2.0.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - }, - "union-value": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", - "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - } - } - } - }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -16540,120 +10268,6 @@ "resolved": "https://registry.npmjs.org/markdown-it-linkify-images/-/markdown-it-linkify-images-1.0.0.tgz", "integrity": "sha1-gTTsj0gM4pxD44Ck4narBnyuRoY=" }, - "match-file": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/match-file/-/match-file-0.2.2.tgz", - "integrity": "sha1-Jua88bOQpmH2Em+visUB4z7M+uk=", - "requires": { - "is-glob": "^3.1.0", - "isobject": "^3.0.0", - "micromatch": "^2.3.11" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - } - } - }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -16686,61 +10300,11 @@ } } }, - "matched": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", - "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", - "requires": { - "arr-union": "^3.1.0", - "async-array-reduce": "^0.2.1", - "glob": "^7.1.2", - "has-glob": "^1.0.0", - "is-valid-glob": "^1.0.0", - "resolve-dir": "^1.0.0" - }, - "dependencies": { - "has-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", - "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", - "requires": { - "is-glob": "^3.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "optional": true }, "mdurl": { "version": "1.0.1", @@ -16774,14 +10338,11 @@ } } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true }, "meow": { "version": "3.7.0", @@ -16807,77 +10368,6 @@ } } }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "dependencies": { - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - } - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -16888,27 +10378,6 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "merge-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/merge-value/-/merge-value-1.0.0.tgz", - "integrity": "sha512-fJMmvat4NeKz63Uv9iHWcPDjCWcCkoiRoajRTEO8hlhUC6rwaHg0QCF9hBOTjZmm4JuglPckPSTtcuJL5kp0TQ==", - "requires": { - "get-value": "^2.0.6", - "is-extendable": "^1.0.0", - "mixin-deep": "^1.2.0", - "set-value": "^2.0.0" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "merge2": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", @@ -16965,15 +10434,6 @@ "to-regex": "^3.0.2" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", @@ -16993,25 +10453,16 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -17026,20 +10477,31 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.6.5.tgz", - "integrity": "sha512-ewSKOPFH9blOLXx0YSE+mbrNMBFPS+11a2b03QZ+P4LVrUHW/GAlqeYC7DBknDyMWkHzrzTpDhUvy7MUxqyrPA==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.8.6.tgz", + "integrity": "sha512-lFG7d6g3+/UaFDCOtqPiKAC9zngWWsQZl1g5q6gaONqrjq61SX2xFqXMleQiFVyDpYwa018E9hmlAFY22PCb+A==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", - "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.1.tgz", + "integrity": "sha512-8AgjrT7C8U/HQWM+02YJHLPh4BypAhc5pFddr0nCcowNy1Hj0hmKPMq9WkjBMn0rtUg3ia30MkCexdd1pTiTIA==", "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } } }, "mixin-deep": { @@ -17061,22 +10523,6 @@ } } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" - } - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -17085,12 +10531,6 @@ "minimist": "0.0.8" } }, - "mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=", - "dev": true - }, "mocha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", @@ -17189,42 +10629,24 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", + "dev": true, "requires": { "bson": "^1.1.1", "require_optional": "^1.0.1", "safe-buffer": "^5.1.2" } }, - "mongodb-core": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.20.tgz", - "integrity": "sha512-IN57CX5/Q1bhDq6ShAR6gIv4koFsZP7L8WOK1S0lR0pVDQaScffSMV5jxubLsmZ7J+UdqmykKw4r9hG3XQEGgQ==", - "dev": true, - "requires": { - "bson": "~1.0.4", - "require_optional": "~1.0.0" - }, - "dependencies": { - "bson": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", - "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==", - "dev": true - } - } - }, "mongoose": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.1.tgz", - "integrity": "sha512-TJeZHb5h8UGH++ctngh2shgZuZmR9o0D8elxfkWzIpKB6QAFsJPmALtDuD6RYZTS33+CifhDdAMGqs3OpJ3cyQ==", + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.7.tgz", + "integrity": "sha512-FU59waB4LKBa9KOnqBUcCcMIVRc09TFo1F8nMxrzSiIWATaJpjxxSSH5FBVUDxQfNdJLfg9uFHxaTxhhwjsZOQ==", "requires": { - "async": "2.6.2", "bson": "~1.1.1", "kareem": "2.3.1", - "mongodb": "3.3.2", + "mongodb": "3.3.3", "mongoose-legacy-pluralize": "1.0.2", "mpath": "0.6.0", - "mquery": "3.2.1", + "mquery": "3.2.2", "ms": "2.1.2", "regexp-clone": "1.0.0", "safe-buffer": "5.1.2", @@ -17232,12 +10654,15 @@ "sliced": "1.0.1" }, "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "mongodb": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", + "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", "requires": { - "lodash": "^4.17.11" + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" } } } @@ -17248,13 +10673,13 @@ "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" }, "monk": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.6.tgz", - "integrity": "sha512-bSuADQGwIxBcRzCzQaMoGmiGl30Dr+0iB1FQAQb3VwWwAKbtpDN2wkVHCjthzw/jXhPHWxTQFUtlSt/nSagojQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/monk/-/monk-7.1.1.tgz", + "integrity": "sha512-7H4bKRUiopLkWsufom7xUZpflz/Ees4V3QXLKZMxMdh4B4R2zultrTUjPXj37DOijvj0PluJMmkffrsUkBVxCA==", "dev": true, "requires": { "debug": "*", - "mongodb": "^2.1.18", + "mongodb": "^3.2.3", "monk-middleware-cast-ids": "^0.2.1", "monk-middleware-fields": "^0.2.0", "monk-middleware-handle-callback": "^0.2.0", @@ -17262,55 +10687,6 @@ "monk-middleware-query": "^0.2.0", "monk-middleware-wait-for-connection": "^0.2.0", "object-assign": "^4.1.1" - }, - "dependencies": { - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=", - "dev": true - }, - "mongodb": { - "version": "2.2.36", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz", - "integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==", - "dev": true, - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.20", - "readable-stream": "2.2.7" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", - "dev": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "monk-middleware-cast-ids": { @@ -17382,9 +10758,9 @@ "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" }, "mquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.1.tgz", - "integrity": "sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", "requires": { "bluebird": "3.5.1", "debug": "3.1.0", @@ -17424,9 +10800,10 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "nan": { "version": "2.13.2", @@ -17451,17 +10828,6 @@ "to-regex": "^3.0.1" } }, - "nanoseconds": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/nanoseconds/-/nanoseconds-0.1.0.tgz", - "integrity": "sha1-aew5/NAOd6s6ct4KQzQoJM15Izo=" - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -17560,12 +10926,6 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -17574,28 +10934,7 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "optional": true - }, - "nightwatch": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-1.2.4.tgz", - "integrity": "sha512-RoO2/leXXTWG/iAcdW1+sN3RV+bL2P4F9B/ty/wJQmsJw2PLduqvbi7cmkwdNGhh/yaIwIcBxyGHqdB0G754hg==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "chai-nightwatch": "^0.3.0", - "dotenv": "7.0.0", - "ejs": "^2.5.9", - "lodash.clone": "3.0.3", - "lodash.defaultsdeep": "^4.6.1", - "lodash.merge": "^4.6.2", - "minimatch": "3.0.4", - "mkpath": "1.0.0", - "mocha": "^5.2.0", - "optimist": "^0.6.1", - "proxy-agent": "^3.0.0" - } + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nise": { "version": "1.5.2", @@ -17633,14 +10972,6 @@ } } }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "^1.1.1" - } - }, "nocache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", @@ -17657,9 +10988,9 @@ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" }, "node-gcm": { "version": "1.0.2", @@ -17778,201 +11109,6 @@ } } }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - } - } - }, "node-loggly-bulk": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-2.2.4.tgz", @@ -17983,6 +11119,12 @@ "request": ">=2.76.0 <3.0.0" } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-pre-gyp": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", @@ -18000,6 +11142,14 @@ "tar": "^4" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -18011,6 +11161,7 @@ "version": "1.1.32", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.32.tgz", "integrity": "sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A==", + "dev": true, "requires": { "semver": "^5.3.0" }, @@ -18018,166 +11169,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.11", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -18213,11 +11206,6 @@ } } }, - "noncharacters": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/noncharacters/-/noncharacters-1.1.0.tgz", - "integrity": "sha1-rzPfMP1Q7TxTzSAiWPJa2pC1QNI=" - }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", @@ -18253,77 +11241,6 @@ "remove-trailing-separator": "^1.0.1" } }, - "normalize-pkg": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/normalize-pkg/-/normalize-pkg-0.3.20.tgz", - "integrity": "sha1-Luc3FJUXhQ2c7/WmI0r174nFFag=", - "requires": { - "arr-union": "^3.1.0", - "array-unique": "^0.3.2", - "component-emitter": "^1.2.1", - "export-files": "^2.1.1", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "get-value": "^2.0.6", - "kind-of": "^3.0.4", - "lazy-cache": "^2.0.1", - "map-schema": "^0.2.3", - "minimist": "^1.2.0", - "mixin-deep": "^1.1.3", - "omit-empty": "^0.4.1", - "parse-git-config": "^1.0.2", - "repo-utils": "^0.3.6", - "semver": "^5.3.0", - "stringify-author": "^0.1.3", - "write-json": "^0.2.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -18412,11 +11329,6 @@ "boolbase": "~1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -18442,12 +11354,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -18481,12 +11387,6 @@ } } }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "dev": true - }, "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", @@ -18527,6 +11427,18 @@ "isobject": "^3.0.0" } }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -18545,25 +11457,6 @@ "make-iterator": "^1.0.0" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - } - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -18597,36 +11490,6 @@ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" }, - "omit-empty": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/omit-empty/-/omit-empty-0.4.1.tgz", - "integrity": "sha1-KUo3gvLLIMdJfEEitiN8ncwMY6s=", - "requires": { - "has-values": "^0.1.4", - "kind-of": "^3.0.3", - "reduce-object": "^0.1.3" - }, - "dependencies": { - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -18654,19 +11517,14 @@ "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -18676,87 +11534,6 @@ "wordwrap": "~0.0.2" } }, - "option-cache": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/option-cache/-/option-cache-3.5.0.tgz", - "integrity": "sha1-y3ZRVboqhhwRCf8m4qIOqgZhKys=", - "requires": { - "arr-flatten": "^1.0.3", - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^0.3.1", - "kind-of": "^3.2.2", - "lazy-cache": "^2.0.2", - "set-value": "^0.4.3", - "to-object-path": "^0.3.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -18795,34 +11572,6 @@ "logalot": "^2.0.0" } }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -18831,11 +11580,6 @@ "readable-stream": "^2.0.1" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, "os-filter-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", @@ -18906,6 +11650,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -18914,16 +11659,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "^1.1.0" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, "p-map-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", @@ -18972,36 +11712,8 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pac-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz", - "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "dev": true, - "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" - } + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "package-json": { "version": "4.0.1", @@ -19052,14 +11764,6 @@ } } }, - "pad-right": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", - "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", - "requires": { - "repeat-string": "^1.5.2" - } - }, "pageres": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/pageres/-/pageres-5.2.0.tgz", @@ -19109,42 +11813,15 @@ } } }, - "paginationator": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/paginationator/-/paginationator-0.1.4.tgz", - "integrity": "sha1-hHht04UKrh8Ru7kRsMHghRtTgQY=" - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "requires": { - "no-case": "^2.2.0" + "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-author": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-1.0.0.tgz", - "integrity": "sha1-XsFZAGKXe9nLOWLpFzuHWGQ39d8=" - }, "parse-data-uri": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz", @@ -19163,58 +11840,6 @@ "path-root": "^0.1.1" } }, - "parse-git-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", - "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", - "requires": { - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "git-config-path": "^1.0.1", - "ini": "^1.3.4" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "parse-github-url": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-0.3.2.tgz", - "integrity": "sha1-du8B6/4LHpwPSTZylSzGpM2csmA=" - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -19233,56 +11858,6 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parser-front-matter": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/parser-front-matter/-/parser-front-matter-1.6.4.tgz", - "integrity": "sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g==", - "requires": { - "extend-shallow": "^2.0.1", - "file-is-binary": "^1.0.0", - "gray-matter": "^3.0.2", - "isobject": "^3.0.1", - "lazy-cache": "^2.0.2", - "mixin-deep": "^1.2.0", - "trim-leading-lines": "^0.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -19343,11 +11918,6 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -19356,7 +11926,8 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -19369,9 +11940,10 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "optional": true }, "path-parse": { "version": "1.0.6", @@ -19453,18 +12025,6 @@ } } }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -19498,6 +12058,15 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pixelsmith": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/pixelsmith/-/pixelsmith-2.4.1.tgz", @@ -19557,185 +12126,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, "requires": { "find-up": "^2.1.0" } }, - "pkg-store": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pkg-store/-/pkg-store-0.2.2.tgz", - "integrity": "sha1-sfXA+GIKWf1mWGrMXiVvTCw3oNg=", - "requires": { - "cache-base": "^0.8.2", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "union-value": "^0.2.3", - "write-json": "^0.2.2" - }, - "dependencies": { - "cache-base": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", - "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", - "requires": { - "collection-visit": "^0.2.1", - "component-emitter": "^1.2.1", - "get-value": "^2.0.5", - "has-value": "^0.3.1", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.1", - "set-value": "^0.4.2", - "to-object-path": "^0.3.0", - "union-value": "^0.2.3", - "unset-value": "^0.1.1" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "^2.0.1", - "map-visit": "^0.1.5", - "object-visit": "^0.3.4" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "^2.0.1", - "object-visit": "^0.3.4" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - }, - "union-value": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", - "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - } - }, - "unset-value": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", - "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - } - } - } - }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -19760,12 +12155,6 @@ "irregular-plurals": "^2.0.0" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, "pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -19776,1882 +12165,11 @@ "resolved": "https://registry.npmjs.org/pngjs-nozlib/-/pngjs-nozlib-1.0.0.tgz", "integrity": "sha1-nmTWAs/pzOTZ1Zl9BodCmnPwt9c=" }, - "popper.js": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", - "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==" - }, - "portal-vue": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.6.tgz", - "integrity": "sha512-lvCF85D4e8whd0nN32D8FqKwwkk7nYUI3Ku8UAEx4Z1reomu75dv5evRUTZNaj1EalxxWNXiNl0EHRq36fG8WA==" - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, - "postcss": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", - "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "^5.0.14" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "^5.0.16" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-easy-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-easy-import/-/postcss-easy-import-3.0.0.tgz", - "integrity": "sha512-cfNsear/v8xlkl9v5Wm8y4Do/puiDQTFF+WX2Fo++h7oKt1fKWVVW/5Ca8hslYDQWnjndrg813cA23Pt1jsYdg==", - "requires": { - "globby": "^6.1.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.4", - "object-assign": "^4.0.1", - "pify": "^3.0.0", - "postcss": "^6.0.11", - "postcss-import": "^10.0.0", - "resolve": "^1.1.7" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-import": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-10.0.0.tgz", - "integrity": "sha1-TIXJewmRNsxeoCQNwd/b/eTi674=", - "requires": { - "object-assign": "^4.0.1", - "postcss": "^6.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "requires": { - "postcss": "^5.0.5" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "requires": { - "postcss": "^5.0.4" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - } - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -21663,76 +12181,21 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "prettier": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", - "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==" - }, "pretty-bytes": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, - "pretty-time": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-0.2.0.tgz", - "integrity": "sha1-ejvexAScYgzXxCt/NCt01W5z104=", - "requires": { - "is-number": "^2.0.2", - "nanoseconds": "^0.1.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -21744,31 +12207,6 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, - "project-name": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/project-name/-/project-name-0.2.6.tgz", - "integrity": "sha1-Pk94H+HulLB4apuuU1BjdsN5r2k=", - "requires": { - "find-pkg": "^0.1.2", - "git-repo-name": "^0.6.0", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -21784,50 +12222,11 @@ "ipaddr.js": "1.9.0" } }, - "proxy-agent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.0.tgz", - "integrity": "sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "pac-proxy-agent": "^3.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, "ps-tree": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", @@ -21851,186 +12250,6 @@ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pug": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", - "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", - "requires": { - "pug-code-gen": "^2.0.2", - "pug-filters": "^3.1.1", - "pug-lexer": "^4.1.0", - "pug-linker": "^3.0.6", - "pug-load": "^2.0.12", - "pug-parser": "^5.0.1", - "pug-runtime": "^2.0.5", - "pug-strip-comments": "^1.0.4" - } - }, - "pug-attrs": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", - "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", - "requires": { - "constantinople": "^3.0.1", - "js-stringify": "^1.0.1", - "pug-runtime": "^2.0.5" - } - }, - "pug-code-gen": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", - "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", - "requires": { - "constantinople": "^3.1.2", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.1", - "pug-attrs": "^2.0.4", - "pug-error": "^1.3.3", - "pug-runtime": "^2.0.5", - "void-elements": "^2.0.1", - "with": "^5.0.0" - } - }, - "pug-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", - "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" - }, - "pug-filters": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", - "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", - "requires": { - "clean-css": "^4.1.11", - "constantinople": "^3.0.1", - "jstransformer": "1.0.0", - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8", - "resolve": "^1.1.6", - "uglify-js": "^2.6.1" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "pug-lexer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", - "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", - "requires": { - "character-parser": "^2.1.1", - "is-expression": "^3.0.0", - "pug-error": "^1.3.3" - } - }, - "pug-linker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", - "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", - "requires": { - "pug-error": "^1.3.3", - "pug-walk": "^1.1.8" - } - }, - "pug-load": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", - "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", - "requires": { - "object-assign": "^4.1.0", - "pug-walk": "^1.1.8" - } - }, - "pug-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", - "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", - "requires": { - "pug-error": "^1.3.3", - "token-stream": "0.0.1" - } - }, - "pug-runtime": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", - "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" - }, - "pug-strip-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", - "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", - "requires": { - "pug-error": "^1.3.3" - } - }, - "pug-walk": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", - "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -22089,6 +12308,14 @@ "ms": "^2.1.1" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -22102,13 +12329,8 @@ "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "optional": true }, "qs": { "version": "6.3.2", @@ -22119,6 +12341,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "optional": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -22130,172 +12353,6 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "question-cache": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/question-cache/-/question-cache-0.5.1.tgz", - "integrity": "sha1-C8JzKRdTQXB99azTHvLd9nApFo0=", - "requires": { - "arr-flatten": "^1.0.1", - "arr-union": "^3.1.0", - "async-each-series": "^1.1.0", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "get-value": "^2.0.6", - "has-value": "^0.3.1", - "inquirer2": "^0.1.1", - "is-answer": "^0.1.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "omit-empty": "^0.4.1", - "option-cache": "^3.4.0", - "os-homedir": "^1.0.1", - "project-name": "^0.2.5", - "set-value": "^0.3.3", - "to-choices": "^0.2.0", - "use": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - }, - "use": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", - "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", - "requires": { - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.2" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - } - } - }, - "question-store": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/question-store/-/question-store-0.11.1.tgz", - "integrity": "sha1-gf1NRF9NWtwqYiPCUj+nEj4E/X0=", - "requires": { - "common-config": "^0.1.0", - "data-store": "^0.16.1", - "debug": "^2.2.0", - "is-answer": "^0.1.0", - "lazy-cache": "^2.0.1", - "project-name": "^0.2.6", - "question-cache": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "queue": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", @@ -22305,45 +12362,10 @@ } }, "ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true, - "optional": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "dev": true }, "range-parser": { "version": "1.2.1", @@ -22379,26 +12401,6 @@ } } }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "read-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/read-file/-/read-file-0.2.0.tgz", - "integrity": "sha1-cMa6+IQux9FUD5gf0Oau1Mgb1UU=" - }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -22461,16 +12463,6 @@ "readable-stream": "^2.0.2" } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -22488,49 +12480,6 @@ "strip-indent": "^1.0.1" } }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", - "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "reduce-object": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/reduce-object/-/reduce-object-0.1.3.tgz", - "integrity": "sha1-1UnUCmwpNvpOPpt4yonJMxRZQhg=", - "requires": { - "for-own": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - } - } - }, "referrer-policy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", @@ -22539,31 +12488,23 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -22579,21 +12520,11 @@ "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", @@ -22611,57 +12542,6 @@ "rc": "^1.0.1" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "relative": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", - "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "remote-origin-url": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.5.3.tgz", - "integrity": "sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==", - "requires": { - "parse-git-config": "^1.1.1" - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -22704,40 +12584,6 @@ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -22771,86 +12617,6 @@ "remove-trailing-separator": "^1.1.0" } }, - "repo-utils": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/repo-utils/-/repo-utils-0.3.7.tgz", - "integrity": "sha1-SrZq80DLEfp+XPgFgekr6Xwb964=", - "requires": { - "extend-shallow": "^2.0.1", - "get-value": "^2.0.6", - "git-config-path": "^1.0.1", - "is-absolute": "^0.2.6", - "kind-of": "^3.0.4", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "omit-empty": "^0.4.1", - "parse-author": "^1.0.0", - "parse-git-config": "^1.0.2", - "parse-github-url": "^0.3.2", - "project-name": "^0.2.6" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "requires": { - "is-unc-path": "^0.1.1" - } - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "requires": { - "unc-path-regex": "^0.1.0" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, "request": { "version": "2.76.0", "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", @@ -22896,11 +12662,6 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" - }, "require-in-the-middle": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.0.0.tgz", @@ -22926,24 +12687,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -22960,12 +12703,6 @@ } } }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", @@ -22983,100 +12720,11 @@ "global-modules": "^1.0.0" } }, - "resolve-file": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/resolve-file/-/resolve-file-0.2.2.tgz", - "integrity": "sha1-FNvsWhnThPXW3GSin9ZigV0xdpY=", - "requires": { - "cwd": "^0.10.0", - "expand-tilde": "^2.0.1", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "global-modules": "^0.2.3", - "homedir-polyfill": "^1.0.0", - "lazy-cache": "^2.0.1", - "resolve": "^1.1.7" - }, - "dependencies": { - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, - "resolve-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-glob/-/resolve-glob-1.0.0.tgz", - "integrity": "sha512-wSW9pVGJRs89k0wEXhM7C6+va9998NsDhgc0Y+6Nv8hrHsu0hUS7Ug10J1EiVtU6N2tKlSNvx9wLihL8Ao22Lg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-valid-glob": "^1.0.0", - "matched": "^1.0.2", - "relative": "^3.0.2", - "resolve-dir": "^1.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -23099,11 +12747,12 @@ } }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -23112,39 +12761,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "rethrow": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/rethrow/-/rethrow-0.2.3.tgz", - "integrity": "sha1-xVKPGQ6J7HU1iJRSob5omWtfZhY=", - "requires": { - "ansi-bgred": "^0.1.1", - "ansi-red": "^0.1.1", - "ansi-yellow": "^0.1.1", - "extend-shallow": "^1.1.4", - "lazy-cache": "^0.2.3", - "right-align": "^0.1.3" - }, - "dependencies": { - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, "retry": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.9.0.tgz", @@ -23174,43 +12790,21 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", "requires": { "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, "run-parallel": { @@ -23218,18 +12812,13 @@ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "dev": true, "requires": { - "rx-lite": "*" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -23250,40 +12839,13 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "sass-loader": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", - "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", - "semver": "^6.3.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } + "sparse-bitfield": "^3.0.3" } }, "save-pixels": { @@ -23312,56 +12874,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=" }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "requires": { - "ajv": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "secure-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", @@ -23387,12 +12899,6 @@ } } }, - "selenium-server": { - "version": "3.141.59", - "resolved": "https://registry.npmjs.org/selenium-server/-/selenium-server-3.141.59.tgz", - "integrity": "sha512-pL7T1YtAqOEXiBbTx0KdZMkE2U7PYucemd7i0nDLcxcR1APXYZlJfNr5hrvL3mZgwXb7AJEZPINzC6mDU3eP5g==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -23507,14 +13013,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "^0.3.0" - } - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -23536,33 +13034,11 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "requires": { - "kind-of": "^6.0.2" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -23576,16 +13052,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -23610,11 +13076,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" - }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -23624,9 +13085,9 @@ } }, "sinon": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.4.2.tgz", - "integrity": "sha512-pY5RY99DKelU3pjNxcWo6XqeB1S118GBcVIIdDi6V+h6hevn1izcg2xv1hTHW/sViRXU7sUOxt4wTUJ3gsW2CQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, "requires": { "@sinonjs/commons": "^1.4.0", @@ -23668,19 +13129,30 @@ "dev": true }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -23694,17 +13166,6 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", - "dev": true - }, - "smartbanner.js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.14.3.tgz", - "integrity": "sha512-sztCJyMU96IlMAYZyfb/5jsmXz7629QozKY0tJ9x39aqUbYHiWInNNm45iNwsqv9A8gASXo98LnLiay0646vWw==" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -23833,159 +13294,6 @@ "hoek": "2.x.x" } }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -24003,39 +13311,6 @@ "sort-keys": "^1.0.0" } }, - "sort-object-arrays": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sort-object-arrays/-/sort-object-arrays-0.1.1.tgz", - "integrity": "sha1-mfVc8gWkkd3h9S8Jajaiawm0gy8=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sortablejs": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.0.tgz", - "integrity": "sha512-+e0YakK1BxgEZpf9l9UiFaiQ8ZOBn1p/4qkkXr8QDVmYyCrUDTyDRRGm0AgW4E4cD0wtgxJ6yzIRkSPUwqhuhg==" - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -24072,6 +13347,15 @@ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -24256,96 +13540,6 @@ } } }, - "src-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/src-stream/-/src-stream-0.1.1.tgz", - "integrity": "sha1-2T9G0oGjcAKB7A8wszoDFDiUpoE=", - "requires": { - "duplexify": "^3.4.2", - "merge-stream": "^0.1.8", - "through2": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "merge-stream": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", - "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", - "requires": { - "through2": "^0.6.1" - }, - "dependencies": { - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - } - } - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -24372,7 +13566,8 @@ "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "optional": true }, "stack-trace": { "version": "0.0.10", @@ -24403,23 +13598,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", @@ -24441,47 +13619,11 @@ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, - "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", - "dev": true, - "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - } - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -24523,11 +13665,6 @@ "safe-buffer": "~5.1.0" } }, - "stringify-author": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stringify-author/-/stringify-author-0.1.3.tgz", - "integrity": "sha1-1YHgLOC1XNo8lT5irdIR+uSw72Y=" - }, "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", @@ -24549,22 +13686,6 @@ "is-utf8": "^0.2.0" } }, - "strip-bom-buffer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz", - "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=", - "requires": { - "is-buffer": "^1.1.0", - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - } - } - }, "strip-bom-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", @@ -24574,16 +13695,6 @@ "strip-bom": "^2.0.0" } }, - "strip-bom-string": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz", - "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=" - }, - "strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" - }, "strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", @@ -24625,17 +13736,17 @@ "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" }, "stripe": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-7.9.1.tgz", - "integrity": "sha512-8RzWlQD2/X/1YdzHtd5PYG0/GyAicxddW0TL54SIFq2ivaDoeJg3YLn9rxcmrnkmmuW8aU7yeByKjNGI8QrVxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-7.10.0.tgz", + "integrity": "sha512-mwW6iIZ+h957CJAcJEt8zb2ZnVvGNceG8dNQPANu6O8Zzm1pr+noC/mxvZSCuAAvMq04VWqbXBON5QvBCT5miw==", "requires": { "qs": "^6.6.0" }, "dependencies": { "qs": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz", - "integrity": "sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==" + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", + "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" } } }, @@ -24644,11 +13755,6 @@ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, - "success-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", - "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" - }, "superagent": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.0.tgz", @@ -24686,9 +13792,9 @@ } }, "qs": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.8.0.tgz", - "integrity": "sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w==" + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", + "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==" }, "readable-stream": { "version": "3.4.0", @@ -24716,47 +13822,11 @@ "es6-symbol": "^3.1.1" } }, - "svg-inline-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz", - "integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==", - "requires": { - "loader-utils": "^0.2.11", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "svg-url-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-3.0.2.tgz", - "integrity": "sha512-MUJFVU2uuOTZW6Eq6NuXZxhaIyWiuKtZMcT90nCkcvIZPGGc0CYyZWYP/rtXUkja5qagNMpxDwdZ/tuC6ywfWg==", - "requires": { - "file-loader": "~4.2.0", - "loader-utils": "~1.2.3" - } - }, "svgo": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "optional": true, "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -24773,133 +13843,52 @@ "util.promisify": "~1.0.0" }, "dependencies": { - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "optional": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "svgo-loader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.1.tgz", - "integrity": "sha512-9dyz/h6ae04pAVRz7QY8bLXtMbwA19NPpCPfCixgW0qXNDCOlHbDRqvtT5/2gzRxfuibWCUP6ZBQmZWF9rjWhQ==", - "requires": { - "js-yaml": "^3.13.1", - "loader-utils": "^1.0.3" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true } } }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "is-fullwidth-code-point": { @@ -24908,64 +13897,36 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, - "tableize-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tableize-object/-/tableize-object-0.1.0.tgz", - "integrity": "sha1-fCngEzsn1ItWuedtOijSQd8bOiQ=", - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, "tar": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.11.tgz", - "integrity": "sha512-iI4zh3ktLJKaDNZKZc+fUONiQrSn9HkCFzamtb7k8FFmVilHVob7QsLX/VySAW8lAviMzMbFw4QtFb4errwgYA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.6.4", + "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", @@ -24987,37 +13948,27 @@ "xtend": "^4.0.0" } }, - "tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", - "dev": true, - "requires": { - "debug": "4.1.0", - "is2": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, "teeny-request": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-5.2.1.tgz", - "integrity": "sha512-gCVm5EV3z0p/yZOKyeBOFOpSXuxdIs3foeWDWb/foKMBejK18w40L0k0UMd/ZrGkOH+gxodjqpL8KK6x3haYCQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-5.3.0.tgz", + "integrity": "sha512-sN9E3JvEBe2CFqB/jpJpw1erWD1C7MxyYCxogHFCQSyZfkHYcdf4wzVQSw7FZxbwcfnS+FP0W9BS0mp6SEOKjg==", "requires": { "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", + "https-proxy-agent": "^3.0.0", "node-fetch": "^2.2.0", "stream-events": "^1.0.5", "uuid": "^3.3.2" + }, + "dependencies": { + "https-proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz", + "integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } } }, "temp-dir": { @@ -25036,173 +13987,6 @@ "uuid": "^3.0.1" } }, - "template-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/template-error/-/template-error-0.1.2.tgz", - "integrity": "sha1-GMn2ANkPLz37oIM+N/fLb0E1QtQ=", - "requires": { - "engine": "^0.1.5", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "rethrow": "^0.2.3" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - } - } - }, - "templates": { - "version": "0.24.3", - "resolved": "https://registry.npmjs.org/templates/-/templates-0.24.3.tgz", - "integrity": "sha1-i6uicOGlcnR022hXX4Ic4bT+TQU=", - "requires": { - "array-sort": "^0.1.2", - "async-each": "^1.0.0", - "base": "^0.11.1", - "base-data": "^0.6.0", - "base-engines": "^0.2.0", - "base-helpers": "^0.1.1", - "base-option": "^0.8.3", - "base-plugins": "^0.4.13", - "base-routes": "^0.2.1", - "debug": "^2.2.0", - "deep-bind": "^0.3.0", - "define-property": "^0.2.5", - "engine-base": "^0.1.2", - "export-files": "^2.1.1", - "extend-shallow": "^2.0.1", - "falsey": "^0.3.0", - "get-value": "^2.0.6", - "get-view": "^0.1.1", - "group-array": "^0.3.0", - "has-glob": "^0.1.1", - "has-value": "^0.3.1", - "inflection": "^1.10.0", - "is-valid-app": "^0.2.0", - "layouts": "^0.11.0", - "lazy-cache": "^2.0.1", - "match-file": "^0.2.0", - "mixin-deep": "^1.1.3", - "paginationator": "^0.1.3", - "pascalcase": "^0.1.1", - "set-value": "^0.3.3", - "template-error": "^0.1.2", - "vinyl-item": "^0.1.0", - "vinyl-view": "^0.1.2" - }, - "dependencies": { - "array-sort": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", - "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "set-value": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", - "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", - "requires": { - "extend-shallow": "^2.0.1", - "isobject": "^2.0.0", - "to-object-path": "^0.2.0" - } - }, - "to-object-path": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", - "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", - "requires": { - "arr-flatten": "^1.0.1", - "is-arguments": "^1.0.2" - } - } - } - }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -25211,128 +13995,6 @@ "execa": "^0.7.0" } }, - "test-exclude": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", - "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^2.3.11", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true - }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -25341,12 +14003,8 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "through": { "version": "2.3.8", @@ -25400,107 +14058,6 @@ } } }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true - }, - "time-diff": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/time-diff/-/time-diff-0.3.1.tgz", - "integrity": "sha1-Jej7c07qnmy15LA5TwWBC5yHwtg=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^2.1.0", - "log-utils": "^0.1.0", - "pretty-time": "^0.2.0" - }, - "dependencies": { - "ansi-colors": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.1.0.tgz", - "integrity": "sha1-M0rDbNPq1wjeXGnhmpjRhkImtD8=", - "requires": { - "ansi-bgblack": "^0.1.1", - "ansi-bgblue": "^0.1.1", - "ansi-bgcyan": "^0.1.1", - "ansi-bggreen": "^0.1.1", - "ansi-bgmagenta": "^0.1.1", - "ansi-bgred": "^0.1.1", - "ansi-bgwhite": "^0.1.1", - "ansi-bgyellow": "^0.1.1", - "ansi-black": "^0.1.1", - "ansi-blue": "^0.1.1", - "ansi-bold": "^0.1.1", - "ansi-cyan": "^0.1.1", - "ansi-dim": "^0.1.1", - "ansi-gray": "^0.1.1", - "ansi-green": "^0.1.1", - "ansi-grey": "^0.1.1", - "ansi-hidden": "^0.1.1", - "ansi-inverse": "^0.1.1", - "ansi-italic": "^0.1.1", - "ansi-magenta": "^0.1.1", - "ansi-red": "^0.1.1", - "ansi-reset": "^0.1.1", - "ansi-strikethrough": "^0.1.1", - "ansi-underline": "^0.1.1", - "ansi-white": "^0.1.1", - "ansi-yellow": "^0.1.1", - "lazy-cache": "^0.2.4" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, - "log-utils": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.1.5.tgz", - "integrity": "sha1-3g84+Vf0zW69Xctoddijua4HT3c=", - "requires": { - "ansi-colors": "^0.1.0", - "error-symbol": "^0.1.0", - "info-symbol": "^0.1.0", - "log-ok": "^0.1.1", - "success-symbol": "^0.1.0", - "time-stamp": "^1.0.1", - "warning-symbol": "^0.1.0" - } - } - } - }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -25511,14 +14068,6 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "requires": { - "setimmediate": "^1.0.4" - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -25536,131 +14085,17 @@ "is-negated-glob": "^1.0.0" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "optional": true }, - "to-choices": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-choices/-/to-choices-0.2.0.tgz", - "integrity": "sha1-IufnWgfWl9fkzsvVaxvwPBVlTXM=", - "requires": { - "ansi-gray": "^0.1.1", - "mixin-deep": "^1.1.3" - } - }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz", - "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=", - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "file-contents": "^0.2.4", - "glob-parent": "^2.0.0", - "is-valid-glob": "^0.3.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "vinyl": "^1.1.1" - }, - "dependencies": { - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true }, "to-object-path": { "version": "0.3.0", @@ -25734,16 +14169,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -25770,14 +14195,6 @@ "punycode": "^1.4.1" } }, - "trim-leading-lines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/trim-leading-lines/-/trim-leading-lines-0.1.1.tgz", - "integrity": "sha1-DnysPoMELc+Vp07TaWbxd0TVwWk=", - "requires": { - "is-whitespace": "^0.3.0" - } - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -25794,32 +14211,20 @@ "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "requires": { - "glob": "^7.1.2" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, "tunnel-agent": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", @@ -25850,6 +14255,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -25879,75 +14290,6 @@ "source-map": "~0.6.1" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, "uid2": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", @@ -26043,6 +14385,34 @@ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -26059,11 +14429,6 @@ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", @@ -26204,7 +14569,8 @@ "unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "optional": true }, "unset-value": { "version": "1.0.0", @@ -26268,128 +14634,6 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, - "update": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/update/-/update-0.7.4.tgz", - "integrity": "sha1-saCRwRo+KK4xui7vWLcRuCzpixQ=", - "requires": { - "arr-union": "^3.1.0", - "assemble-core": "^0.25.0", - "assemble-loader": "^0.6.1", - "base-cli-process": "^0.1.18", - "base-config-process": "^0.1.9", - "base-generators": "^0.4.5", - "base-questions": "^0.7.3", - "base-runtimes": "^0.2.0", - "base-store": "^0.4.4", - "common-config": "^0.1.0", - "data-store": "^0.16.1", - "export-files": "^2.1.1", - "extend-shallow": "^2.0.1", - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0", - "global-modules": "^0.2.2", - "gulp-choose-files": "^0.1.3", - "is-valid-app": "^0.2.0", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "log-utils": "^0.2.1", - "parser-front-matter": "^1.4.1", - "resolve-dir": "^0.1.0", - "resolve-file": "^0.2.0", - "set-blocking": "^2.0.0", - "strip-color": "^0.1.0", - "text-table": "^0.2.0", - "through2": "^2.0.1", - "yargs-parser": "^2.4.1" - }, - "dependencies": { - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "requires": { - "os-homedir": "^1.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - } - } - }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", @@ -26414,16 +14658,6 @@ } } }, - "upgrade": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upgrade/-/upgrade-1.1.0.tgz", - "integrity": "sha1-SlCHXsXHFdGTeXmfBZCg55aVj2E=" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -26465,28 +14699,6 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=" }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -26561,21 +14773,6 @@ } } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -26590,11 +14787,6 @@ "object.getownpropertydescriptors": "^2.0.3" } }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -26605,6 +14797,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", @@ -26613,11 +14811,6 @@ "homedir-polyfill": "^1.0.1" } }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -26642,11 +14835,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "vendors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -26777,218 +14965,6 @@ } } }, - "vinyl-item": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vinyl-item/-/vinyl-item-0.1.0.tgz", - "integrity": "sha1-8ngTyBFC66ScpYSd5PQvb6Dl4Jg=", - "requires": { - "base": "^0.8.1", - "base-option": "^0.8.2", - "base-plugins": "^0.4.12", - "clone": "^1.0.2", - "clone-stats": "^1.0.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "vinyl": "^1.1.1" - }, - "dependencies": { - "base": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/base/-/base-0.8.1.tgz", - "integrity": "sha1-aQC7MA8sdZbJnz2DurhyLYGLdI8=", - "requires": { - "arr-union": "^3.1.0", - "cache-base": "^0.8.2", - "class-utils": "^0.3.2", - "component-emitter": "^1.2.0", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "lazy-cache": "^1.0.3", - "mixin-deep": "^1.1.3" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } - } - }, - "cache-base": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", - "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", - "requires": { - "collection-visit": "^0.2.1", - "component-emitter": "^1.2.1", - "get-value": "^2.0.5", - "has-value": "^0.3.1", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.1", - "set-value": "^0.4.2", - "to-object-path": "^0.3.0", - "union-value": "^0.2.3", - "unset-value": "^0.1.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "collection-visit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", - "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", - "requires": { - "lazy-cache": "^2.0.1", - "map-visit": "^0.1.5", - "object-visit": "^0.3.4" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - }, - "map-visit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", - "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", - "requires": { - "lazy-cache": "^2.0.1", - "object-visit": "^0.3.4" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "object-visit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", - "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", - "requires": { - "isobject": "^2.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - }, - "union-value": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", - "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - } - }, - "unset-value": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", - "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - } - } - } - } - }, "vinyl-sourcemap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", @@ -27018,174 +14994,58 @@ } } }, - "vinyl-view": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/vinyl-view/-/vinyl-view-0.1.2.tgz", - "integrity": "sha1-CaxtfIASEr8JJr2dQQb0XmxPyXc=", + "vue-eslint-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", + "integrity": "sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==", + "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "engine-base": "^0.1.2", - "isobject": "^2.1.0", - "lazy-cache": "^2.0.1", - "mixin-deep": "^1.1.3", - "vinyl-item": "^0.1.0" + "debug": "^4.1.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.1.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "ms": "^2.1.1" } }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, "requires": { - "isarray": "1.0.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, "requires": { - "set-getter": "^0.1.0" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } } } }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" - }, - "vue": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", - "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" - }, - "vue-functional-data-merge": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", - "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" - }, - "vue-loader": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-14.2.4.tgz", - "integrity": "sha512-bub2/rcTMJ3etEbbeehdH2Em3G2F5vZIjMK7ZUePj5UtgmZSTtOX1xVVawDpDsy021s3vQpO6VpWJ3z3nO8dDw==", - "requires": { - "consolidate": "^0.14.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "lru-cache": "^4.1.1", - "postcss": "^6.0.8", - "postcss-load-config": "^1.1.0", - "postcss-selector-parser": "^2.0.0", - "prettier": "^1.16.0", - "resolve": "^1.4.0", - "source-map": "^0.6.1", - "vue-hot-reload-api": "^2.2.0", - "vue-style-loader": "^4.0.1", - "vue-template-es2015-compiler": "^1.6.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "vue-mugen-scroll": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/vue-mugen-scroll/-/vue-mugen-scroll-0.2.6.tgz", - "integrity": "sha512-6FOBzotc8p/GDQZYkEdenxPydDvABUuxqMese6Zv4fpEZf7CjNSabRtAeBUtg+339Z9iKMdpzussbqFHCRXVqA==", - "requires": { - "element-in-view": "^0.1.0", - "throttleit": "^1.0.0" - } - }, - "vue-router": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.3.tgz", - "integrity": "sha512-8iSa4mGNXBjyuSZFCCO4fiKfvzqk+mhL0lnKuGcQtO1eoj8nq3CmbEG8FwK5QqoqwDgsjsf1GDuisDX4cdb/aQ==" - }, - "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "vue-template-compiler": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", - "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", - "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" - }, - "vuedraggable": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.0.tgz", - "integrity": "sha512-RgdH16k43WNoxyRcv/OarB/DZh9SY5TYthk9TS4YiHXpelD1DytEG0phLAXiXx5EhsmdH8ltSWxklGa4g1WTCw==", - "requires": { - "sortablejs": "^1.9.0" - } - }, - "vuejs-datepicker": { - "version": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", - "from": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec" - }, "w3counter": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/w3counter/-/w3counter-3.0.1.tgz", @@ -27229,334 +15089,6 @@ } } }, - "warning-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", - "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "^2.0.0" - } - }, - "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.1.tgz", - "integrity": "sha512-rwxyfecTAxoarCC9VlHlIpfQCmmJ/qWD5bpbjkof+7HrNhTNZIwZITxN6CdlYL2axGmwNUQ+tFgcSOiNXMf/sQ==", - "dev": true, - "requires": { - "acorn": "^5.3.0", - "bfj-node4": "^5.2.0", - "chalk": "^2.3.0", - "commander": "^2.13.0", - "ejs": "^2.5.7", - "express": "^4.16.2", - "filesize": "^3.5.11", - "gzip-size": "^4.1.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "opener": "^1.4.3", - "ws": "^4.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", - "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", - "dev": true, - "requires": { - "loud-rejection": "^1.6.0", - "memory-fs": "~0.4.1", - "mime": "^2.1.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "url-join": "^2.0.2", - "webpack-log": "^1.0.1" - }, - "dependencies": { - "url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", - "dev": true - } - } - }, - "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" - } - }, - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -27658,15 +15190,6 @@ "triple-beam": "^1.2.0" } }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "requires": { - "acorn": "^3.1.0", - "acorn-globals": "^3.0.0" - } - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -27687,9 +15210,10 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, "requires": { "mkdirp": "^0.5.1" } @@ -27704,14 +15228,6 @@ "signal-exit": "^3.0.2" } }, - "write-json": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/write-json/-/write-json-0.2.2.tgz", - "integrity": "sha1-+k4VKennY6T5LwfZhBMX49JI2vM=", - "requires": { - "write": "^0.2.1" - } - }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", @@ -27772,23 +15288,11 @@ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz", "integrity": "sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw=" }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xpath.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -27841,12 +15345,6 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true } } } diff --git a/package.json b/package.json index 8649936b3e..de010c8d6c 100644 --- a/package.json +++ b/package.json @@ -1,76 +1,49 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.116.2", + "version": "4.118.0", "main": "./website/server/index.js", "dependencies": { - "@google-cloud/trace-agent": "^4.0.0", + "@google-cloud/trace-agent": "^4.2.2", "@slack/client": "^3.8.1", "accepts": "^1.3.5", "amazon-payments": "^0.2.7", "amplitude": "^3.5.0", - "amplitude-js": "^5.2.2", "apidoc": "^0.17.5", "apn": "^2.2.0", - "autoprefixer": "^9.4.0", - "aws-sdk": "^2.432.0", - "axios": "^0.19.0", - "axios-progress-bar": "^1.2.0", - "babel-core": "^6.26.3", - "babel-eslint": "^8.2.3", - "babel-loader": "^7.1.4", - "babel-plugin-syntax-async-functions": "^6.13.0", - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "babel-plugin-transform-object-rest-spread": "^6.16.0", - "babel-plugin-transform-regenerator": "^6.16.1", - "babel-polyfill": "^6.6.1", - "babel-preset-es2015": "^6.6.0", - "babel-register": "^6.6.0", - "babel-runtime": "^6.11.6", + "aws-sdk": "^2.556.0", "bcrypt": "^3.0.6", "body-parser": "^1.18.3", - "bootstrap": "^4.1.1", - "bootstrap-vue": "^2.0.2", "compression": "^1.7.4", "cookie-session": "^1.3.3", "coupon-code": "^0.4.5", - "cross-env": "^6.0.0", - "css-loader": "^0.28.11", "csv-stringify": "^5.1.0", "cwait": "^1.1.1", "domain-middleware": "~0.1.0", "express": "^4.16.3", "express-basic-auth": "^1.1.5", "express-validator": "^5.2.0", - "extract-text-webpack-plugin": "^3.0.2", - "glob": "^7.1.2", + "glob": "^7.1.5", "got": "^9.0.0", "gulp": "^4.0.0", - "gulp-babel": "^7.0.1", - "gulp-imagemin": "^6.0.0", + "gulp-babel": "^8.0.0", + "gulp-imagemin": "^6.1.1", "gulp-nodemon": "^2.4.1", "gulp.spritesmith": "^6.9.0", "habitica-markdown": "^1.3.0", - "hellojs": "^1.18.1", - "helmet": "^3.21.0", - "html-webpack-plugin": "^3.2.0", - "image-size": "^0.8.0", + "helmet": "^3.21.2", + "image-size": "^0.8.3", "in-app-purchase": "^1.11.3", - "intro.js": "^2.9.3", - "jquery": ">=3.0.0", "js2xmlparser": "^4.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "merge-stream": "^2.0.0", "method-override": "^3.0.0", - "moment": "^2.22.1", + "moment": "^2.24.0", "moment-recur": "^1.0.7", - "mongoose": "^5.6.9", + "mongoose": "^5.7.7", "morgan": "^1.7.0", "nconf": "^0.10.0", "node-gcm": "^1.0.2", - "node-sass": "^4.12.0", - "ora": "^3.2.0", "pageres": "^5.1.0", "passport": "^0.4.0", "passport-facebook": "^3.0.0", @@ -78,40 +51,17 @@ "passport-google-oauth20": "1.0.0", "paypal-ipn": "3.0.0", "paypal-rest-sdk": "^1.8.1", - "popper.js": "^1.14.3", - "postcss-easy-import": "^3.0.0", "ps-tree": "^1.0.0", - "pug": "^2.0.3", "regenerator-runtime": "^0.13.3", - "rimraf": "^2.4.3", - "sass-loader": "^7.0.3", - "shelljs": "^0.8.2", + "rimraf": "^3.0.0", "short-uuid": "^3.0.0", - "smartbanner.js": "^1.11.0", - "stripe": "^7.9.0", + "stripe": "^7.10.0", "superagent": "^5.0.2", - "svg-inline-loader": "^0.8.0", - "svg-url-loader": "^3.0.0", - "svgo": "^1.2.0", - "svgo-loader": "^2.1.0", "universal-analytics": "^0.4.17", - "update": "^0.7.4", - "upgrade": "^1.1.0", - "url-loader": "^1.0.0", "useragent": "^2.1.9", - "uuid": "^3.0.1", + "uuid": "^3.3.3", "validator": "^11.0.0", "vinyl-buffer": "^1.0.1", - "vue": "^2.6.10", - "vue-loader": "^14.2.2", - "vue-mugen-scroll": "^0.2.1", - "vue-router": "^3.0.0", - "vue-style-loader": "^4.1.0", - "vue-template-compiler": "^2.6.10", - "vuedraggable": "^2.20.0", - "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", - "webpack": "^3.12.0", - "webpack-merge": "^4.1.3", "winston": "^2.4.3", "winston-loggly-bulk": "^2.0.2", "xml2js": "^0.4.4" @@ -122,7 +72,8 @@ "npm": "^6" }, "scripts": { - "lint": "eslint --ext .js,.vue .", + "lint": "eslint --ext .js --fix . && cd website/client && npm run lint", + "lint-no-fix": "eslint --ext .js . && cd website/client && npm run lint --no-fix", "test": "npm run lint && gulp test && gulp apidoc", "test:build": "gulp test:prepare:build", "test:api-v3": "gulp test:api-v3", @@ -137,60 +88,32 @@ "test:nodemon": "gulp test:nodemon", "coverage": "COVERAGE=true mocha --require register-handlers.js --reporter html-cov > coverage.html; open coverage.html", "sprites": "gulp sprites:compile", - "client:dev": "node webpack/dev-server.js", - "client:build": "gulp build:client", - "client:unit": "cross-env NODE_ENV=test karma start test/client/unit/karma.conf.js --single-run", - "client:unit:watch": "cross-env NODE_ENV=test karma start test/client/unit/karma.conf.js", - "client:e2e": "node test/client/e2e/runner.js", - "client:test": "npm run client:unit && npm run client:e2e", + "client:dev": "cd website/client && npm run serve", + "client:build": "cd website/client && npm run build", + "client:unit": "cd website/client && npm run test:unit", "start": "gulp nodemon", - "postinstall": "gulp build", + "postinstall": "gulp build && cd website/client && npm install", "apidoc": "gulp apidoc" }, "devDependencies": { - "@vue/test-utils": "^1.0.0-beta.29", - "babel-plugin-istanbul": "^4.1.6", - "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "@babel/core": "^7.6.4", + "@babel/preset-env": "^7.6.3", + "@babel/register": "^7.6.2", + "axios": "^0.19.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "chalk": "^2.4.1", - "chromedriver": "^77.0.0", - "connect-history-api-fallback": "^1.1.0", - "cross-spawn": "^7.0.0", - "eslint": "^4.19.1", - "eslint-config-habitrpg": "^4.0.0", - "eslint-friendly-formatter": "^4.0.1", - "eslint-loader": "^2.0.0", - "eslint-plugin-html": "^4.0.3", + "eslint": "^6.6.0", + "eslint-config-habitrpg": "^6.2.0", "eslint-plugin-mocha": "^5.0.0", - "eventsource-polyfill": "^0.9.6", "expect.js": "^0.3.1", - "http-proxy-middleware": "^0.20.0", "istanbul": "^1.1.0-alpha.1", - "karma": "^4.0.1", - "karma-babel-preprocessor": "^7.0.0", - "karma-chai-plugins": "^0.9.0", - "karma-chrome-launcher": "^3.0.0", - "karma-coverage": "^1.1.2", - "karma-mocha": "^1.3.0", - "karma-mocha-reporter": "^2.2.5", - "karma-sinon-chai": "^2.0.0", - "karma-sinon-stub-promise": "^1.0.0", - "karma-sourcemap-loader": "^0.3.7", - "karma-spec-reporter": "0.0.32", - "karma-webpack": "^3.0.0", "mocha": "^5.1.1", - "monk": "^6.0.6", - "nightwatch": "^1.0.16", - "puppeteer": "^1.14.0", + "monk": "^7.1.1", "require-again": "^2.0.0", - "selenium-server": "^3.12.0", "sinon": "^7.2.4", "sinon-chai": "^3.0.0", - "sinon-stub-promise": "^4.0.0", - "webpack-bundle-analyzer": "^2.12.0", - "webpack-dev-middleware": "^2.0.5", - "webpack-hot-middleware": "^2.22.2" + "sinon-stub-promise": "^4.0.0" }, "optionalDependencies": {} } diff --git a/scripts/gdpr-delete-users.js b/scripts/gdpr-delete-users.js index c60c16d92f..cfa95d29a3 100644 --- a/scripts/gdpr-delete-users.js +++ b/scripts/gdpr-delete-users.js @@ -1,13 +1,13 @@ -/* eslint-disable no-console */ -import axios from 'axios'; -import { model as User } from '../website/server/models/user'; +/* eslint-disable no-console, import/no-commonjs */ +import axios from 'axios'; // eslint-disable-line import/no-extraneous-dependencies import nconf from 'nconf'; +import { model as User } from '../website/server/models/user'; const AMPLITUDE_KEY = nconf.get('AMPLITUDE_KEY'); const AMPLITUDE_SECRET = nconf.get('AMPLITUDE_SECRET'); const BASE_URL = nconf.get('BASE_URL'); -async function _deleteAmplitudeData (userId, email) { +async function deleteAmplitudeData (userId, email) { const response = await axios.post( 'https://amplitude.com/api/2/deletions/users', { @@ -19,22 +19,24 @@ async function _deleteAmplitudeData (userId, email) { username: AMPLITUDE_KEY, password: AMPLITUDE_SECRET, }, - } - ).catch((err) => { + }, + ).catch(err => { console.log(err.response.data); }); if (response) console.log(`${response.status} ${response.statusText}`); } -async function _deleteHabiticaData (user, email) { +async function deleteHabiticaData (user, email) { await User.update( - {_id: user._id}, - {$set: { - 'auth.local.email': email, - 'auth.local.hashed_password': '$2a$10$QDnNh1j1yMPnTXDEOV38xOePEWFd4X8DSYwAM8XTmqmacG5X0DKjW', - 'auth.local.passwordHashMethod': 'bcrypt', - }} + { _id: user._id }, + { + $set: { + 'auth.local.email': email, + 'auth.local.hashed_password': '$2a$10$QDnNh1j1yMPnTXDEOV38xOePEWFd4X8DSYwAM8XTmqmacG5X0DKjW', + 'auth.local.passwordHashMethod': 'bcrypt', + }, + }, ); const response = await axios.delete( `${BASE_URL}/api/v3/user`, @@ -46,8 +48,8 @@ async function _deleteHabiticaData (user, email) { 'x-api-user': user._id, 'x-api-key': user.apiToken, }, - } - ).catch((err) => { + }, + ).catch(err => { console.log(err.response.data); }); @@ -57,14 +59,15 @@ async function _deleteHabiticaData (user, email) { } } -async function _processEmailAddress (email) { +async function processEmailAddress (email) { const emailRegex = new RegExp(`^${email}$`, 'i'); const users = await User.find({ $or: [ - {'auth.local.email': emailRegex}, - {'auth.facebook.emails.value': emailRegex}, - {'auth.google.emails.value': emailRegex}, - ]}, + { 'auth.local.email': emailRegex }, + { 'auth.facebook.emails.value': emailRegex }, + { 'auth.google.emails.value': emailRegex }, + ], + }, { _id: 1, apiToken: 1, @@ -74,15 +77,15 @@ async function _processEmailAddress (email) { if (users.length < 1) { console.log(`No users found with email address ${email}`); } else { - for (const user of users) { - await _deleteAmplitudeData(user._id, email); // eslint-disable-line no-await-in-loop - await _deleteHabiticaData(user, email); // eslint-disable-line no-await-in-loop - } + Promise.all(users.map(user => (async () => { + await deleteAmplitudeData(user._id, email); // eslint-disable-line no-await-in-loop + await deleteHabiticaData(user, email); // eslint-disable-line no-await-in-loop + })())); } } function deleteUserData (emails) { - const emailPromises = emails.map(_processEmailAddress); + const emailPromises = emails.map(processEmailAddress); return Promise.all(emailPromises); } diff --git a/scripts/paypalBillingSetup.js b/scripts/paypalBillingSetup.js index e99ffe31b8..76ab828e58 100644 --- a/scripts/paypalBillingSetup.js +++ b/scripts/paypalBillingSetup.js @@ -1,8 +1,12 @@ -require('babel-register'); +/* eslint-disable import/no-commonjs */ +require('@babel/register'); // eslint-disable-line import/no-extraneous-dependencies -// This file is used for creating paypal billing plans. PayPal doesn't have a web interface for setting up recurring -// payment plan definitions, instead you have to create it via their REST SDK and keep it updated the same way. So this -// file will be used once for initing your billing plan (then you get the resultant plan.id to store in config.json), +// This file is used for creating paypal billing plans. +// PayPal doesn't have a web interface for setting up recurring +// payment plan definitions, instead you have to create it +// via their REST SDK and keep it updated the same way. So this +// file will be used once for initing your billing plan +// (then you get the resultant plan.id to store in config.json), // and once for any time you need to edit the plan thereafter /* eslint-disable no-console, camelcase, no-case-declarations */ @@ -12,11 +16,12 @@ const nconf = require('nconf'); const _ = require('lodash'); const paypal = require('paypal-rest-sdk'); const blocks = require('../website/common').content.subscriptionBlocks; + const live = nconf.get('PAYPAL_MODE') === 'live'; nconf.argv().env().file('user', path.join(path.resolve(__dirname, '../config.json'))); -let OP = 'create'; // list get update create create-webprofile +const OP = 'create'; // list get update create create-webprofile paypal.configure({ mode: nconf.get('PAYPAL_MODE'), // sandbox or live @@ -25,8 +30,8 @@ paypal.configure({ }); // https://developer.paypal.com/docs/api/#billing-plans-and-agreements -let billingPlanTitle = 'Habitica Subscription'; -let billingPlanAttributes = { +const billingPlanTitle = 'Habitica Subscription'; +const billingPlanAttributes = { description: billingPlanTitle, type: 'INFINITE', merchant_preferences: { @@ -41,7 +46,7 @@ let billingPlanAttributes = { }], }; -_.each(blocks, (block) => { +_.each(blocks, block => { block.definition = _.cloneDeep(billingPlanAttributes); _.merge(block.definition.payment_definitions[0], { name: `${billingPlanTitle} ($${block.price} every ${block.months} months, recurring)`, @@ -57,17 +62,17 @@ _.each(blocks, (block) => { switch (OP) { case 'list': - paypal.billingPlan.list({status: 'ACTIVE'}, (err, plans) => { - console.log({err, plans}); + paypal.billingPlan.list({ status: 'ACTIVE' }, (err, plans) => { + console.log({ err, plans }); }); break; case 'get': paypal.billingPlan.get(nconf.get('PAYPAL_BILLING_PLANS_basic_12mo'), (err, plan) => { - console.log({err, plan}); + console.log({ err, plan }); }); break; case 'update': - let updatePayload = { + const updatePayload = { op: 'replace', path: '/merchant_preferences', value: { @@ -75,7 +80,7 @@ switch (OP) { }, }; paypal.billingPlan.update(nconf.get('PAYPAL_BILLING_PLANS_basic_12mo'), updatePayload, (err, res) => { - console.log({err, plan: res}); + console.log({ err, plan: res }); }); break; case 'create': @@ -83,10 +88,10 @@ switch (OP) { if (err) return console.log(err); if (plan.state === 'ACTIVE') { - return console.log({err, plan}); + return console.log({ err, plan }); } - let billingPlanUpdateAttributes = [{ + const billingPlanUpdateAttributes = [{ op: 'replace', path: '/', value: { @@ -96,12 +101,14 @@ switch (OP) { // Activate the plan by changing status to Active paypal.billingPlan.update(plan.id, billingPlanUpdateAttributes, (err2, response) => { - console.log({err: err2, response, id: plan.id}); + console.log({ err: err2, response, id: plan.id }); }); + + return null; }); break; case 'create-webprofile': - let webexpinfo = { + const webexpinfo = { name: 'HabiticaProfile', input_fields: { no_shipping: 1, @@ -112,4 +119,6 @@ switch (OP) { console.log(error, result); }); break; + default: + throw new Error('Invalid op'); } diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 465e06424b..0000000000 --- a/test/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": [ - "habitrpg/mocha", - "habitrpg/esnext" - ], - "env": { - "node": true, - }, - "globals": { - "_": true, - } -} diff --git a/test/.eslintrc.js b/test/.eslintrc.js new file mode 100644 index 0000000000..b62d82ccea --- /dev/null +++ b/test/.eslintrc.js @@ -0,0 +1,12 @@ +module.exports = { + extends: [ + 'habitrpg/lib/mocha', + ], + globals: { + _: true, + chai: true, + expect: true, + sinon: true, + sandbox: true + }, +} diff --git a/test/api/unit/libs/analyticsService.test.js b/test/api/unit/libs/analyticsService.test.js index e5c7819478..27d78d3f3c 100644 --- a/test/api/unit/libs/analyticsService.test.js +++ b/test/api/unit/libs/analyticsService.test.js @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ -import analyticsService from '../../../../website/server/libs/analyticsService'; import Amplitude from 'amplitude'; import { Visitor } from 'universal-analytics'; +import * as analyticsService from '../../../../website/server/libs/analyticsService'; describe('analyticsService', () => { beforeEach(() => { @@ -16,7 +16,8 @@ describe('analyticsService', () => { }); describe('#track', () => { - let eventType, data; + let eventType; let + data; beforeEach(() => { Visitor.prototype.event.yields(); @@ -35,12 +36,10 @@ describe('analyticsService', () => { }); context('Amplitude', () => { - it('calls out to amplitude', () => { - return analyticsService.track(eventType, data) - .then(() => { - expect(Amplitude.prototype.track).to.be.calledOnce; - }); - }); + it('calls out to amplitude', () => analyticsService.track(eventType, data) + .then(() => { + expect(Amplitude.prototype.track).to.be.calledOnce; + })); it('uses a dummy user id if none is provided', () => { delete data.uuid; @@ -55,7 +54,7 @@ describe('analyticsService', () => { context('platform', () => { it('logs web platform', () => { - data.headers = {'x-client': 'habitica-web'}; + data.headers = { 'x-client': 'habitica-web' }; return analyticsService.track(eventType, data) .then(() => { @@ -66,7 +65,7 @@ describe('analyticsService', () => { }); it('logs iOS platform', () => { - data.headers = {'x-client': 'habitica-ios'}; + data.headers = { 'x-client': 'habitica-ios' }; return analyticsService.track(eventType, data) .then(() => { @@ -77,7 +76,7 @@ describe('analyticsService', () => { }); it('logs Android platform', () => { - data.headers = {'x-client': 'habitica-android'}; + data.headers = { 'x-client': 'habitica-android' }; return analyticsService.track(eventType, data) .then(() => { @@ -88,7 +87,7 @@ describe('analyticsService', () => { }); it('logs 3rd Party platform', () => { - data.headers = {'x-client': 'some-third-party'}; + data.headers = { 'x-client': 'some-third-party' }; return analyticsService.track(eventType, data) .then(() => { @@ -169,18 +168,16 @@ describe('analyticsService', () => { }); }); - it('sends details about event', () => { - return analyticsService.track(eventType, data) - .then(() => { - expect(Amplitude.prototype.track).to.be.calledWithMatch({ - event_properties: { - category: 'behavior', - resting: true, - cronCount: 5, - }, - }); + it('sends details about event', () => analyticsService.track(eventType, data) + .then(() => { + expect(Amplitude.prototype.track).to.be.calledWithMatch({ + event_properties: { + category: 'behavior', + resting: true, + cronCount: 5, + }, }); - }); + })); it('sends english item name for gear if itemKey is provided', () => { data.itemKey = 'headAccessory_special_foxEars'; @@ -267,16 +264,18 @@ describe('analyticsService', () => { }); it('sends user data if provided', () => { - let stats = { class: 'wizard', exp: 5, gp: 23, hp: 10, lvl: 4, mp: 30 }; - let user = { + const stats = { + class: 'wizard', exp: 5, gp: 23, hp: 10, lvl: 4, mp: 30, + }; + const user = { stats, contributor: { level: 1 }, purchased: { plan: { planId: 'foo-plan' } }, - flags: {tour: {intro: -2}}, - habits: [{_id: 'habit'}], - dailys: [{_id: 'daily'}], - todos: [{_id: 'todo'}], - rewards: [{_id: 'reward'}], + flags: { tour: { intro: -2 } }, + habits: [{ _id: 'habit' }], + dailys: [{ _id: 'daily' }], + todos: [{ _id: 'todo' }], + rewards: [{ _id: 'reward' }], balance: 12, loginIncentives: 1, }; @@ -312,27 +311,24 @@ describe('analyticsService', () => { }); context('GA', () => { - it('calls out to GA', () => { - return analyticsService.track(eventType, data) - .then(() => { - expect(Visitor.prototype.event).to.be.calledOnce; - }); - }); + it('calls out to GA', () => analyticsService.track(eventType, data) + .then(() => { + expect(Visitor.prototype.event).to.be.calledOnce; + })); - it('sends details about event', () => { - return analyticsService.track(eventType, data) - .then(() => { - expect(Visitor.prototype.event).to.be.calledWith({ - ea: 'Cron', - ec: 'behavior', - }); + it('sends details about event', () => analyticsService.track(eventType, data) + .then(() => { + expect(Visitor.prototype.event).to.be.calledWith({ + ea: 'Cron', + ec: 'behavior', }); - }); + })); }); }); describe('#trackPurchase', () => { - let data, itemSpy; + let data; let + itemSpy; beforeEach(() => { Visitor.prototype.event.yields(); @@ -361,12 +357,10 @@ describe('analyticsService', () => { }); context('Amplitude', () => { - it('calls out to amplitude', () => { - return analyticsService.trackPurchase(data) - .then(() => { - expect(Amplitude.prototype.track).to.be.calledOnce; - }); - }); + it('calls out to amplitude', () => analyticsService.trackPurchase(data) + .then(() => { + expect(Amplitude.prototype.track).to.be.calledOnce; + })); it('uses a dummy user id if none is provided', () => { delete data.uuid; @@ -381,7 +375,7 @@ describe('analyticsService', () => { context('platform', () => { it('logs web platform', () => { - data.headers = {'x-client': 'habitica-web'}; + data.headers = { 'x-client': 'habitica-web' }; return analyticsService.trackPurchase(data) .then(() => { @@ -392,7 +386,7 @@ describe('analyticsService', () => { }); it('logs iOS platform', () => { - data.headers = {'x-client': 'habitica-ios'}; + data.headers = { 'x-client': 'habitica-ios' }; return analyticsService.trackPurchase(data) .then(() => { @@ -403,7 +397,7 @@ describe('analyticsService', () => { }); it('logs Android platform', () => { - data.headers = {'x-client': 'habitica-android'}; + data.headers = { 'x-client': 'habitica-android' }; return analyticsService.trackPurchase(data) .then(() => { @@ -414,7 +408,7 @@ describe('analyticsService', () => { }); it('logs 3rd Party platform', () => { - data.headers = {'x-client': 'some-third-party'}; + data.headers = { 'x-client': 'some-third-party' }; return analyticsService.trackPurchase(data) .then(() => { @@ -495,33 +489,33 @@ describe('analyticsService', () => { }); }); - it('sends details about purchase', () => { - return analyticsService.trackPurchase(data) - .then(() => { - expect(Amplitude.prototype.track).to.be.calledWithMatch({ - event_properties: { - gift: false, - itemPurchased: 'Gems', - paymentMethod: 'PayPal', - purchaseType: 'checkout', - quantity: 1, - sku: 'paypal-checkout', - }, - }); + it('sends details about purchase', () => analyticsService.trackPurchase(data) + .then(() => { + expect(Amplitude.prototype.track).to.be.calledWithMatch({ + event_properties: { + gift: false, + itemPurchased: 'Gems', + paymentMethod: 'PayPal', + purchaseType: 'checkout', + quantity: 1, + sku: 'paypal-checkout', + }, }); - }); + })); it('sends user data if provided', () => { - let stats = { class: 'wizard', exp: 5, gp: 23, hp: 10, lvl: 4, mp: 30 }; - let user = { + const stats = { + class: 'wizard', exp: 5, gp: 23, hp: 10, lvl: 4, mp: 30, + }; + const user = { stats, contributor: { level: 1 }, purchased: { plan: { planId: 'foo-plan' } }, - flags: {tour: {intro: -2}}, - habits: [{_id: 'habit'}], - dailys: [{_id: 'daily'}], - todos: [{_id: 'todo'}], - rewards: [{_id: 'reward'}], + flags: { tour: { intro: -2 } }, + habits: [{ _id: 'habit' }], + dailys: [{ _id: 'daily' }], + todos: [{ _id: 'todo' }], + rewards: [{ _id: 'reward' }], }; data.user = user; @@ -552,27 +546,23 @@ describe('analyticsService', () => { }); context('GA', () => { - it('calls out to GA', () => { - return analyticsService.trackPurchase(data) - .then(() => { - expect(Visitor.prototype.event).to.be.calledOnce; - expect(Visitor.prototype.transaction).to.be.calledOnce; - }); - }); + it('calls out to GA', () => analyticsService.trackPurchase(data) + .then(() => { + expect(Visitor.prototype.event).to.be.calledOnce; + expect(Visitor.prototype.transaction).to.be.calledOnce; + })); - it('sends details about purchase', () => { - return analyticsService.trackPurchase(data) - .then(() => { - expect(Visitor.prototype.event).to.be.calledWith({ - ea: 'checkout', - ec: 'commerce', - el: 'PayPal', - ev: 8, - }); - expect(Visitor.prototype.transaction).to.be.calledWith('user-id', 8); - expect(itemSpy).to.be.calledWith(8, 1, 'paypal-checkout', 'Gems', 'checkout'); + it('sends details about purchase', () => analyticsService.trackPurchase(data) + .then(() => { + expect(Visitor.prototype.event).to.be.calledWith({ + ea: 'checkout', + ec: 'commerce', + el: 'PayPal', + ev: 8, }); - }); + expect(Visitor.prototype.transaction).to.be.calledWith('user-id', 8); + expect(itemSpy).to.be.calledWith(8, 1, 'paypal-checkout', 'Gems', 'checkout'); + })); }); }); diff --git a/test/api/unit/libs/apiError.js b/test/api/unit/libs/apiError.js index fda9b1788b..c9c8357f2f 100644 --- a/test/api/unit/libs/apiError.js +++ b/test/api/unit/libs/apiError.js @@ -11,7 +11,7 @@ describe('API Messages', () => { }); it('clones the passed variables', () => { - let vars = {a: 1}; + const vars = { a: 1 }; sandbox.stub(_, 'clone').returns({}); apiError('guildsOnlyPaginate', vars); expect(_.clone).to.have.been.calledOnce; @@ -19,8 +19,8 @@ describe('API Messages', () => { }); it('pass the message through _.template', () => { - let vars = {a: 1}; - let stub = sinon.stub().returns('string'); + const vars = { a: 1 }; + const stub = sinon.stub().returns('string'); sandbox.stub(_, 'template').returns(stub); apiError('guildsOnlyPaginate', vars); expect(_.template).to.have.been.calledOnce; diff --git a/test/api/unit/libs/baseModel.test.js b/test/api/unit/libs/baseModel.test.js index 28e85aea50..44fbf1854c 100644 --- a/test/api/unit/libs/baseModel.test.js +++ b/test/api/unit/libs/baseModel.test.js @@ -1,5 +1,5 @@ -import baseModel from '../../../../website/server/libs/baseModel'; import mongoose from 'mongoose'; +import baseModel from '../../../../website/server/libs/baseModel'; describe('Base model plugin', () => { let schema; @@ -25,7 +25,7 @@ describe('Base model plugin', () => { }); it('can add timestamps fields', () => { - schema.plugin(baseModel, {timestamps: true}); + schema.plugin(baseModel, { timestamps: true }); expect(schema.add).to.be.calledTwice; }); @@ -36,7 +36,7 @@ describe('Base model plugin', () => { }); expect(schema.statics.sanitize).to.exist; - let sanitized = schema.statics.sanitize({ok: true, noUpdateForMe: true}); + const sanitized = schema.statics.sanitize({ ok: true, noUpdateForMe: true }); expect(sanitized).to.have.property('ok'); expect(sanitized).not.to.have.property('noUpdateForMe'); @@ -49,7 +49,7 @@ describe('Base model plugin', () => { }); expect(schema.statics.sanitize).to.exist; - let sanitized = schema.statics.sanitize({ok: true, noUpdateForMe: true, usuallySettable: true}, ['usuallySettable']); + const sanitized = schema.statics.sanitize({ ok: true, noUpdateForMe: true, usuallySettable: true }, ['usuallySettable']); expect(sanitized).to.have.property('ok'); expect(sanitized).not.to.have.property('noUpdateForMe'); @@ -63,31 +63,31 @@ describe('Base model plugin', () => { }); expect(schema.options.toJSON.transform).to.exist; - let objToTransform = {ok: true, amPrivate: true}; - let privatized = schema.options.toJSON.transform({}, objToTransform); + const objToTransform = { ok: true, amPrivate: true }; + const privatized = schema.options.toJSON.transform({}, objToTransform); expect(privatized).to.have.property('ok'); expect(privatized).not.to.have.property('amPrivate'); }); it('accepts a further transform function for toJSON', () => { - let options = { + const options = { private: ['amPrivate'], toJSONTransform: sandbox.stub().returns(true), }; schema.plugin(baseModel, options); - let objToTransform = {ok: true, amPrivate: true}; - let doc = {doc: true}; - let privatized = schema.options.toJSON.transform(doc, objToTransform); + const objToTransform = { ok: true, amPrivate: true }; + const doc = { doc: true }; + const privatized = schema.options.toJSON.transform(doc, objToTransform); expect(privatized).to.equals(true); expect(options.toJSONTransform).to.be.calledWith(objToTransform, doc); }); it('accepts a transform function for sanitize', () => { - let options = { + const options = { private: ['amPrivate'], sanitizeTransform: sandbox.stub().returns(true), }; @@ -95,8 +95,8 @@ describe('Base model plugin', () => { schema.plugin(baseModel, options); expect(schema.options.toJSON.transform).to.exist; - let objToSanitize = {ok: true, noUpdateForMe: true}; - let sanitized = schema.statics.sanitize(objToSanitize); + const objToSanitize = { ok: true, noUpdateForMe: true }; + const sanitized = schema.statics.sanitize(objToSanitize); expect(sanitized).to.equals(true); expect(options.sanitizeTransform).to.be.calledWith(objToSanitize); diff --git a/test/api/unit/libs/collectionManipulators.test.js b/test/api/unit/libs/collectionManipulators.test.js index 3d4fb70d6d..3c524d3af7 100644 --- a/test/api/unit/libs/collectionManipulators.test.js +++ b/test/api/unit/libs/collectionManipulators.test.js @@ -6,7 +6,7 @@ import { describe('Collection Manipulators', () => { describe('removeFromArray', () => { it('removes element from array', () => { - let array = ['a', 'b', 'c', 'd']; + const array = ['a', 'b', 'c', 'd']; removeFromArray(array, 'c'); @@ -14,7 +14,7 @@ describe('Collection Manipulators', () => { }); it('removes object from array', () => { - let array = [ + const array = [ { id: 'a', foo: 'bar' }, { id: 'b', foo: 'bar' }, { id: 'c', foo: 'bar' }, @@ -28,7 +28,7 @@ describe('Collection Manipulators', () => { }); it('does not change array if value is not found', () => { - let array = ['a', 'b', 'c', 'd']; + const array = ['a', 'b', 'c', 'd']; removeFromArray(array, 'z'); @@ -40,15 +40,15 @@ describe('Collection Manipulators', () => { }); it('returns the removed element', () => { - let array = ['a', 'b', 'c']; + const array = ['a', 'b', 'c']; - let result = removeFromArray(array, 'b'); + const result = removeFromArray(array, 'b'); expect(result).to.eql('b'); }); it('returns the removed object element', () => { - let array = [ + const array = [ { id: 'a', foo: 'bar' }, { id: 'b', foo: 'bar' }, { id: 'c', foo: 'bar' }, @@ -56,31 +56,31 @@ describe('Collection Manipulators', () => { { id: 'e', foo: 'bar' }, ]; - let result = removeFromArray(array, { id: 'c' }); + const result = removeFromArray(array, { id: 'c' }); expect(result).to.eql({ id: 'c', foo: 'bar' }); }); it('returns false if item is not found', () => { - let array = ['a', 'b', 'c']; + const array = ['a', 'b', 'c']; - let result = removeFromArray(array, 'z'); + const result = removeFromArray(array, 'z'); expect(result).to.eql(false); }); it('persists removal of element when mongoose document is saved', async () => { - let schema = new mongoose.Schema({ + const schema = new mongoose.Schema({ array: Array, }); - let Model = mongoose.model('ModelToTestRemoveFromArray', schema); - let model = await new Model({ + const Model = mongoose.model('ModelToTestRemoveFromArray', schema); + const model = await new Model({ array: ['a', 'b', 'c'], }).save(); // Initial creation removeFromArray(model.array, 'b'); - let savedModel = await model.save(); + const savedModel = await model.save(); expect(savedModel.array).to.not.include('b'); }); diff --git a/test/api/unit/libs/cron.test.js b/test/api/unit/libs/cron.test.js index 61e7499393..5f6c6c95d8 100644 --- a/test/api/unit/libs/cron.test.js +++ b/test/api/unit/libs/cron.test.js @@ -6,16 +6,18 @@ import { recoverCron, cron } from '../../../../website/server/libs/cron'; import { model as User } from '../../../../website/server/models/user'; import * as Tasks from '../../../../website/server/models/task'; import common from '../../../../website/common'; -import analytics from '../../../../website/server/libs/analyticsService'; +import * as analytics from '../../../../website/server/libs/analyticsService'; // const scoreTask = common.ops.scoreTask; -let pathToCronLib = '../../../../website/server/libs/cron'; +const pathToCronLib = '../../../../website/server/libs/cron'; describe('cron', () => { let clock = null; let user; - let tasksByType = {habits: [], dailys: [], todos: [], rewards: []}; + const tasksByType = { + habits: [], dailys: [], todos: [], rewards: [], + }; let daysMissed = 0; beforeEach(() => { @@ -35,39 +37,48 @@ describe('cron', () => { }); afterEach(() => { - if (clock !== null) - clock.restore(); + if (clock !== null) clock.restore(); analytics.track.restore(); }); it('updates user.preferences.timezoneOffsetAtLastCron', () => { - let timezoneOffsetFromUserPrefs = 1; + const timezoneOffsetFromUserPrefs = 1; - cron({user, tasksByType, daysMissed, analytics, timezoneOffsetFromUserPrefs}); + cron({ + user, tasksByType, daysMissed, analytics, timezoneOffsetFromUserPrefs, + }); expect(user.preferences.timezoneOffsetAtLastCron).to.equal(timezoneOffsetFromUserPrefs); }); it('resets user.items.lastDrop.count', () => { user.items.lastDrop.count = 4; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.items.lastDrop.count).to.equal(0); }); it('increments user cron count', () => { - let cronCountBefore = user.flags.cronCount; - cron({user, tasksByType, daysMissed, analytics}); + const cronCountBefore = user.flags.cronCount; + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.flags.cronCount).to.be.greaterThan(cronCountBefore); }); it('calls analytics', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(analytics.track.callCount).to.equal(1); }); it('calls analytics when user is sleeping', () => { user.preferences.sleep = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(analytics.track.callCount).to.equal(1); }); @@ -79,14 +90,18 @@ describe('cron', () => { it('resets plan.gemsBought on a new month', () => { user.purchased.plan.gemsBought = 10; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.gemsBought).to.equal(0); }); it('resets plan.gemsBought on a new month if user does not have purchased.plan.dateUpdated', () => { user.purchased.plan.gemsBought = 10; user.purchased.plan.dateUpdated = undefined; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.gemsBought).to.equal(0); }); @@ -95,32 +110,42 @@ describe('cron', () => { user.purchased.plan.dateUpdated = moment().startOf('month').toDate(); user.purchased.plan.gemsBought = 10; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.gemsBought).to.equal(10); }); it('resets plan.dateUpdated on a new month', () => { - let currentMonth = moment().startOf('month'); - cron({user, tasksByType, daysMissed, analytics}); + const currentMonth = moment().startOf('month'); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(moment(user.purchased.plan.dateUpdated).startOf('month').isSame(currentMonth)).to.eql(true); }); it('increments plan.consecutive.count', () => { user.purchased.plan.consecutive.count = 0; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.count).to.equal(1); }); it('increments plan.consecutive.count by more than 1 if user skipped months between logins', () => { user.purchased.plan.dateUpdated = moment().subtract(2, 'months').toDate(); user.purchased.plan.consecutive.count = 0; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.count).to.equal(2); }); it('decrements plan.consecutive.offset when offset is greater than 0', () => { user.purchased.plan.consecutive.offset = 2; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.offset).to.equal(1); }); @@ -130,7 +155,9 @@ describe('cron', () => { user.purchased.plan.consecutive.count = 5; user.purchased.plan.consecutive.trinkets = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.trinkets).to.equal(1); }); @@ -138,23 +165,29 @@ describe('cron', () => { it('does not increment plan.consecutive.gemCapExtra when user has reached the gemCap limit', () => { user.purchased.plan.consecutive.gemCapExtra = 25; user.purchased.plan.consecutive.count = 5; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(25); }); it('does not reset plan stats if we are before the last day of the cancelled month', () => { - user.purchased.plan.dateTerminated = moment(new Date()).add({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + user.purchased.plan.dateTerminated = moment(new Date()).add({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.customerId).to.exist; }); it('does reset plan stats if we are after the last day of the cancelled month', () => { - user.purchased.plan.dateTerminated = moment(new Date()).subtract({days: 1}); + user.purchased.plan.dateTerminated = moment(new Date()).subtract({ days: 1 }); user.purchased.plan.consecutive.gemCapExtra = 20; user.purchased.plan.consecutive.count = 5; user.purchased.plan.consecutive.offset = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.customerId).to.not.exist; expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(0); @@ -164,7 +197,7 @@ describe('cron', () => { describe('for a 1-month recurring subscription', () => { // create a user that will be used for all of these tests without a reset before each - let user1 = new User({ + const user1 = new User({ auth: { local: { username: 'username1', @@ -185,10 +218,15 @@ describe('cron', () => { user1.purchased.plan.consecutive.gemCapExtra = 0; it('does not increment consecutive benefits after the first month', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); // Add 1 month to simulate what happens a month after the subscription was created. - // Add 2 days so that we're sure we're not affected by any start-of-month effects e.g., from time zone oddness. - cron({user: user1, tasksByType, daysMissed, analytics}); + // Add 2 days so that we're sure we're not affected by any start-of-month effects + // e.g., from time zone oddness. + cron({ + user: user1, tasksByType, daysMissed, analytics, + }); expect(user1.purchased.plan.consecutive.count).to.equal(1); expect(user1.purchased.plan.consecutive.offset).to.equal(0); expect(user1.purchased.plan.consecutive.trinkets).to.equal(0); @@ -196,10 +234,15 @@ describe('cron', () => { }); it('does not increment consecutive benefits after the second month', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months').add(2, 'days').toDate()); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months') + .add(2, 'days') + .toDate()); // Add 1 month to simulate what happens a month after the subscription was created. - // Add 2 days so that we're sure we're not affected by any start-of-month effects e.g., from time zone oddness. - cron({user: user1, tasksByType, daysMissed, analytics}); + // Add 2 days so that we're sure we're not affected by any start-of-month effects + // e.g., from time zone oddness. + cron({ + user: user1, tasksByType, daysMissed, analytics, + }); expect(user1.purchased.plan.consecutive.count).to.equal(2); expect(user1.purchased.plan.consecutive.offset).to.equal(0); expect(user1.purchased.plan.consecutive.trinkets).to.equal(0); @@ -207,10 +250,15 @@ describe('cron', () => { }); it('increments consecutive benefits after the third month', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months').add(2, 'days').toDate()); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months') + .add(2, 'days') + .toDate()); // Add 1 month to simulate what happens a month after the subscription was created. - // Add 2 days so that we're sure we're not affected by any start-of-month effects e.g., from time zone oddness. - cron({user: user1, tasksByType, daysMissed, analytics}); + // Add 2 days so that we're sure we're not affected by any start-of-month effects + // e.g., from time zone oddness. + cron({ + user: user1, tasksByType, daysMissed, analytics, + }); expect(user1.purchased.plan.consecutive.count).to.equal(3); expect(user1.purchased.plan.consecutive.offset).to.equal(0); expect(user1.purchased.plan.consecutive.trinkets).to.equal(1); @@ -218,10 +266,15 @@ describe('cron', () => { }); it('does not increment consecutive benefits after the fourth month', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months').add(2, 'days').toDate()); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months') + .add(2, 'days') + .toDate()); // Add 1 month to simulate what happens a month after the subscription was created. - // Add 2 days so that we're sure we're not affected by any start-of-month effects e.g., from time zone oddness. - cron({user: user1, tasksByType, daysMissed, analytics}); + // Add 2 days so that we're sure we're not affected by any start-of-month effects + // e.g., from time zone oddness. + cron({ + user: user1, tasksByType, daysMissed, analytics, + }); expect(user1.purchased.plan.consecutive.count).to.equal(4); expect(user1.purchased.plan.consecutive.offset).to.equal(0); expect(user1.purchased.plan.consecutive.trinkets).to.equal(1); @@ -229,8 +282,12 @@ describe('cron', () => { }); it('increments consecutive benefits correctly if user has been absent with continuous subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(10, 'months').add(2, 'days').toDate()); - cron({user: user1, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(10, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user1, tasksByType, daysMissed, analytics, + }); expect(user1.purchased.plan.consecutive.count).to.equal(10); expect(user1.purchased.plan.consecutive.offset).to.equal(0); expect(user1.purchased.plan.consecutive.trinkets).to.equal(3); @@ -239,7 +296,7 @@ describe('cron', () => { }); describe('for a 3-month recurring subscription', () => { - let user3 = new User({ + const user3 = new User({ auth: { local: { username: 'username3', @@ -260,8 +317,12 @@ describe('cron', () => { user3.purchased.plan.consecutive.gemCapExtra = 5; it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(1); expect(user3.purchased.plan.consecutive.offset).to.equal(2); expect(user3.purchased.plan.consecutive.trinkets).to.equal(1); @@ -269,8 +330,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the middle of the period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(2); expect(user3.purchased.plan.consecutive.offset).to.equal(1); expect(user3.purchased.plan.consecutive.trinkets).to.equal(1); @@ -278,8 +343,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the final month of the period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(3); expect(user3.purchased.plan.consecutive.offset).to.equal(0); expect(user3.purchased.plan.consecutive.trinkets).to.equal(1); @@ -287,8 +356,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the second paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(4); expect(user3.purchased.plan.consecutive.offset).to.equal(2); expect(user3.purchased.plan.consecutive.trinkets).to.equal(2); @@ -296,8 +369,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the second month of the second period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(5, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(5, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(5); expect(user3.purchased.plan.consecutive.offset).to.equal(1); expect(user3.purchased.plan.consecutive.trinkets).to.equal(2); @@ -305,8 +382,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the final month of the second period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(6, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(6, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(6); expect(user3.purchased.plan.consecutive.offset).to.equal(0); expect(user3.purchased.plan.consecutive.trinkets).to.equal(2); @@ -314,8 +395,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the third paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(7); expect(user3.purchased.plan.consecutive.offset).to.equal(2); expect(user3.purchased.plan.consecutive.trinkets).to.equal(3); @@ -323,8 +408,12 @@ describe('cron', () => { }); it('increments consecutive benefits correctly if user has been absent with continuous subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(10, 'months').add(2, 'days').toDate()); - cron({user: user3, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(10, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3, tasksByType, daysMissed, analytics, + }); expect(user3.purchased.plan.consecutive.count).to.equal(10); expect(user3.purchased.plan.consecutive.offset).to.equal(2); expect(user3.purchased.plan.consecutive.trinkets).to.equal(4); @@ -333,7 +422,7 @@ describe('cron', () => { }); describe('for a 6-month recurring subscription', () => { - let user6 = new User({ + const user6 = new User({ auth: { local: { username: 'username6', @@ -354,8 +443,12 @@ describe('cron', () => { user6.purchased.plan.consecutive.gemCapExtra = 10; it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); - cron({user: user6, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6, tasksByType, daysMissed, analytics, + }); expect(user6.purchased.plan.consecutive.count).to.equal(1); expect(user6.purchased.plan.consecutive.offset).to.equal(5); expect(user6.purchased.plan.consecutive.trinkets).to.equal(2); @@ -363,8 +456,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the final month of the period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(6, 'months').add(2, 'days').toDate()); - cron({user: user6, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(6, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6, tasksByType, daysMissed, analytics, + }); expect(user6.purchased.plan.consecutive.count).to.equal(6); expect(user6.purchased.plan.consecutive.offset).to.equal(0); expect(user6.purchased.plan.consecutive.trinkets).to.equal(2); @@ -372,8 +469,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the second paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months').add(2, 'days').toDate()); - cron({user: user6, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6, tasksByType, daysMissed, analytics, + }); expect(user6.purchased.plan.consecutive.count).to.equal(7); expect(user6.purchased.plan.consecutive.offset).to.equal(5); expect(user6.purchased.plan.consecutive.trinkets).to.equal(4); @@ -381,8 +482,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the third paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(13, 'months').add(2, 'days').toDate()); - cron({user: user6, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(13, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6, tasksByType, daysMissed, analytics, + }); expect(user6.purchased.plan.consecutive.count).to.equal(13); expect(user6.purchased.plan.consecutive.offset).to.equal(5); expect(user6.purchased.plan.consecutive.trinkets).to.equal(6); @@ -390,8 +495,12 @@ describe('cron', () => { }); it('increments consecutive benefits correctly if user has been absent with continuous subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(19, 'months').add(2, 'days').toDate()); - cron({user: user6, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(19, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6, tasksByType, daysMissed, analytics, + }); expect(user6.purchased.plan.consecutive.count).to.equal(19); expect(user6.purchased.plan.consecutive.offset).to.equal(5); expect(user6.purchased.plan.consecutive.trinkets).to.equal(8); @@ -400,7 +509,7 @@ describe('cron', () => { }); describe('for a 12-month recurring subscription', () => { - let user12 = new User({ + const user12 = new User({ auth: { local: { username: 'username12', @@ -421,8 +530,12 @@ describe('cron', () => { user12.purchased.plan.consecutive.gemCapExtra = 20; it('does not increment consecutive benefits in the first month of the first paid period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); - cron({user: user12, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user12, tasksByType, daysMissed, analytics, + }); expect(user12.purchased.plan.consecutive.count).to.equal(1); expect(user12.purchased.plan.consecutive.offset).to.equal(11); expect(user12.purchased.plan.consecutive.trinkets).to.equal(4); @@ -430,8 +543,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the final month of the period that they already have benefits for', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(12, 'months').add(2, 'days').toDate()); - cron({user: user12, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(12, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user12, tasksByType, daysMissed, analytics, + }); expect(user12.purchased.plan.consecutive.count).to.equal(12); expect(user12.purchased.plan.consecutive.offset).to.equal(0); expect(user12.purchased.plan.consecutive.trinkets).to.equal(4); @@ -439,8 +556,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the second paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(13, 'months').add(2, 'days').toDate()); - cron({user: user12, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(13, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user12, tasksByType, daysMissed, analytics, + }); expect(user12.purchased.plan.consecutive.count).to.equal(13); expect(user12.purchased.plan.consecutive.offset).to.equal(11); expect(user12.purchased.plan.consecutive.trinkets).to.equal(8); @@ -448,8 +569,12 @@ describe('cron', () => { }); it('increments consecutive benefits the month after the third paid period has started', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(25, 'months').add(2, 'days').toDate()); - cron({user: user12, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(25, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user12, tasksByType, daysMissed, analytics, + }); expect(user12.purchased.plan.consecutive.count).to.equal(25); expect(user12.purchased.plan.consecutive.offset).to.equal(11); expect(user12.purchased.plan.consecutive.trinkets).to.equal(12); @@ -457,8 +582,12 @@ describe('cron', () => { }); it('increments consecutive benefits correctly if user has been absent with continuous subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(37, 'months').add(2, 'days').toDate()); - cron({user: user12, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(37, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user12, tasksByType, daysMissed, analytics, + }); expect(user12.purchased.plan.consecutive.count).to.equal(37); expect(user12.purchased.plan.consecutive.offset).to.equal(11); expect(user12.purchased.plan.consecutive.trinkets).to.equal(16); @@ -467,7 +596,7 @@ describe('cron', () => { }); describe('for a 3-month gift subscription (non-recurring)', () => { - let user3g = new User({ + const user3g = new User({ auth: { local: { username: 'username3g', @@ -481,7 +610,8 @@ describe('cron', () => { // user3g has a 3-month gift subscription starting today user3g.purchased.plan.customerId = 'Gift'; user3g.purchased.plan.dateUpdated = moment().toDate(); - user3g.purchased.plan.dateTerminated = moment().startOf('month').add(3, 'months').add(15, 'days').toDate(); + user3g.purchased.plan.dateTerminated = moment().startOf('month').add(3, 'months').add(15, 'days') + .toDate(); user3g.purchased.plan.planId = null; user3g.purchased.plan.consecutive.count = 0; user3g.purchased.plan.consecutive.offset = 3; @@ -489,8 +619,12 @@ describe('cron', () => { user3g.purchased.plan.consecutive.gemCapExtra = 5; it('does not increment consecutive benefits in the first month of the gift subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); - cron({user: user3g, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3g, tasksByType, daysMissed, analytics, + }); expect(user3g.purchased.plan.consecutive.count).to.equal(1); expect(user3g.purchased.plan.consecutive.offset).to.equal(2); expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1); @@ -498,8 +632,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the second month of the gift subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months').add(2, 'days').toDate()); - cron({user: user3g, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3g, tasksByType, daysMissed, analytics, + }); expect(user3g.purchased.plan.consecutive.count).to.equal(2); expect(user3g.purchased.plan.consecutive.offset).to.equal(1); expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1); @@ -507,8 +645,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the third month of the gift subscription', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months').add(2, 'days').toDate()); - cron({user: user3g, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3g, tasksByType, daysMissed, analytics, + }); expect(user3g.purchased.plan.consecutive.count).to.equal(3); expect(user3g.purchased.plan.consecutive.offset).to.equal(0); expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1); @@ -516,9 +658,14 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the month after the gift subscription has ended', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months').add(2, 'days').toDate()); - cron({user: user3g, tasksByType, daysMissed, analytics}); - expect(user3g.purchased.plan.consecutive.count).to.equal(0); // subscription has been erased by now + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(4, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user3g, tasksByType, daysMissed, analytics, + }); + // subscription has been erased by now + expect(user3g.purchased.plan.consecutive.count).to.equal(0); expect(user3g.purchased.plan.consecutive.offset).to.equal(0); expect(user3g.purchased.plan.consecutive.trinkets).to.equal(1); expect(user3g.purchased.plan.consecutive.gemCapExtra).to.equal(0); // erased @@ -526,7 +673,7 @@ describe('cron', () => { }); describe('for a 6-month recurring subscription where the user has incorrect consecutive month data from prior bugs', () => { - let user6x = new User({ + const user6x = new User({ auth: { local: { username: 'username6x', @@ -537,7 +684,8 @@ describe('cron', () => { }, }, }); - // user6x has a 6-month recurring subscription starting 8 months in the past before issue #4819 was fixed + // user6x has a 6-month recurring subscription starting 8 months in the past + // before issue #4819 was fixed user6x.purchased.plan.customerId = 'subscribedId'; user6x.purchased.plan.dateUpdated = moment().toDate(); user6x.purchased.plan.planId = 'basic_6mo'; @@ -547,8 +695,12 @@ describe('cron', () => { user6x.purchased.plan.consecutive.gemCapExtra = 15; it('increments consecutive benefits in the first month since the fix for #4819 goes live', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months').add(2, 'days').toDate()); - cron({user: user6x, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(1, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6x, tasksByType, daysMissed, analytics, + }); expect(user6x.purchased.plan.consecutive.count).to.equal(9); expect(user6x.purchased.plan.consecutive.offset).to.equal(5); expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5); @@ -556,8 +708,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the second month after the fix goes live', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months').add(2, 'days').toDate()); - cron({user: user6x, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(2, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6x, tasksByType, daysMissed, analytics, + }); expect(user6x.purchased.plan.consecutive.count).to.equal(10); expect(user6x.purchased.plan.consecutive.offset).to.equal(4); expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5); @@ -565,8 +721,12 @@ describe('cron', () => { }); it('does not increment consecutive benefits in the third month after the fix goes live', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months').add(2, 'days').toDate()); - cron({user: user6x, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(3, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6x, tasksByType, daysMissed, analytics, + }); expect(user6x.purchased.plan.consecutive.count).to.equal(11); expect(user6x.purchased.plan.consecutive.offset).to.equal(3); expect(user6x.purchased.plan.consecutive.trinkets).to.equal(5); @@ -574,8 +734,12 @@ describe('cron', () => { }); it('increments consecutive benefits in the seventh month after the fix goes live', () => { - clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months').add(2, 'days').toDate()); - cron({user: user6x, tasksByType, daysMissed, analytics}); + clock = sinon.useFakeTimers(moment().zone(0).startOf('month').add(7, 'months') + .add(2, 'days') + .toDate()); + cron({ + user: user6x, tasksByType, daysMissed, analytics, + }); expect(user6x.purchased.plan.consecutive.count).to.equal(15); expect(user6x.purchased.plan.consecutive.offset).to.equal(5); expect(user6x.purchased.plan.consecutive.trinkets).to.equal(7); @@ -591,7 +755,9 @@ describe('cron', () => { it('resets plan.gemsBought on a new month', () => { user.purchased.plan.gemsBought = 10; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.gemsBought).to.equal(0); }); @@ -600,59 +766,77 @@ describe('cron', () => { user.purchased.plan.dateUpdated = moment().startOf('month').toDate(); user.purchased.plan.gemsBought = 10; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.gemsBought).to.equal(10); }); it('does not reset plan.dateUpdated on a new month', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.dateUpdated).to.be.empty; }); it('does not increment plan.consecutive.count', () => { user.purchased.plan.consecutive.count = 0; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.count).to.equal(0); }); it('does not decrement plan.consecutive.offset when offset is greater than 0', () => { user.purchased.plan.consecutive.offset = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.offset).to.equal(1); }); it('does not increment plan.consecutive.trinkets when user has reached a month that is a multiple of 3', () => { user.purchased.plan.consecutive.count = 5; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.trinkets).to.equal(0); }); it('does not increment plan.consecutive.gemCapExtra when user has reached a month that is a multiple of 3', () => { user.purchased.plan.consecutive.count = 5; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(0); }); it('does not increment plan.consecutive.gemCapExtra when user has reached the gemCap limit', () => { user.purchased.plan.consecutive.gemCapExtra = 25; user.purchased.plan.consecutive.count = 5; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.consecutive.gemCapExtra).to.equal(25); }); it('does nothing to plan stats if we are before the last day of the cancelled month', () => { - user.purchased.plan.dateTerminated = moment(new Date()).add({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + user.purchased.plan.dateTerminated = moment(new Date()).add({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.customerId).to.not.exist; }); xit('does nothing to plan stats when we are after the last day of the cancelled month', () => { - user.purchased.plan.dateTerminated = moment(new Date()).subtract({days: 1}); + user.purchased.plan.dateTerminated = moment(new Date()).subtract({ days: 1 }); user.purchased.plan.consecutive.gemCapExtra = 20; user.purchased.plan.consecutive.count = 5; user.purchased.plan.consecutive.offset = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.purchased.plan.customerId).to.exist; expect(user.purchased.plan.consecutive.gemCapExtra).to.exist; @@ -663,26 +847,30 @@ describe('cron', () => { describe('todos', () => { beforeEach(() => { - let todo = { + const todo = { text: 'test todo', type: 'todo', value: 0, }; - let task = new Tasks.todo(Tasks.Task.sanitize(todo)); // eslint-disable-line new-cap + const task = new Tasks.todo(Tasks.Task.sanitize(todo)); // eslint-disable-line new-cap tasksByType.todos.push(task); }); it('should make uncompleted todos redder', () => { - let valueBefore = tasksByType.todos[0].value; - cron({user, tasksByType, daysMissed, analytics}); + const valueBefore = tasksByType.todos[0].value; + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.todos[0].value).to.be.lessThan(valueBefore); }); it('should add history of completed todos to user history', () => { tasksByType.todos[0].completed = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.history.todos).to.be.lengthOf(1); }); @@ -690,7 +878,7 @@ describe('cron', () => { it('should remove completed todos from users taskOrder list', () => { tasksByType.todos = []; user.tasksOrder.todos = []; - let todo = { + const todo = { text: 'test todo', type: 'todo', value: 0, @@ -702,16 +890,17 @@ describe('cron', () => { tasksByType.todos.push(task); tasksByType.todos[0].completed = true; - user.tasksOrder.todos = tasksByType.todos.map(taskTodo => { - return taskTodo._id; - }); - // Since ideally tasksByType should not contain completed todos, fake ids should be filtered too + user.tasksOrder.todos = tasksByType.todos.map(taskTodo => taskTodo._id); + // Since ideally tasksByType should not contain completed todos, + // fake ids should be filtered too user.tasksOrder.todos.push('00000000-0000-0000-0000-000000000000'); expect(tasksByType.todos).to.be.lengthOf(2); expect(user.tasksOrder.todos).to.be.lengthOf(3); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); // user.tasksOrder.todos should be filtered while tasks by type remains unchanged expect(tasksByType.todos).to.be.lengthOf(2); @@ -721,7 +910,7 @@ describe('cron', () => { it('should preserve todos order in task list', () => { tasksByType.todos = []; user.tasksOrder.todos = []; - let todo = { + const todo = { text: 'test todo', type: 'todo', value: 0, @@ -735,12 +924,12 @@ describe('cron', () => { tasksByType.todos.push(task); // Set up user.tasksOrder list in a specific order - user.tasksOrder.todos = tasksByType.todos.map(todoTask => { - return todoTask._id; - }).reverse(); - let original = user.tasksOrder.todos; // Preserve the original order + user.tasksOrder.todos = tasksByType.todos.map(todoTask => todoTask._id).reverse(); + const original = user.tasksOrder.todos; // Preserve the original order - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); let listsAreEqual = true; user.tasksOrder.todos.forEach((taskId, index) => { @@ -756,18 +945,18 @@ describe('cron', () => { describe('dailys', () => { beforeEach(() => { - let daily = { + const daily = { text: 'test daily', type: 'daily', }; - let task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap + const task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap tasksByType.dailys = []; tasksByType.dailys.push(task); const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {con: 1})); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { con: 1 })); }); afterEach(() => { @@ -778,7 +967,9 @@ describe('cron', () => { tasksByType.dailys[0].frequency = 'daily'; tasksByType.dailys[0].everyX = 5; tasksByType.dailys[0].startDate = moment().add(1, 'days').toDate(); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].isDue).to.be.false; }); @@ -787,7 +978,9 @@ describe('cron', () => { tasksByType.dailys[0].frequency = 'daily'; tasksByType.dailys[0].everyX = 5; tasksByType.dailys[0].startDate = moment().toDate(); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].isDue).to.exist; }); @@ -795,88 +988,110 @@ describe('cron', () => { tasksByType.dailys[0].frequency = 'daily'; tasksByType.dailys[0].everyX = 5; tasksByType.dailys[0].startDate = moment().add(1, 'days').toDate(); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].nextDue.length).to.eql(6); }); it('should add history', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].history).to.be.lengthOf(1); }); it('should set tasks completed to false', () => { tasksByType.dailys[0].completed = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].completed).to.be.false; }); it('should set tasks completed to false when user is sleeping', () => { user.preferences.sleep = true; tasksByType.dailys[0].completed = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].completed).to.be.false; }); it('should reset task checklist for completed dailys', () => { - tasksByType.dailys[0].checklist.push({title: 'test', completed: false}); + tasksByType.dailys[0].checklist.push({ title: 'test', completed: false }); tasksByType.dailys[0].completed = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].checklist[0].completed).to.be.false; }); it('should reset task checklist for completed dailys when user is sleeping', () => { user.preferences.sleep = true; - tasksByType.dailys[0].checklist.push({title: 'test', completed: false}); + tasksByType.dailys[0].checklist.push({ title: 'test', completed: false }); tasksByType.dailys[0].completed = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].checklist[0].completed).to.be.false; }); it('should reset task checklist for dailys with scheduled misses', () => { daysMissed = 10; - tasksByType.dailys[0].checklist.push({title: 'test', completed: false}); - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + tasksByType.dailys[0].checklist.push({ title: 'test', completed: false }); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.dailys[0].checklist[0].completed).to.be.false; }); it('should do damage for missing a daily', () => { daysMissed = 1; - let hpBefore = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + const hpBefore = user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.hp).to.be.lessThan(hpBefore); }); it('should not do damage for missing a daily when user is sleeping', () => { user.preferences.sleep = true; daysMissed = 1; - let hpBefore = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + const hpBefore = user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.hp).to.equal(hpBefore); }); it('should not do damage for missing a daily when CRON_SAFE_MODE is set', () => { sandbox.stub(nconf, 'get').withArgs('CRON_SAFE_MODE').returns('true'); - let cronOverride = requireAgain(pathToCronLib).cron; + const cronOverride = requireAgain(pathToCronLib).cron; daysMissed = 1; - let hpBefore = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + const hpBefore = user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - cronOverride({user, tasksByType, daysMissed, analytics}); + cronOverride({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.hp).to.equal(hpBefore); }); it('should not do damage for missing a daily if user stealth buff is greater than or equal to days missed', () => { daysMissed = 1; - let hpBefore = user.stats.hp; + const hpBefore = user.stats.hp; user.stats.buffs.stealth = 2; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.hp).to.equal(hpBefore); }); @@ -884,24 +1099,31 @@ describe('cron', () => { it('should do less damage for missing a daily with partial completion', () => { daysMissed = 1; let hpBefore = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); - let hpDifferenceOfFullyIncompleteDaily = hpBefore - user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); + const hpDifferenceOfFullyIncompleteDaily = hpBefore - user.stats.hp; hpBefore = user.stats.hp; - tasksByType.dailys[0].checklist.push({title: 'test', completed: true}); - tasksByType.dailys[0].checklist.push({title: 'test2', completed: false}); - cron({user, tasksByType, daysMissed, analytics}); - let hpDifferenceOfPartiallyIncompleteDaily = hpBefore - user.stats.hp; + tasksByType.dailys[0].checklist.push({ title: 'test', completed: true }); + tasksByType.dailys[0].checklist.push({ title: 'test2', completed: false }); + cron({ + user, tasksByType, daysMissed, analytics, + }); + const hpDifferenceOfPartiallyIncompleteDaily = hpBefore - user.stats.hp; - expect(hpDifferenceOfPartiallyIncompleteDaily).to.be.lessThan(hpDifferenceOfFullyIncompleteDaily); + expect(hpDifferenceOfPartiallyIncompleteDaily) + .to.be.lessThan(hpDifferenceOfFullyIncompleteDaily); }); it('should decrement quest.progress.down for missing a daily', () => { daysMissed = 1; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let progress = cron({user, tasksByType, daysMissed, analytics}); + const progress = cron({ + user, tasksByType, daysMissed, analytics, + }); expect(progress.down).to.equal(-1); }); @@ -909,28 +1131,32 @@ describe('cron', () => { it('should not decrement quest.progress.down for missing a daily when user is sleeping', () => { user.preferences.sleep = true; daysMissed = 1; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let progress = cron({user, tasksByType, daysMissed, analytics}); + const progress = cron({ + user, tasksByType, daysMissed, analytics, + }); expect(progress.down).to.equal(0); }); it('should do damage for only yesterday\'s dailies', () => { daysMissed = 3; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let daily = { + const daily = { text: 'test daily', type: 'daily', }; - let task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap + const task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap tasksByType.dailys.push(task); - tasksByType.dailys[1].startDate = moment(new Date()).subtract({days: 2}); + tasksByType.dailys[1].startDate = moment(new Date()).subtract({ days: 2 }); tasksByType.dailys[1].everyX = 2; tasksByType.dailys[1].frequency = 'daily'; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.hp).to.equal(48); }); @@ -938,12 +1164,12 @@ describe('cron', () => { describe('habits', () => { beforeEach(() => { - let habit = { + const habit = { text: 'test habit', type: 'habit', }; - let task = new Tasks.habit(Tasks.Task.sanitize(habit)); // eslint-disable-line new-cap + const task = new Tasks.habit(Tasks.Task.sanitize(habit)); // eslint-disable-line new-cap tasksByType.habits = []; tasksByType.habits.push(task); }); @@ -952,7 +1178,9 @@ describe('cron', () => { tasksByType.habits[0].value = 1; tasksByType.habits[0].down = false; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].value).to.be.lessThan(1); }); @@ -961,7 +1189,9 @@ describe('cron', () => { tasksByType.habits[0].value = 1; tasksByType.habits[0].up = false; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].value).to.be.lessThan(1); }); @@ -971,13 +1201,15 @@ describe('cron', () => { tasksByType.habits[0].up = true; tasksByType.habits[0].down = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].value).to.equal(1); }); describe('counters', () => { - let notStartOfWeekOrMonth = new Date(2016, 9, 28).getTime(); // a Friday + const notStartOfWeekOrMonth = new Date(2016, 9, 28).getTime(); // a Friday beforeEach(() => { // Replace system clocks so we can get predictable results @@ -988,7 +1220,9 @@ describe('cron', () => { tasksByType.habits[0].counterUp = 1; tasksByType.habits[0].counterDown = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -999,7 +1233,9 @@ describe('cron', () => { tasksByType.habits[0].counterUp = 1; tasksByType.habits[0].counterDown = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1011,14 +1247,18 @@ describe('cron', () => { tasksByType.habits[0].counterDown = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); // should reset daysMissed = 8; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1040,7 +1280,9 @@ describe('cron', () => { daysMissed = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); @@ -1052,7 +1294,9 @@ describe('cron', () => { clock = sinon.useFakeTimers(monday); // should reset after user CDS - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1062,7 +1306,7 @@ describe('cron', () => { clock.restore(); // Server clock: Monday 11pm UTC - let monday = new Date('May 22, 2017 23:00:00 GMT').getTime(); + const monday = new Date('May 22, 2017 23:00:00 GMT').getTime(); clock = sinon.useFakeTimers(monday); // User clock: Tuesday 1am UTC + 2 @@ -1074,7 +1318,9 @@ describe('cron', () => { daysMissed = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); @@ -1082,7 +1328,9 @@ describe('cron', () => { // User missed one cron, which will subtract User clock back to Monday 1am UTC + 2 // should reset daysMissed = 2; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1092,7 +1340,7 @@ describe('cron', () => { clock.restore(); // Server clock: Sunday 11pm UTC - let sunday = new Date('May 21, 2017 23:00:00 GMT').getTime(); + const sunday = new Date('May 21, 2017 23:00:00 GMT').getTime(); clock = sinon.useFakeTimers(sunday); // User clock: Monday 2am UTC + 3 @@ -1104,7 +1352,9 @@ describe('cron', () => { daysMissed = 1; // should reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1114,7 +1364,7 @@ describe('cron', () => { clock.restore(); // Server clock: Monday 2am UTC - let monday = new Date('May 22, 2017 02:00:00 GMT').getTime(); + const monday = new Date('May 22, 2017 02:00:00 GMT').getTime(); clock = sinon.useFakeTimers(monday); // User clock: Sunday 11pm UTC - 3 @@ -1126,7 +1376,9 @@ describe('cron', () => { daysMissed = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); @@ -1138,14 +1390,18 @@ describe('cron', () => { tasksByType.habits[0].counterDown = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); // should reset daysMissed = 32; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1156,7 +1412,7 @@ describe('cron', () => { daysMissed = 0; // Server clock: 4/30/17 11pm UTC - let monday = new Date('April 30, 2017 23:00:00 GMT').getTime(); + const monday = new Date('April 30, 2017 23:00:00 GMT').getTime(); clock = sinon.useFakeTimers(monday); // User clock: 5/1/17 2am UTC + 3 @@ -1168,7 +1424,9 @@ describe('cron', () => { daysMissed = 1; // should reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1178,7 +1436,7 @@ describe('cron', () => { clock.restore(); // Server clock: 5/1/17 11pm UTC - let monday = new Date('May 1, 2017 23:00:00 GMT').getTime(); + const monday = new Date('May 1, 2017 23:00:00 GMT').getTime(); clock = sinon.useFakeTimers(monday); // User clock: 5/2/17 2am UTC + 3 @@ -1190,7 +1448,9 @@ describe('cron', () => { daysMissed = 1; // should not reset - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(1); expect(tasksByType.habits[0].counterDown).to.equal(1); @@ -1198,7 +1458,9 @@ describe('cron', () => { // User missed one day, which will subtract User clock back to 5/1/17 2am UTC + 3 // should reset daysMissed = 2; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(tasksByType.habits[0].counterUp).to.equal(0); expect(tasksByType.habits[0].counterDown).to.equal(0); @@ -1208,18 +1470,18 @@ describe('cron', () => { describe('perfect day', () => { beforeEach(() => { - let daily = { + const daily = { text: 'test daily', type: 'daily', }; - let task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap + const task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap tasksByType.dailys = []; tasksByType.dailys.push(task); const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {con: 1})); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { con: 1 })); }); afterEach(() => { @@ -1229,7 +1491,9 @@ describe('cron', () => { it('stores a new entry in user.history.exp', () => { user.stats.lvl = 2; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.history.exp).to.have.lengthOf(1); expect(user.history.exp[0].value).to.equal(25); @@ -1238,9 +1502,11 @@ describe('cron', () => { it('increments perfect day achievement if all (at least 1) due dailies were completed', () => { daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.achievements.perfect).to.equal(1); }); @@ -1248,9 +1514,11 @@ describe('cron', () => { it('does not increment perfect day achievement if no due dailies', () => { daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).add({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).add({ days: 1 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.achievements.perfect).to.equal(0); }); @@ -1258,11 +1526,13 @@ describe('cron', () => { it('gives perfect day buff if all (at least 1) due dailies were completed', () => { daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let previousBuffs = user.stats.buffs.toObject(); + const previousBuffs = user.stats.buffs.toObject(); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.be.greaterThan(previousBuffs.str); expect(user.stats.buffs.int).to.be.greaterThan(previousBuffs.int); @@ -1274,11 +1544,13 @@ describe('cron', () => { user.preferences.sleep = true; daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let previousBuffs = user.stats.buffs.toObject(); + const previousBuffs = user.stats.buffs.toObject(); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.be.greaterThan(previousBuffs.str); expect(user.stats.buffs.int).to.be.greaterThan(previousBuffs.int); @@ -1289,7 +1561,7 @@ describe('cron', () => { it('clears buffs if user does not have a perfect day (no due dailys)', () => { daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).add({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).add({ days: 1 }); user.stats.buffs = { str: 1, @@ -1300,7 +1572,9 @@ describe('cron', () => { streaks: true, }; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.equal(0); expect(user.stats.buffs.int).to.equal(0); @@ -1314,7 +1588,7 @@ describe('cron', () => { user.preferences.sleep = true; daysMissed = 1; tasksByType.dailys[0].completed = true; - tasksByType.dailys[0].startDate = moment(new Date()).add({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).add({ days: 1 }); user.stats.buffs = { str: 1, @@ -1325,7 +1599,9 @@ describe('cron', () => { streaks: true, }; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.equal(0); expect(user.stats.buffs.int).to.equal(0); @@ -1338,7 +1614,7 @@ describe('cron', () => { it('clears buffs if user does not have a perfect day (at least one due daily not completed)', () => { daysMissed = 1; tasksByType.dailys[0].completed = false; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); user.stats.buffs = { str: 1, @@ -1349,7 +1625,9 @@ describe('cron', () => { streaks: true, }; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.equal(0); expect(user.stats.buffs.int).to.equal(0); @@ -1363,7 +1641,7 @@ describe('cron', () => { user.preferences.sleep = true; daysMissed = 1; tasksByType.dailys[0].completed = false; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); user.stats.buffs = { str: 1, @@ -1374,7 +1652,9 @@ describe('cron', () => { streaks: true, }; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.equal(0); expect(user.stats.buffs.int).to.equal(0); @@ -1386,14 +1666,16 @@ describe('cron', () => { it('always grants a perfect day buff when CRON_SAFE_MODE is set', () => { sandbox.stub(nconf, 'get').withArgs('CRON_SAFE_MODE').returns('true'); - let cronOverride = requireAgain(pathToCronLib).cron; + const cronOverride = requireAgain(pathToCronLib).cron; daysMissed = 1; tasksByType.dailys[0].completed = false; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let previousBuffs = user.stats.buffs.toObject(); + const previousBuffs = user.stats.buffs.toObject(); - cronOverride({user, tasksByType, daysMissed, analytics}); + cronOverride({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.be.greaterThan(previousBuffs.str); expect(user.stats.buffs.int).to.be.greaterThan(previousBuffs.int); @@ -1404,14 +1686,16 @@ describe('cron', () => { it('always grants a perfect day buff when CRON_SAFE_MODE is set when user is sleeping', () => { user.preferences.sleep = true; sandbox.stub(nconf, 'get').withArgs('CRON_SAFE_MODE').returns('true'); - let cronOverride = requireAgain(pathToCronLib).cron; + const cronOverride = requireAgain(pathToCronLib).cron; daysMissed = 1; tasksByType.dailys[0].completed = false; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - let previousBuffs = user.stats.buffs.toObject(); + const previousBuffs = user.stats.buffs.toObject(); - cronOverride({user, tasksByType, daysMissed, analytics}); + cronOverride({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.buffs.str).to.be.greaterThan(previousBuffs.str); expect(user.stats.buffs.int).to.be.greaterThan(previousBuffs.int); @@ -1425,10 +1709,12 @@ describe('cron', () => { const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - let mpBefore = user.stats.mp; + const mpBefore = user.stats.mp; tasksByType.dailys[0].completed = true; - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {maxMP: 100})); - cron({user, tasksByType, daysMissed, analytics}); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { maxMP: 100 })); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.mp).to.be.greaterThan(mpBefore); common.statsComputed.restore(); @@ -1439,10 +1725,12 @@ describe('cron', () => { const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); user.preferences.sleep = true; - let mpBefore = user.stats.mp; + const mpBefore = user.stats.mp; tasksByType.dailys[0].completed = true; - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {maxMP: 100})); - cron({user, tasksByType, daysMissed, analytics}); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { maxMP: 100 })); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.mp).to.equal(mpBefore); common.statsComputed.restore(); @@ -1452,8 +1740,10 @@ describe('cron', () => { const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); user.stats.mp = 120; - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {maxMP: 100})); - cron({user, tasksByType, daysMissed, analytics}); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { maxMP: 100 })); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.stats.mp).to.equal(common.statsComputed(user).maxMP); common.statsComputed.restore(); @@ -1462,21 +1752,21 @@ describe('cron', () => { describe('quest progress', () => { beforeEach(() => { - let daily = { + const daily = { text: 'test daily', type: 'daily', }; - let task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap + const task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap tasksByType.dailys = []; tasksByType.dailys.push(task); const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {con: 1})); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { con: 1 })); daysMissed = 1; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); }); afterEach(() => { @@ -1484,32 +1774,38 @@ describe('cron', () => { }); it('resets user progress', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.party.quest.progress.up).to.equal(0); expect(user.party.quest.progress.down).to.equal(0); expect(user.party.quest.progress.collectedItems).to.equal(0); }); it('applies the user progress', () => { - let progress = cron({user, tasksByType, daysMissed, analytics}); + const progress = cron({ + user, tasksByType, daysMissed, analytics, + }); expect(progress.down).to.equal(-1); }); }); describe('notifications', () => { it('adds a user notification', () => { - let mpBefore = user.stats.mp; + const mpBefore = user.stats.mp; tasksByType.dailys[0].completed = true; const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {maxMP: 100})); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { maxMP: 100 })); daysMissed = 1; - let hpBefore = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + const hpBefore = user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.notifications.length).to.be.greaterThan(0); expect(user.notifications[1].type).to.equal('CRON'); @@ -1522,18 +1818,20 @@ describe('cron', () => { }); it('condenses multiple notifications into one', () => { - let mpBefore1 = user.stats.mp; + const mpBefore1 = user.stats.mp; tasksByType.dailys[0].completed = true; const statsComputedRes = common.statsComputed(user); const stubbedStatsComputed = sinon.stub(common, 'statsComputed'); - stubbedStatsComputed.returns(Object.assign(statsComputedRes, {maxMP: 100})); + stubbedStatsComputed.returns(Object.assign(statsComputedRes, { maxMP: 100 })); daysMissed = 1; - let hpBefore1 = user.stats.hp; - tasksByType.dailys[0].startDate = moment(new Date()).subtract({days: 1}); + const hpBefore1 = user.stats.hp; + tasksByType.dailys[0].startDate = moment(new Date()).subtract({ days: 1 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.notifications.length).to.be.greaterThan(0); expect(user.notifications[1].type).to.equal('CRON'); @@ -1542,13 +1840,15 @@ describe('cron', () => { mp: user.stats.mp - mpBefore1, }); - let notifsBefore2 = user.notifications.length; - let hpBefore2 = user.stats.hp; - let mpBefore2 = user.stats.mp; + const notifsBefore2 = user.notifications.length; + const hpBefore2 = user.stats.hp; + const mpBefore2 = user.stats.mp; - user.lastCron = moment(new Date()).subtract({days: 2}); + user.lastCron = moment(new Date()).subtract({ days: 2 }); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.notifications.length - notifsBefore2).to.equal(0); expect(user.notifications[0].type).to.not.equal('CRON'); @@ -1566,9 +1866,9 @@ describe('cron', () => { let lastMessageId; beforeEach(() => { - let maxPMs = 200; + const maxPMs = 200; for (let index = 0; index < maxPMs - 1; index += 1) { - let messageId = common.uuid(); + const messageId = common.uuid(); user.inbox.messages[messageId] = { id: messageId, text: `test ${index}`, @@ -1593,43 +1893,61 @@ describe('cron', () => { describe('login incentives', () => { it('increments incentive counter each cron', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(1); - user.lastCron = moment(new Date()).subtract({days: 1}); - cron({user, tasksByType, daysMissed, analytics}); + user.lastCron = moment(new Date()).subtract({ days: 1 }); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(2); }); it('pushes a notification of the day\'s incentive each cron', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.notifications.length).to.be.greaterThan(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); }); it('replaces previous notifications', () => { - cron({user, tasksByType, daysMissed, analytics}); - cron({user, tasksByType, daysMissed, analytics}); - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); + cron({ + user, tasksByType, daysMissed, analytics, + }); + cron({ + user, tasksByType, daysMissed, analytics, + }); - let filteredNotifications = user.notifications.filter(n => n.type === 'LOGIN_INCENTIVE'); + const filteredNotifications = user.notifications.filter(n => n.type === 'LOGIN_INCENTIVE'); expect(filteredNotifications.length).to.equal(1); }); it('increments loginIncentives by 1 even if days are skipped in between', () => { daysMissed = 3; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(1); }); it('increments loginIncentives by 1 even if user is sleeping', () => { user.preferences.sleep = true; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(1); }); it('awards user bard robes if login incentive is 1', () => { - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(1); expect(user.items.gear.owned.armor_special_bardRobes).to.eql(true); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1637,7 +1955,9 @@ describe('cron', () => { it('awards user incentive backgrounds if login incentive is 2', () => { user.loginIncentives = 1; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(2); expect(user.purchased.background.blue).to.eql(true); expect(user.purchased.background.green).to.eql(true); @@ -1649,7 +1969,9 @@ describe('cron', () => { it('awards user Bard Hat if login incentive is 3', () => { user.loginIncentives = 2; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(3); expect(user.items.gear.owned.head_special_bardHat).to.eql(true); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1657,7 +1979,9 @@ describe('cron', () => { it('awards user RoyalPurple Hatching Potion if login incentive is 4', () => { user.loginIncentives = 3; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(4); expect(user.items.hatchingPotions.RoyalPurple).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1665,7 +1989,9 @@ describe('cron', () => { it('awards user a Chocolate, Meat and Pink Contton Candy if login incentive is 5', () => { user.loginIncentives = 4; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(5); expect(user.items.food.Chocolate).to.eql(1); @@ -1677,7 +2003,9 @@ describe('cron', () => { it('awards user moon quest if login incentive is 7', () => { user.loginIncentives = 6; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(7); expect(user.items.quests.moon1).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1685,7 +2013,9 @@ describe('cron', () => { it('awards user RoyalPurple Hatching Potion if login incentive is 10', () => { user.loginIncentives = 9; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(10); expect(user.items.hatchingPotions.RoyalPurple).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1693,7 +2023,9 @@ describe('cron', () => { it('awards user a Strawberry, Patato and Blue Contton Candy if login incentive is 14', () => { user.loginIncentives = 13; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(14); expect(user.items.food.Strawberry).to.eql(1); @@ -1705,7 +2037,9 @@ describe('cron', () => { it('awards user a bard instrument if login incentive is 18', () => { user.loginIncentives = 17; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(18); expect(user.items.gear.owned.weapon_special_bardInstrument).to.eql(true); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1713,7 +2047,9 @@ describe('cron', () => { it('awards user second moon quest if login incentive is 22', () => { user.loginIncentives = 21; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(22); expect(user.items.quests.moon2).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1721,7 +2057,9 @@ describe('cron', () => { it('awards user a RoyalPurple hatching potion if login incentive is 26', () => { user.loginIncentives = 25; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(26); expect(user.items.hatchingPotions.RoyalPurple).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1729,7 +2067,9 @@ describe('cron', () => { it('awards user Fish, Milk, Rotten Meat and Honey if login incentive is 30', () => { user.loginIncentives = 29; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(30); expect(user.items.food.Fish).to.eql(1); @@ -1742,7 +2082,9 @@ describe('cron', () => { it('awards user a RoyalPurple hatching potion if login incentive is 35', () => { user.loginIncentives = 34; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(35); expect(user.items.hatchingPotions.RoyalPurple).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1750,7 +2092,9 @@ describe('cron', () => { it('awards user the third moon quest if login incentive is 40', () => { user.loginIncentives = 39; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(40); expect(user.items.quests.moon3).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1758,7 +2102,9 @@ describe('cron', () => { it('awards user a RoyalPurple hatching potion if login incentive is 45', () => { user.loginIncentives = 44; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(45); expect(user.items.hatchingPotions.RoyalPurple).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1766,7 +2112,9 @@ describe('cron', () => { it('awards user a saddle if login incentive is 50', () => { user.loginIncentives = 49; - cron({user, tasksByType, daysMissed, analytics}); + cron({ + user, tasksByType, daysMissed, analytics, + }); expect(user.loginIncentives).to.eql(50); expect(user.items.food.Saddle).to.eql(1); expect(user.notifications[0].type).to.eql('LOGIN_INCENTIVE'); @@ -1775,7 +2123,8 @@ describe('cron', () => { }); describe('recoverCron', () => { - let locals, status, execStub; + let locals; let status; let + execStub; beforeEach(() => { execStub = sandbox.stub(); @@ -1813,17 +2162,17 @@ describe('recoverCron', () => { }); it('increases status.times count and reruns up to 4 times', async () => { - execStub.returns(Promise.resolve({_cronSignature: 'RUNNING_CRON'})); - execStub.onCall(4).returns(Promise.resolve({_cronSignature: 'NOT_RUNNING'})); + execStub.returns(Promise.resolve({ _cronSignature: 'RUNNING_CRON' })); + execStub.onCall(4).returns(Promise.resolve({ _cronSignature: 'NOT_RUNNING' })); await recoverCron(status, locals); expect(status.times).to.eql(4); - expect(locals.user).to.eql({_cronSignature: 'NOT_RUNNING'}); + expect(locals.user).to.eql({ _cronSignature: 'NOT_RUNNING' }); }); it('throws an error if recoverCron runs 5 times', async () => { - execStub.returns(Promise.resolve({_cronSignature: 'RUNNING_CRON'})); + execStub.returns(Promise.resolve({ _cronSignature: 'RUNNING_CRON' })); try { await recoverCron(status, locals); diff --git a/test/api/unit/libs/email.test.js b/test/api/unit/libs/email.test.js index 6b4d368aa6..057766eddd 100644 --- a/test/api/unit/libs/email.test.js +++ b/test/api/unit/libs/email.test.js @@ -31,20 +31,20 @@ function getUser () { } describe('emails', () => { - let pathToEmailLib = '../../../../website/server/libs/email'; + const pathToEmailLib = '../../../../website/server/libs/email'; describe('getUserInfo', () => { it('returns an empty object if no field request', () => { - let attachEmail = requireAgain(pathToEmailLib); - let getUserInfo = attachEmail.getUserInfo; + const attachEmail = requireAgain(pathToEmailLib); + const { getUserInfo } = attachEmail; expect(getUserInfo({}, [])).to.be.empty; }); it('returns correct user data', () => { - let attachEmail = requireAgain(pathToEmailLib); - let getUserInfo = attachEmail.getUserInfo; - let user = getUser(); - let data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); + const attachEmail = requireAgain(pathToEmailLib); + const { getUserInfo } = attachEmail; + const user = getUser(); + const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); expect(data).to.have.property('name', user.auth.local.username); expect(data).to.have.property('email', user.auth.local.email); @@ -53,13 +53,13 @@ describe('emails', () => { }); it('returns correct user data [facebook users]', () => { - let attachEmail = requireAgain(pathToEmailLib); - let getUserInfo = attachEmail.getUserInfo; - let user = getUser(); + const attachEmail = requireAgain(pathToEmailLib); + const { getUserInfo } = attachEmail; + const user = getUser(); delete user.profile.name; delete user.auth.local.email; - let data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); + const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); expect(data).to.have.property('name', user.auth.local.username); expect(data).to.have.property('email', user.auth.facebook.emails[0].value); @@ -68,13 +68,13 @@ describe('emails', () => { }); it('has fallbacks for missing data', () => { - let attachEmail = requireAgain(pathToEmailLib); - let getUserInfo = attachEmail.getUserInfo; - let user = getUser(); + const attachEmail = requireAgain(pathToEmailLib); + const { getUserInfo } = attachEmail; + const user = getUser(); delete user.auth.local.email; delete user.auth.facebook; - let data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); + const data = getUserInfo(user, ['name', 'email', '_id', 'canSend']); expect(data).to.have.property('name', user.auth.local.username); expect(data).not.to.have.property('email'); @@ -85,18 +85,18 @@ describe('emails', () => { describe('getGroupUrl', () => { it('returns correct url if group is the tavern', () => { - let getGroupUrl = require(pathToEmailLib).getGroupUrl; - expect(getGroupUrl({_id: TAVERN_ID, type: 'guild'})).to.eql('/groups/tavern'); + const { getGroupUrl } = require(pathToEmailLib); // eslint-disable-line import/no-dynamic-require, max-len + expect(getGroupUrl({ _id: TAVERN_ID, type: 'guild' })).to.eql('/groups/tavern'); }); it('returns correct url if group is a guild', () => { - let getGroupUrl = require(pathToEmailLib).getGroupUrl; - expect(getGroupUrl({_id: 'random _id', type: 'guild'})).to.eql('/groups/guild/random _id'); + const { getGroupUrl } = require(pathToEmailLib); // eslint-disable-line import/no-dynamic-require, max-len + expect(getGroupUrl({ _id: 'random _id', type: 'guild' })).to.eql('/groups/guild/random _id'); }); it('returns correct url if group is a party', () => { - let getGroupUrl = require(pathToEmailLib).getGroupUrl; - expect(getGroupUrl({_id: 'random _id', type: 'party'})).to.eql('party'); + const { getGroupUrl } = require(pathToEmailLib); // eslint-disable-line import/no-dynamic-require, max-len + expect(getGroupUrl({ _id: 'random _id', type: 'party' })).to.eql('party'); }); }); @@ -111,10 +111,10 @@ describe('emails', () => { it('can send a txn email to one recipient', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); - let attachEmail = requireAgain(pathToEmailLib); - let sendTxnEmail = attachEmail.sendTxn; - let emailType = 'an email type'; - let mailingInfo = { + const attachEmail = requireAgain(pathToEmailLib); + const sendTxnEmail = attachEmail.sendTxn; + const emailType = 'an email type'; + const mailingInfo = { name: 'my name', email: 'my@email', }; @@ -125,9 +125,7 @@ describe('emails', () => { body: { data: { emailType: sinon.match.same(emailType), - to: sinon.match((value) => { - return Array.isArray(value) && value[0].name === mailingInfo.name; - }, 'matches mailing info array'), + to: sinon.match(value => Array.isArray(value) && value[0].name === mailingInfo.name, 'matches mailing info array'), }, }, })); @@ -135,10 +133,10 @@ describe('emails', () => { it('does not send email if address is missing', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); - let attachEmail = requireAgain(pathToEmailLib); - let sendTxnEmail = attachEmail.sendTxn; - let emailType = 'an email type'; - let mailingInfo = { + const attachEmail = requireAgain(pathToEmailLib); + const sendTxnEmail = attachEmail.sendTxn; + const emailType = 'an email type'; + const mailingInfo = { name: 'my name', // email: 'my@email', }; @@ -149,10 +147,10 @@ describe('emails', () => { it('uses getUserInfo in case of user data', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); - let attachEmail = requireAgain(pathToEmailLib); - let sendTxnEmail = attachEmail.sendTxn; - let emailType = 'an email type'; - let mailingInfo = getUser(); + const attachEmail = requireAgain(pathToEmailLib); + const sendTxnEmail = attachEmail.sendTxn; + const emailType = 'an email type'; + const mailingInfo = getUser(); sendTxnEmail(mailingInfo, emailType); expect(got.post).to.be.calledWith('undefined/job', sinon.match({ @@ -168,28 +166,24 @@ describe('emails', () => { it('sends email with some default variables', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); - let attachEmail = requireAgain(pathToEmailLib); - let sendTxnEmail = attachEmail.sendTxn; - let emailType = 'an email type'; - let mailingInfo = { + const attachEmail = requireAgain(pathToEmailLib); + const sendTxnEmail = attachEmail.sendTxn; + const emailType = 'an email type'; + const mailingInfo = { name: 'my name', email: 'my@email', }; - let variables = [1, 2, 3]; + const variables = [1, 2, 3]; sendTxnEmail(mailingInfo, emailType, variables); expect(got.post).to.be.calledWith('undefined/job', sinon.match({ json: true, body: { data: { - variables: sinon.match((value) => { - return value[0].name === 'BASE_URL'; - }, 'matches variables'), - personalVariables: sinon.match((value) => { - return value[0].rcpt === mailingInfo.email && - value[0].vars[0].name === 'RECIPIENT_NAME' && - value[0].vars[1].name === 'RECIPIENT_UNSUB_URL'; - }, 'matches personal variables'), + variables: sinon.match(value => value[0].name === 'BASE_URL', 'matches variables'), + personalVariables: sinon.match(value => value[0].rcpt === mailingInfo.email + && value[0].vars[0].name === 'RECIPIENT_NAME' + && value[0].vars[1].name === 'RECIPIENT_UNSUB_URL', 'matches personal variables'), }, }, })); diff --git a/test/api/unit/libs/encryption.test.js b/test/api/unit/libs/encryption.test.js index 60522d1927..fdfdb39e75 100644 --- a/test/api/unit/libs/encryption.test.js +++ b/test/api/unit/libs/encryption.test.js @@ -5,9 +5,9 @@ import { describe('encryption', () => { it('can encrypt and decrypt', () => { - let data = 'some secret text'; - let encrypted = encrypt(data); - let decrypted = decrypt(encrypted); + const data = 'some secret text'; + const encrypted = encrypt(data); + const decrypted = decrypt(encrypted); expect(encrypted).not.to.equal(data); expect(data).to.equal(decrypted); diff --git a/test/api/unit/libs/errors.test.js b/test/api/unit/libs/errors.test.js index b7e3657ff4..4de2e4499f 100644 --- a/test/api/unit/libs/errors.test.js +++ b/test/api/unit/libs/errors.test.js @@ -12,7 +12,7 @@ import i18n from '../../../../website/common/script/i18n'; describe('Custom Errors', () => { describe('CustomError', () => { it('is an instance of Error', () => { - let customError = new CustomError(); + const customError = new CustomError(); expect(customError).to.be.an.instanceOf(Error); }); @@ -20,25 +20,25 @@ describe('Custom Errors', () => { describe('NotAuthorized', () => { it('is an instance of CustomError', () => { - let notAuthorizedError = new NotAuthorized(); + const notAuthorizedError = new NotAuthorized(); expect(notAuthorizedError).to.be.an.instanceOf(CustomError); }); it('it returns an http code of 401', () => { - let notAuthorizedError = new NotAuthorized(); + const notAuthorizedError = new NotAuthorized(); expect(notAuthorizedError.httpCode).to.eql(401); }); it('returns a default message', () => { - let notAuthorizedError = new NotAuthorized(); + const notAuthorizedError = new NotAuthorized(); expect(notAuthorizedError.message).to.eql('Not authorized.'); }); it('allows a custom message', () => { - let notAuthorizedError = new NotAuthorized('Custom Error Message'); + const notAuthorizedError = new NotAuthorized('Custom Error Message'); expect(notAuthorizedError.message).to.eql('Custom Error Message'); }); @@ -46,25 +46,25 @@ describe('Custom Errors', () => { describe('NotFound', () => { it('is an instance of CustomError', () => { - let notAuthorizedError = new NotFound(); + const notAuthorizedError = new NotFound(); expect(notAuthorizedError).to.be.an.instanceOf(CustomError); }); it('it returns an http code of 404', () => { - let notAuthorizedError = new NotFound(); + const notAuthorizedError = new NotFound(); expect(notAuthorizedError.httpCode).to.eql(404); }); it('returns a default message', () => { - let notAuthorizedError = new NotFound(); + const notAuthorizedError = new NotFound(); expect(notAuthorizedError.message).to.eql('Not found.'); }); it('allows a custom message', () => { - let notAuthorizedError = new NotFound('Custom Error Message'); + const notAuthorizedError = new NotFound('Custom Error Message'); expect(notAuthorizedError.message).to.eql('Custom Error Message'); }); @@ -89,25 +89,25 @@ describe('Custom Errors', () => { describe('BadRequest', () => { it('is an instance of CustomError', () => { - let badRequestError = new BadRequest(); + const badRequestError = new BadRequest(); expect(badRequestError).to.be.an.instanceOf(CustomError); }); it('it returns an http code of 401', () => { - let badRequestError = new BadRequest(); + const badRequestError = new BadRequest(); expect(badRequestError.httpCode).to.eql(400); }); it('returns a default message', () => { - let badRequestError = new BadRequest(); + const badRequestError = new BadRequest(); expect(badRequestError.message).to.eql('Bad request.'); }); it('allows a custom message', () => { - let badRequestError = new BadRequest('Custom Error Message'); + const badRequestError = new BadRequest('Custom Error Message'); expect(badRequestError.message).to.eql('Custom Error Message'); }); @@ -115,25 +115,25 @@ describe('Custom Errors', () => { describe('InternalServerError', () => { it('is an instance of CustomError', () => { - let internalServerError = new InternalServerError(); + const internalServerError = new InternalServerError(); expect(internalServerError).to.be.an.instanceOf(CustomError); }); it('it returns an http code of 500', () => { - let internalServerError = new InternalServerError(); + const internalServerError = new InternalServerError(); expect(internalServerError.httpCode).to.eql(500); }); it('returns a default message', () => { - let internalServerError = new InternalServerError(); + const internalServerError = new InternalServerError(); expect(internalServerError.message).to.eql('An unexpected error occurred.'); }); it('allows a custom message', () => { - let internalServerError = new InternalServerError('Custom Error Message'); + const internalServerError = new InternalServerError('Custom Error Message'); expect(internalServerError.message).to.eql('Custom Error Message'); }); diff --git a/test/api/unit/libs/highlightMentions.js b/test/api/unit/libs/highlightMentions.js new file mode 100644 index 0000000000..6d46e14aee --- /dev/null +++ b/test/api/unit/libs/highlightMentions.js @@ -0,0 +1,60 @@ +import mongoose from 'mongoose'; +import { + highlightMentions, +} from '../../../../website/server/libs/highlightMentions'; + +describe('highlightMentions', () => { + beforeEach(() => { + const mockFind = { + select () { + return this; + }, + lean () { + return this; + }, + exec () { + return Promise.resolve([{ + auth: { local: { username: 'user' } }, _id: '111', + }, { auth: { local: { username: 'user2' } }, _id: '222' }, { auth: { local: { username: 'user3' } }, _id: '333' }, { auth: { local: { username: 'user-dash' } }, _id: '444' }, { auth: { local: { username: 'user_underscore' } }, _id: '555' }, + ]); + }, + }; + + sinon.stub(mongoose.Model, 'find').returns(mockFind); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('doesn\'t change text without mentions', async () => { + const text = 'some chat text'; + const result = await highlightMentions(text); + expect(result[0]).to.equal(text); + }); + it('highlights existing users', async () => { + const text = '@user: message'; + const result = await highlightMentions(text); + expect(result[0]).to.equal('[@user](/profile/111): message'); + }); + it('highlights special characters', async () => { + const text = '@user-dash: message @user_underscore'; + const result = await highlightMentions(text); + expect(result[0]).to.equal('[@user-dash](/profile/444): message [@user_underscore](/profile/555)'); + }); + it('doesn\'t highlight nonexisting users', async () => { + const text = '@nouser message'; + const result = await highlightMentions(text); + expect(result[0]).to.equal('@nouser message'); + }); + it('highlights multiple existing users', async () => { + const text = '@user message (@user2) @user3 @user'; + const result = await highlightMentions(text); + expect(result[0]).to.equal('[@user](/profile/111) message ([@user2](/profile/222)) [@user3](/profile/333) [@user](/profile/111)'); + }); + it('doesn\'t highlight more than 5 users', async () => { + const text = '@user @user2 @user3 @user4 @user5 @user6'; + const result = await highlightMentions(text); + expect(result[0]).to.equal(text); + }); +}); diff --git a/test/api/unit/libs/i18n.test.js b/test/api/unit/libs/i18n.test.js index e276ee5dc1..bc1c436332 100644 --- a/test/api/unit/libs/i18n.test.js +++ b/test/api/unit/libs/i18n.test.js @@ -5,11 +5,11 @@ import { } from '../../../../website/server/libs/i18n'; describe('i18n', () => { - let listOfLocales = approvedLanguages.sort(); + const listOfLocales = approvedLanguages.sort(); describe('translations', () => { it('includes a translation object for each locale', () => { - listOfLocales.forEach((locale) => { + listOfLocales.forEach(locale => { expect(translations[locale]).to.be.an('object'); }); }); diff --git a/test/api/unit/libs/logger.js b/test/api/unit/libs/logger.js index bf6f2a2f9f..c9878f36fa 100644 --- a/test/api/unit/libs/logger.js +++ b/test/api/unit/libs/logger.js @@ -2,7 +2,7 @@ import winston from 'winston'; import logger from '../../../../website/server/libs/logger'; import { NotFound, -} from '../../../../website/server/libs//errors'; +} from '../../../../website/server/libs/errors'; describe('logger', () => { let logSpy; @@ -34,7 +34,7 @@ describe('logger', () => { context('error object', () => { it('logs the stack and the err data', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, { data: 1, }, 2, 3); @@ -45,13 +45,13 @@ describe('logger', () => { errInstance.stack, { data: 1, fullError: errInstance }, 2, - 3 + 3, ); }); it('logs the stack and the err data with it\'s own fullError property', () => { - let errInstance = new Error('An error.'); - let anotherError = new Error('another error'); + const errInstance = new Error('An error.'); + const anotherError = new Error('another error'); logger.error(errInstance, { data: 1, @@ -64,12 +64,12 @@ describe('logger', () => { errInstance.stack, { data: 1, fullError: anotherError }, 2, - 3 + 3, ); }); it('logs the error when errorData is null', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, null, 2, 3); @@ -79,12 +79,12 @@ describe('logger', () => { errInstance.stack, null, 2, - 3 + 3, ); }); it('logs the error when errorData is not an object', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, true, 2, 3); @@ -94,12 +94,12 @@ describe('logger', () => { errInstance.stack, true, 2, - 3 + 3, ); }); it('logs the error when errorData does not include isHandledError property', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, { httpCode: 400 }, 2, 3); @@ -109,12 +109,12 @@ describe('logger', () => { errInstance.stack, { httpCode: 400, fullError: errInstance }, 2, - 3 + 3, ); }); it('logs the error when errorData includes isHandledError property but is a 500 error', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, { isHandledError: true, @@ -127,12 +127,12 @@ describe('logger', () => { errInstance.stack, { httpCode: 502, isHandledError: true, fullError: errInstance }, 2, - 3 + 3, ); }); it('logs a warning when errorData includes isHandledError property and is not a 500 error', () => { - let errInstance = new Error('An error.'); + const errInstance = new Error('An error.'); logger.error(errInstance, { isHandledError: true, @@ -145,12 +145,12 @@ describe('logger', () => { errInstance.stack, { httpCode: 403, isHandledError: true, fullError: errInstance }, 2, - 3 + 3, ); }); it('logs additional data from a CustomError', () => { - let errInstance = new NotFound('An error.'); + const errInstance = new NotFound('An error.'); errInstance.customField = 'Some interesting data'; @@ -166,7 +166,7 @@ describe('logger', () => { }, }, 2, - 3 + 3, ); }); }); diff --git a/test/api/unit/libs/password.test.js b/test/api/unit/libs/password.test.js index 66fccbfe51..3ca2643b6d 100644 --- a/test/api/unit/libs/password.test.js +++ b/test/api/unit/libs/password.test.js @@ -1,9 +1,9 @@ /* eslint-disable camelcase */ +import moment from 'moment'; import { encrypt, } from '../../../../website/server/libs/encryption'; -import moment from 'moment'; import { generateUser, } from '../../../helpers/api-integration/v3'; @@ -20,11 +20,11 @@ import { describe('Password Utilities', () => { describe('compare', () => { it('can compare a correct password hashed with SHA1', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let hashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const hashedPassword = sha1EncryptPassword(textPassword, salt); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -34,16 +34,16 @@ describe('Password Utilities', () => { }, }; - let isValidPassword = await compare(user, textPassword); + const isValidPassword = await compare(user, textPassword); expect(isValidPassword).to.eql(true); }); it('can compare an invalid password hashed with SHA1', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let hashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const hashedPassword = sha1EncryptPassword(textPassword, salt); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -53,15 +53,15 @@ describe('Password Utilities', () => { }, }; - let isValidPassword = await compare(user, 'wrongPassword'); + const isValidPassword = await compare(user, 'wrongPassword'); expect(isValidPassword).to.eql(false); }); it('can compare a correct password hashed with bcrypt', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -70,15 +70,15 @@ describe('Password Utilities', () => { }, }; - let isValidPassword = await compare(user, textPassword); + const isValidPassword = await compare(user, textPassword); expect(isValidPassword).to.eql(true); }); it('can compare an invalid password hashed with bcrypt', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -87,7 +87,7 @@ describe('Password Utilities', () => { }, }; - let isValidPassword = await compare(user, 'wrongPassword'); + const isValidPassword = await compare(user, 'wrongPassword'); expect(isValidPassword).to.eql(false); }); @@ -101,18 +101,18 @@ describe('Password Utilities', () => { it('throws an error if passwordToCheck is missing', async () => { try { - await compare({a: true}); + await compare({ a: true }); } catch (e) { expect(e.toString()).to.equal('Error: user and passwordToCheck are required parameters.'); } }); it('defaults to SHA1 encryption if salt is provided', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let hashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const hashedPassword = sha1EncryptPassword(textPassword, salt); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -122,7 +122,7 @@ describe('Password Utilities', () => { }, }; - let isValidPassword = await compare(user, textPassword); + const isValidPassword = await compare(user, textPassword); expect(isValidPassword).to.eql(true); }); @@ -141,29 +141,29 @@ describe('Password Utilities', () => { }); it('returns true if comparing the same password', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let isValidPassword = await bcryptCompare(textPassword, hashedPassword); + const isValidPassword = await bcryptCompare(textPassword, hashedPassword); expect(isValidPassword).to.eql(true); }); it('returns true if comparing a different password', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); + const isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); expect(isValidPassword).to.eql(false); }); }); describe('convertToBcrypt', () => { it('converts an user password hashed with sha1 to bcrypt', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let hashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const hashedPassword = sha1EncryptPassword(textPassword, salt); - let user = { + const user = { auth: { local: { hashed_password: hashedPassword, @@ -178,7 +178,7 @@ describe('Password Utilities', () => { expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); expect(user.auth.local.hashed_password).to.be.a.string; - let isValidPassword = await compare(user, textPassword); + const isValidPassword = await compare(user, textPassword); expect(isValidPassword).to.eql(true); }); @@ -192,7 +192,7 @@ describe('Password Utilities', () => { it('throws an error if plainTextPassword is missing', async () => { try { - await convertToBcrypt({a: true}); + await convertToBcrypt({ a: true }); } catch (e) { expect(e.toString()).to.equal('Error: user and plainTextPassword are required parameters.'); } @@ -201,18 +201,18 @@ describe('Password Utilities', () => { describe('validatePasswordResetCodeAndFindUser', () => { it('returns false if the code is missing', async () => { - let res = await validatePasswordResetCodeAndFindUser(); + const res = await validatePasswordResetCodeAndFindUser(); expect(res).to.equal(false); }); it('returns false if the code is invalid json', async () => { - let res = await validatePasswordResetCodeAndFindUser('invalid json'); + const res = await validatePasswordResetCodeAndFindUser('invalid json'); expect(res).to.equal(false); }); it('returns false if the code cannot be decrypted', async () => { - let user = await generateUser(); - let res = await validatePasswordResetCodeAndFindUser(JSON.stringify({ // not encrypted + const user = await generateUser(); + const res = await validatePasswordResetCodeAndFindUser(JSON.stringify({ // not encrypted userId: user._id, expiresAt: new Date(), })); @@ -220,71 +220,71 @@ describe('Password Utilities', () => { }); it('returns false if the code is expired', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().subtract({minutes: 1}), + expiresAt: moment().subtract({ minutes: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, }); - let res = await validatePasswordResetCodeAndFindUser(code); + const res = await validatePasswordResetCodeAndFindUser(code); expect(res).to.equal(false); }); it('returns false if the user does not exist', async () => { - let res = await validatePasswordResetCodeAndFindUser(encrypt(JSON.stringify({ + const res = await validatePasswordResetCodeAndFindUser(encrypt(JSON.stringify({ userId: Date.now().toString(), - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), }))); expect(res).to.equal(false); }); it('returns false if the user has no local auth', async () => { - let user = await generateUser({ + const user = await generateUser({ auth: { facebook: {}, }, }); - let res = await validatePasswordResetCodeAndFindUser(encrypt(JSON.stringify({ + const res = await validatePasswordResetCodeAndFindUser(encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), }))); expect(res).to.equal(false); }); it('returns false if the code doesn\'t match the one saved at user.auth.passwordResetCode', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': 'invalid', }); - let res = await validatePasswordResetCodeAndFindUser(code); + const res = await validatePasswordResetCodeAndFindUser(code); expect(res).to.equal(false); }); it('returns the user if the password reset code is valid', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, }); - let res = await validatePasswordResetCodeAndFindUser(code); + const res = await validatePasswordResetCodeAndFindUser(code); expect(res).not.to.equal(false); expect(res._id).to.equal(user._id); }); @@ -293,8 +293,8 @@ describe('Password Utilities', () => { describe('bcrypt', () => { describe('Hash', () => { it('returns a hashed string', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); expect(hashedPassword).to.be.a.string; }); @@ -302,18 +302,18 @@ describe('Password Utilities', () => { describe('Compare', () => { it('returns true if comparing the same password', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let isValidPassword = await bcryptCompare(textPassword, hashedPassword); + const isValidPassword = await bcryptCompare(textPassword, hashedPassword); expect(isValidPassword).to.eql(true); }); it('returns true if comparing a different password', async () => { - let textPassword = 'mySecretPassword'; - let hashedPassword = await bcryptHash(textPassword); + const textPassword = 'mySecretPassword'; + const hashedPassword = await bcryptHash(textPassword); - let isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); + const isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); expect(isValidPassword).to.eql(false); }); }); @@ -322,19 +322,19 @@ describe('Password Utilities', () => { describe('SHA1', () => { describe('Encrypt', () => { it('always encrypt the same password to the same value when using the same salt', () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let encryptedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const encryptedPassword = sha1EncryptPassword(textPassword, salt); expect(sha1EncryptPassword(textPassword, salt)).to.eql(encryptedPassword); }); it('never encrypt the same password to the same value when using a different salt', () => { - let textPassword = 'mySecretPassword'; - let aSalt = sha1MakeSalt(); - let anotherSalt = sha1MakeSalt(); - let anEncryptedPassword = sha1EncryptPassword(textPassword, aSalt); - let anotherEncryptedPassword = sha1EncryptPassword(textPassword, anotherSalt); + const textPassword = 'mySecretPassword'; + const aSalt = sha1MakeSalt(); + const anotherSalt = sha1MakeSalt(); + const anEncryptedPassword = sha1EncryptPassword(textPassword, aSalt); + const anotherEncryptedPassword = sha1EncryptPassword(textPassword, anotherSalt); expect(anEncryptedPassword).not.to.eql(anotherEncryptedPassword); }); @@ -342,14 +342,14 @@ describe('Password Utilities', () => { describe('Make Salt', () => { it('creates a salt with length 10 by default', () => { - let salt = sha1MakeSalt(); + const salt = sha1MakeSalt(); expect(salt.length).to.eql(10); }); it('can create a salt of any length', () => { - let length = 24; - let salt = sha1MakeSalt(length); + const length = 24; + const salt = sha1MakeSalt(length); expect(salt.length).to.eql(length); }); diff --git a/test/api/unit/libs/payments/amazon/cancel.test.js b/test/api/unit/libs/payments/amazon/cancel.test.js index ab0f2ebf8c..e24d3dbf52 100644 --- a/test/api/unit/libs/payments/amazon/cancel.test.js +++ b/test/api/unit/libs/payments/amazon/cancel.test.js @@ -2,19 +2,20 @@ import moment from 'moment'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import amzLib from '../../../../../../website/server/libs/payments/amazon'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; import { createNonLeaderGroupMember } from '../paymentHelpers'; -const i18n = common.i18n; +const { i18n } = common; describe('Amazon Payments - Cancel Subscription', () => { const subKey = 'basic_3mo'; - let user, group, headers, billingAgreementId, subscriptionBlock, subscriptionLength; + let user; let group; let headers; let billingAgreementId; let subscriptionBlock; let + subscriptionLength; let getBillingAgreementDetailsSpy; let paymentCancelSubscriptionSpy; @@ -50,7 +51,7 @@ describe('Amazon Payments - Cancel Subscription', () => { getBillingAgreementDetailsSpy = sinon.stub(amzLib, 'getBillingAgreementDetails') .resolves({ BillingAgreementDetails: { - BillingAgreementStatus: {State: 'Open'}, + BillingAgreementStatus: { State: 'Open' }, }, }); } @@ -81,7 +82,7 @@ describe('Amazon Payments - Cancel Subscription', () => { getBillingAgreementDetailsSpy = sinon.stub(amzLib, 'getBillingAgreementDetails'); getBillingAgreementDetailsSpy.resolves({ BillingAgreementDetails: { - BillingAgreementStatus: {State: 'Closed'}, + BillingAgreementStatus: { State: 'Closed' }, }, }); @@ -89,7 +90,7 @@ describe('Amazon Payments - Cancel Subscription', () => { paymentCancelSubscriptionSpy.resolves({}); }); - afterEach(function () { + afterEach(() => { amzLib.getBillingAgreementDetails.restore(); payments.cancelSubscription.restore(); }); @@ -97,7 +98,7 @@ describe('Amazon Payments - Cancel Subscription', () => { it('should throw an error if we are missing a subscription', async () => { user.purchased.plan.customerId = undefined; - await expect(amzLib.cancelSubscription({user})) + await expect(amzLib.cancelSubscription({ user })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -108,7 +109,7 @@ describe('Amazon Payments - Cancel Subscription', () => { it('should cancel a user subscription', async () => { billingAgreementId = user.purchased.plan.customerId; - await amzLib.cancelSubscription({user, headers}); + await amzLib.cancelSubscription({ user, headers }); expectAmazonCancelUserSubscriptionSpy(); expectAmazonStubs(); @@ -117,10 +118,10 @@ describe('Amazon Payments - Cancel Subscription', () => { it('should close a user subscription if amazon not closed', async () => { amzLib.getBillingAgreementDetails.restore(); expectBillingAggreementDetailSpy(); - let closeBillingAgreementSpy = sinon.stub(amzLib, 'closeBillingAgreement').resolves({}); + const closeBillingAgreementSpy = sinon.stub(amzLib, 'closeBillingAgreement').resolves({}); billingAgreementId = user.purchased.plan.customerId; - await amzLib.cancelSubscription({user, headers}); + await amzLib.cancelSubscription({ user, headers }); expectAmazonStubs(); expect(closeBillingAgreementSpy).to.be.calledOnce; @@ -132,7 +133,7 @@ describe('Amazon Payments - Cancel Subscription', () => { }); it('should throw an error if group is not found', async () => { - await expect(amzLib.cancelSubscription({user, groupId: 'fake-id'})) + await expect(amzLib.cancelSubscription({ user, groupId: 'fake-id' })) .to.eventually.be.rejected.and.to.eql({ httpCode: 404, name: 'NotFound', @@ -141,9 +142,9 @@ describe('Amazon Payments - Cancel Subscription', () => { }); it('should throw an error if user is not group leader', async () => { - let nonLeader = await createNonLeaderGroupMember(group); + const nonLeader = await createNonLeaderGroupMember(group); - await expect(amzLib.cancelSubscription({user: nonLeader, groupId: group._id})) + await expect(amzLib.cancelSubscription({ user: nonLeader, groupId: group._id })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -154,7 +155,7 @@ describe('Amazon Payments - Cancel Subscription', () => { it('should cancel a group subscription', async () => { billingAgreementId = group.purchased.plan.customerId; - await amzLib.cancelSubscription({user, groupId: group._id, headers}); + await amzLib.cancelSubscription({ user, groupId: group._id, headers }); expectAmazonCancelGroupSubscriptionSpy(group._id); expectAmazonStubs(); @@ -163,10 +164,10 @@ describe('Amazon Payments - Cancel Subscription', () => { it('should close a group subscription if amazon not closed', async () => { amzLib.getBillingAgreementDetails.restore(); expectBillingAggreementDetailSpy(); - let closeBillingAgreementSpy = sinon.stub(amzLib, 'closeBillingAgreement').resolves({}); + const closeBillingAgreementSpy = sinon.stub(amzLib, 'closeBillingAgreement').resolves({}); billingAgreementId = group.purchased.plan.customerId; - await amzLib.cancelSubscription({user, groupId: group._id, headers}); + await amzLib.cancelSubscription({ user, groupId: group._id, headers }); expectAmazonStubs(); expect(closeBillingAgreementSpy).to.be.calledOnce; diff --git a/test/api/unit/libs/payments/amazon/checkout.test.js b/test/api/unit/libs/payments/amazon/checkout.test.js index 4e220bb26b..ee4ab9cee7 100644 --- a/test/api/unit/libs/payments/amazon/checkout.test.js +++ b/test/api/unit/libs/payments/amazon/checkout.test.js @@ -3,11 +3,12 @@ import amzLib from '../../../../../../website/server/libs/payments/amazon'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('Amazon Payments - Checkout', () => { const subKey = 'basic_3mo'; - let user, orderReferenceId, headers; + let user; let orderReferenceId; let + headers; let setOrderReferenceDetailsSpy; let confirmOrderReferenceSpy; let authorizeSpy; @@ -62,7 +63,7 @@ describe('Amazon Payments - Checkout', () => { expect(closeOrderReferenceSpy).to.be.calledWith({ AmazonOrderReferenceId: orderReferenceId }); } - beforeEach(function () { + beforeEach(() => { user = new User(); headers = {}; orderReferenceId = 'orderReferenceId'; @@ -88,7 +89,7 @@ describe('Amazon Payments - Checkout', () => { sinon.stub(common, 'uuid').returns('uuid-generated'); }); - afterEach(function () { + afterEach(() => { amzLib.setOrderReferenceDetails.restore(); amzLib.confirmOrderReference.restore(); amzLib.authorize.restore(); @@ -101,7 +102,7 @@ describe('Amazon Payments - Checkout', () => { function expectBuyGemsStub (paymentMethod, gift) { expect(paymentBuyGemsStub).to.be.calledOnce; - let expectedArgs = { + const expectedArgs = { user, paymentMethod, headers, @@ -112,7 +113,7 @@ describe('Amazon Payments - Checkout', () => { it('should purchase gems', async () => { sinon.stub(user, 'canGetGems').resolves(true); - await amzLib.checkout({user, orderReferenceId, headers}); + await amzLib.checkout({ user, orderReferenceId, headers }); expectBuyGemsStub(amzLib.constants.PAYMENT_METHOD); expectAmazonStubs(); @@ -121,9 +122,9 @@ describe('Amazon Payments - Checkout', () => { }); it('should error if gem amount is too low', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); - let gift = { + const gift = { type: 'gems', gems: { amount: 0, @@ -131,7 +132,9 @@ describe('Amazon Payments - Checkout', () => { }, }; - await expect(amzLib.checkout({gift, user, orderReferenceId, headers})) + await expect(amzLib.checkout({ + gift, user, orderReferenceId, headers, + })) .to.eventually.be.rejected.and.to.eql({ httpCode: 400, message: 'Amount must be at least 1.', @@ -141,18 +144,19 @@ describe('Amazon Payments - Checkout', () => { it('should error if user cannot get gems gems', async () => { sinon.stub(user, 'canGetGems').resolves(false); - await expect(amzLib.checkout({user, orderReferenceId, headers})).to.eventually.be.rejected.and.to.eql({ - httpCode: 401, - message: i18n.t('groupPolicyCannotGetGems'), - name: 'NotAuthorized', - }); + await expect(amzLib.checkout({ user, orderReferenceId, headers })) + .to.eventually.be.rejected.and.to.eql({ + httpCode: 401, + message: i18n.t('groupPolicyCannotGetGems'), + name: 'NotAuthorized', + }); user.canGetGems.restore(); }); it('should gift gems', async () => { - let receivingUser = new User(); + const receivingUser = new User(); await receivingUser.save(); - let gift = { + const gift = { type: 'gems', uuid: receivingUser._id, gems: { @@ -160,16 +164,18 @@ describe('Amazon Payments - Checkout', () => { }, }; amount = 16 / 4; - await amzLib.checkout({gift, user, orderReferenceId, headers}); + await amzLib.checkout({ + gift, user, orderReferenceId, headers, + }); expectBuyGemsStub(amzLib.constants.PAYMENT_METHOD_GIFT, gift); expectAmazonStubs(); }); it('should gift a subscription', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); - let gift = { + const gift = { type: 'subscription', subscription: { key: subKey, @@ -178,7 +184,9 @@ describe('Amazon Payments - Checkout', () => { }; amount = common.content.subscriptionBlocks[subKey].price; - await amzLib.checkout({user, orderReferenceId, headers, gift}); + await amzLib.checkout({ + user, orderReferenceId, headers, gift, + }); gift.member = receivingUser; expect(paymentCreateSubscritionStub).to.be.calledOnce; diff --git a/test/api/unit/libs/payments/amazon/subscribe.test.js b/test/api/unit/libs/payments/amazon/subscribe.test.js index d42c80d96c..03cef6b0bc 100644 --- a/test/api/unit/libs/payments/amazon/subscribe.test.js +++ b/test/api/unit/libs/payments/amazon/subscribe.test.js @@ -2,18 +2,19 @@ import cc from 'coupon-code'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import { model as Coupon } from '../../../../../../website/server/models/coupon'; import amzLib from '../../../../../../website/server/libs/payments/amazon'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('Amazon Payments - Subscribe', () => { const subKey = 'basic_3mo'; - let user, group, amount, billingAgreementId, sub, coupon, groupId, headers; + let user; let group; let amount; let billingAgreementId; let sub; let coupon; let groupId; let + headers; let amazonSetBillingAgreementDetailsSpy; let amazonConfirmBillingAgreementSpy; let amazonAuthorizeOnBillingAgreementSpy; @@ -60,7 +61,7 @@ describe('Amazon Payments - Subscribe', () => { sinon.stub(common, 'uuid').returns('uuid-generated'); }); - afterEach(function () { + afterEach(() => { amzLib.setBillingAgreementDetails.restore(); amzLib.confirmBillingAgreement.restore(); amzLib.authorizeOnBillingAgreement.restore(); @@ -168,7 +169,7 @@ describe('Amazon Payments - Subscribe', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; await couponModel.save(); @@ -195,9 +196,9 @@ describe('Amazon Payments - Subscribe', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; - let updatedCouponModel = await couponModel.save(); + const updatedCouponModel = await couponModel.save(); sinon.stub(cc, 'validate').returns(updatedCouponModel._id); diff --git a/test/api/unit/libs/payments/amazon/upgrade-groupplan.test.js b/test/api/unit/libs/payments/amazon/upgrade-groupplan.test.js index f846738acc..b47ed59257 100644 --- a/test/api/unit/libs/payments/amazon/upgrade-groupplan.test.js +++ b/test/api/unit/libs/payments/amazon/upgrade-groupplan.test.js @@ -2,16 +2,17 @@ import uuid from 'uuid'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import { model as Group } from '../../../../../../website/server/models/group'; import amzLib from '../../../../../../website/server/libs/payments/amazon'; import payments from '../../../../../../website/server/libs/payments/payments'; describe('#upgradeGroupPlan', () => { - let spy, data, user, group, uuidString; + let spy; let data; let user; let group; let + uuidString; - beforeEach(async function () { + beforeEach(async () => { user = new User(); user.profile.name = 'sender'; @@ -46,7 +47,7 @@ describe('#upgradeGroupPlan', () => { data.sub.quantity = 3; }); - afterEach(function () { + afterEach(() => { amzLib.authorizeOnBillingAgreement.restore(); uuid.v4.restore(); }); @@ -55,7 +56,7 @@ describe('#upgradeGroupPlan', () => { data.paymentMethod = amzLib.constants.PAYMENT_METHOD; await payments.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); updatedGroup.memberCount += 1; await updatedGroup.save(); diff --git a/test/api/unit/libs/payments/apple.test.js b/test/api/unit/libs/payments/apple.test.js index 10029b6c3b..82fea35eec 100644 --- a/test/api/unit/libs/payments/apple.test.js +++ b/test/api/unit/libs/payments/apple.test.js @@ -1,21 +1,22 @@ /* eslint-disable camelcase */ -import iapModule from '../../../../../website/server/libs/inAppPurchases'; +import moment from 'moment'; import payments from '../../../../../website/server/libs/payments/payments'; import applePayments from '../../../../../website/server/libs/payments/apple'; import iap from '../../../../../website/server/libs/inAppPurchases'; -import {model as User} from '../../../../../website/server/models/user'; +import { model as User } from '../../../../../website/server/models/user'; import common from '../../../../../website/common'; -import moment from 'moment'; -import {mockFindById, restoreFindById} from '../../../../helpers/mongoose.helper'; +import { mockFindById, restoreFindById } from '../../../../helpers/mongoose.helper'; -const i18n = common.i18n; +const { i18n } = common; -describe('Apple Payments', () => { - let subKey = 'basic_3mo'; +describe('Apple Payments', () => { + const subKey = 'basic_3mo'; describe('verifyGemPurchase', () => { - let sku, user, token, receipt, headers; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, paymentBuyGemsStub, iapGetPurchaseDataStub; + let sku; let user; let token; let receipt; let + headers; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let paymentBuyGemsStub; let + iapGetPurchaseDataStub; beforeEach(() => { token = 'testToken'; @@ -24,33 +25,34 @@ describe('Apple Payments', () => { receipt = `{"token": "${token}", "productId": "${sku}"}`; headers = {}; - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({}); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{productId: 'com.habitrpg.ios.Habitica.21gems', - transactionId: token, + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ + productId: 'com.habitrpg.ios.Habitica.21gems', + transactionId: token, }]); paymentBuyGemsStub = sinon.stub(payments, 'buyGems').resolves({}); }); afterEach(() => { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); - iapModule.getPurchaseData.restore(); + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); + iap.getPurchaseData.restore(); payments.buyGems.restore(); }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); - await expect(applePayments.verifyGemPurchase({user, receipt, headers})) + await expect(applePayments.verifyGemPurchase({ user, receipt, headers })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -60,9 +62,9 @@ describe('Apple Payments', () => { it('should throw an error if getPurchaseData is invalid', async () => { iapGetPurchaseDataStub.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData').returns([]); + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData').returns([]); - await expect(applePayments.verifyGemPurchase({user, receipt, headers})) + await expect(applePayments.verifyGemPurchase({ user, receipt, headers })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -72,7 +74,7 @@ describe('Apple Payments', () => { it('errors if the user cannot purchase gems', async () => { sinon.stub(user, 'canGetGems').resolves(false); - await expect(applePayments.verifyGemPurchase({user, receipt, headers})) + await expect(applePayments.verifyGemPurchase({ user, receipt, headers })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -85,12 +87,13 @@ describe('Apple Payments', () => { it('errors if amount does not exist', async () => { sinon.stub(user, 'canGetGems').resolves(true); iapGetPurchaseDataStub.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{productId: 'badProduct', - transactionId: token, + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ + productId: 'badProduct', + transactionId: token, }]); - await expect(applePayments.verifyGemPurchase({user, receipt, headers})) + await expect(applePayments.verifyGemPurchase({ user, receipt, headers })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -126,13 +129,14 @@ describe('Apple Payments', () => { gemsCanPurchase.forEach(gemTest => { it(`purchases ${gemTest.productId} gems`, async () => { iapGetPurchaseDataStub.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{productId: gemTest.productId, - transactionId: token, + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ + productId: gemTest.productId, + transactionId: token, }]); sinon.stub(user, 'canGetGems').resolves(true); - await applePayments.verifyGemPurchase({user, receipt, headers}); + await applePayments.verifyGemPurchase({ user, receipt, headers }); expect(iapSetupStub).to.be.calledOnce; expect(iapValidateStub).to.be.calledOnce; @@ -160,13 +164,16 @@ describe('Apple Payments', () => { mockFindById(receivingUser); iapGetPurchaseDataStub.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{productId: gemsCanPurchase[0].productId, - transactionId: token, + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ + productId: gemsCanPurchase[0].productId, + transactionId: token, }]); - const gift = {uuid: receivingUser._id}; - await applePayments.verifyGemPurchase({user, gift, receipt, headers}); + const gift = { uuid: receivingUser._id }; + await applePayments.verifyGemPurchase({ + user, gift, receipt, headers, + }); expect(iapSetupStub).to.be.calledOnce; expect(iapValidateStub).to.be.calledOnce; @@ -187,8 +194,11 @@ describe('Apple Payments', () => { }); describe('subscribe', () => { - let sub, sku, user, token, receipt, headers, nextPaymentProcessing; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, paymentsCreateSubscritionStub, iapGetPurchaseDataStub; + let sub; let sku; let user; let token; let receipt; let headers; let + nextPaymentProcessing; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; + let paymentsCreateSubscritionStub; let + iapGetPurchaseDataStub; beforeEach(() => { sub = common.content.subscriptionBlocks[subKey]; @@ -197,25 +207,25 @@ describe('Apple Payments', () => { token = 'test-token'; headers = {}; receipt = `{"token": "${token}"}`; - nextPaymentProcessing = moment.utc().add({days: 2}); + nextPaymentProcessing = moment.utc().add({ days: 2 }); - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({}); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') .returns([{ - expirationDate: moment.utc().subtract({day: 1}).toDate(), + expirationDate: moment.utc().subtract({ day: 1 }).toDate(), productId: sku, transactionId: token, }, { - expirationDate: moment.utc().add({day: 1}).toDate(), + expirationDate: moment.utc().add({ day: 1 }).toDate(), productId: 'wrongsku', transactionId: token, }, { - expirationDate: moment.utc().add({day: 1}).toDate(), + expirationDate: moment.utc().add({ day: 1 }).toDate(), productId: sku, transactionId: token, }]); @@ -223,10 +233,10 @@ describe('Apple Payments', () => { }); afterEach(() => { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); - iapModule.getPurchaseData.restore(); + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); + iap.getPurchaseData.restore(); if (payments.createSubscription.restore) payments.createSubscription.restore(); }); @@ -240,8 +250,8 @@ describe('Apple Payments', () => { }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); await expect(applePayments.subscribe(sku, user, receipt, headers, nextPaymentProcessing)) @@ -272,10 +282,10 @@ describe('Apple Payments', () => { ]; subOptions.forEach(option => { it(`creates a user subscription for ${option.sku}`, async () => { - iapModule.getPurchaseData.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') + iap.getPurchaseData.restore(); + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') .returns([{ - expirationDate: moment.utc().add({day: 1}).toDate(), + expirationDate: moment.utc().add({ day: 1 }).toDate(), productId: option.sku, transactionId: token, }]); @@ -319,8 +329,10 @@ describe('Apple Payments', () => { }); describe('cancelSubscribe ', () => { - let user, token, receipt, headers, customerId, expirationDate; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, iapGetPurchaseDataStub, paymentCancelSubscriptionSpy; + let user; let token; let receipt; let headers; let customerId; let + expirationDate; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let iapGetPurchaseDataStub; let + paymentCancelSubscriptionSpy; beforeEach(async () => { token = 'test-token'; @@ -329,15 +341,15 @@ describe('Apple Payments', () => { customerId = 'test-customerId'; expirationDate = moment.utc(); - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({ expirationDate, }); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{expirationDate: expirationDate.toDate()}]); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ expirationDate: expirationDate.toDate() }]); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); user = new User(); @@ -350,11 +362,11 @@ describe('Apple Payments', () => { paymentCancelSubscriptionSpy = sinon.stub(payments, 'cancelSubscription').resolves({}); }); - afterEach(function () { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); - iapModule.getPurchaseData.restore(); + afterEach(() => { + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); + iap.getPurchaseData.restore(); payments.cancelSubscription.restore(); }); @@ -370,9 +382,9 @@ describe('Apple Payments', () => { }); it('should throw an error if subscription is still valid', async () => { - iapModule.getPurchaseData.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{expirationDate: expirationDate.add({day: 1}).toDate()}]); + iap.getPurchaseData.restore(); + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ expirationDate: expirationDate.add({ day: 1 }).toDate() }]); await expect(applePayments.cancelSubscribe(user, headers)) .to.eventually.be.rejected.and.to.eql({ @@ -383,8 +395,8 @@ describe('Apple Payments', () => { }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); await expect(applePayments.cancelSubscribe(user, headers)) diff --git a/test/api/unit/libs/payments/google.test.js b/test/api/unit/libs/payments/google.test.js index c80639957c..c8383fa828 100644 --- a/test/api/unit/libs/payments/google.test.js +++ b/test/api/unit/libs/payments/google.test.js @@ -1,21 +1,22 @@ /* eslint-disable camelcase */ -import iapModule from '../../../../../website/server/libs/inAppPurchases'; +import moment from 'moment'; import payments from '../../../../../website/server/libs/payments/payments'; import googlePayments from '../../../../../website/server/libs/payments/google'; import iap from '../../../../../website/server/libs/inAppPurchases'; -import {model as User} from '../../../../../website/server/models/user'; +import { model as User } from '../../../../../website/server/models/user'; import common from '../../../../../website/common'; -import moment from 'moment'; -import {mockFindById, restoreFindById} from '../../../../helpers/mongoose.helper'; +import { mockFindById, restoreFindById } from '../../../../helpers/mongoose.helper'; -const i18n = common.i18n; +const { i18n } = common; -describe('Google Payments', () => { - let subKey = 'basic_3mo'; +describe('Google Payments', () => { + const subKey = 'basic_3mo'; describe('verifyGemPurchase', () => { - let sku, user, token, receipt, signature, headers; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, paymentBuyGemsStub; + let sku; let user; let token; let receipt; let signature; let + headers; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let + paymentBuyGemsStub; beforeEach(() => { sku = 'com.habitrpg.android.habitica.iap.21gems'; @@ -24,28 +25,30 @@ describe('Google Payments', () => { signature = ''; headers = {}; - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({}); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); paymentBuyGemsStub = sinon.stub(payments, 'buyGems').resolves({}); }); afterEach(() => { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); payments.buyGems.restore(); }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); - await expect(googlePayments.verifyGemPurchase({user, receipt, signature, headers})) + await expect(googlePayments.verifyGemPurchase({ + user, receipt, signature, headers, + })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -56,7 +59,9 @@ describe('Google Payments', () => { it('should throw an error if productId is invalid', async () => { receipt = `{"token": "${token}", "productId": "invalid"}`; - await expect(googlePayments.verifyGemPurchase({user, receipt, signature, headers})) + await expect(googlePayments.verifyGemPurchase({ + user, receipt, signature, headers, + })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -67,7 +72,9 @@ describe('Google Payments', () => { it('should throw an error if user cannot purchase gems', async () => { sinon.stub(user, 'canGetGems').resolves(false); - await expect(googlePayments.verifyGemPurchase({user, receipt, signature, headers})) + await expect(googlePayments.verifyGemPurchase({ + user, receipt, signature, headers, + })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -79,7 +86,9 @@ describe('Google Payments', () => { it('purchases gems', async () => { sinon.stub(user, 'canGetGems').resolves(true); - await googlePayments.verifyGemPurchase({user, receipt, signature, headers}); + await googlePayments.verifyGemPurchase({ + user, receipt, signature, headers, + }); expect(iapSetupStub).to.be.calledOnce; expect(iapValidateStub).to.be.calledOnce; @@ -107,8 +116,10 @@ describe('Google Payments', () => { mockFindById(receivingUser); - const gift = {uuid: receivingUser._id}; - await googlePayments.verifyGemPurchase({user, gift, receipt, signature, headers}); + const gift = { uuid: receivingUser._id }; + await googlePayments.verifyGemPurchase({ + user, gift, receipt, signature, headers, + }); expect(iapSetupStub).to.be.calledOnce; expect(iapValidateStub).to.be.calledOnce; @@ -131,8 +142,10 @@ describe('Google Payments', () => { }); describe('subscribe', () => { - let sub, sku, user, token, receipt, signature, headers, nextPaymentProcessing; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, paymentsCreateSubscritionStub; + let sub; let sku; let user; let token; let receipt; let signature; let headers; let + nextPaymentProcessing; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let + paymentsCreateSubscritionStub; beforeEach(() => { sub = common.content.subscriptionBlocks[subKey]; @@ -142,30 +155,31 @@ describe('Google Payments', () => { headers = {}; receipt = `{"token": "${token}"}`; signature = ''; - nextPaymentProcessing = moment.utc().add({days: 2}); + nextPaymentProcessing = moment.utc().add({ days: 2 }); - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({}); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); paymentsCreateSubscritionStub = sinon.stub(payments, 'createSubscription').resolves({}); }); afterEach(() => { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); payments.createSubscription.restore(); }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); - await expect(googlePayments.subscribe(sku, user, receipt, signature, headers, nextPaymentProcessing)) + await expect(googlePayments + .subscribe(sku, user, receipt, signature, headers, nextPaymentProcessing)) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -176,7 +190,8 @@ describe('Google Payments', () => { it('should throw an error if sku is invalid', async () => { sku = 'invalid'; - await expect(googlePayments.subscribe(sku, user, receipt, signature, headers, nextPaymentProcessing)) + await expect(googlePayments + .subscribe(sku, user, receipt, signature, headers, nextPaymentProcessing)) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -203,15 +218,17 @@ describe('Google Payments', () => { paymentMethod: googlePayments.constants.PAYMENT_METHOD_GOOGLE, sub, headers, - additionalData: {data: receipt, signature}, + additionalData: { data: receipt, signature }, nextPaymentProcessing, }); }); }); describe('cancelSubscribe ', () => { - let user, token, receipt, signature, headers, customerId, expirationDate; - let iapSetupStub, iapValidateStub, iapIsValidatedStub, iapGetPurchaseDataStub, paymentCancelSubscriptionSpy; + let user; let token; let receipt; let signature; let headers; let customerId; let + expirationDate; + let iapSetupStub; let iapValidateStub; let iapIsValidatedStub; let iapGetPurchaseDataStub; let + paymentCancelSubscriptionSpy; beforeEach(async () => { token = 'test-token'; @@ -221,15 +238,15 @@ describe('Google Payments', () => { customerId = 'test-customerId'; expirationDate = moment.utc(); - iapSetupStub = sinon.stub(iapModule, 'setup') + iapSetupStub = sinon.stub(iap, 'setup') .resolves(); - iapValidateStub = sinon.stub(iapModule, 'validate') + iapValidateStub = sinon.stub(iap, 'validate') .resolves({ expirationDate, }); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{expirationDate: expirationDate.toDate()}]); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ expirationDate: expirationDate.toDate() }]); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(true); user = new User(); @@ -237,16 +254,16 @@ describe('Google Payments', () => { user.purchased.plan.customerId = customerId; user.purchased.plan.paymentMethod = googlePayments.constants.PAYMENT_METHOD_GOOGLE; user.purchased.plan.planId = subKey; - user.purchased.plan.additionalData = {data: receipt, signature}; + user.purchased.plan.additionalData = { data: receipt, signature }; paymentCancelSubscriptionSpy = sinon.stub(payments, 'cancelSubscription').resolves({}); }); - afterEach(function () { - iapModule.setup.restore(); - iapModule.validate.restore(); - iapModule.isValidated.restore(); - iapModule.getPurchaseData.restore(); + afterEach(() => { + iap.setup.restore(); + iap.validate.restore(); + iap.isValidated.restore(); + iap.getPurchaseData.restore(); payments.cancelSubscription.restore(); }); @@ -262,9 +279,9 @@ describe('Google Payments', () => { }); it('should throw an error if subscription is still valid', async () => { - iapModule.getPurchaseData.restore(); - iapGetPurchaseDataStub = sinon.stub(iapModule, 'getPurchaseData') - .returns([{expirationDate: expirationDate.add({day: 1}).toDate()}]); + iap.getPurchaseData.restore(); + iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData') + .returns([{ expirationDate: expirationDate.add({ day: 1 }).toDate() }]); await expect(googlePayments.cancelSubscribe(user, headers)) .to.eventually.be.rejected.and.to.eql({ @@ -275,8 +292,8 @@ describe('Google Payments', () => { }); it('should throw an error if receipt is invalid', async () => { - iapModule.isValidated.restore(); - iapIsValidatedStub = sinon.stub(iapModule, 'isValidated') + iap.isValidated.restore(); + iapIsValidatedStub = sinon.stub(iap, 'isValidated') .returns(false); await expect(googlePayments.cancelSubscribe(user, headers)) diff --git a/test/api/unit/libs/payments/group-plans/group-payments-cancel.test.js b/test/api/unit/libs/payments/group-plans/group-payments-cancel.test.js index 65d78399eb..ccbe63f328 100644 --- a/test/api/unit/libs/payments/group-plans/group-payments-cancel.test.js +++ b/test/api/unit/libs/payments/group-plans/group-payments-cancel.test.js @@ -1,16 +1,17 @@ import moment from 'moment'; import * as sender from '../../../../../../website/server/libs/email'; -import * as api from '../../../../../../website/server/libs/payments/payments'; +import api from '../../../../../../website/server/libs/payments/payments'; import { model as User } from '../../../../../../website/server/models/user'; import { model as Group } from '../../../../../../website/server/models/group'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import i18n from '../../../../../../website/common/script/i18n'; describe('Canceling a subscription for group', () => { - let plan, group, user, data; + let plan; let group; let user; let + data; beforeEach(async () => { user = new User(); @@ -67,9 +68,9 @@ describe('Canceling a subscription for group', () => { data.groupId = group._id; await api.cancelSubscription(data); - let now = new Date(); - let updatedGroup = await Group.findById(group._id).exec(); - let daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const updatedGroup = await Group.findById(group._id).exec(); + const daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(29, 30); // 1 month +/- 1 days }); @@ -81,9 +82,9 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let now = new Date(); - let updatedGroup = await Group.findById(group._id).exec(); - let daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const updatedGroup = await Group.findById(group._id).exec(); + const daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(89, 90); // 3 months +/- 1 days }); @@ -95,9 +96,9 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let now = new Date(); - let updatedGroup = await Group.findById(group._id).exec(); - let daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const updatedGroup = await Group.findById(group._id).exec(); + const daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(38, 39); // should be about 1 month + 1/3 month }); @@ -108,9 +109,9 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let now = new Date(); - let updatedGroup = await Group.findById(group._id).exec(); - let daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const updatedGroup = await Group.findById(group._id).exec(); + const daysTillTermination = moment(updatedGroup.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(13, 15); }); @@ -122,7 +123,7 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); expect(updatedGroup.purchased.plan.extraMonths).to.eql(0); }); @@ -134,12 +135,12 @@ describe('Canceling a subscription for group', () => { expect(sender.sendTxn.firstCall.args[0]._id).to.equal(user._id); expect(sender.sendTxn.firstCall.args[1]).to.equal('group-cancel-subscription'); expect(sender.sendTxn.firstCall.args[2]).to.eql([ - {name: 'GROUP_NAME', content: group.name}, + { name: 'GROUP_NAME', content: group.name }, ]); }); it('prevents non group leader from managing subscription', async () => { - let groupMember = new User(); + const groupMember = new User(); data.user = groupMember; data.groupId = group._id; @@ -160,7 +161,7 @@ describe('Canceling a subscription for group', () => { await api.createSubscription(data); let updatedGroup = await Group.findById(group._id).exec(); - let newLeader = new User(); + const newLeader = new User(); updatedGroup.leader = newLeader._id; await updatedGroup.save(); @@ -192,15 +193,15 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let now = new Date(); + const now = new Date(); now.setHours(0, 0, 0, 0); - let updatedLeader = await User.findById(user._id).exec(); - let daysTillTermination = moment(updatedLeader.purchased.plan.dateTerminated).diff(now, 'days'); + const updatedLeader = await User.findById(user._id).exec(); + const daysTillTermination = moment(updatedLeader.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(2, 3); // only a few days }); it('sends an email to members of group', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.guilds.push(group._id); await recipient.save(); @@ -214,8 +215,8 @@ describe('Canceling a subscription for group', () => { expect(sender.sendTxn.thirdCall.args[0]._id).to.equal(recipient._id); expect(sender.sendTxn.thirdCall.args[1]).to.equal('group-member-cancel'); expect(sender.sendTxn.thirdCall.args[2]).to.eql([ - {name: 'LEADER', content: user.profile.name}, - {name: 'GROUP_NAME', content: group.name}, + { name: 'LEADER', content: user.profile.name }, + { name: 'GROUP_NAME', content: group.name }, ]); }); @@ -223,7 +224,7 @@ describe('Canceling a subscription for group', () => { plan.key = 'basic_earned'; plan.customerId = api.constants.UNLIMITED_CUSTOMER_ID; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -233,12 +234,12 @@ describe('Canceling a subscription for group', () => { await api.cancelSubscription(data); - let updatedLeader = await User.findById(user._id).exec(); + const updatedLeader = await User.findById(user._id).exec(); expect(updatedLeader.purchased.plan.dateTerminated).to.not.exist; }); it('does not cancel a user subscription if they are still in another active group plan', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; recipient.purchased.plan = plan; @@ -252,10 +253,10 @@ describe('Canceling a subscription for group', () => { await api.createSubscription(data); let updatedUser = await User.findById(recipient._id).exec(); - let firstDateCreated = updatedUser.purchased.plan.dateCreated; - let extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; + const firstDateCreated = updatedUser.purchased.plan.dateCreated; + const extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; - let group2 = generateGroup({ + const group2 = generateGroup({ name: 'test group2', type: 'guild', privacy: 'public', @@ -291,10 +292,10 @@ describe('Canceling a subscription for group', () => { await api.createSubscription(data); let updatedUser = await User.findById(user._id).exec(); - let firstDateCreated = updatedUser.purchased.plan.dateCreated; - let extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; + const firstDateCreated = updatedUser.purchased.plan.dateCreated; + const extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; - let group2 = generateGroup({ + const group2 = generateGroup({ name: 'test group2', type: 'guild', privacy: 'public', diff --git a/test/api/unit/libs/payments/group-plans/group-payments-create.test.js b/test/api/unit/libs/payments/group-plans/group-payments-create.test.js index 3e57126ef0..ca6c921f80 100644 --- a/test/api/unit/libs/payments/group-plans/group-payments-create.test.js +++ b/test/api/unit/libs/payments/group-plans/group-payments-create.test.js @@ -3,7 +3,7 @@ import stripeModule from 'stripe'; import nconf from 'nconf'; import * as sender from '../../../../../../website/server/libs/email'; -import * as api from '../../../../../../website/server/libs/payments/payments'; +import api from '../../../../../../website/server/libs/payments/payments'; import amzLib from '../../../../../../website/server/libs/payments/amazon'; import paypalPayments from '../../../../../../website/server/libs/payments/paypal'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; @@ -11,7 +11,7 @@ import { model as User } from '../../../../../../website/server/models/user'; import { model as Group } from '../../../../../../website/server/models/group'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; describe('Purchasing a group plan for group', () => { const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE = 'Google_subscription'; @@ -19,10 +19,11 @@ describe('Purchasing a group plan for group', () => { const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL = 'normal_subscription'; const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE = 'no_subscription'; - let plan, group, user, data; - let stripe = stripeModule('test'); - let groupLeaderName = 'sender'; - let groupName = 'test group'; + let plan; let group; let user; let + data; + const stripe = stripeModule('test'); + const groupLeaderName = 'sender'; + const groupName = 'test group'; beforeEach(async () => { user = new User(); @@ -68,14 +69,17 @@ describe('Purchasing a group plan for group', () => { }, }; - let subscriptionId = 'subId'; + const subscriptionId = 'subId'; sinon.stub(stripe.customers, 'del').resolves({}); - let currentPeriodEndTimeStamp = moment().add(3, 'months').unix(); + const currentPeriodEndTimeStamp = moment().add(3, 'months').unix(); sinon.stub(stripe.customers, 'retrieve') .resolves({ subscriptions: { - data: [{id: subscriptionId, current_period_end: currentPeriodEndTimeStamp}], // eslint-disable-line camelcase + data: [{ + id: subscriptionId, + current_period_end: currentPeriodEndTimeStamp, + }], // eslint-disable-line camelcase }, }); @@ -95,7 +99,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); expect(updatedGroup.purchased.plan.planId).to.eql('basic_3mo'); expect(updatedGroup.purchased.plan.customerId).to.eql('customer-id'); @@ -126,7 +130,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); expect(updatedGroup.purchased.plan.extraMonths).to.within(1.9, 2); }); @@ -139,7 +143,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); expect(updatedGroup.purchased.plan.extraMonths).to.eql(0); }); @@ -150,7 +154,7 @@ describe('Purchasing a group plan for group', () => { data.groupId = group._id; await api.createSubscription(data); - let updatedLeader = await User.findById(user._id).exec(); + const updatedLeader = await User.findById(user._id).exec(); expect(updatedLeader.purchased.plan.planId).to.eql('group_plan_auto'); expect(updatedLeader.purchased.plan.customerId).to.eql('group-plan'); @@ -166,7 +170,7 @@ describe('Purchasing a group plan for group', () => { }); it('sends an email to member of group who was not a subscriber', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.guilds.push(group._id); await recipient.save(); @@ -179,9 +183,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.firstCall.args[0]._id).to.equal(recipient._id); expect(sender.sendTxn.firstCall.args[1]).to.equal('group-member-join'); expect(sender.sendTxn.firstCall.args[2]).to.eql([ - {name: 'LEADER', content: user.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE}, + { name: 'LEADER', content: user.profile.name }, + { name: 'GROUP_NAME', content: group.name }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE }, ]); // confirm that the other email sent is appropriate: expect(sender.sendTxn.secondCall.args[0]._id).to.equal(group.leader); @@ -189,7 +193,7 @@ describe('Purchasing a group plan for group', () => { }); it('sends one email to subscribed member of group, stating subscription is cancelled (Stripe)', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -205,9 +209,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.firstCall.args[0]._id).to.equal(recipient._id); expect(sender.sendTxn.firstCall.args[1]).to.equal('group-member-join'); expect(sender.sendTxn.firstCall.args[2]).to.eql([ - {name: 'LEADER', content: user.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL}, + { name: 'LEADER', content: user.profile.name }, + { name: 'GROUP_NAME', content: group.name }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL }, ]); // confirm that the other email sent is not a cancel-subscription email: expect(sender.sendTxn.secondCall.args[0]._id).to.equal(group.leader); @@ -218,11 +222,11 @@ describe('Purchasing a group plan for group', () => { sinon.stub(amzLib, 'getBillingAgreementDetails') .resolves({ BillingAgreementDetails: { - BillingAgreementStatus: {State: 'Closed'}, + BillingAgreementStatus: { State: 'Closed' }, }, }); - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.planId = 'basic_earned'; plan.paymentMethod = amzLib.constants.PAYMENT_METHOD; @@ -238,9 +242,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.firstCall.args[0]._id).to.equal(recipient._id); expect(sender.sendTxn.firstCall.args[1]).to.equal('group-member-join'); expect(sender.sendTxn.firstCall.args[2]).to.eql([ - {name: 'LEADER', content: user.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL}, + { name: 'LEADER', content: user.profile.name }, + { name: 'GROUP_NAME', content: group.name }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL }, ]); // confirm that the other email sent is not a cancel-subscription email: expect(sender.sendTxn.secondCall.args[0]._id).to.equal(group.leader); @@ -259,7 +263,7 @@ describe('Purchasing a group plan for group', () => { }, }); - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.planId = 'basic_earned'; plan.paymentMethod = paypalPayments.constants.PAYMENT_METHOD; @@ -275,9 +279,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.firstCall.args[0]._id).to.equal(recipient._id); expect(sender.sendTxn.firstCall.args[1]).to.equal('group-member-join'); expect(sender.sendTxn.firstCall.args[2]).to.eql([ - {name: 'LEADER', content: user.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL}, + { name: 'LEADER', content: user.profile.name }, + { name: 'GROUP_NAME', content: group.name }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL }, ]); // confirm that the other email sent is not a cancel-subscription email: expect(sender.sendTxn.secondCall.args[0]._id).to.equal(group.leader); @@ -292,7 +296,7 @@ describe('Purchasing a group plan for group', () => { plan.customerId = 'random'; plan.paymentMethod = api.constants.GOOGLE_PAYMENT_METHOD; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -310,9 +314,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.args[1][0]._id).to.equal(recipient._id); expect(sender.sendTxn.args[1][1]).to.equal('group-member-join'); expect(sender.sendTxn.args[1][2]).to.eql([ - {name: 'LEADER', content: groupLeaderName}, - {name: 'GROUP_NAME', content: groupName}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE}, + { name: 'LEADER', content: groupLeaderName }, + { name: 'GROUP_NAME', content: groupName }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE }, ]); expect(sender.sendTxn.args[2][0]._id).to.equal(group.leader); expect(sender.sendTxn.args[2][1]).to.equal('group-member-join'); @@ -325,7 +329,7 @@ describe('Purchasing a group plan for group', () => { plan.customerId = 'random'; plan.paymentMethod = api.constants.IOS_PAYMENT_METHOD; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -343,9 +347,9 @@ describe('Purchasing a group plan for group', () => { expect(sender.sendTxn.args[1][0]._id).to.equal(recipient._id); expect(sender.sendTxn.args[1][1]).to.equal('group-member-join'); expect(sender.sendTxn.args[1][2]).to.eql([ - {name: 'LEADER', content: groupLeaderName}, - {name: 'GROUP_NAME', content: groupName}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS}, + { name: 'LEADER', content: groupLeaderName }, + { name: 'GROUP_NAME', content: groupName }, + { name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS }, ]); expect(sender.sendTxn.args[2][0]._id).to.equal(group.leader); expect(sender.sendTxn.args[2][1]).to.equal('group-member-join'); @@ -354,7 +358,7 @@ describe('Purchasing a group plan for group', () => { }); it('adds months to members with existing gift subscription', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -378,7 +382,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('group_plan_auto'); expect(updatedUser.purchased.plan.customerId).to.eql('group-plan'); @@ -392,7 +396,7 @@ describe('Purchasing a group plan for group', () => { }); it('adds months to members with existing multi-month gift subscription', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -414,7 +418,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('group_plan_auto'); expect(updatedUser.purchased.plan.customerId).to.eql('group-plan'); @@ -428,7 +432,7 @@ describe('Purchasing a group plan for group', () => { }); it('adds months to members with existing recurring subscription (Stripe)', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -450,11 +454,11 @@ describe('Purchasing a group plan for group', () => { sinon.stub(amzLib, 'getBillingAgreementDetails') .resolves({ BillingAgreementDetails: { - BillingAgreementStatus: {State: 'Closed'}, + BillingAgreementStatus: { State: 'Closed' }, }, }); - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.planId = 'basic_earned'; plan.paymentMethod = amzLib.constants.PAYMENT_METHOD; @@ -470,7 +474,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(3, 5); }); @@ -485,7 +489,7 @@ describe('Purchasing a group plan for group', () => { }, }); - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.planId = 'basic_earned'; plan.paymentMethod = paypalPayments.constants.PAYMENT_METHOD; @@ -500,7 +504,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(2, 3); paypalPayments.paypalBillingAgreementGet.restore(); @@ -511,7 +515,7 @@ describe('Purchasing a group plan for group', () => { it('adds months to members with existing recurring subscription (iOS)'); it('adds months to members who already cancelled but not yet terminated recurring subscription', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -527,13 +531,13 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(2, 3); }); it('adds months to members who already cancelled but not yet terminated group plan subscription', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = api.constants.GROUP_PLAN_PAYMENT_METHOD; @@ -550,12 +554,12 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(3, 4); }); it('resets date terminated if user has old subscription', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -570,13 +574,13 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.dateTerminated).to.not.exist; }); it('adds months to members with existing recurring subscription and includes existing extraMonths', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -591,13 +595,13 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(7, 9); }); it('adds months to members with existing recurring subscription and ignores existing negative extraMonths', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; plan.paymentMethod = stripePayments.constants.PAYMENT_METHOD; @@ -612,23 +616,23 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.extraMonths).to.within(2, 3); }); it('does not override gemsBought, mysteryItems, dateCreated, and consective fields', async () => { - let planCreatedDate = moment().toDate(); - let mysteryItem = {title: 'item'}; - let mysteryItems = [mysteryItem]; - let consecutive = { + const planCreatedDate = moment().toDate(); + const mysteryItem = { title: 'item' }; + const mysteryItems = [mysteryItem]; + const consecutive = { trinkets: 3, gemCapExtra: 20, offset: 1, count: 13, }; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; @@ -647,7 +651,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.gemsBought).to.equal(3); expect(updatedUser.purchased.plan.mysteryItems[0]).to.eql(mysteryItem); @@ -659,7 +663,7 @@ describe('Purchasing a group plan for group', () => { }); it('does not modify a user with a group subscription when they join another group', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; recipient.purchased.plan = plan; @@ -673,10 +677,10 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); let updatedUser = await User.findById(recipient._id).exec(); - let firstDateCreated = updatedUser.purchased.plan.dateCreated; - let extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; + const firstDateCreated = updatedUser.purchased.plan.dateCreated; + const extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; - let group2 = generateGroup({ + const group2 = generateGroup({ name: 'test group2', type: 'guild', privacy: 'public', @@ -703,7 +707,7 @@ describe('Purchasing a group plan for group', () => { }); it('does not remove a user who is in two groups plans and leaves one', async () => { - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; plan.key = 'basic_earned'; recipient.purchased.plan = plan; @@ -717,10 +721,10 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); let updatedUser = await User.findById(recipient._id).exec(); - let firstDateCreated = updatedUser.purchased.plan.dateCreated; - let extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; + const firstDateCreated = updatedUser.purchased.plan.dateCreated; + const extraMonthsBeforeSecond = updatedUser.purchased.plan.extraMonths; - let group2 = generateGroup({ + const group2 = generateGroup({ name: 'test group2', type: 'guild', privacy: 'public', @@ -733,7 +737,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); await updatedGroup.leave(recipient); updatedUser = await User.findById(recipient._id).exec(); @@ -753,7 +757,7 @@ describe('Purchasing a group plan for group', () => { plan.key = 'basic_earned'; plan.customerId = api.constants.UNLIMITED_CUSTOMER_ID; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -765,7 +769,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('basic_3mo'); expect(updatedUser.purchased.plan.customerId).to.eql(api.constants.UNLIMITED_CUSTOMER_ID); @@ -782,7 +786,7 @@ describe('Purchasing a group plan for group', () => { plan.customerId = 'random'; plan.paymentMethod = api.constants.GOOGLE_PAYMENT_METHOD; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -794,7 +798,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('basic_3mo'); expect(updatedUser.purchased.plan.customerId).to.eql('random'); @@ -811,7 +815,7 @@ describe('Purchasing a group plan for group', () => { plan.customerId = 'random'; plan.paymentMethod = api.constants.IOS_PAYMENT_METHOD; - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -823,7 +827,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('basic_3mo'); expect(updatedUser.purchased.plan.customerId).to.eql('random'); @@ -841,7 +845,7 @@ describe('Purchasing a group plan for group', () => { plan.customerId = api.constants.GROUP_PLAN_CUSTOMER_ID; plan.dateTerminated = moment().add(1, 'months'); - let recipient = new User(); + const recipient = new User(); recipient.profile.name = 'recipient'; recipient.purchased.plan = plan; recipient.guilds.push(group._id); @@ -853,7 +857,7 @@ describe('Purchasing a group plan for group', () => { await api.createSubscription(data); - let updatedUser = await User.findById(recipient._id).exec(); + const updatedUser = await User.findById(recipient._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('group_plan_auto'); expect(updatedUser.purchased.plan.customerId).to.eql(api.constants.GROUP_PLAN_CUSTOMER_ID); diff --git a/test/api/unit/libs/payments/paymentHelpers.js b/test/api/unit/libs/payments/paymentHelpers.js index 6ea70a5504..7bed28e44b 100644 --- a/test/api/unit/libs/payments/paymentHelpers.js +++ b/test/api/unit/libs/payments/paymentHelpers.js @@ -1,7 +1,7 @@ import { model as User } from '../../../../../website/server/models/user'; -export async function createNonLeaderGroupMember (group) { - let nonLeader = new User(); +export async function createNonLeaderGroupMember (group) { // eslint-disable-line import/prefer-default-export, max-len + const nonLeader = new User(); nonLeader.guilds.push(group._id); - return await nonLeader.save(); + return nonLeader.save(); } diff --git a/test/api/unit/libs/payments/payments.test.js b/test/api/unit/libs/payments/payments.test.js index f37c5c511b..76d0d3d00e 100644 --- a/test/api/unit/libs/payments/payments.test.js +++ b/test/api/unit/libs/payments/payments.test.js @@ -1,17 +1,18 @@ import moment from 'moment'; import * as sender from '../../../../../website/server/libs/email'; -import * as api from '../../../../../website/server/libs/payments/payments'; -import analytics from '../../../../../website/server/libs/analyticsService'; -import notifications from '../../../../../website/server/libs/pushNotifications'; +import api from '../../../../../website/server/libs/payments/payments'; +import * as analytics from '../../../../../website/server/libs/analyticsService'; +import * as notifications from '../../../../../website/server/libs/pushNotifications'; import { model as User } from '../../../../../website/server/models/user'; import { translate as t } from '../../../../helpers/api-integration/v3'; import { generateGroup, -} from '../../../../helpers/api-unit.helper.js'; +} from '../../../../helpers/api-unit.helper'; describe('payments/index', () => { - let user, group, data, plan; + let user; let group; let data; let + plan; beforeEach(async () => { user = new User(); @@ -102,7 +103,7 @@ describe('payments/index', () => { }); it('does not set negative extraMonths if plan has past dateTerminated date', async () => { - let dateTerminated = moment().subtract(2, 'months').toDate(); + const dateTerminated = moment().subtract(2, 'months').toDate(); recipient.purchased.plan.dateTerminated = dateTerminated; await api.createSubscription(data); @@ -120,7 +121,7 @@ describe('payments/index', () => { }); it('adds to date terminated for an existing plan with a future terminated date', async () => { - let dateTerminated = moment().add(1, 'months').toDate(); + const dateTerminated = moment().add(1, 'months').toDate(); recipient.purchased.plan = plan; recipient.purchased.plan.dateTerminated = dateTerminated; @@ -130,7 +131,7 @@ describe('payments/index', () => { }); it('replaces date terminated for an account with a past terminated date', async () => { - let dateTerminated = moment().subtract(1, 'months').toDate(); + const dateTerminated = moment().subtract(1, 'months').toDate(); recipient.purchased.plan.dateTerminated = dateTerminated; await api.createSubscription(data); @@ -208,18 +209,21 @@ describe('payments/index', () => { it('sends a private message about the gift', async () => { await api.createSubscription(data); - let msg = '\`Hello recipient, sender has sent you 3 months of subscription!\`'; + const msg = '`Hello recipient, sender has sent you 3 months of subscription!`'; expect(user.sendMessage).to.be.calledOnce; - expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false }); + expect(user.sendMessage).to.be.calledWith( + recipient, + { receiverMsg: msg, senderMsg: msg, save: false }, + ); }); it('sends an email about the gift', async () => { await api.createSubscription(data); expect(sender.sendTxn).to.be.calledWith(recipient, 'gifted-subscription', [ - {name: 'GIFTER', content: 'sender'}, - {name: 'X_MONTHS_SUBSCRIPTION', content: 3}, + { name: 'GIFTER', content: 'sender' }, + { name: 'X_MONTHS_SUBSCRIPTION', content: 3 }, ]); }); @@ -416,8 +420,8 @@ describe('payments/index', () => { context('Mystery Items', () => { it('awards mystery items when within the timeframe for a mystery item', async () => { - let mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 - let fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); + const mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 + const fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } }; @@ -437,7 +441,7 @@ describe('payments/index', () => { it('does not awards mystery items when not within the timeframe for a mystery item', async () => { const noMysteryItemTimeframe = 1462183920000; // May 2nd 2016 - let fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe); + const fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe); data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } }; await api.createSubscription(data); @@ -449,7 +453,7 @@ describe('payments/index', () => { it('does not add a notification for mystery items if none was awarded', async () => { const noMysteryItemTimeframe = 1462183920000; // May 2nd 2016 - let fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe); + const fakeClock = sinon.useFakeTimers(noMysteryItemTimeframe); data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } }; await api.createSubscription(data); @@ -461,9 +465,9 @@ describe('payments/index', () => { }); it('does not award mystery item when user already owns the item', async () => { - let mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 - let fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); - let mayMysteryItem = 'armor_mystery_201605'; + const mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 + const fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); + const mayMysteryItem = 'armor_mystery_201605'; user.items.gear.owned[mayMysteryItem] = true; data = { paymentMethod: 'PaymentMethod', user, sub: { key: 'basic_3mo' } }; @@ -477,9 +481,9 @@ describe('payments/index', () => { }); it('does not award mystery item when user already has the item in the mystery box', async () => { - let mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 - let fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); - let mayMysteryItem = 'armor_mystery_201605'; + const mayMysteryItemTimeframe = 1464725113000; // May 31st 2016 + const fakeClock = sinon.useFakeTimers(mayMysteryItemTimeframe); + const mayMysteryItem = 'armor_mystery_201605'; user.purchased.plan.mysteryItems = [mayMysteryItem]; sandbox.spy(user.purchased.plan.mysteryItems, 'push'); @@ -504,8 +508,8 @@ describe('payments/index', () => { it('adds a month termination date by default', async () => { await api.cancelSubscription(data); - let now = new Date(); - let daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(29, 30); // 1 month +/- 1 days }); @@ -515,8 +519,8 @@ describe('payments/index', () => { await api.cancelSubscription(data); - let now = new Date(); - let daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(89, 90); // 3 months +/- 1 days }); @@ -526,8 +530,8 @@ describe('payments/index', () => { await api.cancelSubscription(data); - let now = new Date(); - let daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(38, 39); // should be about 1 month + 1/3 month }); @@ -537,8 +541,8 @@ describe('payments/index', () => { await api.cancelSubscription(data); - let now = new Date(); - let daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(13, 15); }); @@ -549,8 +553,8 @@ describe('payments/index', () => { await api.cancelSubscription(data); - let now = new Date(); - let daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); + const now = new Date(); + const daysTillTermination = moment(user.purchased.plan.dateTerminated).diff(now, 'days'); expect(daysTillTermination).to.be.within(13, 15); }); @@ -641,9 +645,10 @@ describe('payments/index', () => { it('sends a message from purchaser to recipient', async () => { await api.buyGems(data); - let msg = '\`Hello recipient, sender has sent you 4 gems!\`'; + const msg = '`Hello recipient, sender has sent you 4 gems!`'; - expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false }); + expect(user.sendMessage).to.be + .calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false }); }); it('sends a message from purchaser to recipient wtih custom message', async () => { @@ -652,7 +657,8 @@ describe('payments/index', () => { await api.buyGems(data); const msg = `\`Hello recipient, sender has sent you 4 gems!\` ${data.gift.message}`; - expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false }); + expect(user.sendMessage).to.be + .calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false }); }); it('sends a push notification if user did not gift to self', async () => { @@ -671,8 +677,8 @@ describe('payments/index', () => { }); await api.buyGems(data); - let [recipientsMessageContent, sendersMessageContent] = ['en', 'en'].map((lang) => { - let messageContent = t('giftedGemsFull', { + const [recipientsMessageContent, sendersMessageContent] = ['en', 'en'].map(lang => { + const messageContent = t('giftedGemsFull', { username: recipient.profile.name, sender: user.profile.name, gemAmount: data.gift.gems.amount, @@ -681,7 +687,10 @@ describe('payments/index', () => { return `\`${messageContent}\``; }); - expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: recipientsMessageContent, senderMsg: sendersMessageContent, save: false }); + expect(user.sendMessage).to.be.calledWith( + recipient, + { receiverMsg: recipientsMessageContent, senderMsg: sendersMessageContent, save: false }, + ); }); }); }); @@ -693,7 +702,7 @@ describe('payments/index', () => { await api.addSubToGroupUser(user, group); - let updatedUser = await User.findById(user._id).exec(); + const updatedUser = await User.findById(user._id).exec(); expect(updatedUser.purchased.plan.planId).to.eql('group_plan_auto'); expect(updatedUser.purchased.plan.customerId).to.eql('group-plan'); @@ -709,17 +718,17 @@ describe('payments/index', () => { it('awards the Royal Purple Jackalope pet', async () => { await api.addSubToGroupUser(user, group); - let updatedUser = await User.findById(user._id).exec(); + const updatedUser = await User.findById(user._id).exec(); expect(updatedUser.items.pets['Jackalope-RoyalPurple']).to.eql(5); }); it('saves previously unused Mystery Items and Hourglasses for an expired subscription', async () => { - let planExpirationDate = new Date(); + const planExpirationDate = new Date(); planExpirationDate.setDate(planExpirationDate.getDate() - 2); - let mysteryItem = 'item'; - let mysteryItems = [mysteryItem]; - let consecutive = { + const mysteryItem = 'item'; + const mysteryItems = [mysteryItem]; + const consecutive = { trinkets: 3, }; @@ -735,7 +744,7 @@ describe('payments/index', () => { await user.save(); await api.addSubToGroupUser(user, group); - let updatedUser = await User.findById(user._id).exec(); + const updatedUser = await User.findById(user._id).exec(); expect(updatedUser.purchased.plan.mysteryItems[0]).to.eql(mysteryItem); expect(updatedUser.purchased.plan.consecutive.trinkets).to.equal(consecutive.trinkets); diff --git a/test/api/unit/libs/payments/paypal/checkout-success.test.js b/test/api/unit/libs/payments/paypal/checkout-success.test.js index 80547925b4..3c896f4128 100644 --- a/test/api/unit/libs/payments/paypal/checkout-success.test.js +++ b/test/api/unit/libs/payments/paypal/checkout-success.test.js @@ -5,8 +5,10 @@ import { model as User } from '../../../../../../website/server/models/user'; describe('checkout success', () => { const subKey = 'basic_3mo'; - let user, gift, customerId, paymentId; - let paypalPaymentExecuteStub, paymentBuyGemsStub, paymentsCreateSubscritionStub; + let user; let gift; let customerId; let + paymentId; + let paypalPaymentExecuteStub; let paymentBuyGemsStub; let + paymentsCreateSubscritionStub; beforeEach(() => { user = new User(); @@ -25,7 +27,9 @@ describe('checkout success', () => { }); it('purchases gems', async () => { - await paypalPayments.checkoutSuccess({user, gift, paymentId, customerId}); + await paypalPayments.checkoutSuccess({ + user, gift, paymentId, customerId, + }); expect(paypalPaymentExecuteStub).to.be.calledOnce; expect(paypalPaymentExecuteStub).to.be.calledWith(paymentId, { payer_id: customerId }); @@ -38,7 +42,7 @@ describe('checkout success', () => { }); it('gifts gems', async () => { - let receivingUser = new User(); + const receivingUser = new User(); await receivingUser.save(); gift = { type: 'gems', @@ -48,7 +52,9 @@ describe('checkout success', () => { }, }; - await paypalPayments.checkoutSuccess({user, gift, paymentId, customerId}); + await paypalPayments.checkoutSuccess({ + user, gift, paymentId, customerId, + }); expect(paypalPaymentExecuteStub).to.be.calledOnce; expect(paypalPaymentExecuteStub).to.be.calledWith(paymentId, { payer_id: customerId }); @@ -62,7 +68,7 @@ describe('checkout success', () => { }); it('gifts subscription', async () => { - let receivingUser = new User(); + const receivingUser = new User(); await receivingUser.save(); gift = { type: 'subscription', @@ -72,7 +78,9 @@ describe('checkout success', () => { }, }; - await paypalPayments.checkoutSuccess({user, gift, paymentId, customerId}); + await paypalPayments.checkoutSuccess({ + user, gift, paymentId, customerId, + }); expect(paypalPaymentExecuteStub).to.be.calledOnce; expect(paypalPaymentExecuteStub).to.be.calledWith(paymentId, { payer_id: customerId }); diff --git a/test/api/unit/libs/payments/paypal/checkout.test.js b/test/api/unit/libs/payments/paypal/checkout.test.js index 25e381bcc1..b6173f6d8e 100644 --- a/test/api/unit/libs/payments/paypal/checkout.test.js +++ b/test/api/unit/libs/payments/paypal/checkout.test.js @@ -6,7 +6,7 @@ import { model as User } from '../../../../../../website/server/models/user'; import common from '../../../../../../website/common'; const BASE_URL = nconf.get('BASE_URL'); -const i18n = common.i18n; +const { i18n } = common; describe('checkout', () => { const subKey = 'basic_3mo'; @@ -53,7 +53,7 @@ describe('checkout', () => { }); it('creates a link for gem purchases', async () => { - let link = await paypalPayments.checkout({user: new User()}); + const link = await paypalPayments.checkout({ user: new User() }); expect(paypalPaymentCreateStub).to.be.calledOnce; expect(paypalPaymentCreateStub).to.be.calledWith(getPaypalCreateOptions('Habitica Gems', 5.00)); @@ -61,9 +61,9 @@ describe('checkout', () => { }); it('should error if gem amount is too low', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); - let gift = { + const gift = { type: 'gems', gems: { amount: 0, @@ -71,7 +71,7 @@ describe('checkout', () => { }, }; - await expect(paypalPayments.checkout({gift})) + await expect(paypalPayments.checkout({ gift })) .to.eventually.be.rejected.and.to.eql({ httpCode: 400, message: 'Amount must be at least 1.', @@ -80,10 +80,10 @@ describe('checkout', () => { }); it('should error if the user cannot get gems', async () => { - let user = new User(); + const user = new User(); sinon.stub(user, 'canGetGems').resolves(false); - await expect(paypalPayments.checkout({user})).to.eventually.be.rejected.and.to.eql({ + await expect(paypalPayments.checkout({ user })).to.eventually.be.rejected.and.to.eql({ httpCode: 401, message: i18n.t('groupPolicyCannotGetGems'), name: 'NotAuthorized', @@ -91,9 +91,9 @@ describe('checkout', () => { }); it('creates a link for gifting gems', async () => { - let receivingUser = new User(); + const receivingUser = new User(); await receivingUser.save(); - let gift = { + const gift = { type: 'gems', uuid: receivingUser._id, gems: { @@ -101,7 +101,7 @@ describe('checkout', () => { }, }; - let link = await paypalPayments.checkout({gift}); + const link = await paypalPayments.checkout({ gift }); expect(paypalPaymentCreateStub).to.be.calledOnce; expect(paypalPaymentCreateStub).to.be.calledWith(getPaypalCreateOptions('Habitica Gems (Gift)', '4.00')); @@ -109,9 +109,9 @@ describe('checkout', () => { }); it('creates a link for gifting a subscription', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); - let gift = { + const gift = { type: 'subscription', subscription: { key: subKey, @@ -119,7 +119,7 @@ describe('checkout', () => { }, }; - let link = await paypalPayments.checkout({gift}); + const link = await paypalPayments.checkout({ gift }); expect(paypalPaymentCreateStub).to.be.calledOnce; expect(paypalPaymentCreateStub).to.be.calledWith(getPaypalCreateOptions('mo. Habitica Subscription (Gift)', '15.00')); diff --git a/test/api/unit/libs/payments/paypal/ipn.test.js b/test/api/unit/libs/payments/paypal/ipn.test.js index 0fe6c8a455..31769ee593 100644 --- a/test/api/unit/libs/payments/paypal/ipn.test.js +++ b/test/api/unit/libs/payments/paypal/ipn.test.js @@ -3,13 +3,15 @@ import paypalPayments from '../../../../../../website/server/libs/payments/paypa import payments from '../../../../../../website/server/libs/payments/payments'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; describe('ipn', () => { const subKey = 'basic_3mo'; - let user, group, txn_type, userPaymentId, groupPaymentId; - let ipnVerifyAsyncStub, paymentCancelSubscriptionSpy; + let user; let group; let txn_type; let userPaymentId; let + groupPaymentId; + let ipnVerifyAsyncStub; let + paymentCancelSubscriptionSpy; beforeEach(async () => { txn_type = 'recurring_payment_profile_cancel'; @@ -38,16 +40,16 @@ describe('ipn', () => { paymentCancelSubscriptionSpy = sinon.stub(payments, 'cancelSubscription').resolves({}); }); - afterEach(function () { + afterEach(() => { paypalPayments.ipnVerifyAsync.restore(); payments.cancelSubscription.restore(); }); it('should cancel a user subscription', async () => { - await paypalPayments.ipn({txn_type, recurring_payment_id: userPaymentId}); + await paypalPayments.ipn({ txn_type, recurring_payment_id: userPaymentId }); expect(ipnVerifyAsyncStub).to.be.calledOnce; - expect(ipnVerifyAsyncStub).to.be.calledWith({txn_type, recurring_payment_id: userPaymentId}); + expect(ipnVerifyAsyncStub).to.be.calledWith({ txn_type, recurring_payment_id: userPaymentId }); expect(paymentCancelSubscriptionSpy).to.be.calledOnce; expect(paymentCancelSubscriptionSpy.args[0][0].user._id).to.eql(user._id); @@ -55,10 +57,10 @@ describe('ipn', () => { }); it('should cancel a group subscription', async () => { - await paypalPayments.ipn({txn_type, recurring_payment_id: groupPaymentId}); + await paypalPayments.ipn({ txn_type, recurring_payment_id: groupPaymentId }); expect(ipnVerifyAsyncStub).to.be.calledOnce; - expect(ipnVerifyAsyncStub).to.be.calledWith({txn_type, recurring_payment_id: groupPaymentId}); + expect(ipnVerifyAsyncStub).to.be.calledWith({ txn_type, recurring_payment_id: groupPaymentId }); expect(paymentCancelSubscriptionSpy).to.be.calledOnce; expect(paymentCancelSubscriptionSpy).to.be.calledWith({ groupId: group._id, paymentMethod: 'Paypal' }); diff --git a/test/api/unit/libs/payments/paypal/subscribe-cancel.test.js b/test/api/unit/libs/payments/paypal/subscribe-cancel.test.js index e0f195f0d2..f9d2f86979 100644 --- a/test/api/unit/libs/payments/paypal/subscribe-cancel.test.js +++ b/test/api/unit/libs/payments/paypal/subscribe-cancel.test.js @@ -3,17 +3,19 @@ import paypalPayments from '../../../../../../website/server/libs/payments/paypa import payments from '../../../../../../website/server/libs/payments/payments'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import common from '../../../../../../website/common'; import { createNonLeaderGroupMember } from '../paymentHelpers'; -const i18n = common.i18n; +const { i18n } = common; describe('subscribeCancel', () => { const subKey = 'basic_3mo'; - let user, group, groupId, customerId, groupCustomerId, nextBillingDate; - let paymentCancelSubscriptionSpy, paypalBillingAgreementCancelStub, paypalBillingAgreementGetStub; + let user; let group; let groupId; let customerId; let groupCustomerId; let + nextBillingDate; + let paymentCancelSubscriptionSpy; let paypalBillingAgreementCancelStub; let + paypalBillingAgreementGetStub; beforeEach(async () => { customerId = 'customer-id'; @@ -49,7 +51,7 @@ describe('subscribeCancel', () => { paymentCancelSubscriptionSpy = sinon.stub(payments, 'cancelSubscription').resolves({}); }); - afterEach(function () { + afterEach(() => { paypalPayments.paypalBillingAgreementGet.restore(); paypalPayments.paypalBillingAgreementCancel.restore(); payments.cancelSubscription.restore(); @@ -58,7 +60,7 @@ describe('subscribeCancel', () => { it('should throw an error if we are missing a subscription', async () => { user.purchased.plan.customerId = undefined; - await expect(paypalPayments.subscribeCancel({user})) + await expect(paypalPayments.subscribeCancel({ user })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -67,7 +69,7 @@ describe('subscribeCancel', () => { }); it('should throw an error if group is not found', async () => { - await expect(paypalPayments.subscribeCancel({user, groupId: 'fake-id'})) + await expect(paypalPayments.subscribeCancel({ user, groupId: 'fake-id' })) .to.eventually.be.rejected.and.to.eql({ httpCode: 404, name: 'NotFound', @@ -76,9 +78,9 @@ describe('subscribeCancel', () => { }); it('should throw an error if user is not group leader', async () => { - let nonLeader = await createNonLeaderGroupMember(group); + const nonLeader = await createNonLeaderGroupMember(group); - await expect(paypalPayments.subscribeCancel({user: nonLeader, groupId: group._id})) + await expect(paypalPayments.subscribeCancel({ user: nonLeader, groupId: group._id })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -87,7 +89,7 @@ describe('subscribeCancel', () => { }); it('should cancel a user subscription', async () => { - await paypalPayments.subscribeCancel({user}); + await paypalPayments.subscribeCancel({ user }); expect(paypalBillingAgreementGetStub).to.be.calledOnce; expect(paypalBillingAgreementGetStub).to.be.calledWith(customerId); @@ -105,7 +107,7 @@ describe('subscribeCancel', () => { }); it('should cancel a group subscription', async () => { - await paypalPayments.subscribeCancel({user, groupId: group._id}); + await paypalPayments.subscribeCancel({ user, groupId: group._id }); expect(paypalBillingAgreementGetStub).to.be.calledOnce; expect(paypalBillingAgreementGetStub).to.be.calledWith(groupCustomerId); diff --git a/test/api/unit/libs/payments/paypal/subscribe-success.test.js b/test/api/unit/libs/payments/paypal/subscribe-success.test.js index 6c2edbf73c..80a09ab7cb 100644 --- a/test/api/unit/libs/payments/paypal/subscribe-success.test.js +++ b/test/api/unit/libs/payments/paypal/subscribe-success.test.js @@ -3,14 +3,16 @@ import paypalPayments from '../../../../../../website/server/libs/payments/paypa import payments from '../../../../../../website/server/libs/payments/payments'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import common from '../../../../../../website/common'; describe('subscribeSuccess', () => { const subKey = 'basic_3mo'; - let user, group, block, groupId, token, headers, customerId; - let paypalBillingAgreementExecuteStub, paymentsCreateSubscritionStub; + let user; let group; let block; let groupId; let token; let headers; let + customerId; + let paypalBillingAgreementExecuteStub; let + paymentsCreateSubscritionStub; beforeEach(async () => { user = new User(); @@ -40,7 +42,9 @@ describe('subscribeSuccess', () => { }); it('creates a user subscription', async () => { - await paypalPayments.subscribeSuccess({user, block, groupId, token, headers}); + await paypalPayments.subscribeSuccess({ + user, block, groupId, token, headers, + }); expect(paypalBillingAgreementExecuteStub).to.be.calledOnce; expect(paypalBillingAgreementExecuteStub).to.be.calledWith(token, {}); @@ -59,7 +63,9 @@ describe('subscribeSuccess', () => { it('create a group subscription', async () => { groupId = group._id; - await paypalPayments.subscribeSuccess({user, block, groupId, token, headers}); + await paypalPayments.subscribeSuccess({ + user, block, groupId, token, headers, + }); expect(paypalBillingAgreementExecuteStub).to.be.calledOnce; expect(paypalBillingAgreementExecuteStub).to.be.calledWith(token, {}); diff --git a/test/api/unit/libs/payments/paypal/subscribe.test.js b/test/api/unit/libs/payments/paypal/subscribe.test.js index d167d7087d..23ad11c60c 100644 --- a/test/api/unit/libs/payments/paypal/subscribe.test.js +++ b/test/api/unit/libs/payments/paypal/subscribe.test.js @@ -6,16 +6,17 @@ import paypalPayments from '../../../../../../website/server/libs/payments/paypa import { model as Coupon } from '../../../../../../website/server/models/coupon'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('subscribe', () => { const subKey = 'basic_3mo'; - let coupon, sub, approvalHerf; + let coupon; let sub; let + approvalHerf; let paypalBillingAgreementCreateStub; beforeEach(() => { approvalHerf = 'approvalHerf-test'; - sub = Object.assign({}, common.content.subscriptionBlocks[subKey]); + sub = { ...common.content.subscriptionBlocks[subKey] }; paypalBillingAgreementCreateStub = sinon.stub(paypalPayments, 'paypalBillingAgreementCreate') .resolves({ @@ -30,7 +31,7 @@ describe('subscribe', () => { it('should throw an error when coupon code is missing', async () => { sub.discount = 40; - await expect(paypalPayments.subscribe({sub, coupon})) + await expect(paypalPayments.subscribe({ sub, coupon })) .to.eventually.be.rejected.and.to.eql({ httpCode: 400, name: 'BadRequest', @@ -43,13 +44,13 @@ describe('subscribe', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; await couponModel.save(); sinon.stub(cc, 'validate').returns('invalid'); - await expect(paypalPayments.subscribe({sub, coupon})) + await expect(paypalPayments.subscribe({ sub, coupon })) .to.eventually.be.rejected.and.to.eql({ httpCode: 401, name: 'NotAuthorized', @@ -63,17 +64,17 @@ describe('subscribe', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; - let updatedCouponModel = await couponModel.save(); + const updatedCouponModel = await couponModel.save(); sinon.stub(cc, 'validate').returns(updatedCouponModel._id); - let link = await paypalPayments.subscribe({sub, coupon}); + const link = await paypalPayments.subscribe({ sub, coupon }); expect(link).to.eql(approvalHerf); expect(paypalBillingAgreementCreateStub).to.be.calledOnce; - let billingPlanTitle = `Habitica Subscription ($${sub.price} every ${sub.months} months, recurring)`; + const billingPlanTitle = `Habitica Subscription ($${sub.price} every ${sub.months} months, recurring)`; expect(paypalBillingAgreementCreateStub).to.be.calledWith({ name: billingPlanTitle, description: billingPlanTitle, @@ -92,11 +93,11 @@ describe('subscribe', () => { it('creates a link for a subscription', async () => { delete sub.discount; - let link = await paypalPayments.subscribe({sub, coupon}); + const link = await paypalPayments.subscribe({ sub, coupon }); expect(link).to.eql(approvalHerf); expect(paypalBillingAgreementCreateStub).to.be.calledOnce; - let billingPlanTitle = `Habitica Subscription ($${sub.price} every ${sub.months} months, recurring)`; + const billingPlanTitle = `Habitica Subscription ($${sub.price} every ${sub.months} months, recurring)`; expect(paypalBillingAgreementCreateStub).to.be.calledWith({ name: billingPlanTitle, description: billingPlanTitle, diff --git a/test/api/unit/libs/payments/stripe/cancel-subscription.test.js b/test/api/unit/libs/payments/stripe/cancel-subscription.test.js index 64750dab8f..c392502f1d 100644 --- a/test/api/unit/libs/payments/stripe/cancel-subscription.test.js +++ b/test/api/unit/libs/payments/stripe/cancel-subscription.test.js @@ -2,18 +2,19 @@ import stripeModule from 'stripe'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('cancel subscription', () => { const subKey = 'basic_3mo'; const stripe = stripeModule('test'); - let user, groupId, group; + let user; let groupId; let + group; beforeEach(async () => { user = new User(); @@ -62,7 +63,7 @@ describe('cancel subscription', () => { }); it('throws an error if user is not the group leader', async () => { - let nonLeader = new User(); + const nonLeader = new User(); nonLeader.guilds.push(groupId); await nonLeader.save(); @@ -78,7 +79,9 @@ describe('cancel subscription', () => { }); describe('success', () => { - let stripeDeleteCustomerStub, paymentsCancelSubStub, stripeRetrieveStub, subscriptionId, currentPeriodEndTimeStamp; + let stripeDeleteCustomerStub; let paymentsCancelSubStub; + let stripeRetrieveStub; let subscriptionId; let + currentPeriodEndTimeStamp; beforeEach(() => { subscriptionId = 'subId'; @@ -89,7 +92,10 @@ describe('cancel subscription', () => { stripeRetrieveStub = sinon.stub(stripe.customers, 'retrieve') .resolves({ subscriptions: { - data: [{id: subscriptionId, current_period_end: currentPeriodEndTimeStamp}], // eslint-disable-line camelcase + data: [{ + id: subscriptionId, + current_period_end: currentPeriodEndTimeStamp, + }], // eslint-disable-line camelcase }, }); }); diff --git a/test/api/unit/libs/payments/stripe/checkout-subscription.test.js b/test/api/unit/libs/payments/stripe/checkout-subscription.test.js index 9a47d7fffe..cffb9a9d35 100644 --- a/test/api/unit/libs/payments/stripe/checkout-subscription.test.js +++ b/test/api/unit/libs/payments/stripe/checkout-subscription.test.js @@ -3,19 +3,22 @@ import cc from 'coupon-code'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import { model as Coupon } from '../../../../../../website/server/models/coupon'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('checkout with subscription', () => { const subKey = 'basic_3mo'; const stripe = stripeModule('test'); - let user, group, data, gift, sub, groupId, email, headers, coupon, customerIdResponse, subscriptionId, token; + let user; let group; let data; let gift; let sub; + let groupId; let email; let headers; let coupon; + let customerIdResponse; let subscriptionId; let + token; let spy; let stripeCreateCustomerSpy; let stripePaymentsCreateSubSpy; @@ -57,10 +60,10 @@ describe('checkout with subscription', () => { spy.resolves; stripeCreateCustomerSpy = sinon.stub(stripe.customers, 'create'); - let stripCustomerResponse = { + const stripCustomerResponse = { id: customerIdResponse, subscriptions: { - data: [{id: subscriptionId}], + data: [{ id: subscriptionId }], }, }; stripeCreateCustomerSpy.resolves(stripCustomerResponse); @@ -72,7 +75,7 @@ describe('checkout with subscription', () => { data.sub.quantity = 3; }); - afterEach(function () { + afterEach(() => { stripe.subscriptions.update.restore(); stripe.customers.create.restore(); payments.createSubscription.restore(); @@ -120,7 +123,7 @@ describe('checkout with subscription', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; await couponModel.save(); @@ -149,9 +152,9 @@ describe('checkout with subscription', () => { sub.key = 'google_6mo'; coupon = 'example-coupon'; - let couponModel = new Coupon(); + const couponModel = new Coupon(); couponModel.event = 'google_6mo'; - let updatedCouponModel = await couponModel.save(); + const updatedCouponModel = await couponModel.save(); sinon.stub(cc, 'validate').returns(updatedCouponModel._id); diff --git a/test/api/unit/libs/payments/stripe/checkout.test.js b/test/api/unit/libs/payments/stripe/checkout.test.js index 37a89e4e70..72585007ad 100644 --- a/test/api/unit/libs/payments/stripe/checkout.test.js +++ b/test/api/unit/libs/payments/stripe/checkout.test.js @@ -5,13 +5,15 @@ import stripePayments from '../../../../../../website/server/libs/payments/strip import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('checkout', () => { const subKey = 'basic_3mo'; const stripe = stripeModule('test'); - let stripeChargeStub, paymentBuyGemsStub, paymentCreateSubscritionStub; - let user, gift, groupId, email, headers, coupon, customerIdResponse, token; + let stripeChargeStub; let paymentBuyGemsStub; let + paymentCreateSubscritionStub; + let user; let gift; let groupId; let email; let headers; let coupon; let customerIdResponse; let + token; beforeEach(() => { user = new User(); @@ -23,7 +25,7 @@ describe('checkout', () => { token = 'test-token'; customerIdResponse = 'example-customerIdResponse'; - let stripCustomerResponse = { + const stripCustomerResponse = { id: customerIdResponse, }; stripeChargeStub = sinon.stub(stripe.charges, 'create').resolves(stripCustomerResponse); @@ -54,7 +56,7 @@ describe('checkout', () => { }); it('should error if gem amount is too low', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); gift = { type: 'gems', @@ -132,7 +134,7 @@ describe('checkout', () => { }); it('should gift gems', async () => { - let receivingUser = new User(); + const receivingUser = new User(); await receivingUser.save(); gift = { type: 'gems', @@ -169,7 +171,7 @@ describe('checkout', () => { }); it('should gift a subscription', async () => { - let receivingUser = new User(); + const receivingUser = new User(); receivingUser.save(); gift = { type: 'subscription', diff --git a/test/api/unit/libs/payments/stripe/edit-subscription.test.js b/test/api/unit/libs/payments/stripe/edit-subscription.test.js index b7a2ec6ecd..1db3a86b17 100644 --- a/test/api/unit/libs/payments/stripe/edit-subscription.test.js +++ b/test/api/unit/libs/payments/stripe/edit-subscription.test.js @@ -2,17 +2,18 @@ import stripeModule from 'stripe'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; import common from '../../../../../../website/common'; -const i18n = common.i18n; +const { i18n } = common; describe('edit subscription', () => { const subKey = 'basic_3mo'; const stripe = stripeModule('test'); - let user, groupId, group, token; + let user; let groupId; let group; let + token; beforeEach(async () => { user = new User(); @@ -76,7 +77,7 @@ describe('edit subscription', () => { }); it('throws an error if user is not the group leader', async () => { - let nonLeader = new User(); + const nonLeader = new User(); nonLeader.guilds.push(groupId); await nonLeader.save(); @@ -93,13 +94,14 @@ describe('edit subscription', () => { }); describe('success', () => { - let stripeListSubscriptionStub, stripeUpdateSubscriptionStub, subscriptionId; + let stripeListSubscriptionStub; let stripeUpdateSubscriptionStub; let + subscriptionId; beforeEach(() => { subscriptionId = 'subId'; stripeListSubscriptionStub = sinon.stub(stripe.subscriptions, 'list') .resolves({ - data: [{id: subscriptionId}], + data: [{ id: subscriptionId }], }); stripeUpdateSubscriptionStub = sinon.stub(stripe.subscriptions, 'update').resolves({}); @@ -118,11 +120,13 @@ describe('edit subscription', () => { }, stripe); expect(stripeListSubscriptionStub).to.be.calledOnce; - expect(stripeListSubscriptionStub).to.be.calledWith({customer: user.purchased.plan.customerId}); + expect(stripeListSubscriptionStub).to.be.calledWith({ + customer: user.purchased.plan.customerId, + }); expect(stripeUpdateSubscriptionStub).to.be.calledOnce; expect(stripeUpdateSubscriptionStub).to.be.calledWith( subscriptionId, - { card: token } + { card: token }, ); }); @@ -134,11 +138,13 @@ describe('edit subscription', () => { }, stripe); expect(stripeListSubscriptionStub).to.be.calledOnce; - expect(stripeListSubscriptionStub).to.be.calledWith({customer: group.purchased.plan.customerId}); + expect(stripeListSubscriptionStub).to.be.calledWith({ + customer: group.purchased.plan.customerId, + }); expect(stripeUpdateSubscriptionStub).to.be.calledOnce; expect(stripeUpdateSubscriptionStub).to.be.calledWith( subscriptionId, - { card: token } + { card: token }, ); }); }); diff --git a/test/api/unit/libs/payments/stripe/handle-webhook.test.js b/test/api/unit/libs/payments/stripe/handle-webhook.test.js index dd7d60be85..9be8121773 100644 --- a/test/api/unit/libs/payments/stripe/handle-webhook.test.js +++ b/test/api/unit/libs/payments/stripe/handle-webhook.test.js @@ -1,25 +1,25 @@ import stripeModule from 'stripe'; +import { v4 as uuid } from 'uuid'; +import moment from 'moment'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; import payments from '../../../../../../website/server/libs/payments/payments'; import common from '../../../../../../website/common'; import logger from '../../../../../../website/server/libs/logger'; -import { v4 as uuid } from 'uuid'; -import moment from 'moment'; -const i18n = common.i18n; +const { i18n } = common; describe('Stripe - Webhooks', () => { const stripe = stripeModule('test'); describe('all events', () => { const eventType = 'account.updated'; - const event = {id: 123}; - const eventRetrieved = {type: eventType}; + const event = { id: 123 }; + const eventRetrieved = { type: eventType }; beforeEach(() => { sinon.stub(stripe.events, 'retrieve').resolves(eventRetrieved); @@ -33,7 +33,7 @@ describe('Stripe - Webhooks', () => { it('logs an error if an unsupported webhook event is passed', async () => { const error = new Error(`Missing handler for Stripe webhook ${eventType}`); - await stripePayments.handleWebhooks({requestBody: event}, stripe); + await stripePayments.handleWebhooks({ requestBody: event }, stripe); expect(logger.error).to.have.been.calledOnce; const calledWith = logger.error.getCall(0).args; @@ -42,7 +42,7 @@ describe('Stripe - Webhooks', () => { }); it('retrieves and validates the event from Stripe', async () => { - await stripePayments.handleWebhooks({requestBody: event}, stripe); + await stripePayments.handleWebhooks({ requestBody: event }, stripe); expect(stripe.events.retrieve).to.have.been.calledOnce; expect(stripe.events.retrieve).to.have.been.calledWith(event.id); }); @@ -68,7 +68,7 @@ describe('Stripe - Webhooks', () => { request: 123, }); - await stripePayments.handleWebhooks({requestBody: {}}, stripe); + await stripePayments.handleWebhooks({ requestBody: {} }, stripe); expect(stripe.events.retrieve).to.have.been.calledOnce; expect(stripe.customers.del).to.not.have.been.called; @@ -93,11 +93,12 @@ describe('Stripe - Webhooks', () => { request: null, }); - await expect(stripePayments.handleWebhooks({requestBody: {}}, stripe)).to.eventually.be.rejectedWith({ - message: i18n.t('userNotFound'), - httpCode: 404, - name: 'NotFound', - }); + await expect(stripePayments.handleWebhooks({ requestBody: {} }, stripe)) + .to.eventually.be.rejectedWith({ + message: i18n.t('userNotFound'), + httpCode: 404, + name: 'NotFound', + }); expect(stripe.customers.del).to.not.have.been.called; expect(payments.cancelSubscription).to.not.have.been.called; @@ -108,7 +109,7 @@ describe('Stripe - Webhooks', () => { it('deletes the customer on Stripe and calls payments.cancelSubscription', async () => { const customerId = '456'; - let subscriber = new User(); + const subscriber = new User(); subscriber.purchased.plan.customerId = customerId; subscriber.purchased.plan.paymentMethod = 'Stripe'; await subscriber.save(); @@ -127,13 +128,13 @@ describe('Stripe - Webhooks', () => { request: null, }); - await stripePayments.handleWebhooks({requestBody: {}}, stripe); + await stripePayments.handleWebhooks({ requestBody: {} }, stripe); expect(stripe.customers.del).to.have.been.calledOnce; expect(stripe.customers.del).to.have.been.calledWith(customerId); expect(payments.cancelSubscription).to.have.been.calledOnce; - let cancelSubscriptionOpts = payments.cancelSubscription.lastCall.args[0]; + const cancelSubscriptionOpts = payments.cancelSubscription.lastCall.args[0]; expect(cancelSubscriptionOpts.user._id).to.equal(subscriber._id); expect(cancelSubscriptionOpts.paymentMethod).to.equal('Stripe'); expect(Math.round(moment(cancelSubscriptionOpts.nextBill).diff(new Date(), 'days', true))).to.equal(3); @@ -160,11 +161,12 @@ describe('Stripe - Webhooks', () => { request: null, }); - await expect(stripePayments.handleWebhooks({requestBody: {}}, stripe)).to.eventually.be.rejectedWith({ - message: i18n.t('groupNotFound'), - httpCode: 404, - name: 'NotFound', - }); + await expect(stripePayments.handleWebhooks({ requestBody: {} }, stripe)) + .to.eventually.be.rejectedWith({ + message: i18n.t('groupNotFound'), + httpCode: 404, + name: 'NotFound', + }); expect(stripe.customers.del).to.not.have.been.called; expect(payments.cancelSubscription).to.not.have.been.called; @@ -175,7 +177,7 @@ describe('Stripe - Webhooks', () => { it('throws an error if the group leader is not found', async () => { const customerId = 456; - let subscriber = generateGroup({ + const subscriber = generateGroup({ name: 'test group', type: 'guild', privacy: 'public', @@ -199,11 +201,12 @@ describe('Stripe - Webhooks', () => { request: null, }); - await expect(stripePayments.handleWebhooks({requestBody: {}}, stripe)).to.eventually.be.rejectedWith({ - message: i18n.t('userNotFound'), - httpCode: 404, - name: 'NotFound', - }); + await expect(stripePayments.handleWebhooks({ requestBody: {} }, stripe)) + .to.eventually.be.rejectedWith({ + message: i18n.t('userNotFound'), + httpCode: 404, + name: 'NotFound', + }); expect(stripe.customers.del).to.not.have.been.called; expect(payments.cancelSubscription).to.not.have.been.called; @@ -214,10 +217,10 @@ describe('Stripe - Webhooks', () => { it('deletes the customer on Stripe and calls payments.cancelSubscription', async () => { const customerId = '456'; - let leader = new User(); + const leader = new User(); await leader.save(); - let subscriber = generateGroup({ + const subscriber = generateGroup({ name: 'test group', type: 'guild', privacy: 'public', @@ -241,13 +244,13 @@ describe('Stripe - Webhooks', () => { request: null, }); - await stripePayments.handleWebhooks({requestBody: {}}, stripe); + await stripePayments.handleWebhooks({ requestBody: {} }, stripe); expect(stripe.customers.del).to.have.been.calledOnce; expect(stripe.customers.del).to.have.been.calledWith(customerId); expect(payments.cancelSubscription).to.have.been.calledOnce; - let cancelSubscriptionOpts = payments.cancelSubscription.lastCall.args[0]; + const cancelSubscriptionOpts = payments.cancelSubscription.lastCall.args[0]; expect(cancelSubscriptionOpts.user._id).to.equal(leader._id); expect(cancelSubscriptionOpts.paymentMethod).to.equal('Stripe'); expect(Math.round(moment(cancelSubscriptionOpts.nextBill).diff(new Date(), 'days', true))).to.equal(3); diff --git a/test/api/unit/libs/payments/stripe/upgrade-group-plan.test.js b/test/api/unit/libs/payments/stripe/upgrade-group-plan.test.js index 38b6e6f979..a1ce194cae 100644 --- a/test/api/unit/libs/payments/stripe/upgrade-group-plan.test.js +++ b/test/api/unit/libs/payments/stripe/upgrade-group-plan.test.js @@ -2,7 +2,7 @@ import stripeModule from 'stripe'; import { generateGroup, -} from '../../../../../helpers/api-unit.helper.js'; +} from '../../../../../helpers/api-unit.helper'; import { model as User } from '../../../../../../website/server/models/user'; import { model as Group } from '../../../../../../website/server/models/group'; import stripePayments from '../../../../../../website/server/libs/payments/stripe'; @@ -10,9 +10,10 @@ import payments from '../../../../../../website/server/libs/payments/payments'; describe('Stripe - Upgrade Group Plan', () => { const stripe = stripeModule('test'); - let spy, data, user, group; + let spy; let data; let user; let + group; - beforeEach(async function () { + beforeEach(async () => { user = new User(); user.profile.name = 'sender'; @@ -44,7 +45,7 @@ describe('Stripe - Upgrade Group Plan', () => { stripePayments.setStripeApi(stripe); }); - afterEach(function () { + afterEach(() => { stripe.subscriptions.update.restore(); }); @@ -52,7 +53,7 @@ describe('Stripe - Upgrade Group Plan', () => { data.paymentMethod = 'Stripe'; await payments.createSubscription(data); - let updatedGroup = await Group.findById(group._id).exec(); + const updatedGroup = await Group.findById(group._id).exec(); expect(updatedGroup.purchased.plan.quantity).to.eql(3); updatedGroup.memberCount += 1; diff --git a/test/api/unit/libs/preening.test.js b/test/api/unit/libs/preening.test.js index 9f5dacbf14..c2448c5df9 100644 --- a/test/api/unit/libs/preening.test.js +++ b/test/api/unit/libs/preening.test.js @@ -1,7 +1,7 @@ -import { preenHistory } from '../../../../website/server/libs/preening'; import moment from 'moment'; import sinon from 'sinon'; // eslint-disable-line no-shadow -import { generateHistory } from '../../../helpers/api-unit.helper.js'; +import { preenHistory } from '../../../../website/server/libs/preening'; +import { generateHistory } from '../../../helpers/api-unit.helper'; describe('preenHistory', () => { let clock; @@ -13,47 +13,47 @@ describe('preenHistory', () => { toFake: ['Date'], }); }); - afterEach(() => { - return clock.restore(); - }); + afterEach(() => clock.restore()); it('does not modify history if all entries are more recent than cutoff (free users)', () => { - let h = generateHistory(60); + const h = generateHistory(60); expect(preenHistory(_.cloneDeep(h), false, 0)).to.eql(h); }); it('does not modify history if all entries are more recent than cutoff (subscribers)', () => { - let h = generateHistory(365); + const h = generateHistory(365); expect(preenHistory(_.cloneDeep(h), true, 0)).to.eql(h); }); it('does aggregate data in monthly entries before cutoff (free users)', () => { - let h = generateHistory(81); // Jumps to July - let preened = preenHistory(_.cloneDeep(h), false, 0); + const h = generateHistory(81); // Jumps to July + const preened = preenHistory(_.cloneDeep(h), false, 0); expect(preened.length).to.eql(62); // Keeps 60 days + 2 entries per august and july }); it('does aggregate data in monthly entries before cutoff (subscribers)', () => { - let h = generateHistory(396); // Jumps to September 2012 - let preened = preenHistory(_.cloneDeep(h), true, 0); + const h = generateHistory(396); // Jumps to September 2012 + const preened = preenHistory(_.cloneDeep(h), true, 0); expect(preened.length).to.eql(367); // Keeps 365 days + 2 entries per october and september }); it('does aggregate data in monthly and yearly entries before cutoff (free users)', () => { - let h = generateHistory(731); // Jumps to October 21 2012 - let preened = preenHistory(_.cloneDeep(h), false, 0); - expect(preened.length).to.eql(73); // Keeps 60 days + 11 montly entries and 2 yearly entry for 2011 and 2012 + const h = generateHistory(731); // Jumps to October 21 2012 + const preened = preenHistory(_.cloneDeep(h), false, 0); + // Keeps 60 days + 11 montly entries and 2 yearly entry for 2011 and 2012 + expect(preened.length).to.eql(73); }); it('does aggregate data in monthly and yearly entries before cutoff (subscribers)', () => { - let h = generateHistory(1031); // Jumps to October 21 2012 - let preened = preenHistory(_.cloneDeep(h), true, 0); - expect(preened.length).to.eql(380); // Keeps 365 days + 13 montly entries and 2 yearly entries for 2011 and 2010 + const h = generateHistory(1031); // Jumps to October 21 2012 + const preened = preenHistory(_.cloneDeep(h), true, 0); + // Keeps 365 days + 13 montly entries and 2 yearly entries for 2011 and 2010 + expect(preened.length).to.eql(380); }); it('correctly aggregates values', () => { - let h = generateHistory(63); // Compress last 3 days - let preened = preenHistory(_.cloneDeep(h), false, 0); + const h = generateHistory(63); // Compress last 3 days + const preened = preenHistory(_.cloneDeep(h), false, 0); expect(preened[0].value).to.eql((61 + 62 + 63) / 3); }); }); diff --git a/test/api/unit/libs/pushNotifications.js b/test/api/unit/libs/pushNotifications.js index 0967ba349d..ba09d4cdce 100644 --- a/test/api/unit/libs/pushNotifications.js +++ b/test/api/unit/libs/pushNotifications.js @@ -1,19 +1,19 @@ -import { model as User } from '../../../../website/server/models/user'; import requireAgain from 'require-again'; import apn from 'apn/mock'; import nconf from 'nconf'; import gcmLib from 'node-gcm'; // works with FCM notifications too +import { model as User } from '../../../../website/server/models/user'; describe('pushNotifications', () => { let user; let sendPushNotification; - let pathToPushNotifications = '../../../../website/server/libs/pushNotifications'; + const pathToPushNotifications = '../../../../website/server/libs/pushNotifications'; let fcmSendSpy; let apnSendSpy; - let identifier = 'identifier'; - let title = 'title'; - let message = 'message'; + const identifier = 'identifier'; + const title = 'title'; + const message = 'message'; beforeEach(() => { user = new User(); @@ -93,7 +93,7 @@ describe('pushNotifications', () => { regId: '123', }); - let details = { + const details = { identifier, title, message, diff --git a/test/api/unit/libs/setupNconf.test.js b/test/api/unit/libs/setupNconf.test.js index 33101e40af..81269915cd 100644 --- a/test/api/unit/libs/setupNconf.test.js +++ b/test/api/unit/libs/setupNconf.test.js @@ -1,7 +1,7 @@ -import setupNconf from '../../../../website/server/libs/setupNconf'; import path from 'path'; import nconf from 'nconf'; +import setupNconf from '../../../../website/server/libs/setupNconf'; describe('setupNconf', () => { beforeEach(() => { @@ -21,7 +21,7 @@ describe('setupNconf', () => { expect(nconf.env).to.be.calledOnce; expect(nconf.file).to.be.calledOnce; - let regexString = `\\${path.sep}config.json$`; + const regexString = `\\${path.sep}config.json$`; expect(nconf.file).to.be.calledWithMatch('user', new RegExp(regexString)); }); diff --git a/test/api/unit/libs/slack.js b/test/api/unit/libs/slack.js index 4b6acdf695..c1615804c2 100644 --- a/test/api/unit/libs/slack.js +++ b/test/api/unit/libs/slack.js @@ -1,11 +1,11 @@ /* eslint-disable camelcase */ import { IncomingWebhook } from '@slack/client'; import requireAgain from 'require-again'; -import slack from '../../../../website/server/libs/slack'; -import logger from '../../../../website/server/libs/logger'; -import { TAVERN_ID } from '../../../../website/server/models/group'; import nconf from 'nconf'; import moment from 'moment'; +import * as slack from '../../../../website/server/libs/slack'; +import logger from '../../../../website/server/libs/logger'; +import { TAVERN_ID } from '../../../../website/server/models/group'; describe('slack', () => { describe('sendFlagNotification', () => { @@ -113,7 +113,7 @@ describe('slack', () => { it('noops if no flagging url is provided', () => { sandbox.stub(nconf, 'get').withArgs('SLACK_FLAGGING_URL').returns(''); sandbox.stub(logger, 'error'); - let reRequiredSlack = requireAgain('../../../../website/server/libs/slack'); + const reRequiredSlack = requireAgain('../../../../website/server/libs/slack'); expect(logger.error).to.be.calledOnce; diff --git a/test/api/unit/libs/taskManager.js b/test/api/unit/libs/taskManager.js index 57c6f3957f..c6c54dc012 100644 --- a/test/api/unit/libs/taskManager.js +++ b/test/api/unit/libs/taskManager.js @@ -9,11 +9,12 @@ import { generateUser, generateGroup, generateChallenge, -} from '../../../helpers/api-unit.helper.js'; +} from '../../../helpers/api-unit.helper'; describe('taskManager', () => { - let user, group, challenge; - let testHabit = { + let user; let group; let + challenge; + const testHabit = { text: 'test habit', type: 'habit', up: false, @@ -47,8 +48,8 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - let newTasks = await createTasks(req, res, {user}); - let newTask = newTasks[0]; + const newTasks = await createTasks(req, res, { user }); + const newTask = newTasks[0]; expect(newTask.text).to.equal(testHabit.text); expect(newTask.type).to.equal(testHabit.type); @@ -61,15 +62,15 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - await createTasks(req, res, {user}); + await createTasks(req, res, { user }); req.body = {}; req.query = { type: 'habits', }; - let tasks = await getTasks(req, res, {user}); - let task = tasks[0]; + const tasks = await getTasks(req, res, { user }); + const task = tasks[0]; expect(task.text).to.equal(testHabit.text); expect(task.type).to.equal(testHabit.type); @@ -82,8 +83,8 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - let newTasks = await createTasks(req, res, {user, group}); - let newTask = newTasks[0]; + const newTasks = await createTasks(req, res, { user, group }); + const newTask = newTasks[0]; expect(newTask.text).to.equal(testHabit.text); expect(newTask.type).to.equal(testHabit.type); @@ -97,15 +98,15 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - await createTasks(req, res, {user, group}); + await createTasks(req, res, { user, group }); req.body = {}; req.query = { type: 'habits', }; - let tasks = await getTasks(req, res, {user, group}); - let task = tasks[0]; + const tasks = await getTasks(req, res, { user, group }); + const task = tasks[0]; expect(task.text).to.equal(testHabit.text); expect(task.type).to.equal(testHabit.type); @@ -119,8 +120,8 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - let newTasks = await createTasks(req, res, {user, challenge}); - let newTask = newTasks[0]; + const newTasks = await createTasks(req, res, { user, challenge }); + const newTask = newTasks[0]; expect(newTask.text).to.equal(testHabit.text); expect(newTask.type).to.equal(testHabit.type); @@ -134,15 +135,15 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - await createTasks(req, res, {user, challenge}); + await createTasks(req, res, { user, challenge }); req.body = {}; req.query = { type: 'habits', }; - let tasks = await getTasks(req, res, {user, challenge}); - let task = tasks[0]; + const tasks = await getTasks(req, res, { user, challenge }); + const task = tasks[0]; expect(task.text).to.equal(testHabit.text); expect(task.type).to.equal(testHabit.type); @@ -156,9 +157,9 @@ describe('taskManager', () => { req.body = testHabit; res.t = i18n.t; - let tasks = await createTasks(req, res, {user, challenge}); + const tasks = await createTasks(req, res, { user, challenge }); - let syncableTask = syncableAttrs(tasks[0]); + const syncableTask = syncableAttrs(tasks[0]); expect(syncableTask._id).to.not.exist; expect(syncableTask.userId).to.not.exist; @@ -172,7 +173,7 @@ describe('taskManager', () => { }); it('moves tasks to a specified position', async () => { - let order = ['task-id-1', 'task-id-2']; + const order = ['task-id-1', 'task-id-2']; moveTask(order, 'task-id-2', 0); @@ -180,7 +181,7 @@ describe('taskManager', () => { }); it('moves tasks to a specified position out of length', async () => { - let order = ['task-id-1']; + const order = ['task-id-1']; moveTask(order, 'task-id-2', 2); diff --git a/test/api/unit/libs/webhooks.test.js b/test/api/unit/libs/webhooks.test.js index d1bc9c52ff..761eda713b 100644 --- a/test/api/unit/libs/webhooks.test.js +++ b/test/api/unit/libs/webhooks.test.js @@ -12,11 +12,13 @@ import { } from '../../../../website/server/models/user'; import { generateUser, -} from '../../../helpers/api-unit.helper.js'; -import { defer } from '../../../helpers/api-unit.helper'; + defer, +} from '../../../helpers/api-unit.helper'; + describe('webhooks', () => { - let webhooks, user; + let webhooks; let + user; beforeEach(() => { sandbox.stub(got, 'post').returns(defer().promise); @@ -72,7 +74,7 @@ describe('webhooks', () => { describe('WebhookSender', () => { it('creates a new WebhookSender object', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); @@ -82,13 +84,15 @@ describe('webhooks', () => { it('provides default function for data transformation', () => { sandbox.spy(WebhookSender, 'defaultTransformData'); - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(WebhookSender.defaultTransformData).to.be.calledOnce; @@ -100,14 +104,16 @@ describe('webhooks', () => { }); it('adds default data (user and webhookType) to the body', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); sandbox.spy(sendWebhook, 'attachDefaultData'); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(sendWebhook.attachDefaultData).to.be.calledOnce; @@ -118,25 +124,27 @@ describe('webhooks', () => { expect(body).to.eql({ foo: 'bar', - user: {_id: user._id}, + user: { _id: user._id }, webhookType: 'custom', }); }); it('can pass in a data transformation function', () => { sandbox.spy(WebhookSender, 'defaultTransformData'); - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', transformData (data) { - let dataToSend = Object.assign({baz: 'biz'}, data); + const dataToSend = { baz: 'biz', ...data }; return dataToSend; }, }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(WebhookSender.defaultTransformData).to.not.be.called; @@ -152,13 +160,15 @@ describe('webhooks', () => { it('provides a default filter function', () => { sandbox.spy(WebhookSender, 'defaultWebhookFilter'); - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(WebhookSender.defaultWebhookFilter).to.be.calledOnce; @@ -166,16 +176,18 @@ describe('webhooks', () => { it('can pass in a webhook filter function', () => { sandbox.spy(WebhookSender, 'defaultWebhookFilter'); - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', webhookFilter (hook) { return hook.url !== 'http://custom-url.com'; }, }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(WebhookSender.defaultWebhookFilter).to.not.be.called; @@ -184,18 +196,22 @@ describe('webhooks', () => { it('can pass in a webhook filter function that filters on data', () => { sandbox.spy(WebhookSender, 'defaultWebhookFilter'); - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', webhookFilter (hook, data) { return hook.options.foo === data.foo; }, }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; user.webhooks = [ - { id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', options: { foo: 'bar' }}, - { id: 'other-custom-webhook', url: 'http://other-custom-url.com', enabled: true, type: 'custom', options: { foo: 'foo' }}, + { + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', options: { foo: 'bar' }, + }, + { + id: 'other-custom-webhook', url: 'http://other-custom-url.com', enabled: true, type: 'custom', options: { foo: 'foo' }, + }, ]; sendWebhook.send(user, body); @@ -204,41 +220,49 @@ describe('webhooks', () => { }); it('ignores disabled webhooks', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'http://custom-url.com', enabled: false, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'http://custom-url.com', enabled: false, type: 'custom', + }]; sendWebhook.send(user, body); expect(got.post).to.not.be.called; }); it('ignores webhooks with invalid urls', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; - user.webhooks = [{id: 'custom-webhook', url: 'httxp://custom-url!!!', enabled: true, type: 'custom'}]; + user.webhooks = [{ + id: 'custom-webhook', url: 'httxp://custom-url!!!', enabled: true, type: 'custom', + }]; sendWebhook.send(user, body); expect(got.post).to.not.be.called; }); it('ignores webhooks of other types', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; user.webhooks = [ - { id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}, - { id: 'other-webhook', url: 'http://other-url.com', enabled: true, type: 'other'}, + { + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }, + { + id: 'other-webhook', url: 'http://other-url.com', enabled: true, type: 'other', + }, ]; sendWebhook.send(user, body); @@ -250,14 +274,16 @@ describe('webhooks', () => { }); it('sends every type of activity to global webhooks', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; user.webhooks = [ - { id: 'global-webhook', url: 'http://custom-url.com', enabled: true, type: 'globalActivity'}, + { + id: 'global-webhook', url: 'http://custom-url.com', enabled: true, type: 'globalActivity', + }, ]; sendWebhook.send(user, body); @@ -269,15 +295,19 @@ describe('webhooks', () => { }); it('sends multiple webhooks of the same type', () => { - let sendWebhook = new WebhookSender({ + const sendWebhook = new WebhookSender({ type: 'custom', }); - let body = { foo: 'bar' }; + const body = { foo: 'bar' }; user.webhooks = [ - { id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom'}, - { id: 'other-custom-webhook', url: 'http://other-url.com', enabled: true, type: 'custom'}, + { + id: 'custom-webhook', url: 'http://custom-url.com', enabled: true, type: 'custom', + }, + { + id: 'other-custom-webhook', url: 'http://other-url.com', enabled: true, type: 'custom', + }, ]; sendWebhook.send(user, body); @@ -299,7 +329,7 @@ describe('webhooks', () => { beforeEach(() => { data = { user: { - _tmp: {foo: 'bar'}, + _tmp: { foo: 'bar' }, stats: { lvl: 5, int: 10, @@ -317,11 +347,12 @@ describe('webhooks', () => { delta: 176, }; - let mockStats = Object.assign({ + const mockStats = { maxHealth: 50, maxMP: 103, toNextLevel: 40, - }, data.user.stats); + ...data.user.stats, + }; delete mockStats.toJSON; sandbox.stub(User, 'addComputedStatsToJSONObj').returns(mockStats); @@ -338,7 +369,7 @@ describe('webhooks', () => { webhookType: 'taskActivity', user: { _id: user._id, - _tmp: {foo: 'bar'}, + _tmp: { foo: 'bar' }, stats: { lvl: 5, int: 10, @@ -376,7 +407,7 @@ describe('webhooks', () => { webhookType: 'taskActivity', user: { _id: user._id, - _tmp: {foo: 'bar'}, + _tmp: { foo: 'bar' }, stats: { lvl: 5, int: 10, @@ -416,7 +447,7 @@ describe('webhooks', () => { }; }); - ['created', 'updated', 'deleted'].forEach((type) => { + ['created', 'updated', 'deleted'].forEach(type => { it(`sends ${type} tasks`, () => { data.type = type; @@ -498,7 +529,7 @@ describe('webhooks', () => { }; }); - ['petHatched', 'mountRaised', 'leveledUp'].forEach((type) => { + ['petHatched', 'mountRaised', 'leveledUp'].forEach(type => { it(`sends ${type} webhooks`, () => { data.type = type; @@ -545,7 +576,7 @@ describe('webhooks', () => { }; }); - ['questStarted', 'questFinised'].forEach((type) => { + ['questStarted', 'questFinised'].forEach(type => { it(`sends ${type} webhooks`, () => { data.type = type; @@ -584,7 +615,7 @@ describe('webhooks', () => { describe('groupChatReceivedWebhook', () => { it('sends chat data', () => { - let data = { + const data = { group: { id: 'group-id', name: 'some group', @@ -619,7 +650,7 @@ describe('webhooks', () => { }); it('does not send chat data for group if not selected', () => { - let data = { + const data = { group: { id: 'not-group-id', name: 'some group', diff --git a/test/api/unit/middlewares/analytics.test.js b/test/api/unit/middlewares/analytics.test.js index dce6bab20d..32b88d00b8 100644 --- a/test/api/unit/middlewares/analytics.test.js +++ b/test/api/unit/middlewares/analytics.test.js @@ -1,16 +1,17 @@ /* eslint-disable global-require */ +import nconf from 'nconf'; +import requireAgain from 'require-again'; import { generateRes, generateReq, generateNext, } from '../../../helpers/api-unit.helper'; -import analyticsService from '../../../../website/server/libs/analyticsService'; -import nconf from 'nconf'; -import requireAgain from 'require-again'; +import * as analyticsService from '../../../../website/server/libs/analyticsService'; describe('analytics middleware', () => { - let res, req, next; - let pathToAnalyticsMiddleware = '../../../../website/server/middlewares/analytics'; + let res; let req; let + next; + const pathToAnalyticsMiddleware = '../../../../website/server/middlewares/analytics'; beforeEach(() => { res = generateRes(); @@ -19,7 +20,7 @@ describe('analytics middleware', () => { }); it('attaches analytics object res.locals', () => { - let attachAnalytics = requireAgain(pathToAnalyticsMiddleware); + const attachAnalytics = requireAgain(pathToAnalyticsMiddleware).default; attachAnalytics(req, res, next); @@ -28,7 +29,7 @@ describe('analytics middleware', () => { it('attaches stubbed methods for non-prod environments', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(false); - let attachAnalytics = requireAgain(pathToAnalyticsMiddleware); + const attachAnalytics = requireAgain(pathToAnalyticsMiddleware).default; attachAnalytics(req, res, next); @@ -39,7 +40,7 @@ describe('analytics middleware', () => { it('attaches real methods for prod environments', () => { sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); - let attachAnalytics = requireAgain(pathToAnalyticsMiddleware); + const attachAnalytics = requireAgain(pathToAnalyticsMiddleware).default; attachAnalytics(req, res, next); diff --git a/test/api/unit/middlewares/auth.test.js b/test/api/unit/middlewares/auth.test.js index 830af9be04..f4a9324189 100644 --- a/test/api/unit/middlewares/auth.test.js +++ b/test/api/unit/middlewares/auth.test.js @@ -5,7 +5,8 @@ import { import { authWithHeaders as authWithHeadersFactory } from '../../../../website/server/middlewares/auth'; describe('auth middleware', () => { - let res, req, user; + let res; let req; let + user; beforeEach(async () => { res = generateRes(); @@ -14,7 +15,7 @@ describe('auth middleware', () => { }); describe('auth with headers', () => { - it('allows to specify a list of user field that we do not want to load', (done) => { + it('allows to specify a list of user field that we do not want to load', done => { const authWithHeaders = authWithHeadersFactory({ userFieldsToExclude: ['items'], }); @@ -22,18 +23,18 @@ describe('auth middleware', () => { req.headers['x-api-user'] = user._id; req.headers['x-api-key'] = user.apiToken; - authWithHeaders(req, res, (err) => { + authWithHeaders(req, res, err => { if (err) return done(err); const userToJSON = res.locals.user.toJSON(); expect(userToJSON.items).to.not.exist; expect(userToJSON.auth).to.exist; - done(); + return done(); }); }); - it('makes sure some fields are always included', (done) => { + it('makes sure some fields are always included', done => { const authWithHeaders = authWithHeadersFactory({ userFieldsToExclude: [ 'items', 'auth.timestamps', @@ -44,7 +45,7 @@ describe('auth middleware', () => { req.headers['x-api-user'] = user._id; req.headers['x-api-key'] = user.apiToken; - authWithHeaders(req, res, (err) => { + authWithHeaders(req, res, err => { if (err) return done(err); const userToJSON = res.locals.user.toJSON(); @@ -56,7 +57,7 @@ describe('auth middleware', () => { expect(userToJSON._id).to.exist; expect(userToJSON.flags).to.exist; - done(); + return done(); }); }); }); diff --git a/test/api/unit/middlewares/cors.test.js b/test/api/unit/middlewares/cors.test.js index 1d5b111dd4..9b2c568bf1 100644 --- a/test/api/unit/middlewares/cors.test.js +++ b/test/api/unit/middlewares/cors.test.js @@ -7,7 +7,8 @@ import { import cors from '../../../../website/server/middlewares/cors'; describe('cors middleware', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { req = generateReq(); diff --git a/test/api/unit/middlewares/cronMiddleware.js b/test/api/unit/middlewares/cronMiddleware.js index 28d4135e25..bd93b06e65 100644 --- a/test/api/unit/middlewares/cronMiddleware.js +++ b/test/api/unit/middlewares/cronMiddleware.js @@ -1,3 +1,5 @@ +import moment from 'moment'; +import { v4 as generateUUID } from 'uuid'; import { generateRes, generateReq, @@ -5,22 +7,21 @@ import { generateDaily, } from '../../../helpers/api-unit.helper'; import cronMiddleware from '../../../../website/server/middlewares/cron'; -import moment from 'moment'; import { model as User } from '../../../../website/server/models/user'; import { model as Group } from '../../../../website/server/models/group'; import * as Tasks from '../../../../website/server/models/task'; -import analyticsService from '../../../../website/server/libs/analyticsService'; +import * as analyticsService from '../../../../website/server/libs/analyticsService'; import * as cronLib from '../../../../website/server/libs/cron'; -import { v4 as generateUUID } from 'uuid'; const CRON_TIMEOUT_WAIT = new Date(60 * 60 * 1000).getTime(); const CRON_TIMEOUT_UNIT = new Date(60 * 1000).getTime(); describe('cron middleware', () => { - let res, req; + let res; let + req; let user; - beforeEach((done) => { + beforeEach(done => { res = generateRes(); req = generateReq(); user = new User({ @@ -48,33 +49,35 @@ describe('cron middleware', () => { sandbox.restore(); }); - it('calls next when user is not attached', (done) => { + it('calls next when user is not attached', done => { res.locals.user = null; cronMiddleware(req, res, done); }); - it('calls next when days have not been missed', (done) => { + it('calls next when days have not been missed', done => { cronMiddleware(req, res, done); }); it('should clear todos older than 30 days for free users', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); - let task = generateTodo(user); - task.dateCompleted = moment(new Date()).subtract({days: 31}); + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const task = generateTodo(user); + task.dateCompleted = moment(new Date()).subtract({ days: 31 }); task.completed = true; await task.save(); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - Tasks.Task.findOne({_id: task}, function (secondErr, taskFound) { + Tasks.Task.findOne({ _id: task }, (secondErr, taskFound) => { if (secondErr) return reject(err); expect(secondErr).to.not.exist; expect(taskFound).to.not.exist; - resolve(); + return resolve(); }); + + return null; }); }); }); @@ -82,22 +85,23 @@ describe('cron middleware', () => { it('should not clear todos older than 30 days for subscribed users', async () => { user.purchased.plan.customerId = 'subscribedId'; user.purchased.plan.dateUpdated = moment('012013', 'MMYYYY'); - user.lastCron = moment(new Date()).subtract({days: 2}); - let task = generateTodo(user); - task.dateCompleted = moment(new Date()).subtract({days: 31}); + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const task = generateTodo(user); + task.dateCompleted = moment(new Date()).subtract({ days: 31 }); task.completed = true; await task.save(); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - Tasks.Task.findOne({_id: task}, function (secondErr, taskFound) { + Tasks.Task.findOne({ _id: task }, (secondErr, taskFound) => { if (secondErr) return reject(secondErr); expect(secondErr).to.not.exist; expect(taskFound).to.exist; - resolve(); + return resolve(); }); + return null; }); }); }); @@ -105,105 +109,106 @@ describe('cron middleware', () => { it('should clear todos older than 90 days for subscribed users', async () => { user.purchased.plan.customerId = 'subscribedId'; user.purchased.plan.dateUpdated = moment('012013', 'MMYYYY'); - user.lastCron = moment(new Date()).subtract({days: 2}); + user.lastCron = moment(new Date()).subtract({ days: 2 }); - let task = generateTodo(user); - task.dateCompleted = moment(new Date()).subtract({days: 91}); + const task = generateTodo(user); + task.dateCompleted = moment(new Date()).subtract({ days: 91 }); task.completed = true; await task.save(); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - Tasks.Task.findOne({_id: task}, function (secondErr, taskFound) { + Tasks.Task.findOne({ _id: task }, (secondErr, taskFound) => { if (secondErr) return reject(secondErr); expect(secondErr).to.not.exist; expect(taskFound).to.not.exist; - resolve(); + return resolve(); }); + return null; }); }); }); it('should call next if user was not modified after cron', async () => { - let hpBefore = user.stats.hp; - user.lastCron = moment(new Date()).subtract({days: 2}); + const hpBefore = user.stats.hp; + user.lastCron = moment(new Date()).subtract({ days: 2 }); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); expect(hpBefore).to.equal(user.stats.hp); - resolve(); + return resolve(); }); }); }); it('updates user.auth.timestamps.loggedin and lastCron', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); - let now = new Date(); + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const now = new Date(); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); expect(moment(now).isSame(user.lastCron, 'day')); expect(moment(now).isSame(user.auth.timestamps.loggedin, 'day')); - resolve(); + return resolve(); }); }); }); it('does damage for missing dailies', async () => { - let hpBefore = user.stats.hp; - user.lastCron = moment(new Date()).subtract({days: 2}); - let daily = generateDaily(user); - daily.startDate = moment(new Date()).subtract({days: 2}); + const hpBefore = user.stats.hp; + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const daily = generateDaily(user); + daily.startDate = moment(new Date()).subtract({ days: 2 }); await daily.save(); await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - User.findOne({_id: user._id}, function (secondErr, updatedUser) { + return User.findOne({ _id: user._id }, (secondErr, updatedUser) => { if (secondErr) return reject(secondErr); expect(updatedUser.stats.hp).to.be.lessThan(hpBefore); - resolve(); + return resolve(); }); }); }); }); it('updates tasks', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); - let todo = generateTodo(user); - let todoValueBefore = todo.value; + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const todo = generateTodo(user); + const todoValueBefore = todo.value; await Promise.all([todo.save(), user.save()]); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - Tasks.Task.findOne({_id: todo._id}, function (secondErr, todoFound) { + return Tasks.Task.findOne({ _id: todo._id }, (secondErr, todoFound) => { if (secondErr) return reject(secondErr); expect(todoFound.value).to.be.lessThan(todoValueBefore); - resolve(); + return resolve(); }); }); }); }); it('applies quest progress', async () => { - let hpBefore = user.stats.hp; - user.lastCron = moment(new Date()).subtract({days: 2}); - let daily = generateDaily(user); - daily.startDate = moment(new Date()).subtract({days: 2}); + const hpBefore = user.stats.hp; + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const daily = generateDaily(user); + daily.startDate = moment(new Date()).subtract({ days: 2 }); await daily.save(); - let questKey = 'dilatory'; + const questKey = 'dilatory'; user.party.quest.key = questKey; - let party = new Group({ + const party = new Group({ type: 'party', name: generateUUID(), leader: user._id, @@ -218,22 +223,22 @@ describe('cron middleware', () => { party.startQuest(user); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); - User.findOne({_id: user._id}, function (secondErr, updatedUser) { + return User.findOne({ _id: user._id }, (secondErr, updatedUser) => { if (secondErr) return reject(secondErr); expect(updatedUser.stats.hp).to.be.lessThan(hpBefore); - resolve(); + return resolve(); }); }); }); }); it('recovers from failed cron and does not error when user is already cronning', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); + user.lastCron = moment(new Date()).subtract({ days: 2 }); await user.save(); - let updatedUser = user.toObject(); + const updatedUser = user.toObject(); updatedUser.nMatched = 0; sandbox.spy(cronLib, 'recoverCron'); @@ -242,8 +247,8 @@ describe('cron middleware', () => { .withArgs({ _id: user._id, $or: [ - {_cronSignature: 'NOT_RUNNING'}, - {_cronSignature: {$lt: sinon.match.number}}, + { _cronSignature: 'NOT_RUNNING' }, + { _cronSignature: { $lt: sinon.match.number } }, ], }) .returns({ @@ -253,18 +258,18 @@ describe('cron middleware', () => { }); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); expect(cronLib.recoverCron).to.be.calledOnce; - resolve(); + return resolve(); }); }); }); it('cronSignature less than an hour ago should error', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); - let now = new Date(); + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const now = new Date(); await User.update({ _id: user._id, }, { @@ -273,20 +278,20 @@ describe('cron middleware', () => { }, }).exec(); await user.save(); - let expectedErrMessage = `Impossible to recover from cron for user ${user._id}.`; + const expectedErrMessage = `Impossible to recover from cron for user ${user._id}.`; await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (!err) return reject(new Error('Cron should have failed.')); expect(err.message).to.be.equal(expectedErrMessage); - resolve(); + return resolve(); }); }); }); it('cronSignature longer than an hour ago should allow cron', async () => { - user.lastCron = moment(new Date()).subtract({days: 2}); - let now = new Date(); + user.lastCron = moment(new Date()).subtract({ days: 2 }); + const now = new Date(); await User.update({ _id: user._id, }, { @@ -297,11 +302,11 @@ describe('cron middleware', () => { await user.save(); await new Promise((resolve, reject) => { - cronMiddleware(req, res, (err) => { + cronMiddleware(req, res, err => { if (err) return reject(err); expect(moment(now).isSame(user.auth.timestamps.loggedin, 'day')); expect(user._cronSignature).to.be.equal('NOT_RUNNING'); - resolve(); + return resolve(); }); }); }); diff --git a/test/api/unit/middlewares/ensureAccessRight.test.js b/test/api/unit/middlewares/ensureAccessRight.test.js index 1938546c9c..30eb84b333 100644 --- a/test/api/unit/middlewares/ensureAccessRight.test.js +++ b/test/api/unit/middlewares/ensureAccessRight.test.js @@ -10,7 +10,8 @@ import { NotAuthorized } from '../../../../website/server/libs/errors'; import apiError from '../../../../website/server/libs/apiError'; describe('ensure access middlewares', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { res = generateRes(); @@ -20,7 +21,7 @@ describe('ensure access middlewares', () => { context('ensure admin', () => { it('returns not authorized when user is not an admin', () => { - res.locals = {user: {contributor: {admin: false}}}; + res.locals = { user: { contributor: { admin: false } } }; ensureAdmin(req, res, next); @@ -30,7 +31,7 @@ describe('ensure access middlewares', () => { }); it('passes when user is an admin', () => { - res.locals = {user: {contributor: {admin: true}}}; + res.locals = { user: { contributor: { admin: true } } }; ensureAdmin(req, res, next); @@ -41,7 +42,7 @@ describe('ensure access middlewares', () => { context('ensure sudo', () => { it('returns not authorized when user is not a sudo user', () => { - res.locals = {user: {contributor: {sudo: false}}}; + res.locals = { user: { contributor: { sudo: false } } }; ensureSudo(req, res, next); @@ -51,7 +52,7 @@ describe('ensure access middlewares', () => { }); it('passes when user is a sudo user', () => { - res.locals = {user: {contributor: {sudo: true}}}; + res.locals = { user: { contributor: { sudo: true } } }; ensureSudo(req, res, next); diff --git a/test/api/unit/middlewares/ensureDevelpmentMode.js b/test/api/unit/middlewares/ensureDevelpmentMode.js index 0e1140c961..39bbb2fe6f 100644 --- a/test/api/unit/middlewares/ensureDevelpmentMode.js +++ b/test/api/unit/middlewares/ensureDevelpmentMode.js @@ -1,4 +1,5 @@ /* eslint-disable global-require */ +import nconf from 'nconf'; import { generateRes, generateReq, @@ -6,10 +7,10 @@ import { } from '../../../helpers/api-unit.helper'; import ensureDevelpmentMode from '../../../../website/server/middlewares/ensureDevelpmentMode'; import { NotFound } from '../../../../website/server/libs/errors'; -import nconf from 'nconf'; describe('developmentMode middleware', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { res = generateRes(); diff --git a/test/api/unit/middlewares/errorHandler.test.js b/test/api/unit/middlewares/errorHandler.test.js index 7611b2c418..ba7c5998a5 100644 --- a/test/api/unit/middlewares/errorHandler.test.js +++ b/test/api/unit/middlewares/errorHandler.test.js @@ -15,7 +15,8 @@ import { BadRequest } from '../../../../website/server/libs/errors'; import logger from '../../../../website/server/libs/logger'; describe('errorHandler', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { res = generateRes(); @@ -29,7 +30,7 @@ describe('errorHandler', () => { }); it('sends internal server error if error is not a CustomError and is not identified', () => { - let error = new Error(); + const error = new Error(); errorHandler(error, req, res, next); @@ -45,7 +46,7 @@ describe('errorHandler', () => { }); it('identifies errors with statusCode property and format them correctly', () => { - let error = new Error('Error message'); + const error = new Error('Error message'); error.statusCode = 400; errorHandler(error, req, res, next); @@ -62,7 +63,7 @@ describe('errorHandler', () => { }); it('doesn\'t leak info about 500 errors', () => { - let error = new Error('Some secret error message'); + const error = new Error('Some secret error message'); error.statusCode = 500; errorHandler(error, req, res, next); @@ -79,7 +80,7 @@ describe('errorHandler', () => { }); it('sends CustomError', () => { - let error = new BadRequest(); + const error = new BadRequest(); errorHandler(error, req, res, next); @@ -95,7 +96,7 @@ describe('errorHandler', () => { }); it('handle http-errors errors', () => { - let error = new Error('custom message'); + const error = new Error('custom message'); error.statusCode = 422; errorHandler(error, req, res, next); @@ -112,7 +113,7 @@ describe('errorHandler', () => { }); it('handle express-validator errors', () => { - let error = [{param: 'param', msg: 'invalid param', value: 123}]; + const error = [{ param: 'param', msg: 'invalid param', value: 123 }]; errorHandler(error, req, res, next); @@ -131,7 +132,7 @@ describe('errorHandler', () => { }); it('handle Mongoose Validation errors', () => { - let error = new Error('User validation failed'); + const error = new Error('User validation failed'); error.name = 'ValidationError'; error.errors = { @@ -159,7 +160,7 @@ describe('errorHandler', () => { }); it('logs error', () => { - let error = new BadRequest(); + const error = new BadRequest(); errorHandler(error, req, res, next); diff --git a/test/api/unit/middlewares/language.test.js b/test/api/unit/middlewares/language.test.js index 8c93bc2b5e..4965da9a49 100644 --- a/test/api/unit/middlewares/language.test.js +++ b/test/api/unit/middlewares/language.test.js @@ -10,11 +10,12 @@ import { import common from '../../../../website/common'; import { model as User } from '../../../../website/server/models/user'; -const i18n = common.i18n; +const { i18n } = common; describe('language middleware', () => { describe('res.t', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { res = generateRes(); @@ -46,9 +47,10 @@ describe('language middleware', () => { }); describe('getUserLanguage', () => { - let res, req, next; + let res; let req; let + next; - let checkResT = (resToCheck) => { + const checkResT = resToCheck => { expect(resToCheck.t).to.be.a('function'); expect(resToCheck.t('help')).to.equal(i18n.t('help', req.language)); }; @@ -119,7 +121,7 @@ describe('language middleware', () => { checkResT(res); }); - it('falls back to english if the user preferred language is not avalaible', (done) => { + it('falls back to english if the user preferred language is not avalaible', done => { req.locals = { user: { preferences: { @@ -155,7 +157,7 @@ describe('language middleware', () => { }); context('request with session', () => { - it('uses the user preferred language if avalaible', (done) => { + it('uses the user preferred language if avalaible', done => { sandbox.stub(User, 'findOne').returns({ lean () { return this; @@ -182,7 +184,7 @@ describe('language middleware', () => { }); context('browser fallback', () => { - it('uses browser specificed language', (done) => { + it('uses browser specificed language', done => { req.headers['accept-language'] = 'pt'; getUserLanguage(req, res, () => { @@ -192,7 +194,7 @@ describe('language middleware', () => { }); }); - it('uses first language in series if browser specifies multiple', (done) => { + it('uses first language in series if browser specifies multiple', done => { req.headers['accept-language'] = 'he, pt, it'; getUserLanguage(req, res, () => { @@ -202,7 +204,7 @@ describe('language middleware', () => { }); }); - it('skips invalid lanaguages and uses first language in series if browser specifies multiple', (done) => { + it('skips invalid lanaguages and uses first language in series if browser specifies multiple', done => { req.headers['accept-language'] = 'blah, he, pt, it'; getUserLanguage(req, res, () => { @@ -212,7 +214,7 @@ describe('language middleware', () => { }); }); - it('uses normal version of language if specialized locale is passed in', (done) => { + it('uses normal version of language if specialized locale is passed in', done => { req.headers['accept-language'] = 'fr-CA'; getUserLanguage(req, res, () => { @@ -222,7 +224,7 @@ describe('language middleware', () => { }); }); - it('uses normal version of language if specialized locale is passed in', (done) => { + it('uses normal version of language if specialized locale is passed in', done => { req.headers['accept-language'] = 'fr-CA'; getUserLanguage(req, res, () => { @@ -232,7 +234,7 @@ describe('language middleware', () => { }); }); - it('uses es if es is passed in', (done) => { + it('uses es if es is passed in', done => { req.headers['accept-language'] = 'es'; getUserLanguage(req, res, () => { @@ -242,7 +244,7 @@ describe('language middleware', () => { }); }); - it('uses es_419 if applicable es-languages are passed in', (done) => { + it('uses es_419 if applicable es-languages are passed in', done => { req.headers['accept-language'] = 'es-mx'; getUserLanguage(req, res, () => { @@ -252,7 +254,7 @@ describe('language middleware', () => { }); }); - it('uses es_419 if multiple es languages are passed in', (done) => { + it('uses es_419 if multiple es languages are passed in', done => { req.headers['accept-language'] = 'es-GT, es-MX, es-CR'; getUserLanguage(req, res, () => { @@ -262,7 +264,7 @@ describe('language middleware', () => { }); }); - it('zh', (done) => { + it('zh', done => { req.headers['accept-language'] = 'zh-TW'; getUserLanguage(req, res, () => { @@ -272,7 +274,7 @@ describe('language middleware', () => { }); }); - it('uses english if browser specified language is not compatible', (done) => { + it('uses english if browser specified language is not compatible', done => { req.headers['accept-language'] = 'blah'; getUserLanguage(req, res, () => { @@ -282,7 +284,7 @@ describe('language middleware', () => { }); }); - it('uses english if browser does not specify', (done) => { + it('uses english if browser does not specify', done => { req.headers['accept-language'] = ''; getUserLanguage(req, res, () => { @@ -292,7 +294,7 @@ describe('language middleware', () => { }); }); - it('uses english if browser does not supply an accept-language header', (done) => { + it('uses english if browser does not supply an accept-language header', done => { delete req.headers['accept-language']; getUserLanguage(req, res, () => { diff --git a/test/api/unit/middlewares/maintenanceMode.test.js b/test/api/unit/middlewares/maintenanceMode.test.js index df5736bd38..59b5185381 100644 --- a/test/api/unit/middlewares/maintenanceMode.test.js +++ b/test/api/unit/middlewares/maintenanceMode.test.js @@ -1,14 +1,15 @@ +import nconf from 'nconf'; +import requireAgain from 'require-again'; import { generateRes, generateReq, generateNext, } from '../../../helpers/api-unit.helper'; -import nconf from 'nconf'; -import requireAgain from 'require-again'; describe('maintenance mode middleware', () => { - let res, req, next; - let pathToMaintenanceModeMiddleware = '../../../../website/server/middlewares/maintenanceMode'; + let res; let req; let + next; + const pathToMaintenanceModeMiddleware = '../../../../website/server/middlewares/maintenanceMode'; beforeEach(() => { res = generateRes(); @@ -18,7 +19,7 @@ describe('maintenance mode middleware', () => { it('does not return 503 error when maintenance mode is off', () => { req = generateReq(); sandbox.stub(nconf, 'get').withArgs('MAINTENANCE_MODE').returns('false'); - let attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware); + const attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware).default; attachMaintenanceMode(req, res, next); @@ -29,7 +30,7 @@ describe('maintenance mode middleware', () => { it('returns 503 error when maintenance mode is on', () => { req = generateReq(); sandbox.stub(nconf, 'get').withArgs('MAINTENANCE_MODE').returns('true'); - let attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware); + const attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware).default; attachMaintenanceMode(req, res, next); @@ -39,18 +40,18 @@ describe('maintenance mode middleware', () => { }); it('renders maintenance page when request type is HTML', () => { - req = generateReq({headers: {accept: 'text/html'}}); + req = generateReq({ headers: { accept: 'text/html' } }); sandbox.stub(nconf, 'get').withArgs('MAINTENANCE_MODE').returns('true'); - let attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware); + const attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware).default; attachMaintenanceMode(req, res, next); expect(res.render).to.have.been.calledOnce; }); it('sends error message when request type is JSON', () => { - req = generateReq({headers: {accept: 'application/json'}}); + req = generateReq({ headers: { accept: 'application/json' } }); sandbox.stub(nconf, 'get').withArgs('MAINTENANCE_MODE').returns('true'); - let attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware); + const attachMaintenanceMode = requireAgain(pathToMaintenanceModeMiddleware).default; attachMaintenanceMode(req, res, next); expect(res.send).to.have.been.calledOnce; diff --git a/test/api/unit/middlewares/redirects.js b/test/api/unit/middlewares/redirects.js index fdbff0d879..2399717437 100644 --- a/test/api/unit/middlewares/redirects.js +++ b/test/api/unit/middlewares/redirects.js @@ -1,14 +1,15 @@ +import nconf from 'nconf'; +import requireAgain from 'require-again'; import { generateRes, generateReq, generateNext, } from '../../../helpers/api-unit.helper'; -import nconf from 'nconf'; -import requireAgain from 'require-again'; describe('redirects middleware', () => { - let res, req, next; - let pathToRedirectsMiddleware = '../../../../website/server/middlewares/redirects'; + let res; let req; let + next; + const pathToRedirectsMiddleware = '../../../../website/server/middlewares/redirects'; beforeEach(() => { res = generateRes(); @@ -18,13 +19,13 @@ describe('redirects middleware', () => { context('forceSSL', () => { it('sends http requests to https', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); req.header = sandbox.stub().withArgs('x-forwarded-proto').returns('http'); req.originalUrl = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceSSL(req, res, next); @@ -33,13 +34,13 @@ describe('redirects middleware', () => { }); it('does not redirect https forwarded requests', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); req.header = sandbox.stub().withArgs('x-forwarded-proto').returns('https'); req.originalUrl = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceSSL(req, res, next); @@ -47,13 +48,13 @@ describe('redirects middleware', () => { }); it('does not redirect outside of production environments', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(false); req.header = sandbox.stub().withArgs('x-forwarded-proto').returns('http'); req.originalUrl = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceSSL(req, res, next); @@ -61,13 +62,13 @@ describe('redirects middleware', () => { }); it('does not redirect if base URL is not https', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('http://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); req.header = sandbox.stub().withArgs('x-forwarded-proto').returns('http'); req.originalUrl = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceSSL(req, res, next); @@ -75,7 +76,7 @@ describe('redirects middleware', () => { }); it('does not redirect if passed skip ssl request param is passed with corrrect key', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); nconfStub.withArgs('SKIP_SSL_CHECK_KEY').returns('test-key'); @@ -91,7 +92,7 @@ describe('redirects middleware', () => { }); it('does redirect if skip ssl request param is passed with incorrrect key', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); nconfStub.withArgs('SKIP_SSL_CHECK_KEY').returns('test-key'); @@ -108,7 +109,7 @@ describe('redirects middleware', () => { }); it('does redirect if skip ssl check key is not set', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IS_PROD').returns(true); nconfStub.withArgs('SKIP_SSL_CHECK_KEY').returns(null); @@ -127,7 +128,7 @@ describe('redirects middleware', () => { context('forceHabitica', () => { it('sends requests with differing hostname to base URL host', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('false'); nconfStub.withArgs('IS_PROD').returns(true); @@ -136,7 +137,7 @@ describe('redirects middleware', () => { req.originalUrl = '/static/front'; req.url = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); @@ -145,7 +146,7 @@ describe('redirects middleware', () => { }); it('does not redirect outside of production environments', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('false'); nconfStub.withArgs('IS_PROD').returns(false); @@ -154,7 +155,7 @@ describe('redirects middleware', () => { req.originalUrl = '/static/front'; req.url = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); @@ -162,7 +163,7 @@ describe('redirects middleware', () => { }); it('does not redirect if env is set to ignore redirection', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('true'); nconfStub.withArgs('IS_PROD').returns(true); @@ -171,7 +172,7 @@ describe('redirects middleware', () => { req.originalUrl = '/static/front'; req.url = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); @@ -179,7 +180,7 @@ describe('redirects middleware', () => { }); it('does not redirect if request hostname matches base URL host', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('false'); nconfStub.withArgs('IS_PROD').returns(true); @@ -188,7 +189,7 @@ describe('redirects middleware', () => { req.originalUrl = '/static/front'; req.url = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); @@ -196,7 +197,7 @@ describe('redirects middleware', () => { }); it('does not redirect if request is an API URL', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('false'); nconfStub.withArgs('IS_PROD').returns(true); @@ -205,7 +206,7 @@ describe('redirects middleware', () => { req.originalUrl = '/api/v3/challenges'; req.url = '/api/v3/challenges'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); @@ -213,7 +214,7 @@ describe('redirects middleware', () => { }); it('does not redirect if request method is not GET', () => { - let nconfStub = sandbox.stub(nconf, 'get'); + const nconfStub = sandbox.stub(nconf, 'get'); nconfStub.withArgs('BASE_URL').returns('https://habitica.com'); nconfStub.withArgs('IGNORE_REDIRECT').returns('false'); nconfStub.withArgs('IS_PROD').returns(true); @@ -222,7 +223,7 @@ describe('redirects middleware', () => { req.originalUrl = '/static/front'; req.url = '/static/front'; - let attachRedirects = requireAgain(pathToRedirectsMiddleware); + const attachRedirects = requireAgain(pathToRedirectsMiddleware); attachRedirects.forceHabitica(req, res, next); diff --git a/test/api/unit/middlewares/response.js b/test/api/unit/middlewares/response.js index 2ffc8c6675..b8157287be 100644 --- a/test/api/unit/middlewares/response.js +++ b/test/api/unit/middlewares/response.js @@ -7,7 +7,8 @@ import responseMiddleware from '../../../../website/server/middlewares/response' import packageInfo from '../../../../package.json'; describe('response middleware', () => { - let res, req, next; + let res; let req; let + next; beforeEach(() => { res = generateRes(); @@ -24,7 +25,7 @@ describe('response middleware', () => { it('can be used to respond to requests', () => { responseMiddleware(req, res, next); - res.respond(200, {field: 1}); + res.respond(200, { field: 1 }); expect(res.status).to.be.calledOnce; expect(res.json).to.be.calledOnce; @@ -32,7 +33,7 @@ describe('response middleware', () => { expect(res.status).to.be.calledWith(200); expect(res.json).to.be.calledWith({ success: true, - data: {field: 1}, + data: { field: 1 }, notifications: [], userV: res.locals.user._v, appVersion: packageInfo.version, @@ -41,7 +42,7 @@ describe('response middleware', () => { it('can be passed a third parameter to be used as optional message', () => { responseMiddleware(req, res, next); - res.respond(200, {field: 1}, 'hello'); + res.respond(200, { field: 1 }, 'hello'); expect(res.status).to.be.calledOnce; expect(res.json).to.be.calledOnce; @@ -49,7 +50,7 @@ describe('response middleware', () => { expect(res.status).to.be.calledWith(200); expect(res.json).to.be.calledWith({ success: true, - data: {field: 1}, + data: { field: 1 }, message: 'hello', notifications: [], userV: res.locals.user._v, @@ -59,7 +60,7 @@ describe('response middleware', () => { it('treats status >= 400 as failures', () => { responseMiddleware(req, res, next); - res.respond(403, {field: 1}); + res.respond(403, { field: 1 }); expect(res.status).to.be.calledOnce; expect(res.json).to.be.calledOnce; @@ -67,7 +68,7 @@ describe('response middleware', () => { expect(res.status).to.be.calledWith(403); expect(res.json).to.be.calledWith({ success: false, - data: {field: 1}, + data: { field: 1 }, notifications: [], userV: res.locals.user._v, appVersion: packageInfo.version, @@ -76,13 +77,13 @@ describe('response middleware', () => { it('returns userV if a user is authenticated', () => { responseMiddleware(req, res, next); - res.respond(200, {field: 1}); + res.respond(200, { field: 1 }); expect(res.json).to.be.calledOnce; expect(res.json).to.be.calledWith({ success: true, - data: {field: 1}, + data: { field: 1 }, notifications: [], userV: 0, appVersion: packageInfo.version, @@ -90,24 +91,25 @@ describe('response middleware', () => { }); it('returns notifications if a user is authenticated', () => { - const user = res.locals.user; + const { user } = res.locals; user.notifications = [ null, // invalid, not an object - {seen: true}, // invalid, no type or id - {id: 123}, // invalid, no type - // {type: 'ABC'}, // invalid, no id, not included here because the id would be added automatically - {type: 'ABC', id: '123'}, // valid + { seen: true }, // invalid, no type or id + { id: 123 }, // invalid, no type + // invalid, no id, not included here because the id would be added automatically + // {type: 'ABC'}, + { type: 'ABC', id: '123' }, // valid ]; responseMiddleware(req, res, next); - res.respond(200, {field: 1}); + res.respond(200, { field: 1 }); expect(res.json).to.be.calledOnce; expect(res.json).to.be.calledWith({ success: true, - data: {field: 1}, + data: { field: 1 }, notifications: [ { type: 'ABC', diff --git a/test/api/unit/models/challenge.test.js b/test/api/unit/models/challenge.test.js index cb4b5562e5..f95908f298 100644 --- a/test/api/unit/models/challenge.test.js +++ b/test/api/unit/models/challenge.test.js @@ -1,13 +1,14 @@ +import { each, find } from 'lodash'; import { model as Challenge } from '../../../../website/server/models/challenge'; import { model as Group } from '../../../../website/server/models/group'; import { model as User } from '../../../../website/server/models/user'; import * as Tasks from '../../../../website/server/models/task'; -import common from '../../../../website/common/'; -import { each, find } from 'lodash'; +import common from '../../../../website/common'; describe('Challenge Model', () => { - let guild, leader, challenge, task; - let tasksToTest = { + let guild; let leader; let challenge; let + task; + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -74,11 +75,15 @@ describe('Challenge Model', () => { it('adds tasks to challenge and challenge members', async () => { await challenge.addTasks([task]); - const updatedLeader = await User.findOne({_id: leader._id}); - const updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - const syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) { - return updatedLeadersTask.type === taskValue.type && updatedLeadersTask.text === taskValue.text; - }); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => ( + updatedLeadersTask.type === taskValue.type + && updatedLeadersTask.text === taskValue.text + ), + ); expect(syncedTask).to.exist; expect(syncedTask.notes).to.eql(task.notes); @@ -88,18 +93,22 @@ describe('Challenge Model', () => { it('syncs a challenge to a user', async () => { await challenge.addTasks([task]); - let newMember = new User({ + const newMember = new User({ guilds: [guild._id], }); await newMember.save(); await challenge.syncToUser(newMember); - let updatedNewMember = await User.findById(newMember._id); - let updatedNewMemberTasks = await Tasks.Task.find({_id: { $in: updatedNewMember.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedNewMemberTasks, function findNewTask (updatedNewMemberTask) { - return updatedNewMemberTask.type === taskValue.type && updatedNewMemberTask.text === taskValue.text; - }); + const updatedNewMember = await User.findById(newMember._id); + const updatedNewMemberTasks = await Tasks.Task.find({ _id: { $in: updatedNewMember.tasksOrder[`${taskType}s`] } }); + const syncedTask = find( + updatedNewMemberTasks, + updatedNewMemberTask => ( + updatedNewMemberTask.type === taskValue.type + && updatedNewMemberTask.text === taskValue.text + ), + ); expect(updatedNewMember.challenges).to.contain(challenge._id); expect(updatedNewMember.tags[7].id).to.equal(challenge._id); @@ -111,30 +120,32 @@ describe('Challenge Model', () => { it('syncs a challenge to a user with the existing task', async () => { await challenge.addTasks([task]); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) { - return updatedLeadersTask.challenge.taskId === task._id; - }); + let updatedLeader = await User.findOne({ _id: leader._id }); + let updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + let syncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => updatedLeadersTask.challenge.taskId === task._id, + ); - let createdAtBefore = syncedTask.createdAt; - let attributeBefore = syncedTask.attribute; + const createdAtBefore = syncedTask.createdAt; + const attributeBefore = syncedTask.attribute; - let newTitle = 'newName'; + const newTitle = 'newName'; task.text = newTitle; task.attribute = 'int'; await task.save(); await challenge.syncToUser(leader); - updatedLeader = await User.findOne({_id: leader._id}); - updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); + updatedLeader = await User.findOne({ _id: leader._id }); + updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); - syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) { - return updatedLeadersTask.challenge.taskId === task._id; - }); + syncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => updatedLeadersTask.challenge.taskId === task._id, + ); - let createdAtAfter = syncedTask.createdAt; - let attributeAfter = syncedTask.attribute; + const createdAtAfter = syncedTask.createdAt; + const attributeAfter = syncedTask.attribute; expect(createdAtBefore).to.eql(createdAtAfter); expect(attributeBefore).to.eql(attributeAfter); @@ -142,10 +153,10 @@ describe('Challenge Model', () => { }); it('updates tasks to challenge and challenge members', async () => { - let updatedTaskName = 'Updated Test Habit'; + const updatedTaskName = 'Updated Test Habit'; await challenge.addTasks([task]); - let req = { + const req = { body: { text: updatedTaskName }, }; @@ -154,8 +165,8 @@ describe('Challenge Model', () => { await challenge.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder[`${taskType}s`][0]); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder[`${taskType}s`][0]); expect(updatedUserTask.text).to.equal(updatedTaskName); }); @@ -164,8 +175,8 @@ describe('Challenge Model', () => { await challenge.addTasks([task]); await challenge.removeTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findOne({_id: updatedLeader.tasksOrder[`${taskType}s`][0]}).exec(); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findOne({ _id: updatedLeader.tasksOrder[`${taskType}s`][0] }).exec(); expect(updatedUserTask.challenge.broken).to.equal('TASK_DELETED'); }); @@ -174,11 +185,15 @@ describe('Challenge Model', () => { await challenge.addTasks([task]); await challenge.unlinkTasks(leader, 'remove-all'); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) { - return updatedLeadersTask.type === taskValue.type && updatedLeadersTask.text === taskValue.text; - }); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => ( + updatedLeadersTask.type === taskValue.type + && updatedLeadersTask.text === taskValue.text + ), + ); expect(syncedTask).to.not.exist; }); @@ -187,11 +202,15 @@ describe('Challenge Model', () => { await challenge.addTasks([task]); await challenge.unlinkTasks(leader, 'keep-all'); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) { - return updatedLeadersTask.type === taskValue.type && updatedLeadersTask.text === taskValue.text; - }); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => ( + updatedLeadersTask.type === taskValue.type + && updatedLeadersTask.text === taskValue.text + ), + ); expect(syncedTask).to.exist; expect(syncedTask.challenge._id).to.be.undefined; @@ -212,8 +231,8 @@ describe('Challenge Model', () => { await challenge.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.habits[0]); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.habits[0]); expect(updatedUserTask.up).to.equal(true); expect(updatedUserTask.down).to.equal(false); @@ -229,8 +248,8 @@ describe('Challenge Model', () => { task.date = new Date(); await challenge.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.todos[0]); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.todos[0]); expect(updatedUserTask.date).to.exist; }); @@ -247,8 +266,8 @@ describe('Challenge Model', () => { }); await challenge.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.todos[0]); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.todos[0]); expect(updatedUserTask.checklist.toObject()).to.deep.equal([]); }); @@ -263,8 +282,8 @@ describe('Challenge Model', () => { task.everyX = 2; await challenge.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.dailys[0]); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedUserTask = await Tasks.Task.findById(updatedLeader.tasksOrder.dailys[0]); expect(updatedUserTask.everyX).to.eql(2); }); diff --git a/test/api/unit/models/group.test.js b/test/api/unit/models/group.test.js index 0a2b45b571..85557ba418 100644 --- a/test/api/unit/models/group.test.js +++ b/test/api/unit/models/group.test.js @@ -10,17 +10,19 @@ import { model as Group, } from '../../../../website/server/models/group'; import { model as User } from '../../../../website/server/models/user'; -import { quests as questScrolls } from '../../../../website/common/script/content'; +import { quests as questScrolls } from '../../../../website/common/script/content/quests'; import { groupChatReceivedWebhook, questActivityWebhook, } from '../../../../website/server/libs/webhook'; import * as email from '../../../../website/server/libs/email'; -import { TAVERN_ID } from '../../../../website/common/script/'; +import { TAVERN_ID } from '../../../../website/common/script/constants'; import shared from '../../../../website/common'; describe('Group Model', () => { - let party, questLeader, participatingMember, sleepingParticipatingMember, nonParticipatingMember, undecidedMember; + let party; let questLeader; let participatingMember; + let sleepingParticipatingMember; let nonParticipatingMember; let + undecidedMember; beforeEach(async () => { sandbox.stub(email, 'sendTxn'); @@ -32,7 +34,7 @@ describe('Group Model', () => { privacy: 'private', }); - let _progress = { + const _progress = { up: 10, down: 8, collectedItems: 5, @@ -132,13 +134,13 @@ describe('Group Model', () => { }); it('returns early if user is not in a party', async () => { - let userWithoutParty = new User(); + const userWithoutParty = new User(); await userWithoutParty.save(); await Group.processQuestProgress(userWithoutParty, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -150,7 +152,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -159,7 +161,7 @@ describe('Group Model', () => { it('returns early if user is not on quest', async () => { await Group.processQuestProgress(nonParticipatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -168,7 +170,7 @@ describe('Group Model', () => { it('returns early if user has made no progress', async () => { await Group.processQuestProgress(participatingMember, null); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -180,7 +182,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -194,7 +196,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype._processBossQuest).to.be.calledOnce; expect(party._processCollectionQuest).to.not.be.called; @@ -208,7 +210,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(Group.prototype._processCollectionQuest).to.be.calledOnce; @@ -222,7 +224,7 @@ describe('Group Model', () => { await Group.processQuestProgress(sleepingParticipatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -236,7 +238,7 @@ describe('Group Model', () => { await Group.processQuestProgress(sleepingParticipatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party._processBossQuest).to.not.be.called; expect(party._processCollectionQuest).to.not.be.called; @@ -260,7 +262,7 @@ describe('Group Model', () => { it('applies user\'s progress to quest boss hp', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.hp).to.eql(495); }); @@ -268,7 +270,7 @@ describe('Group Model', () => { it('sends a chat message about progress', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledOnce; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -286,9 +288,9 @@ describe('Group Model', () => { it('applies damage only to participating members of party', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -322,9 +324,9 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -350,7 +352,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledTwice; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -360,8 +362,8 @@ describe('Group Model', () => { }); it('calls finishQuest when boss has <= 0 hp', async () => { - let quest = questScrolls[party.quest.key]; - let finishQuest = sandbox.spy(Group.prototype, 'finishQuest'); + const quest = questScrolls[party.quest.key]; + const finishQuest = sandbox.spy(Group.prototype, 'finishQuest'); progress.up = 999; @@ -383,13 +385,13 @@ describe('Group Model', () => { it('applies down progress to boss rage', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.rage).to.eql(10); }); it('activates rage when progress.down triggers rage bar', async () => { - let quest = questScrolls[party.quest.key]; + const quest = questScrolls[party.quest.key]; progress.down = -999; party.quest.progress.hp = 300; @@ -397,7 +399,7 @@ describe('Group Model', () => { await party.save(); await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledWith({ message: quest.boss.rage.effect('en'), @@ -414,7 +416,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.hp).to.eql(500); }); @@ -434,23 +436,23 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.rage).to.eql(8); - let drainedUser = await User.findById(participatingMember._id); + const drainedUser = await User.findById(participatingMember._id); expect(drainedUser.stats.mp).to.eql(10); }); it('activates rage when progress.down triggers rage bar', async () => { - let quest = questScrolls[party.quest.key]; + const quest = questScrolls[party.quest.key]; progress.down = -999; await party.save(); await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledWith({ message: quest.boss.rage.effect('en'), @@ -458,7 +460,7 @@ describe('Group Model', () => { }); expect(party.quest.progress.rage).to.eql(0); - let drainedUser = await User.findById(participatingMember._id); + const drainedUser = await User.findById(participatingMember._id); expect(drainedUser.stats.mp).to.eql(0); }); }); @@ -481,7 +483,7 @@ describe('Group Model', () => { it('applies user\'s progress to found quest items', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.collect.soapBars).to.eq(5); }); @@ -495,7 +497,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.progress.collect.fireCoral).to.eq(20); }); @@ -503,7 +505,7 @@ describe('Group Model', () => { it('sends a chat message about progress', async () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledOnce; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -522,7 +524,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledOnce; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -547,7 +549,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledOnce; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -572,7 +574,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledOnce; expect(Group.prototype.sendChat).to.be.calledWithMatch({ @@ -590,7 +592,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(Group.prototype.sendChat).to.be.calledTwice; expect(Group.prototype.sendChat).to.be.calledWith({ @@ -600,8 +602,8 @@ describe('Group Model', () => { }); it('calls finishQuest when all items are found', async () => { - let quest = questScrolls[party.quest.key]; - let finishQuest = sandbox.spy(Group.prototype, 'finishQuest'); + const quest = questScrolls[party.quest.key]; + const finishQuest = sandbox.spy(Group.prototype, 'finishQuest'); progress.collectedItems = 999; @@ -616,7 +618,7 @@ describe('Group Model', () => { await Group.processQuestProgress(participatingMember, progress); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -659,7 +661,7 @@ describe('Group Model', () => { }); it('throws an error if only uuids are passed in, but they are not an array', async () => { - await expect(Group.validateInvitations({ uuids: 'user-id'}, res)).to.eventually.be.rejected.and.eql({ + await expect(Group.validateInvitations({ uuids: 'user-id' }, res)).to.eventually.be.rejected.and.eql({ httpCode: 400, message: 'Bad request.', name: 'BadRequest', @@ -669,7 +671,7 @@ describe('Group Model', () => { }); it('throws an error if only emails are passed in, but they are not an array', async () => { - await expect(Group.validateInvitations({emails: 'user@example.com'}, res)).to.eventually.be.rejected.and.eql({ + await expect(Group.validateInvitations({ emails: 'user@example.com' }, res)).to.eventually.be.rejected.and.eql({ httpCode: 400, message: 'Bad request.', name: 'BadRequest', @@ -679,91 +681,95 @@ describe('Group Model', () => { }); it('throws an error if emails are not passed in, and uuid array is empty', async () => { - await expect(Group.validateInvitations({uuids: []}, res)).to.eventually.be.rejected.and.eql({ - httpCode: 400, - message: 'Bad request.', - name: 'BadRequest', - }); + await expect(Group.validateInvitations({ uuids: [] }, res)) + .to.eventually.be.rejected.and.eql({ + httpCode: 400, + message: 'Bad request.', + name: 'BadRequest', + }); expect(res.t).to.be.calledOnce; expect(res.t).to.be.calledWith('inviteMustNotBeEmpty'); }); it('throws an error if uuids are not passed in, and email array is empty', async () => { - await expect(Group.validateInvitations({emails: []}, res)).to.eventually.be.rejected.and.eql({ - httpCode: 400, - message: 'Bad request.', - name: 'BadRequest', - }); + await expect(Group.validateInvitations({ emails: [] }, res)) + .to.eventually.be.rejected.and.eql({ + httpCode: 400, + message: 'Bad request.', + name: 'BadRequest', + }); expect(res.t).to.be.calledOnce; expect(res.t).to.be.calledWith('inviteMustNotBeEmpty'); }); it('throws an error if uuids and emails are passed in as empty arrays', async () => { - await expect(Group.validateInvitations({emails: [], uuids: []}, res)).to.eventually.be.rejected.and.eql({ - httpCode: 400, - message: 'Bad request.', - name: 'BadRequest', - }); + await expect(Group.validateInvitations({ emails: [], uuids: [] }, res)) + .to.eventually.be.rejected.and.eql({ + httpCode: 400, + message: 'Bad request.', + name: 'BadRequest', + }); expect(res.t).to.be.calledOnce; expect(res.t).to.be.calledWith('inviteMustNotBeEmpty'); }); it('throws an error if total invites exceed max invite constant', async () => { - let uuids = []; - let emails = []; + const uuids = []; + const emails = []; - for (let i = 0; i < INVITES_LIMIT / 2; i++) { + for (let i = 0; i < INVITES_LIMIT / 2; i += 1) { uuids.push(`user-id-${i}`); emails.push(`user-${i}@example.com`); } uuids.push('one-more-uuid'); // to put it over the limit - await expect(Group.validateInvitations({uuids, emails}, res)).to.eventually.be.rejected.and.eql({ - httpCode: 400, - message: 'Bad request.', - name: 'BadRequest', - }); + await expect(Group.validateInvitations({ uuids, emails }, res)) + .to.eventually.be.rejected.and.eql({ + httpCode: 400, + message: 'Bad request.', + name: 'BadRequest', + }); expect(res.t).to.be.calledOnce; - expect(res.t).to.be.calledWith('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT }); + expect(res.t).to.be.calledWith('canOnlyInviteMaxInvites', { maxInvites: INVITES_LIMIT }); }); it('does not throw error if number of invites matches max invite limit', async () => { - let uuids = []; - let emails = []; + const uuids = []; + const emails = []; - for (let i = 0; i < INVITES_LIMIT / 2; i++) { + for (let i = 0; i < INVITES_LIMIT / 2; i += 1) { uuids.push(`user-id-${i}`); emails.push(`user-${i}@example.com`); } - await Group.validateInvitations({uuids, emails}, res); + await Group.validateInvitations({ uuids, emails }, res); expect(res.t).to.not.be.called; }); it('does not throw an error if only user ids are passed in', async () => { - await Group.validateInvitations({uuids: ['user-id', 'user-id2']}, res); + await Group.validateInvitations({ uuids: ['user-id', 'user-id2'] }, res); expect(res.t).to.not.be.called; }); it('does not throw an error if only emails are passed in', async () => { - await Group.validateInvitations({emails: ['user1@example.com', 'user2@example.com']}, res); + await Group.validateInvitations({ emails: ['user1@example.com', 'user2@example.com'] }, res); expect(res.t).to.not.be.called; }); it('does not throw an error if both uuids and emails are passed in', async () => { - await Group.validateInvitations({uuids: ['user-id', 'user-id2'], emails: ['user1@example.com', 'user2@example.com']}, res); + await Group.validateInvitations({ uuids: ['user-id', 'user-id2'], emails: ['user1@example.com', 'user2@example.com'] }, res); expect(res.t).to.not.be.called; }); it('does not throw an error if uuids are passed in and emails are an empty array', async () => { - await Group.validateInvitations({uuids: ['user-id', 'user-id2'], emails: []}, res); + await Group.validateInvitations({ uuids: ['user-id', 'user-id2'], emails: [] }, res); expect(res.t).to.not.be.called; }); it('does not throw an error if emails are passed in and uuids are an empty array', async () => { - await Group.validateInvitations({uuids: [], emails: ['user1@example.com', 'user2@example.com']}, res); + await Group.validateInvitations({ uuids: [], emails: ['user1@example.com', 'user2@example.com'] }, res); expect(res.t).to.not.be.called; }); }); @@ -777,7 +783,7 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -792,7 +798,7 @@ describe('Group Model', () => { bossDamage: 3.7, }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -806,7 +812,7 @@ describe('Group Model', () => { userDamage: 15.3, }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -818,7 +824,7 @@ describe('Group Model', () => { quest: 'lostMasterclasser3', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -830,7 +836,7 @@ describe('Group Model', () => { quest: 'lostMasterclasser3', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -848,7 +854,7 @@ describe('Group Model', () => { }, }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -859,7 +865,7 @@ describe('Group Model', () => { type: 'all_items_found', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -873,7 +879,7 @@ describe('Group Model', () => { spell: 'earth', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -888,7 +894,7 @@ describe('Group Model', () => { target: participatingMember.profile.name, }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -901,7 +907,7 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -914,7 +920,7 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -926,7 +932,7 @@ describe('Group Model', () => { quest: 'stressbeast', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -938,7 +944,7 @@ describe('Group Model', () => { quest: 'stressbeast', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -951,7 +957,7 @@ describe('Group Model', () => { scene: 'market', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -963,7 +969,7 @@ describe('Group Model', () => { quest: 'stressbeast', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); @@ -976,7 +982,7 @@ describe('Group Model', () => { task: 'Feed the pet', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); translationCheck(toJSON.chat[0].text); }); }); @@ -990,7 +996,7 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); expect(toJSON.chat.length).to.equal(1); }); @@ -1002,8 +1008,8 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - const admin = new User({'contributor.admin': true}); - let toJSON = await Group.toJSONCleanChat(party, admin); + const admin = new User({ 'contributor.admin': true }); + const toJSON = await Group.toJSONCleanChat(party, admin); expect(toJSON.chat.length).to.equal(1); }); @@ -1015,7 +1021,7 @@ describe('Group Model', () => { quest: 'basilist', }, }]; - let toJSON = await Group.toJSONCleanChat(party, questLeader); + const toJSON = await Group.toJSONCleanChat(party, questLeader); expect(toJSON.chat.length).to.equal(0); }); }); @@ -1041,8 +1047,9 @@ describe('Group Model', () => { }); describe('#checkChatSpam', () => { - let testUser, testTime, tavern; - let testUserID = '1'; + let testUser; let testTime; let + tavern; + const testUserID = '1'; beforeEach(async () => { testTime = Date.now(); @@ -1059,32 +1066,33 @@ describe('Group Model', () => { }); function generateTestMessage (overrides = {}) { - return Object.assign({}, { + return { text: 'test message', uuid: testUserID, timestamp: testTime, - }, overrides); + ...overrides, + }; } it('group that is not the tavern returns false, while tavern returns true', async () => { - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { party.chat.push(generateTestMessage()); } expect(party.checkChatSpam(testUser)).to.eql(false); - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { tavern.chat.push(generateTestMessage()); } expect(tavern.checkChatSpam(testUser)).to.eql(true); }); it('high enough contributor returns false', async () => { - let highContributor = testUser; + const highContributor = testUser; highContributor.contributor = { level: SPAM_MIN_EXEMPT_CONTRIB_LEVEL, }; - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { tavern.chat.push(generateTestMessage()); } @@ -1097,17 +1105,17 @@ describe('Group Model', () => { }); it('user has not reached limit but another one has returns false', async () => { - let otherUserID = '2'; + const otherUserID = '2'; - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { - tavern.chat.push(generateTestMessage({uuid: otherUserID})); + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { + tavern.chat.push(generateTestMessage({ uuid: otherUserID })); } expect(tavern.checkChatSpam(testUser)).to.eql(false); }); it('user messages is less than the limit returns false', async () => { - for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i += 1) { tavern.chat.push(generateTestMessage()); } @@ -1115,17 +1123,17 @@ describe('Group Model', () => { }); it('user has reached the message limit outside of window returns false', async () => { - for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i += 1) { tavern.chat.push(generateTestMessage()); } - let earlierTimestamp = testTime - SPAM_WINDOW_LENGTH - 1; - tavern.chat.push(generateTestMessage({timestamp: earlierTimestamp})); + const earlierTimestamp = testTime - SPAM_WINDOW_LENGTH - 1; + tavern.chat.push(generateTestMessage({ timestamp: earlierTimestamp })); expect(tavern.checkChatSpam(testUser)).to.eql(false); }); it('user has posted too many messages in limit returns true', async () => { - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { tavern.chat.push(generateTestMessage()); } @@ -1147,7 +1155,7 @@ describe('Group Model', () => { await party.leave(participatingMember); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party.quest.members).to.eql({ [questLeader._id]: true, [sleepingParticipatingMember._id]: true, @@ -1163,7 +1171,7 @@ describe('Group Model', () => { await party.leave(nonParticipatingMember); await party.leave(undecidedMember); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party).to.not.exist; }); @@ -1178,7 +1186,7 @@ describe('Group Model', () => { message: shared.i18n.t('cannotDeleteActiveGroup'), }); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party).to.exist; expect(party.memberCount).to.eql(1); }); @@ -1194,19 +1202,19 @@ describe('Group Model', () => { message: shared.i18n.t('leaderCannotLeaveGroupWithActiveGroup'), }); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party).to.exist; expect(party.memberCount).to.eql(1); }); it('deletes a private group when the last member leaves and a subscription is cancelled', async () => { - let guild = new Group({ + const guild = new Group({ name: 'test guild', type: 'guild', memberCount: 1, }); - let leader = new User({ + const leader = new User({ guilds: [guild._id], }); @@ -1222,7 +1230,7 @@ describe('Group Model', () => { await guild.leave(leader); - party = await Group.findOne({_id: guild._id}); + party = await Group.findOne({ _id: guild._id }); expect(party).to.not.exist; }); @@ -1235,7 +1243,7 @@ describe('Group Model', () => { await party.leave(nonParticipatingMember); await party.leave(undecidedMember); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party).to.exist; }); @@ -1244,7 +1252,7 @@ describe('Group Model', () => { await party.leave(participatingMember); - party = await Group.findOne({_id: party._id}); + party = await Group.findOne({ _id: party._id }); expect(party).to.exist; }); @@ -1255,7 +1263,7 @@ describe('Group Model', () => { memberCount: 1, }); - let leader = new User({ + const leader = new User({ guilds: [guild._id], }); @@ -1268,7 +1276,7 @@ describe('Group Model', () => { await guild.leave(leader); - guild = await Group.findOne({_id: guild._id}); + guild = await Group.findOne({ _id: guild._id }); expect(guild).to.not.exist; }); @@ -1279,11 +1287,11 @@ describe('Group Model', () => { memberCount: 1, }); - let leader = new User({ + const leader = new User({ guilds: [guild._id], }); - let member = new User({ + const member = new User({ guilds: [guild._id], }); @@ -1297,7 +1305,7 @@ describe('Group Model', () => { await guild.leave(member); - guild = await Group.findOne({_id: guild._id}); + guild = await Group.findOne({ _id: guild._id }); expect(guild).to.exist; }); }); @@ -1309,7 +1317,8 @@ describe('Group Model', () => { it('formats message', () => { const chatMessage = party.sendChat({ - message: 'a new message', user: { + message: 'a new message', + user: { _id: 'user-id', profile: { name: 'user name' }, contributor: { @@ -1322,8 +1331,8 @@ describe('Group Model', () => { return 'backer object'; }, }, - }} - ); + }, + }); const chat = chatMessage; @@ -1340,7 +1349,7 @@ describe('Group Model', () => { }); it('formats message as system if no user is passed in', () => { - const chat = party.sendChat({message: 'a system message'}); + const chat = party.sendChat({ message: 'a system message' }); expect(chat.text).to.eql('a system message'); expect(validator.isUUID(chat.id)).to.eql(true); @@ -1355,7 +1364,7 @@ describe('Group Model', () => { }); it('updates users about new messages in party', () => { - party.sendChat({message: 'message'}); + party.sendChat({ message: 'message' }); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1365,11 +1374,11 @@ describe('Group Model', () => { }); it('updates users about new messages in group', () => { - let group = new Group({ + const group = new Group({ type: 'guild', }); - group.sendChat({message: 'message'}); + group.sendChat({ message: 'message' }); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1379,7 +1388,7 @@ describe('Group Model', () => { }); it('does not send update to user that sent the message', () => { - party.sendChat({message: 'message', user: {_id: 'user-id', profile: { name: 'user' }}}); + party.sendChat({ message: 'message', user: { _id: 'user-id', profile: { name: 'user' } } }); expect(User.update).to.be.calledOnce; expect(User.update).to.be.calledWithMatch({ @@ -1391,7 +1400,7 @@ describe('Group Model', () => { it('skips sending new message notification for guilds with > 5000 members', () => { party.memberCount = 5001; - party.sendChat({message: 'message'}); + party.sendChat({ message: 'message' }); expect(User.update).to.not.be.called; }); @@ -1399,7 +1408,7 @@ describe('Group Model', () => { it('skips sending messages to the tavern', () => { party._id = TAVERN_ID; - party.sendChat({message: 'message'}); + party.sendChat({ message: 'message' }); expect(User.update).to.not.be.called; }); @@ -1408,7 +1417,7 @@ describe('Group Model', () => { describe('#startQuest', () => { context('Failure Conditions', () => { it('throws an error if group is not a party', async () => { - let guild = new Group({ + const guild = new Group({ type: 'guild', }); @@ -1448,7 +1457,7 @@ describe('Group Model', () => { }); it('sets up boss quest', () => { - let bossQuest = questScrolls.whale; + const bossQuest = questScrolls.whale; party.quest.key = bossQuest.key; party.startQuest(participatingMember); @@ -1457,7 +1466,7 @@ describe('Group Model', () => { }); it('sets up rage meter for rage boss quest', () => { - let rageBossQuest = questScrolls.trex_undead; + const rageBossQuest = questScrolls.trex_undead; party.quest.key = rageBossQuest.key; party.startQuest(participatingMember); @@ -1466,7 +1475,7 @@ describe('Group Model', () => { }); it('sets up collection quest', () => { - let collectionQuest = questScrolls.vice2; + const collectionQuest = questScrolls.vice2; party.quest.key = collectionQuest.key; party.startQuest(participatingMember); @@ -1476,7 +1485,7 @@ describe('Group Model', () => { }); it('sets up collection quest with multiple items', () => { - let collectionQuest = questScrolls.evilsanta2; + const collectionQuest = questScrolls.evilsanta2; party.quest.key = collectionQuest.key; party.startQuest(participatingMember); @@ -1489,7 +1498,7 @@ describe('Group Model', () => { it('prunes non-participating members from quest members object', () => { party.startQuest(participatingMember); - let expectedQuestMembers = {}; + const expectedQuestMembers = {}; expectedQuestMembers[questLeader._id] = true; expectedQuestMembers[participatingMember._id] = true; expectedQuestMembers[sleepingParticipatingMember._id] = true; @@ -1536,7 +1545,7 @@ describe('Group Model', () => { it('does not apply updates to nonparticipating members', async () => { await party.startQuest(participatingMember); - nonParticipatingMember = await User.findById(nonParticipatingMember ._id); + nonParticipatingMember = await User.findById(nonParticipatingMember._id); undecidedMember = await User.findById(undecidedMember._id); expect(nonParticipatingMember.party.quest.key).to.not.eql('whale'); @@ -1562,8 +1571,8 @@ describe('Group Model', () => { expect(email.sendTxn).to.be.calledOnce; - let memberIds = _.map(email.sendTxn.args[0][0], '_id'); - let typeOfEmail = email.sendTxn.args[0][1]; + const memberIds = _.map(email.sendTxn.args[0][0], '_id'); + const typeOfEmail = email.sendTxn.args[0][1]; expect(memberIds).to.have.a.lengthOf(3); expect(memberIds).to.include(participatingMember._id); @@ -1596,7 +1605,11 @@ describe('Group Model', () => { }, }]; - await Promise.all([participatingMember.save(), sleepingParticipatingMember.save(), questLeader.save()]); + await Promise.all([ + participatingMember.save(), + sleepingParticipatingMember.save(), + questLeader.save(), + ]); await party.startQuest(nonParticipatingMember); @@ -1604,10 +1617,10 @@ describe('Group Model', () => { expect(questActivityWebhook.send).to.be.calledThrice; // for 3 participating members - let args = questActivityWebhook.send.args[0]; - let webhooks = args[0].webhooks; - let webhookOwner = args[0]._id; - let options = args[1]; + const args = questActivityWebhook.send.args[0]; + const { webhooks } = args[0]; + const webhookOwner = args[0]._id; + const options = args[1]; expect(webhooks).to.have.a.lengthOf(1); if (webhookOwner === questLeader._id) { @@ -1638,7 +1651,7 @@ describe('Group Model', () => { expect(email.sendTxn).to.be.calledOnce; - let memberIds = _.map(email.sendTxn.args[0][0], '_id'); + const memberIds = _.map(email.sendTxn.args[0][0], '_id'); expect(memberIds).to.have.a.lengthOf(1); expect(memberIds).to.not.include(participatingMember._id); @@ -1662,7 +1675,7 @@ describe('Group Model', () => { expect(email.sendTxn).to.be.calledOnce; - let memberIds = _.map(email.sendTxn.args[0][0], '_id'); + const memberIds = _.map(email.sendTxn.args[0][0], '_id'); expect(memberIds).to.have.a.lengthOf(2); expect(memberIds).to.not.include(participatingMember._id); @@ -1675,7 +1688,9 @@ describe('Group Model', () => { await party.startQuest(nonParticipatingMember); - let members = [questLeader._id, participatingMember._id, sleepingParticipatingMember._id]; + const members = [ + questLeader._id, participatingMember._id, sleepingParticipatingMember._id, + ]; expect(User.update).to.be.calledWith( { _id: { $in: members } }, @@ -1685,7 +1700,7 @@ describe('Group Model', () => { 'party.quest.progress.down': 0, 'party.quest.completed': null, }, - } + }, ); }); @@ -1700,14 +1715,14 @@ describe('Group Model', () => { $inc: { 'items.quests.whale': -1, }, - } + }, ); }); it('modifies the participating initiating user directly', async () => { await party.startQuest(participatingMember); - let userQuest = participatingMember.party.quest; + const userQuest = participatingMember.party.quest; expect(userQuest.key).to.eql('whale'); expect(userQuest.progress.up).to.eql(10); @@ -1748,15 +1763,11 @@ describe('Group Model', () => { }); describe('user update retry failures', () => { - let successfulMock = { - exec: () => { - return Promise.resolve({raw: 'sucess'}); - }, + const successfulMock = { + exec: () => Promise.resolve({ raw: 'sucess' }), }; - let failedMock = { - exec: () => { - return Promise.reject(new Error('error')); - }, + const failedMock = { + exec: () => Promise.reject(new Error('error')), }; it('doesn\'t retry successful operations', async () => { @@ -1768,7 +1779,7 @@ describe('Group Model', () => { }); it('stops retrying when a successful update has occurred', async () => { - let updateStub = sandbox.stub(User, 'update'); + const updateStub = sandbox.stub(User, 'update'); updateStub.onCall(0).returns(failedMock); updateStub.returns(successfulMock); @@ -1789,7 +1800,7 @@ describe('Group Model', () => { it('gives out achievements', async () => { await party.finishQuest(quest); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -1828,7 +1839,7 @@ describe('Group Model', () => { await questLeader.save(); await party.finishQuest(quest); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -1867,7 +1878,7 @@ describe('Group Model', () => { await questLeader.save(); await party.finishQuest(quest); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -1897,7 +1908,7 @@ describe('Group Model', () => { await questLeader.save(); await party.finishQuest(quest); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -1915,7 +1926,7 @@ describe('Group Model', () => { it('gives xp and gold', async () => { await party.finishQuest(quest); - let [ + const [ updatedLeader, updatedParticipatingMember, updatedSleepingParticipatingMember, @@ -1935,91 +1946,91 @@ describe('Group Model', () => { context('drops', () => { it('awards gear', async () => { - let gearQuest = questScrolls.vice3; + const gearQuest = questScrolls.vice3; await party.finishQuest(gearQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.gear.owned.weapon_special_2).to.eql(true); }); it('awards eggs', async () => { - let eggQuest = questScrolls.vice3; + const eggQuest = questScrolls.vice3; await party.finishQuest(eggQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.eggs.Dragon).to.eql(2); }); it('awards food', async () => { - let foodQuest = questScrolls.moonstone3; + const foodQuest = questScrolls.moonstone3; await party.finishQuest(foodQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.food.RottenMeat).to.eql(5); }); it('awards hatching potions', async () => { - let hatchingPotionQuest = questScrolls.vice3; + const hatchingPotionQuest = questScrolls.vice3; await party.finishQuest(hatchingPotionQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.hatchingPotions.Shade).to.eql(2); }); it('awards quest scrolls to owner', async () => { - let questAwardQuest = questScrolls.vice2; + const questAwardQuest = questScrolls.vice2; await party.finishQuest(questAwardQuest); - let updatedLeader = await User.findById(questLeader._id); + const updatedLeader = await User.findById(questLeader._id); expect(updatedLeader.items.quests.vice3).to.eql(1); }); it('awards non quest leader rewards to quest leader', async () => { - let gearQuest = questScrolls.vice3; + const gearQuest = questScrolls.vice3; await party.finishQuest(gearQuest); - let updatedLeader = await User.findById(questLeader._id); + const updatedLeader = await User.findById(questLeader._id); expect(updatedLeader.items.gear.owned.weapon_special_2).to.eql(true); }); it('doesn\'t award quest owner rewards to all participants', async () => { - let questAwardQuest = questScrolls.vice2; + const questAwardQuest = questScrolls.vice2; await party.finishQuest(questAwardQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.quests.vice3).to.not.exist; }); it('awards pets', async () => { - let petQuest = questScrolls.evilsanta2; + const petQuest = questScrolls.evilsanta2; await party.finishQuest(petQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.pets['BearCub-Polar']).to.eql(5); }); it('awards mounts', async () => { - let mountQuest = questScrolls.evilsanta; + const mountQuest = questScrolls.evilsanta; await party.finishQuest(mountQuest); - let updatedParticipatingMember = await User.findById(participatingMember._id); + const updatedParticipatingMember = await User.findById(participatingMember._id); expect(updatedParticipatingMember.items.mounts['BearCub-Polar']).to.eql(true); }); @@ -2079,7 +2090,11 @@ describe('Group Model', () => { }, }]; - await Promise.all([participatingMember.save(), sleepingParticipatingMember.save(), questLeader.save()]); + await Promise.all([ + participatingMember.save(), + sleepingParticipatingMember.save(), + questLeader.save(), + ]); await party.finishQuest(quest); @@ -2087,9 +2102,9 @@ describe('Group Model', () => { expect(questActivityWebhook.send).to.be.calledOnce; - let args = questActivityWebhook.send.args[0]; - let webhooks = args[0].webhooks; - let options = args[1]; + const args = questActivityWebhook.send.args[0]; + const { webhooks } = args[0]; + const options = args[1]; expect(webhooks).to.have.a.lengthOf(1); expect(webhooks[0].id).to.eql(participatingMember.webhooks[0].id); @@ -2118,7 +2133,7 @@ describe('Group Model', () => { it('sets quest completed to the world quest key', async () => { await party.finishQuest(tavernQuest); - let updatedLeader = await User.findById(questLeader._id); + const updatedLeader = await User.findById(questLeader._id); expect(updatedLeader.party.quest.completed).to.eql(tavernQuest.key); }); @@ -2133,7 +2148,7 @@ describe('Group Model', () => { it('looks for users in specified guild with webhooks', () => { sandbox.spy(User, 'find'); - let guild = new Group({ + const guild = new Group({ type: 'guild', }); @@ -2167,13 +2182,13 @@ describe('Group Model', () => { }); it('sends webhooks for users with webhooks', async () => { - let guild = new Group({ + const guild = new Group({ name: 'some guild', type: 'guild', }); - let chat = {message: 'text'}; - let memberWithWebhook = new User({ + const chat = { message: 'text' }; + const memberWithWebhook = new User({ guilds: [guild._id], webhooks: [{ type: 'groupChatReceived', @@ -2183,10 +2198,10 @@ describe('Group Model', () => { }, }], }); - let memberWithoutWebhook = new User({ + const memberWithoutWebhook = new User({ guilds: [guild._id], }); - let nonMemberWithWebhooks = new User({ + const nonMemberWithWebhooks = new User({ webhooks: [{ type: 'groupChatReceived', url: 'http://a-different-url.com', @@ -2212,9 +2227,9 @@ describe('Group Model', () => { expect(groupChatReceivedWebhook.send).to.be.calledOnce; - let args = groupChatReceivedWebhook.send.args[0]; - let webhooks = args[0].webhooks; - let options = args[1]; + const args = groupChatReceivedWebhook.send.args[0]; + const { webhooks } = args[0]; + const options = args[1]; expect(webhooks).to.have.a.lengthOf(1); expect(webhooks[0].id).to.eql(memberWithWebhook.webhooks[0].id); @@ -2223,12 +2238,12 @@ describe('Group Model', () => { }); it('sends webhooks for users with webhooks triggered by system messages', async () => { - let guild = new Group({ + const guild = new Group({ name: 'some guild', type: 'guild', }); - let memberWithWebhook = new User({ + const memberWithWebhook = new User({ guilds: [guild._id], webhooks: [{ type: 'groupChatReceived', @@ -2238,10 +2253,10 @@ describe('Group Model', () => { }, }], }); - let memberWithoutWebhook = new User({ + const memberWithoutWebhook = new User({ guilds: [guild._id], }); - let nonMemberWithWebhooks = new User({ + const nonMemberWithWebhooks = new User({ webhooks: [{ type: 'groupChatReceived', url: 'http://a-different-url.com', @@ -2261,16 +2276,16 @@ describe('Group Model', () => { await guild.save(); - const groupMessage = guild.sendChat({message: 'Test message.'}); + const groupMessage = guild.sendChat({ message: 'Test message.' }); await groupMessage.save(); await sleep(); expect(groupChatReceivedWebhook.send).to.be.calledOnce; - let args = groupChatReceivedWebhook.send.args[0]; - let webhooks = args[0].webhooks; - let options = args[1]; + const args = groupChatReceivedWebhook.send.args[0]; + const { webhooks } = args[0]; + const options = args[1]; expect(webhooks).to.have.a.lengthOf(1); expect(webhooks[0].id).to.eql(memberWithWebhook.webhooks[0].id); @@ -2279,13 +2294,13 @@ describe('Group Model', () => { }); it('sends webhooks for each user with webhooks in group', async () => { - let guild = new Group({ + const guild = new Group({ name: 'some guild', type: 'guild', }); - let chat = {message: 'text'}; - let memberWithWebhook = new User({ + const chat = { message: 'text' }; + const memberWithWebhook = new User({ guilds: [guild._id], webhooks: [{ type: 'groupChatReceived', @@ -2295,7 +2310,7 @@ describe('Group Model', () => { }, }], }); - let memberWithWebhook2 = new User({ + const memberWithWebhook2 = new User({ guilds: [guild._id], webhooks: [{ type: 'groupChatReceived', @@ -2305,7 +2320,7 @@ describe('Group Model', () => { }, }], }); - let memberWithWebhook3 = new User({ + const memberWithWebhook3 = new User({ guilds: [guild._id], webhooks: [{ type: 'groupChatReceived', @@ -2332,10 +2347,16 @@ describe('Group Model', () => { expect(groupChatReceivedWebhook.send).to.be.calledThrice; - let args = groupChatReceivedWebhook.send.args; - expect(args.find(arg => arg[0].webhooks[0].id === memberWithWebhook.webhooks[0].id)).to.be.exist; - expect(args.find(arg => arg[0].webhooks[0].id === memberWithWebhook2.webhooks[0].id)).to.be.exist; - expect(args.find(arg => arg[0].webhooks[0].id === memberWithWebhook3.webhooks[0].id)).to.be.exist; + const { args } = groupChatReceivedWebhook.send; + expect(args.find( + arg => arg[0].webhooks[0].id === memberWithWebhook.webhooks[0].id, + )).to.be.exist; + expect(args.find( + arg => arg[0].webhooks[0].id === memberWithWebhook2.webhooks[0].id, + )).to.be.exist; + expect(args.find( + arg => arg[0].webhooks[0].id === memberWithWebhook3.webhooks[0].id, + )).to.be.exist; }); }); diff --git a/test/api/unit/models/group_tasks.test.js b/test/api/unit/models/group_tasks.test.js index 21cfd9ef2b..848b4b0792 100644 --- a/test/api/unit/models/group_tasks.test.js +++ b/test/api/unit/models/group_tasks.test.js @@ -1,12 +1,13 @@ +import { each, find, findIndex } from 'lodash'; import { model as Challenge } from '../../../../website/server/models/challenge'; import { model as Group } from '../../../../website/server/models/group'; import { model as User } from '../../../../website/server/models/user'; import * as Tasks from '../../../../website/server/models/task'; -import { each, find, findIndex } from 'lodash'; describe('Group Task Methods', () => { - let guild, leader, challenge, task; - let tasksToTest = { + let guild; let leader; let challenge; let + task; + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -79,9 +80,9 @@ describe('Group Task Methods', () => { it('syncs an assigned task to a user', async () => { await guild.syncTask(task, leader); - let updatedLeader = await User.findOne({_id: leader._id}); - let tagIndex = findIndex(updatedLeader.tags, {id: guild._id}); - let newTag = updatedLeader.tags[tagIndex]; + const updatedLeader = await User.findOne({ _id: leader._id }); + const tagIndex = findIndex(updatedLeader.tags, { id: guild._id }); + const newTag = updatedLeader.tags[tagIndex]; expect(newTag.id).to.equal(guild._id); expect(newTag.name).to.equal(guild.name); @@ -91,9 +92,9 @@ describe('Group Task Methods', () => { it('create tags for a user when task is synced', async () => { await guild.syncTask(task, leader); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); expect(task.group.assignedUsers).to.contain(leader._id); expect(syncedTask).to.exist; @@ -101,13 +102,13 @@ describe('Group Task Methods', () => { it('syncs updated info for assigned task to a user', async () => { await guild.syncTask(task, leader); - let updatedTaskName = 'Update Task name'; + const updatedTaskName = 'Update Task name'; task.text = updatedTaskName; await guild.syncTask(task, leader); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); expect(task.group.assignedUsers).to.contain(leader._id); expect(syncedTask).to.exist; @@ -117,9 +118,9 @@ describe('Group Task Methods', () => { it('syncs checklist items to an assigned user', async () => { await guild.syncTask(task, leader); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); if (task.type !== 'daily' && task.type !== 'todo') return; @@ -141,19 +142,19 @@ describe('Group Task Methods', () => { }); it('syncs updated info for assigned task to all users', async () => { - let updatedTaskName = 'Update Task name'; + const updatedTaskName = 'Update Task name'; task.text = updatedTaskName; task.group.approval.required = true; await guild.updateTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); - let updatedMember = await User.findOne({_id: newMember._id}); - let updatedMemberTasks = await Tasks.Task.find({_id: { $in: updatedMember.tasksOrder[`${taskType}s`]}}); - let syncedMemberTask = find(updatedMemberTasks, findLinkedTask); + const updatedMember = await User.findOne({ _id: newMember._id }); + const updatedMemberTasks = await Tasks.Task.find({ _id: { $in: updatedMember.tasksOrder[`${taskType}s`] } }); + const syncedMemberTask = find(updatedMemberTasks, findLinkedTask); expect(task.group.assignedUsers).to.contain(leader._id); expect(syncedTask).to.exist; @@ -169,22 +170,22 @@ describe('Group Task Methods', () => { it('syncs a new checklist item to all assigned users', async () => { if (task.type !== 'daily' && task.type !== 'todo') return; - let newCheckListItem = { + const newCheckListItem = { text: 'Checklist Item 1', completed: false, }; task.checklist.push(newCheckListItem); - await guild.updateTask(task, {newCheckListItem}); + await guild.updateTask(task, { newCheckListItem }); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); - let updatedMember = await User.findOne({_id: newMember._id}); - let updatedMemberTasks = await Tasks.Task.find({_id: { $in: updatedMember.tasksOrder[`${taskType}s`]}}); - let syncedMemberTask = find(updatedMemberTasks, findLinkedTask); + const updatedMember = await User.findOne({ _id: newMember._id }); + const updatedMemberTasks = await Tasks.Task.find({ _id: { $in: updatedMember.tasksOrder[`${taskType}s`] } }); + const syncedMemberTask = find(updatedMemberTasks, findLinkedTask); expect(syncedTask.checklist.length).to.equal(task.checklist.length); expect(syncedTask.checklist[1].text).to.equal(task.checklist[1].text); @@ -195,20 +196,20 @@ describe('Group Task Methods', () => { it('syncs updated info for checklist in assigned task to all users when flag is passed', async () => { if (task.type !== 'daily' && task.type !== 'todo') return; - let updateCheckListText = 'Updated checklist item'; + const updateCheckListText = 'Updated checklist item'; if (task.checklist) { task.checklist[0].text = updateCheckListText; } - await guild.updateTask(task, {updateCheckListItems: [task.checklist[0]]}); + await guild.updateTask(task, { updateCheckListItems: [task.checklist[0]] }); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); - let updatedMember = await User.findOne({_id: newMember._id}); - let updatedMemberTasks = await Tasks.Task.find({_id: { $in: updatedMember.tasksOrder[`${taskType}s`]}}); - let syncedMemberTask = find(updatedMemberTasks, findLinkedTask); + const updatedMember = await User.findOne({ _id: newMember._id }); + const updatedMemberTasks = await Tasks.Task.find({ _id: { $in: updatedMember.tasksOrder[`${taskType}s`] } }); + const syncedMemberTask = find(updatedMemberTasks, findLinkedTask); expect(syncedTask.checklist.length).to.equal(task.checklist.length); expect(syncedTask.checklist[0].text).to.equal(updateCheckListText); @@ -219,15 +220,15 @@ describe('Group Task Methods', () => { it('removes a checklist item in assigned task to all users when flag is passed with checklist id', async () => { if (task.type !== 'daily' && task.type !== 'todo') return; - await guild.updateTask(task, {removedCheckListItemId: task.checklist[0].id}); + await guild.updateTask(task, { removedCheckListItemId: task.checklist[0].id }); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); - let updatedMember = await User.findOne({_id: newMember._id}); - let updatedMemberTasks = await Tasks.Task.find({_id: { $in: updatedMember.tasksOrder[`${taskType}s`]}}); - let syncedMemberTask = find(updatedMemberTasks, findLinkedTask); + const updatedMember = await User.findOne({ _id: newMember._id }); + const updatedMemberTasks = await Tasks.Task.find({ _id: { $in: updatedMember.tasksOrder[`${taskType}s`] } }); + const syncedMemberTask = find(updatedMemberTasks, findLinkedTask); expect(syncedTask.checklist.length).to.equal(0); expect(syncedMemberTask.checklist.length).to.equal(0); @@ -238,9 +239,9 @@ describe('Group Task Methods', () => { await guild.syncTask(task, leader); await guild.removeTask(task); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); expect(syncedTask.group.broken).to.equal('TASK_DELETED'); }); @@ -249,9 +250,9 @@ describe('Group Task Methods', () => { await guild.syncTask(task, leader); await guild.unlinkTask(task, leader, 'remove-all'); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + const updatedLeader = await User.findOne({ _id: leader._id }); + const updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); expect(task.group.assignedUsers).to.not.contain(leader._id); expect(syncedTask).to.not.exist; @@ -260,17 +261,18 @@ describe('Group Task Methods', () => { it('unlinks and keeps group tasks for a user when keep-all is specified', async () => { await guild.syncTask(task, leader); - let updatedLeader = await User.findOne({_id: leader._id}); - let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let syncedTask = find(updatedLeadersTasks, findLinkedTask); + let updatedLeader = await User.findOne({ _id: leader._id }); + let updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const syncedTask = find(updatedLeadersTasks, findLinkedTask); await guild.unlinkTask(task, leader, 'keep-all'); - updatedLeader = await User.findOne({_id: leader._id}); - updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}}); - let updatedSyncedTask = find(updatedLeadersTasks, function findUpdatedLinkedTask (updatedLeadersTask) { - return updatedLeadersTask._id === syncedTask._id; - }); + updatedLeader = await User.findOne({ _id: leader._id }); + updatedLeadersTasks = await Tasks.Task.find({ _id: { $in: updatedLeader.tasksOrder[`${taskType}s`] } }); + const updatedSyncedTask = find( + updatedLeadersTasks, + updatedLeadersTask => updatedLeadersTask._id === syncedTask._id, + ); expect(task.group.assignedUsers).to.not.contain(leader._id); expect(updatedSyncedTask).to.exist; diff --git a/test/api/unit/models/task.test.js b/test/api/unit/models/task.test.js index d925073945..006efd0a07 100644 --- a/test/api/unit/models/task.test.js +++ b/test/api/unit/models/task.test.js @@ -1,14 +1,15 @@ +import { each } from 'lodash'; import { model as Challenge } from '../../../../website/server/models/challenge'; import { model as Group } from '../../../../website/server/models/group'; import { model as User } from '../../../../website/server/models/user'; import * as Tasks from '../../../../website/server/models/task'; import { InternalServerError } from '../../../../website/server/libs/errors'; -import { each } from 'lodash'; -import { generateHistory } from '../../../helpers/api-unit.helper.js'; +import { generateHistory } from '../../../helpers/api-unit.helper'; describe('Task Model', () => { - let guild, leader, challenge, task; - let tasksToTest = { + let guild; let leader; let challenge; let + task; + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -62,11 +63,11 @@ describe('Task Model', () => { }); it('preens challenge tasks history when scored', async () => { - let historyLengthBeforePreen = task.history.length; + const historyLengthBeforePreen = task.history.length; await task.scoreChallengeTask(1.2); - let updatedTask = await Tasks.Task.findOne({_id: task._id}); + const updatedTask = await Tasks.Task.findOne({ _id: task._id }); expect(historyLengthBeforePreen).to.be.greaterThan(updatedTask.history.length); }); @@ -75,7 +76,8 @@ describe('Task Model', () => { describe('Static Methods', () => { describe('findByIdOrAlias', () => { - let taskWithAlias, user; + let taskWithAlias; let + user; beforeEach(async () => { user = new User(); @@ -112,13 +114,13 @@ describe('Task Model', () => { }); it('returns task by id', async () => { - let foundTodo = await Tasks.Task.findByIdOrAlias(taskWithAlias._id, user._id); + const foundTodo = await Tasks.Task.findByIdOrAlias(taskWithAlias._id, user._id); expect(foundTodo.text).to.eql(taskWithAlias.text); }); it('returns task by alias', async () => { - let foundTodo = await Tasks.Task.findByIdOrAlias(taskWithAlias.alias, user._id); + const foundTodo = await Tasks.Task.findByIdOrAlias(taskWithAlias.alias, user._id); expect(foundTodo.text).to.eql(taskWithAlias.text); }); @@ -134,7 +136,7 @@ describe('Task Model', () => { }); it('returns null if task cannot be found', async () => { - let foundTask = await Tasks.Task.findByIdOrAlias('not-found', user._id); + const foundTask = await Tasks.Task.findByIdOrAlias('not-found', user._id); expect(foundTask).to.eql(null); }); diff --git a/test/api/unit/models/user.test.js b/test/api/unit/models/user.test.js index 24652fa7b6..1e01c52b16 100644 --- a/test/api/unit/models/user.test.js +++ b/test/api/unit/models/user.test.js @@ -5,7 +5,7 @@ import common from '../../../../website/common'; describe('User Model', () => { it('keeps user._tmp when calling .toJSON', () => { - let user = new User({ + const user = new User({ auth: { local: { username: 'username', @@ -17,26 +17,26 @@ describe('User Model', () => { }, }); - user._tmp = {ok: true}; - user._nonTmp = {ok: true}; + user._tmp = { ok: true }; + user._nonTmp = { ok: true }; - expect(user._tmp).to.eql({ok: true}); - expect(user._nonTmp).to.eql({ok: true}); + expect(user._tmp).to.eql({ ok: true }); + expect(user._nonTmp).to.eql({ ok: true }); - let toObject = user.toObject(); - let toJSON = user.toJSON(); + const toObject = user.toObject(); + const toJSON = user.toJSON(); expect(toObject).to.not.have.keys('_tmp'); expect(toObject).to.not.have.keys('_nonTmp'); expect(toJSON).to.have.any.key('_tmp'); - expect(toJSON._tmp).to.eql({ok: true}); + expect(toJSON._tmp).to.eql({ ok: true }); expect(toJSON).to.not.have.keys('_nonTmp'); }); it('can add computed stats to a JSONified user object', () => { - let user = new User(); - let userToJSON = user.toJSON(); + const user = new User(); + const userToJSON = user.toJSON(); expect(userToJSON.stats.maxMP).to.not.exist; expect(userToJSON.stats.maxHealth).to.not.exist; @@ -50,9 +50,9 @@ describe('User Model', () => { }); it('can transform user object without mongoose helpers', async () => { - let user = new User(); + const user = new User(); await user.save(); - let userToJSON = await User.findById(user._id).lean().exec(); + const userToJSON = await User.findById(user._id).lean().exec(); expect(userToJSON.stats.maxMP).to.not.exist; expect(userToJSON.stats.maxHealth).to.not.exist; @@ -68,9 +68,9 @@ describe('User Model', () => { }); it('can transform user object without mongoose helpers (including computed stats)', async () => { - let user = new User(); + const user = new User(); await user.save(); - let userToJSON = await User.findById(user._id).lean().exec(); + const userToJSON = await User.findById(user._id).lean().exec(); expect(userToJSON.stats.maxMP).to.not.exist; expect(userToJSON.stats.maxHealth).to.not.exist; @@ -86,11 +86,11 @@ describe('User Model', () => { context('notifications', () => { it('can add notifications without data', () => { - let user = new User(); + const user = new User(); user.addNotification('CRON'); - let userToJSON = user.toJSON(); + const userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']); expect(userToJSON.notifications[0].type).to.equal('CRON'); @@ -99,14 +99,15 @@ describe('User Model', () => { }); it('removes invalid notifications when calling toJSON', () => { - let user = new User(); + const user = new User(); user.notifications = [ null, // invalid, not an object - {seen: true}, // invalid, no type or id - {id: 123}, // invalid, no type - // {type: 'ABC'}, // invalid, no id, not included here because the id would be added automatically - {type: 'ABC', id: '123'}, // valid + { seen: true }, // invalid, no type or id + { id: 123 }, // invalid, no type + // invalid, no id, not included here because the id would be added automatically + // {type: 'ABC'}, + { type: 'ABC', id: '123' }, // valid ]; const userToJSON = user.toJSON(); @@ -118,15 +119,15 @@ describe('User Model', () => { }); it('can add notifications with data and already marked as seen', () => { - let user = new User(); + const user = new User(); - user.addNotification('CRON', {field: 1}, true); + user.addNotification('CRON', { field: 1 }, true); - let userToJSON = user.toJSON(); + const userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']); expect(userToJSON.notifications[0].type).to.equal('CRON'); - expect(userToJSON.notifications[0].data).to.eql({field: 1}); + expect(userToJSON.notifications[0].data).to.eql({ field: 1 }); expect(userToJSON.notifications[0].seen).to.eql(true); }); @@ -135,11 +136,11 @@ describe('User Model', () => { let user = new User(); await user.save(); - await User.pushNotification({_id: user._id}, 'CRON'); + await User.pushNotification({ _id: user._id }, 'CRON'); - user = await User.findOne({_id: user._id}).exec(); + user = await User.findOne({ _id: user._id }).exec(); - let userToJSON = user.toJSON(); + const userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']); expect(userToJSON.notifications[0].type).to.equal('CRON'); @@ -147,21 +148,21 @@ describe('User Model', () => { }); it('validates notifications via static method', async () => { - let user = new User(); + const user = new User(); await user.save(); - expect(User.pushNotification({_id: user._id}, 'BAD_TYPE')).to.eventually.be.rejected; - expect(User.pushNotification({_id: user._id}, 'CRON', null, 'INVALID_SEEN')).to.eventually.be.rejected; + expect(User.pushNotification({ _id: user._id }, 'BAD_TYPE')).to.eventually.be.rejected; + expect(User.pushNotification({ _id: user._id }, 'CRON', null, 'INVALID_SEEN')).to.eventually.be.rejected; }); it('adds notifications without data for all given users via static method', async () => { let user = new User(); - let otherUser = new User(); + const otherUser = new User(); await Promise.all([user.save(), otherUser.save()]); - await User.pushNotification({_id: {$in: [user._id, otherUser._id]}}, 'CRON'); + await User.pushNotification({ _id: { $in: [user._id, otherUser._id] } }, 'CRON'); - user = await User.findOne({_id: user._id}).exec(); + user = await User.findOne({ _id: user._id }).exec(); let userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); @@ -170,7 +171,7 @@ describe('User Model', () => { expect(userToJSON.notifications[0].data).to.eql({}); expect(userToJSON.notifications[0].seen).to.eql(false); - user = await User.findOne({_id: otherUser._id}).exec(); + user = await User.findOne({ _id: otherUser._id }).exec(); userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); @@ -182,27 +183,27 @@ describe('User Model', () => { it('adds notifications with data and seen status for all given users via static method', async () => { let user = new User(); - let otherUser = new User(); + const otherUser = new User(); await Promise.all([user.save(), otherUser.save()]); - await User.pushNotification({_id: {$in: [user._id, otherUser._id]}}, 'CRON', {field: 1}, true); + await User.pushNotification({ _id: { $in: [user._id, otherUser._id] } }, 'CRON', { field: 1 }, true); - user = await User.findOne({_id: user._id}).exec(); + user = await User.findOne({ _id: user._id }).exec(); let userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']); expect(userToJSON.notifications[0].type).to.equal('CRON'); - expect(userToJSON.notifications[0].data).to.eql({field: 1}); + expect(userToJSON.notifications[0].data).to.eql({ field: 1 }); expect(userToJSON.notifications[0].seen).to.eql(true); - user = await User.findOne({_id: otherUser._id}).exec(); + user = await User.findOne({ _id: otherUser._id }).exec(); userToJSON = user.toJSON(); expect(user.notifications.length).to.equal(1); expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']); expect(userToJSON.notifications[0].type).to.equal('CRON'); - expect(userToJSON.notifications[0].data).to.eql({field: 1}); + expect(userToJSON.notifications[0].data).to.eql({ field: 1 }); expect(userToJSON.notifications[0].seen).to.eql(true); }); }); @@ -245,7 +246,7 @@ describe('User Model', () => { let group; beforeEach(() => { user = new User(); - let leader = new User(); + const leader = new User(); group = new Group({ name: 'test', type: 'guild', @@ -379,11 +380,13 @@ describe('User Model', () => { // Create conditions for the Beast Master achievement to be awarded user.achievements.beastMasterCount = 3; - expect(user.achievements.beastMaster).to.not.equal(true); // verify that it was not awarded initially + // verify that it was not awarded initially + expect(user.achievements.beastMaster).to.not.equal(true); user = await user.save(); // verify that it's been awarded expect(user.achievements.beastMaster).to.equal(true); + expect(user.notifications.find(notification => notification.type === 'ACHIEVEMENT_BEAST_MASTER')).to.exist; // reset the user user.achievements.beastMasterCount = 0; @@ -397,7 +400,8 @@ describe('User Model', () => { user = await User.findById(user._id).select('-items').exec(); expect(user.isSelected('items')).to.equal(false); - // create the conditions for the beast master achievement but this time it should not be awarded + // create the conditions for the beast master achievement + // but this time it should not be awarded user.achievements.beastMasterCount = 3; user = await user.save(); expect(user.achievements.beastMaster).to.equal(false); @@ -414,6 +418,28 @@ describe('User Model', () => { expect(user.achievements.beastMaster).to.not.equal(true); }); + it('adds achievements to notification list', async () => { + let user = new User(); + user = await user.save(); // necessary for user.isSelected to work correctly + + // Create conditions for achievements to be awarded + user.achievements.beastMasterCount = 3; + user.achievements.mountMasterCount = 3; + user.achievements.triadBingoCount = 3; + // verify that it was not awarded initially + expect(user.achievements.beastMaster).to.not.equal(true); + // verify that it was not awarded initially + expect(user.achievements.mountMaster).to.not.equal(true); + // verify that it was not awarded initially + expect(user.achievements.triadBingo).to.not.equal(true); + + user = await user.save(); + // verify that it's been awarded + expect(user.notifications.find(notification => notification.type === 'ACHIEVEMENT_BEAST_MASTER')).to.exist; + expect(user.notifications.find(notification => notification.type === 'ACHIEVEMENT_MOUNT_MASTER')).to.exist; + expect(user.notifications.find(notification => notification.type === 'ACHIEVEMENT_TRIAD_BINGO')).to.exist; + }); + context('manage unallocated stats points notifications', () => { it('doesn\'t add a notification if there are no points to allocate', async () => { let user = new User(); @@ -536,11 +562,9 @@ describe('User Model', () => { const today = moment('2017-12-06T00:00:00.000-06:00'); // 11 pm on 4 Texas const req = {}; - req.header = () => { - return timezoneOffset + 60; - }; + req.header = () => timezoneOffset + 60; - const {daysMissed} = user.daysUserHasMissed(today, req); + const { daysMissed } = user.daysUserHasMissed(today, req); expect(daysMissed).to.eql(0); }); @@ -554,11 +578,9 @@ describe('User Model', () => { const today = moment('2017-12-06T02:00:00.000-08:00'); const req = {}; - req.header = () => { - return timezoneOffset + 60; - }; + req.header = () => timezoneOffset + 60; - const {daysMissed} = user.daysUserHasMissed(today, req); + const { daysMissed } = user.daysUserHasMissed(today, req); expect(daysMissed).to.eql(0); }); diff --git a/test/api/unit/models/userNotification.test.js b/test/api/unit/models/userNotification.test.js index 81140a9c26..c52a44bd21 100644 --- a/test/api/unit/models/userNotification.test.js +++ b/test/api/unit/models/userNotification.test.js @@ -5,10 +5,10 @@ describe('UserNotification Model', () => { it('converts an array of notifications to a safe version', () => { const notifications = [ null, // invalid, not an object - {seen: true}, // invalid, no type or id - {id: 123}, // invalid, no type - {type: 'ABC'}, // invalid, no id - new UserNotification({type: 'ABC', id: 123}), // valid + { seen: true }, // invalid, no type or id + { id: 123 }, // invalid, no type + { type: 'ABC' }, // invalid, no id + new UserNotification({ type: 'ABC', id: 123 }), // valid ]; const notificationsToJSON = UserNotification.convertNotificationsToSafeJson(notifications); diff --git a/test/api/unit/models/webhook.test.js b/test/api/unit/models/webhook.test.js index 06d69a256d..4a49b6213f 100644 --- a/test/api/unit/models/webhook.test.js +++ b/test/api/unit/models/webhook.test.js @@ -1,6 +1,6 @@ +import { v4 as generateUUID } from 'uuid'; import { model as Webhook } from '../../../../website/server/models/webhook'; import { BadRequest } from '../../../../website/server/libs/errors'; -import { v4 as generateUUID } from 'uuid'; import apiError from '../../../../website/server/libs/apiError'; describe('Webhook Model', () => { @@ -33,7 +33,7 @@ describe('Webhook Model', () => { it('it provides default values for options', () => { delete config.options; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -49,7 +49,7 @@ describe('Webhook Model', () => { it('provides missing task options', () => { delete config.options.created; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -65,7 +65,7 @@ describe('Webhook Model', () => { it('discards additional options', () => { config.options.foo = 'another option'; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -79,12 +79,12 @@ describe('Webhook Model', () => { }); }); - ['created', 'updated', 'deleted', 'scored', 'checklistScored'].forEach((option) => { - it(`validates that ${option} is a boolean`, (done) => { + ['created', 'updated', 'deleted', 'scored', 'checklistScored'].forEach(option => { + it(`validates that ${option} is a boolean`, done => { config.options[option] = 'not a boolean'; try { - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); } catch (err) { @@ -115,7 +115,7 @@ describe('Webhook Model', () => { it('it provides default values for options', () => { delete config.options; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -129,7 +129,7 @@ describe('Webhook Model', () => { it('provides missing user options', () => { delete config.options.petHatched; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -143,7 +143,7 @@ describe('Webhook Model', () => { it('discards additional options', () => { config.options.foo = 'another option'; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -155,12 +155,12 @@ describe('Webhook Model', () => { }); }); - ['petHatched', 'petHatched', 'leveledUp'].forEach((option) => { - it(`validates that ${option} is a boolean`, (done) => { + ['petHatched', 'petHatched', 'leveledUp'].forEach(option => { + it(`validates that ${option} is a boolean`, done => { config.options[option] = 'not a boolean'; try { - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); } catch (err) { @@ -190,7 +190,7 @@ describe('Webhook Model', () => { it('it provides default values for options', () => { delete config.options; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -203,7 +203,7 @@ describe('Webhook Model', () => { it('provides missing user options', () => { delete config.options.questStarted; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -216,7 +216,7 @@ describe('Webhook Model', () => { it('discards additional options', () => { config.options.foo = 'another option'; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -227,12 +227,12 @@ describe('Webhook Model', () => { }); }); - ['questStarted', 'questFinished'].forEach((option) => { - it(`validates that ${option} is a boolean`, (done) => { + ['questStarted', 'questFinished'].forEach(option => { + it(`validates that ${option} is a boolean`, done => { config.options[option] = 'not a boolean'; try { - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); } catch (err) { @@ -259,7 +259,7 @@ describe('Webhook Model', () => { }); it('creates options', () => { - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -269,7 +269,7 @@ describe('Webhook Model', () => { it('discards additional objects', () => { config.options.foo = 'another thing'; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); @@ -279,11 +279,11 @@ describe('Webhook Model', () => { }); }); - it('requires groupId option to be a uuid', (done) => { + it('requires groupId option to be a uuid', done => { config.options.groupId = 'not a uuid'; try { - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); } catch (err) { @@ -310,7 +310,7 @@ describe('Webhook Model', () => { it('discards additional objects', () => { config.options.foo = 'another thing'; - let wh = new Webhook(config); + const wh = new Webhook(config); wh.formatOptions(res); diff --git a/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js b/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js index 15d8751e5a..5e1f9ce9e0 100644 --- a/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateChallenge, @@ -6,11 +7,10 @@ import { checkExistence, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /challenges/:challengeId', () => { it('returns error when challengeId is not a valid UUID', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.del('/challenges/test')).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -19,7 +19,7 @@ describe('DELETE /challenges/:challengeId', () => { }); it('returns error when challengeId is not for a valid challenge', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.del(`/challenges/${generateUUID()}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -32,10 +32,10 @@ describe('DELETE /challenges/:challengeId', () => { let groupLeader; let group; let challenge; - let taskText = 'A challenge task text'; + const taskText = 'A challenge task text'; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup(); + const populatedGroup = await createAndPopulateGroup(); groupLeader = populatedGroup.groupLeader; group = populatedGroup.group; @@ -44,14 +44,14 @@ describe('DELETE /challenges/:challengeId', () => { await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: taskText}, + { type: 'habit', text: taskText }, ]); await challenge.sync(); }); it('returns an error when user doesn\'t have permissions to delete the challenge', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.del(`/challenges/${challenge._id}`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -69,7 +69,7 @@ describe('DELETE /challenges/:challengeId', () => { }); it('refunds gems to group leader', async () => { - let oldBalance = (await groupLeader.sync()).balance; + const oldBalance = (await groupLeader.sync()).balance; await groupLeader.del(`/challenges/${challenge._id}`); @@ -83,10 +83,8 @@ describe('DELETE /challenges/:challengeId', () => { await sleep(0.5); - let tasks = await groupLeader.get('/tasks/user'); - let testTask = _.find(tasks, (task) => { - return task.text === taskText; - }); + const tasks = await groupLeader.get('/tasks/user'); + const testTask = _.find(tasks, task => task.text === taskText); expect(testTask.challenge.broken).to.eql('CHALLENGE_DELETED'); expect(testTask.challenge.winner).to.be.null; diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js index 2f3e219592..7f70513da8 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js @@ -1,14 +1,14 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, createAndPopulateGroup, generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /challenges/:challengeId', () => { it('fails if challenge doesn\'t exists', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.get(`/challenges/${generateUUID()}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -25,8 +25,8 @@ describe('GET /challenges/:challengeId', () => { beforeEach(async () => { user = await generateUser(); - let populatedGroup = await createAndPopulateGroup({ - groupDetails: {type: 'guild', privacy: 'public'}, + const populatedGroup = await createAndPopulateGroup({ + groupDetails: { type: 'guild', privacy: 'public' }, }); groupLeader = populatedGroup.groupLeader; @@ -38,7 +38,7 @@ describe('GET /challenges/:challengeId', () => { it('should return challenge data', async () => { await challenge.sync(); - let chal = await user.get(`/challenges/${challenge._id}`); + const chal = await user.get(`/challenges/${challenge._id}`); expect(chal.memberCount).to.equal(challenge.memberCount); expect(chal.name).to.equal(challenge.name); expect(chal._id).to.equal(challenge._id); @@ -46,7 +46,7 @@ describe('GET /challenges/:challengeId', () => { expect(chal.leader).to.eql({ _id: groupLeader._id, id: groupLeader._id, - profile: {name: groupLeader.profile.name}, + profile: { name: groupLeader.profile.name }, auth: { local: { username: groupLeader.auth.local.username, @@ -81,8 +81,8 @@ describe('GET /challenges/:challengeId', () => { beforeEach(async () => { nonMember = await generateUser(); - let populatedGroup = await createAndPopulateGroup({ - groupDetails: {type: 'guild', privacy: 'private'}, + const populatedGroup = await createAndPopulateGroup({ + groupDetails: { type: 'guild', privacy: 'private' }, members: 2, }); @@ -90,8 +90,8 @@ describe('GET /challenges/:challengeId', () => { group = populatedGroup.group; members = populatedGroup.members; - challengeLeader = members[0]; - otherMember = members[1]; + challengeLeader = members[0]; // eslint-disable-line prefer-destructuring + otherMember = members[1]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(challengeLeader, group); }); @@ -105,14 +105,14 @@ describe('GET /challenges/:challengeId', () => { }); it('returns challenge data for any user in the guild', async () => { - let chal = await otherMember.get(`/challenges/${challenge._id}`); + const chal = await otherMember.get(`/challenges/${challenge._id}`); expect(chal.name).to.equal(challenge.name); expect(chal._id).to.equal(challenge._id); expect(chal.leader).to.eql({ _id: challengeLeader._id, id: challengeLeader._id, - profile: {name: challengeLeader.profile.name}, + profile: { name: challengeLeader.profile.name }, auth: { local: { username: challengeLeader.auth.local.username, @@ -139,14 +139,14 @@ describe('GET /challenges/:challengeId', () => { await challengeLeader.sync(); expect(challengeLeader.guilds).to.be.empty; // check that leaving worked - let chal = await challengeLeader.get(`/challenges/${challenge._id}`); + const chal = await challengeLeader.get(`/challenges/${challenge._id}`); expect(chal.name).to.equal(challenge.name); expect(chal._id).to.equal(challenge._id); expect(chal.leader).to.eql({ _id: challengeLeader._id, id: challengeLeader._id, - profile: {name: challengeLeader.profile.name}, + profile: { name: challengeLeader.profile.name }, auth: { local: { username: challengeLeader.auth.local.username, @@ -171,8 +171,8 @@ describe('GET /challenges/:challengeId', () => { beforeEach(async () => { nonMember = await generateUser(); - let populatedGroup = await createAndPopulateGroup({ - groupDetails: {type: 'party', privacy: 'private'}, + const populatedGroup = await createAndPopulateGroup({ + groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -180,8 +180,8 @@ describe('GET /challenges/:challengeId', () => { group = populatedGroup.group; members = populatedGroup.members; - challengeLeader = members[0]; - otherMember = members[1]; + challengeLeader = members[0]; // eslint-disable-line prefer-destructuring + otherMember = members[1]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(challengeLeader, group); }); @@ -195,14 +195,14 @@ describe('GET /challenges/:challengeId', () => { }); it('returns challenge data for any user in the party', async () => { - let chal = await otherMember.get(`/challenges/${challenge._id}`); + const chal = await otherMember.get(`/challenges/${challenge._id}`); expect(chal.name).to.equal(challenge.name); expect(chal._id).to.equal(challenge._id); expect(chal.leader).to.eql({ _id: challengeLeader._id, id: challengeLeader._id, - profile: {name: challengeLeader.profile.name}, + profile: { name: challengeLeader.profile.name }, auth: { local: { username: challengeLeader.auth.local.username, @@ -229,14 +229,14 @@ describe('GET /challenges/:challengeId', () => { await challengeLeader.sync(); expect(challengeLeader.party._id).to.be.undefined; // check that leaving worked - let chal = await challengeLeader.get(`/challenges/${challenge._id}`); + const chal = await challengeLeader.get(`/challenges/${challenge._id}`); expect(chal.name).to.equal(challenge.name); expect(chal._id).to.equal(challenge._id); expect(chal.leader).to.eql({ _id: challengeLeader._id, id: challengeLeader._id, - profile: {name: challengeLeader.profile.name}, + profile: { name: challengeLeader.profile.name }, auth: { local: { username: challengeLeader.auth.local.username, diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js index 03702d5063..9fca02088e 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, createAndPopulateGroup, @@ -5,7 +6,6 @@ import { translate as t, sleep, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /challenges/:challengeId/export/csv', () => { let groupLeader; @@ -15,7 +15,7 @@ describe('GET /challenges/:challengeId/export/csv', () => { let user; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 3, }); @@ -30,8 +30,8 @@ describe('GET /challenges/:challengeId/export/csv', () => { await members[2].post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: 'Task 1'}, - {type: 'todo', text: 'Task 2'}, + { type: 'habit', text: 'Task 1' }, + { type: 'todo', text: 'Task 2' }, ]); await sleep(0.5); // Make sure tasks are synced to the users await members[0].sync(); @@ -74,7 +74,7 @@ describe('GET /challenges/:challengeId/export/csv', () => { }); it('should successfully return when it contains erroneous residue user data', async () => { - await members[0].update({challenges: []}); + await members[0].update({ challenges: [] }); const res = await members[1].get(`/challenges/${challenge._id}/export/csv`); const sortedMembers = _.sortBy([members[1], members[2], groupLeader], '_id'); const splitRes = res.split('\n'); diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js index 97ed8236fc..776f0db1b0 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, @@ -5,7 +6,6 @@ import { generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /challenges/:challengeId/members', () => { let user; @@ -31,9 +31,9 @@ describe('GET /challenges/:challengeId/members', () => { }); it('fails if user isn\'t in the private group and isn\'t challenge leader', async () => { - let group = await generateGroup(user, {type: 'party', privacy: 'private'}); - let challenge = await generateChallenge(user, group); - let anotherUser = await generateUser(); + const group = await generateGroup(user, { type: 'party', privacy: 'private' }); + const challenge = await generateChallenge(user, group); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/challenges/${challenge._id}/members`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -43,23 +43,23 @@ describe('GET /challenges/:challengeId/members', () => { }); it('works if user isn\'t in the private group but is challenge leader', async () => { - let populatedGroup = await createAndPopulateGroup({ - groupDetails: {type: 'party', privacy: 'private'}, + const populatedGroup = await createAndPopulateGroup({ + groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - let groupLeader = populatedGroup.groupLeader; - let challengeLeader = populatedGroup.members[0]; - let challenge = await generateChallenge(challengeLeader, populatedGroup.group); + const { groupLeader } = populatedGroup; + const challengeLeader = populatedGroup.members[0]; + const challenge = await generateChallenge(challengeLeader, populatedGroup.group); await groupLeader.post(`/challenges/${challenge._id}/join`); await challengeLeader.post('/groups/party/leave'); await challengeLeader.sync(); expect(challengeLeader.party._id).to.be.undefined; // check that leaving worked - let res = await challengeLeader.get(`/challenges/${challenge._id}/members`); + const res = await challengeLeader.get(`/challenges/${challenge._id}/members`); expect(res[0]).to.eql({ _id: groupLeader._id, id: groupLeader._id, - profile: {name: groupLeader.profile.name}, + profile: { name: groupLeader.profile.name }, auth: { local: { username: groupLeader.auth.local.username, @@ -72,15 +72,15 @@ describe('GET /challenges/:challengeId/members', () => { }); it('works with challenges belonging to public guild', async () => { - let leader = await generateUser({balance: 4}); - let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); - let challenge = await generateChallenge(leader, group); + const leader = await generateUser({ balance: 4 }); + const group = await generateGroup(leader, { type: 'guild', privacy: 'public', name: generateUUID() }); + const challenge = await generateChallenge(leader, group); await leader.post(`/challenges/${challenge._id}/join`); - let res = await user.get(`/challenges/${challenge._id}/members`); + const res = await user.get(`/challenges/${challenge._id}/members`); expect(res[0]).to.eql({ _id: leader._id, id: leader._id, - profile: {name: leader.profile.name}, + profile: { name: leader.profile.name }, auth: { local: { username: leader.auth.local.username, @@ -95,15 +95,15 @@ describe('GET /challenges/:challengeId/members', () => { }); it('populates only some fields', async () => { - let anotherUser = await generateUser({balance: 3}); - let group = await generateGroup(anotherUser, {type: 'guild', privacy: 'public', name: generateUUID()}); - let challenge = await generateChallenge(anotherUser, group); + const anotherUser = await generateUser({ balance: 3 }); + const group = await generateGroup(anotherUser, { type: 'guild', privacy: 'public', name: generateUUID() }); + const challenge = await generateChallenge(anotherUser, group); await anotherUser.post(`/challenges/${challenge._id}/join`); - let res = await user.get(`/challenges/${challenge._id}/members`); + const res = await user.get(`/challenges/${challenge._id}/members`); expect(res[0]).to.eql({ _id: anotherUser._id, id: anotherUser._id, - profile: {name: anotherUser.profile.name}, + profile: { name: anotherUser.profile.name }, auth: { local: { username: anotherUser.auth.local.username, @@ -118,17 +118,17 @@ describe('GET /challenges/:challengeId/members', () => { }); it('returns only first 30 members if req.query.includeAllMembers is not true', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let usersToGenerate = []; - for (let i = 0; i < 31; i++) { - usersToGenerate.push(generateUser({challenges: [challenge._id]})); + const usersToGenerate = []; + for (let i = 0; i < 31; i += 1) { + usersToGenerate.push(generateUser({ challenges: [challenge._id] })); } await Promise.all(usersToGenerate); - let res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=not-true`); + const res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=not-true`); expect(res.length).to.equal(30); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -137,17 +137,17 @@ describe('GET /challenges/:challengeId/members', () => { }); it('returns only first 30 members if req.query.includeAllMembers is not defined', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let usersToGenerate = []; - for (let i = 0; i < 31; i++) { - usersToGenerate.push(generateUser({challenges: [challenge._id]})); + const usersToGenerate = []; + for (let i = 0; i < 31; i += 1) { + usersToGenerate.push(generateUser({ challenges: [challenge._id] })); } await Promise.all(usersToGenerate); - let res = await user.get(`/challenges/${challenge._id}/members`); + const res = await user.get(`/challenges/${challenge._id}/members`); expect(res.length).to.equal(30); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -156,17 +156,17 @@ describe('GET /challenges/:challengeId/members', () => { }); it('returns all members if req.query.includeAllMembers is true', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let usersToGenerate = []; - for (let i = 0; i < 31; i++) { - usersToGenerate.push(generateUser({challenges: [challenge._id]})); + const usersToGenerate = []; + for (let i = 0; i < 31; i += 1) { + usersToGenerate.push(generateUser({ challenges: [challenge._id] })); } await Promise.all(usersToGenerate); - let res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=true`); + const res = await user.get(`/challenges/${challenge._id}/members?includeAllMembers=true`); expect(res.length).to.equal(32); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -174,47 +174,48 @@ describe('GET /challenges/:challengeId/members', () => { }); }); - it('supports using req.query.lastId to get more members', async function () { + it('supports using req.query.lastId to get more members', async function test () { this.timeout(30000); // @TODO: times out after 8 seconds - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let usersToGenerate = []; - for (let i = 0; i < 57; i++) { - usersToGenerate.push(generateUser({challenges: [challenge._id]})); + const usersToGenerate = []; + for (let i = 0; i < 57; i += 1) { + usersToGenerate.push(generateUser({ challenges: [challenge._id] })); } - let generatedUsers = await Promise.all(usersToGenerate); // Group has 59 members (1 is the leader) - let expectedIds = [user._id].concat(generatedUsers.map(generatedUser => generatedUser._id)); + // Group has 59 members (1 is the leader) + const generatedUsers = await Promise.all(usersToGenerate); + const expectedIds = [user._id].concat(generatedUsers.map(generatedUser => generatedUser._id)); - let res = await user.get(`/challenges/${challenge._id}/members`); + const res = await user.get(`/challenges/${challenge._id}/members`); expect(res.length).to.equal(30); - let res2 = await user.get(`/challenges/${challenge._id}/members?lastId=${res[res.length - 1]._id}`); + const res2 = await user.get(`/challenges/${challenge._id}/members?lastId=${res[res.length - 1]._id}`); expect(res2.length).to.equal(28); - let resIds = res.concat(res2).map(member => member._id); + const resIds = res.concat(res2).map(member => member._id); expect(resIds).to.eql(expectedIds.sort()); }); it('supports using req.query.search to get search members', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let usersToGenerate = []; - for (let i = 0; i < 3; i++) { + const usersToGenerate = []; + for (let i = 0; i < 3; i += 1) { usersToGenerate.push(generateUser({ challenges: [challenge._id], 'profile.name': `${i}profilename`, })); } - let generatedUsers = await Promise.all(usersToGenerate); - let profileNames = generatedUsers.map(generatedUser => generatedUser.profile.name); + const generatedUsers = await Promise.all(usersToGenerate); + const profileNames = generatedUsers.map(generatedUser => generatedUser.profile.name); - let firstProfileName = profileNames[0]; - let nameToSearch = firstProfileName.substring(0, 4); + const firstProfileName = profileNames[0]; + const nameToSearch = firstProfileName.substring(0, 4); - let response = await user.get(`/challenges/${challenge._id}/members?search=${nameToSearch}`); + const response = await user.get(`/challenges/${challenge._id}/members?search=${nameToSearch}`); expect(response[0].profile.name).to.eql(firstProfileName); }); }); diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js index eef16de7e1..98455f66d3 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateChallenge, generateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /challenges/:challengeId/members/:memberId', () => { let user; @@ -30,16 +30,16 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { }); it('fails if member doesn\'t exists', async () => { - let userId = generateUUID(); + const userId = generateUUID(); await expect(user.get(`/challenges/${generateUUID()}/members/${userId}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId}), + message: t('userWithIDNotFound', { userId }), }); }); it('fails if challenge doesn\'t exists', async () => { - let member = await generateUser(); + const member = await generateUser(); await expect(user.get(`/challenges/${generateUUID()}/members/${member._id}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -48,11 +48,11 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { }); it('fails if user doesn\'t have access to the challenge', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let anotherUser = await generateUser(); - let member = await generateUser(); + const anotherUser = await generateUser(); + const member = await generateUser(); await expect(anotherUser.get(`/challenges/${challenge._id}/members/${member._id}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -61,10 +61,10 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { }); it('fails if member is not part of the challenge', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let member = await generateUser(); + const member = await generateUser(); await expect(user.get(`/challenges/${challenge._id}/members/${member._id}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -73,37 +73,37 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { }); it('works with challenges belonging to a public guild', async () => { - let groupLeader = await generateUser({balance: 4}); - let group = await generateGroup(groupLeader, {type: 'guild', privacy: 'public', name: generateUUID()}); - let challenge = await generateChallenge(groupLeader, group); + const groupLeader = await generateUser({ balance: 4 }); + const group = await generateGroup(groupLeader, { type: 'guild', privacy: 'public', name: generateUUID() }); + const challenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${challenge._id}/join`); - let taskText = 'Test Text'; - await groupLeader.post(`/tasks/challenge/${challenge._id}`, [{type: 'habit', text: taskText}]); + const taskText = 'Test Text'; + await groupLeader.post(`/tasks/challenge/${challenge._id}`, [{ type: 'habit', text: taskText }]); - let memberProgress = await user.get(`/challenges/${challenge._id}/members/${groupLeader._id}`); + const memberProgress = await user.get(`/challenges/${challenge._id}/members/${groupLeader._id}`); expect(memberProgress).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile', 'tasks']); expect(memberProgress.profile).to.have.all.keys(['name']); expect(memberProgress.tasks.length).to.equal(1); }); it('returns the member tasks for the challenges', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - await user.post(`/tasks/challenge/${challenge._id}`, [{type: 'habit', text: 'Test Text'}]); + await user.post(`/tasks/challenge/${challenge._id}`, [{ type: 'habit', text: 'Test Text' }]); - let memberProgress = await user.get(`/challenges/${challenge._id}/members/${user._id}`); - let chalTasks = await user.get(`/tasks/challenge/${challenge._id}`); + const memberProgress = await user.get(`/challenges/${challenge._id}/members/${user._id}`); + const chalTasks = await user.get(`/tasks/challenge/${challenge._id}`); expect(memberProgress.tasks.length).to.equal(chalTasks.length); expect(memberProgress.tasks[0].challenge.id).to.equal(challenge._id); expect(memberProgress.tasks[0].challenge.taskId).to.equal(chalTasks[0]._id); }); it('returns the tasks without the tags and checklist', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let challenge = await generateChallenge(user, group); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); - let taskText = 'Test Text'; + const taskText = 'Test Text'; await user.post(`/tasks/challenge/${challenge._id}`, [{ type: 'todo', text: taskText, @@ -115,7 +115,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { ], }]); - let memberProgress = await user.get(`/challenges/${challenge._id}/members/${user._id}`); + const memberProgress = await user.get(`/challenges/${challenge._id}/members/${user._id}`); expect(memberProgress.tasks[0]).not.to.have.key('tags'); expect(memberProgress.tasks[0].checklist).to.eql([]); }); diff --git a/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js b/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js index 9fc903c925..19ee8798c9 100644 --- a/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js @@ -8,10 +8,11 @@ import { TAVERN_ID } from '../../../../../website/common/script/constants'; describe('GET challenges/groups/:groupId', () => { context('Public Guild', () => { - let publicGuild, user, nonMember, challenge, challenge2; + let publicGuild; let user; let nonMember; let challenge; let + challenge2; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', @@ -31,14 +32,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return group challenges for non member with populated leader', async () => { - let challenges = await nonMember.get(`/challenges/groups/${publicGuild._id}`); + const challenges = await nonMember.get(`/challenges/groups/${publicGuild._id}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -48,12 +49,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -66,14 +67,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return group challenges for member with populated leader', async () => { - let challenges = await user.get(`/challenges/groups/${publicGuild._id}`); + const challenges = await user.get(`/challenges/groups/${publicGuild._id}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -83,12 +84,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -106,7 +107,7 @@ describe('GET challenges/groups/:groupId', () => { let foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id }); expect(foundChallengeIndex).to.eql(0); - let newChallenge = await generateChallenge(user, publicGuild); + const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); @@ -117,10 +118,11 @@ describe('GET challenges/groups/:groupId', () => { }); context('Private Guild', () => { - let privateGuild, user, nonMember, challenge, challenge2; + let privateGuild; let user; let nonMember; let challenge; let + challenge2; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestPrivateGuild', type: 'guild', @@ -149,14 +151,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return group challenges for member with populated leader', async () => { - let challenges = await user.get(`/challenges/groups/${privateGuild._id}`); + const challenges = await user.get(`/challenges/groups/${privateGuild._id}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: privateGuild.leader._id, id: privateGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -166,12 +168,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: privateGuild.leader._id, id: privateGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -185,10 +187,11 @@ describe('GET challenges/groups/:groupId', () => { }); context('official challenge is present', () => { - let publicGuild, user, officialChallenge, challenge, challenge2; + let publicGuild; let user; let officialChallenge; let challenge; let + challenge2; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', @@ -218,9 +221,9 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return official challenges first', async () => { - let challenges = await user.get(`/challenges/groups/${publicGuild._id}`); + const challenges = await user.get(`/challenges/groups/${publicGuild._id}`); - let foundChallengeIndex = _.findIndex(challenges, { _id: officialChallenge._id }); + const foundChallengeIndex = _.findIndex(challenges, { _id: officialChallenge._id }); expect(foundChallengeIndex).to.eql(0); }); @@ -233,7 +236,7 @@ describe('GET challenges/groups/:groupId', () => { foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id }); expect(foundChallengeIndex).to.eql(1); - let newChallenge = await generateChallenge(user, publicGuild); + const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); @@ -244,10 +247,11 @@ describe('GET challenges/groups/:groupId', () => { }); context('Party', () => { - let party, user, nonMember, challenge, challenge2; + let party; let user; let nonMember; let challenge; let + challenge2; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestParty', type: 'party', @@ -275,14 +279,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return group challenges for member with populated leader', async () => { - let challenges = await user.get(`/challenges/groups/${party._id}`); + const challenges = await user.get(`/challenges/groups/${party._id}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: party.leader._id, id: party.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -292,12 +296,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: party.leader._id, id: party.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -310,14 +314,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return group challenges for member using ID "party"', async () => { - let challenges = await user.get('/challenges/groups/party'); + const challenges = await user.get('/challenges/groups/party'); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: party.leader._id, id: party.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -327,12 +331,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: party.leader._id, id: party.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -346,28 +350,29 @@ describe('GET challenges/groups/:groupId', () => { }); context('Tavern', () => { - let tavern, user, challenge, challenge2; + let tavern; let user; let challenge; let + challenge2; before(async () => { user = await generateUser(); - await user.update({balance: 0.5}); + await user.update({ balance: 0.5 }); tavern = await user.get(`/groups/${TAVERN_ID}`); - challenge = await generateChallenge(user, tavern, {prize: 1}); + challenge = await generateChallenge(user, tavern, { prize: 1 }); await user.post(`/challenges/${challenge._id}/join`); - challenge2 = await generateChallenge(user, tavern, {prize: 1}); + challenge2 = await generateChallenge(user, tavern, { prize: 1 }); await user.post(`/challenges/${challenge2._id}/join`); }); it('should return tavern challenges with populated leader', async () => { - let challenges = await user.get(`/challenges/groups/${TAVERN_ID}`); + const challenges = await user.get(`/challenges/groups/${TAVERN_ID}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -377,12 +382,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -395,14 +400,14 @@ describe('GET challenges/groups/:groupId', () => { }); it('should return tavern challenges using ID "habitrpg', async () => { - let challenges = await user.get('/challenges/groups/habitrpg'); + const challenges = await user.get('/challenges/groups/habitrpg'); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -412,12 +417,12 @@ describe('GET challenges/groups/:groupId', () => { verifiedUsername: true, }, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, diff --git a/test/api/v3/integration/challenges/GET-challenges_user.test.js b/test/api/v3/integration/challenges/GET-challenges_user.test.js index c42510f640..abb7b32804 100644 --- a/test/api/v3/integration/challenges/GET-challenges_user.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_user.test.js @@ -6,10 +6,11 @@ import { describe('GET challenges/user', () => { context('no official challenges', () => { - let user, member, nonMember, challenge, challenge2, publicGuild; + let user; let member; let nonMember; let challenge; let challenge2; let + publicGuild; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', @@ -20,7 +21,7 @@ describe('GET challenges/user', () => { user = groupLeader; publicGuild = group; - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring nonMember = await generateUser(); challenge = await generateChallenge(user, group); @@ -32,14 +33,14 @@ describe('GET challenges/user', () => { it('should return challenges user has joined', async () => { await nonMember.post(`/challenges/${challenge._id}/join`); - let challenges = await nonMember.get('/challenges/user'); + const challenges = await nonMember.get('/challenges/user'); - let foundChallenge = _.find(challenges, { _id: challenge._id }); + const foundChallenge = _.find(challenges, { _id: challenge._id }); expect(foundChallenge).to.exist; expect(foundChallenge.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -62,14 +63,14 @@ describe('GET challenges/user', () => { }); it('should return challenges user has created', async () => { - let challenges = await user.get('/challenges/user'); + const challenges = await user.get('/challenges/user'); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -89,12 +90,12 @@ describe('GET challenges/user', () => { summary: publicGuild.name, leader: publicGuild.leader._id, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -117,14 +118,14 @@ describe('GET challenges/user', () => { }); it('should return challenges in user\'s group', async () => { - let challenges = await member.get('/challenges/user'); + const challenges = await member.get('/challenges/user'); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -144,12 +145,12 @@ describe('GET challenges/user', () => { summary: publicGuild.name, leader: publicGuild.leader._id, }); - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -172,12 +173,12 @@ describe('GET challenges/user', () => { }); it('should not return challenges in user groups if we send member true param', async () => { - let challenges = await member.get(`/challenges/user?member=${true}`); + const challenges = await member.get(`/challenges/user?member=${true}`); - let foundChallenge1 = _.find(challenges, { _id: challenge._id }); + const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.not.exist; - let foundChallenge2 = _.find(challenges, { _id: challenge2._id }); + const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.not.exist; }); @@ -187,7 +188,7 @@ describe('GET challenges/user', () => { let foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id }); expect(foundChallengeIndex).to.eql(0); - let newChallenge = await generateChallenge(user, publicGuild); + const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get('/challenges/user'); @@ -197,7 +198,7 @@ describe('GET challenges/user', () => { }); it('should not return challenges user doesn\'t have access to', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestPrivateGuild', summary: 'summary for TestPrivateGuild', @@ -206,17 +207,17 @@ describe('GET challenges/user', () => { }, }); - let privateChallenge = await generateChallenge(groupLeader, group); + const privateChallenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${privateChallenge._id}/join`); - let challenges = await nonMember.get('/challenges/user'); + const challenges = await nonMember.get('/challenges/user'); - let foundChallenge = _.find(challenges, { _id: privateChallenge._id }); + const foundChallenge = _.find(challenges, { _id: privateChallenge._id }); expect(foundChallenge).to.not.exist; }); it('should not return challenges user doesn\'t have access to, even with query parameters', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestPrivateGuild', summary: 'summary for TestPrivateGuild', @@ -225,24 +226,27 @@ describe('GET challenges/user', () => { }, }); - let privateChallenge = await generateChallenge(groupLeader, group, {categories: [{ - name: 'academics', - slug: 'academics', - }]}); + const privateChallenge = await generateChallenge(groupLeader, group, { + categories: [{ + name: 'academics', + slug: 'academics', + }], + }); await groupLeader.post(`/challenges/${privateChallenge._id}/join`); - let challenges = await nonMember.get('/challenges/user?categories=academics&owned=not_owned'); + const challenges = await nonMember.get('/challenges/user?categories=academics&owned=not_owned'); - let foundChallenge = _.find(challenges, { _id: privateChallenge._id }); + const foundChallenge = _.find(challenges, { _id: privateChallenge._id }); expect(foundChallenge).to.not.exist; }); }); context('official challenge is present', () => { - let user, officialChallenge, challenge, challenge2, publicGuild; + let user; let officialChallenge; let challenge; let challenge2; let + publicGuild; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', summary: 'summary for TestGuild', @@ -273,9 +277,9 @@ describe('GET challenges/user', () => { }); it('should return official challenges first', async () => { - let challenges = await user.get('/challenges/user'); + const challenges = await user.get('/challenges/user'); - let foundChallengeIndex = _.findIndex(challenges, { _id: officialChallenge._id }); + const foundChallengeIndex = _.findIndex(challenges, { _id: officialChallenge._id }); expect(foundChallengeIndex).to.eql(0); }); @@ -288,7 +292,7 @@ describe('GET challenges/user', () => { foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id }); expect(foundChallengeIndex).to.eql(1); - let newChallenge = await generateChallenge(user, publicGuild); + const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get('/challenges/user'); @@ -299,14 +303,15 @@ describe('GET challenges/user', () => { }); context('filters and paging', () => { - let user, guild, member; + let user; let guild; let + member; const categories = [{ slug: 'newCat', name: 'New Category', }]; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', @@ -317,9 +322,9 @@ describe('GET challenges/user', () => { user = groupLeader; guild = group; - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring - await user.update({balance: 20}); + await user.update({ balance: 20 }); for (let i = 0; i < 11; i += 1) { let challenge = await generateChallenge(user, group); // eslint-disable-line @@ -328,7 +333,7 @@ describe('GET challenges/user', () => { }); it('returns public guilds filtered by category', async () => { - const categoryChallenge = await generateChallenge(user, guild, {categories}); + const categoryChallenge = await generateChallenge(user, guild, { categories }); await user.post(`/challenges/${categoryChallenge._id}/join`); const challenges = await user.get(`/challenges/user?categories=${categories[0].slug}`); diff --git a/test/api/v3/integration/challenges/POST-challenges.test.js b/test/api/v3/integration/challenges/POST-challenges.test.js index b53c3750b1..23475c1f23 100644 --- a/test/api/v3/integration/challenges/POST-challenges.test.js +++ b/test/api/v3/integration/challenges/POST-challenges.test.js @@ -1,13 +1,13 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /challenges', () => { it('returns error when group is empty', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post('/challenges')).to.eventually.be.rejected.and.eql({ code: 400, @@ -17,7 +17,7 @@ describe('POST /challenges', () => { }); it('returns error when groupId is not for a valid group', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post('/challenges', { group: generateUUID(), @@ -29,7 +29,7 @@ describe('POST /challenges', () => { }); it('returns error when creating a challenge in the tavern with no prize', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post('/challenges', { group: 'habitrpg', @@ -42,8 +42,8 @@ describe('POST /challenges', () => { }); it('returns error when creating a challenge in a public guild and you are not a member of it', async () => { - let user = await generateUser(); - let { group } = await createAndPopulateGroup({ + const user = await generateUser(); + const { group } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -66,7 +66,7 @@ describe('POST /challenges', () => { let groupMember; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 1, leaderDetails: { balance: 3, @@ -81,7 +81,7 @@ describe('POST /challenges', () => { groupLeader = await populatedGroup.groupLeader.sync(); group = populatedGroup.group; - groupMember = populatedGroup.members[0]; + groupMember = populatedGroup.members[0]; // eslint-disable-line prefer-destructuring }); it('returns an error when non-leader member creates a challenge in leaderOnly group', async () => { @@ -95,14 +95,14 @@ describe('POST /challenges', () => { }); it('allows non-leader member to create a challenge', async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 1, }); group = populatedGroup.group; - groupMember = populatedGroup.members[0]; + groupMember = populatedGroup.members[0]; // eslint-disable-line prefer-destructuring - let chal = await groupMember.post('/challenges', { + const chal = await groupMember.post('/challenges', { group: group._id, name: 'Test Challenge', shortName: 'TC Label', @@ -110,13 +110,13 @@ describe('POST /challenges', () => { expect(chal.leader).to.eql({ _id: groupMember._id, - profile: {name: groupMember.profile.name}, + profile: { name: groupMember.profile.name }, }); }); it('doesn\'t take gems from user or group when challenge has no prize', async () => { - let oldUserBalance = groupLeader.balance; - let oldGroupBalance = group.balance; + const oldUserBalance = groupLeader.balance; + const oldGroupBalance = group.balance; await groupLeader.post('/challenges', { group: group._id, @@ -143,9 +143,9 @@ describe('POST /challenges', () => { }); it('takes prize out of group if it has sufficient funds', async () => { - let oldUserBalance = groupLeader.balance; - let oldGroupBalance = group.balance; - let prize = 4; + const oldUserBalance = groupLeader.balance; + const oldGroupBalance = group.balance; + const prize = 4; await groupLeader.post('/challenges', { group: group._id, @@ -159,8 +159,8 @@ describe('POST /challenges', () => { }); it('takes prize out of both group and user if group doesn\'t have enough', async () => { - let oldUserBalance = groupLeader.balance; - let prize = 8; + const oldUserBalance = groupLeader.balance; + const prize = 8; await groupLeader.post('/challenges', { group: group._id, @@ -170,14 +170,14 @@ describe('POST /challenges', () => { }); await expect(group.sync()).to.eventually.have.property('balance', 0); - await expect(groupLeader.sync()).to.eventually.have.property('balance', oldUserBalance - (prize / 4 - 1)); + await expect(groupLeader.sync()).to.eventually.have.property('balance', oldUserBalance - (prize / 4 - 1)); }); it('takes prize out of user if group has no balance', async () => { - let oldUserBalance = groupLeader.balance; - let prize = 8; + const oldUserBalance = groupLeader.balance; + const prize = 8; - await group.update({ balance: 0}); + await group.update({ balance: 0 }); await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', @@ -190,7 +190,7 @@ describe('POST /challenges', () => { }); it('increases challenge count of group', async () => { - let oldChallengeCount = group.challengeCount; + const oldChallengeCount = group.challengeCount; await groupLeader.post('/challenges', { group: group._id, @@ -208,7 +208,7 @@ describe('POST /challenges', () => { }, }); - let challenge = await groupLeader.post('/challenges', { + const challenge = await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', shortName: 'TC Label', @@ -219,7 +219,7 @@ describe('POST /challenges', () => { }); it('doesn\'t set challenge as official if official flag is set by non-admin', async () => { - let challenge = await groupLeader.post('/challenges', { + const challenge = await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', shortName: 'TC Label', @@ -230,9 +230,9 @@ describe('POST /challenges', () => { }); it('returns an error when challenge validation fails; doesn\'s save user or group', async () => { - let oldChallengeCount = group.challengeCount; - let oldUserBalance = groupLeader.balance; - let oldGroupBalance = group.balance; + const oldChallengeCount = group.challengeCount; + const oldUserBalance = groupLeader.balance; + const oldGroupBalance = group.balance; await expect(groupLeader.post('/challenges', { group: group._id, @@ -252,12 +252,12 @@ describe('POST /challenges', () => { }); it('sets all properites of the challenge as passed', async () => { - let name = 'Test Challenge'; - let shortName = 'TC Label'; - let description = 'Test Description'; - let prize = 4; + const name = 'Test Challenge'; + const shortName = 'TC Label'; + const description = 'Test Description'; + const prize = 4; - let challenge = await groupLeader.post('/challenges', { + const challenge = await groupLeader.post('/challenges', { group: group._id, name, shortName, @@ -267,7 +267,7 @@ describe('POST /challenges', () => { expect(challenge.leader).to.eql({ _id: groupLeader._id, - profile: {name: groupLeader.profile.name}, + profile: { name: groupLeader.profile.name }, }); expect(challenge.name).to.eql(name); expect(challenge.shortName).to.eql(shortName); diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js index 8385d63e36..fad086cd4f 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js @@ -1,14 +1,14 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateChallenge, createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /challenges/:challengeId/join', () => { it('returns error when challengeId is not a valid UUID', async () => { - let user = await generateUser({ balance: 1}); + const user = await generateUser({ balance: 1 }); await expect(user.post('/challenges/test/join')).to.eventually.be.rejected.and.eql({ code: 400, @@ -18,7 +18,7 @@ describe('POST /challenges/:challengeId/join', () => { }); it('returns error when challengeId is not for a valid challenge', async () => { - let user = await generateUser({ balance: 1}); + const user = await generateUser({ balance: 1 }); await expect(user.post(`/challenges/${generateUUID()}/join`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -34,20 +34,20 @@ describe('POST /challenges/:challengeId/join', () => { let authorizedUser; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 1, }); groupLeader = populatedGroup.groupLeader; group = populatedGroup.group; - authorizedUser = populatedGroup.members[0]; + authorizedUser = populatedGroup.members[0]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${challenge._id}/join`); }); it('returns an error when user isn\'t in the private group and isn\'t challenge leader', async () => { - let unauthorizedUser = await generateUser(); + const unauthorizedUser = await generateUser(); await expect(unauthorizedUser.post(`/challenges/${challenge._id}/join`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -62,12 +62,12 @@ describe('POST /challenges/:challengeId/join', () => { await groupLeader.sync(); expect(groupLeader.guilds).to.be.empty; // check that leaving worked - let res = await groupLeader.post(`/challenges/${challenge._id}/join`); + const res = await groupLeader.post(`/challenges/${challenge._id}/join`); expect(res.name).to.equal(challenge.name); }); it('returns challenge data', async () => { - let res = await authorizedUser.post(`/challenges/${challenge._id}/join`); + const res = await authorizedUser.post(`/challenges/${challenge._id}/join`); expect(res.group).to.eql({ _id: group._id, @@ -78,7 +78,7 @@ describe('POST /challenges/:challengeId/join', () => { expect(res.leader).to.eql({ _id: groupLeader._id, id: groupLeader._id, - profile: {name: groupLeader.profile.name}, + profile: { name: groupLeader.profile.name }, auth: { local: { username: groupLeader.auth.local.username, @@ -111,7 +111,7 @@ describe('POST /challenges/:challengeId/join', () => { it('increases memberCount of challenge', async () => { await challenge.sync(); - let oldMemberCount = challenge.memberCount; + const oldMemberCount = challenge.memberCount; await authorizedUser.post(`/challenges/${challenge._id}/join`); @@ -123,15 +123,13 @@ describe('POST /challenges/:challengeId/join', () => { it('syncs challenge tasks to joining user', async () => { const taskText = 'A challenge task text'; await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'daily', text: taskText}, + { type: 'daily', text: taskText }, ]); await authorizedUser.post(`/challenges/${challenge._id}/join`); const tasks = await authorizedUser.get('/tasks/user'); - const syncedTask = tasks.find((task) => { - return task.text === taskText; - }); + const syncedTask = tasks.find(task => task.text === taskText); expect(syncedTask.text).to.eql(taskText); expect(syncedTask.isDue).to.exist; @@ -139,7 +137,7 @@ describe('POST /challenges/:challengeId/join', () => { }); it('adds challenge tag to user tags', async () => { - let userTagsLength = (await authorizedUser.get('/tags')).length; + const userTagsLength = (await authorizedUser.get('/tags')).length; await authorizedUser.post(`/challenges/${challenge._id}/join`); diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js index 080f7a92ef..c6304151a1 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js @@ -1,14 +1,14 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateChallenge, createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /challenges/:challengeId/leave', () => { it('returns error when challengeId is not a valid UUID', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post('/challenges/test/leave')).to.eventually.be.rejected.and.eql({ code: 400, @@ -18,7 +18,7 @@ describe('POST /challenges/:challengeId/leave', () => { }); it('returns error when challengeId is not for a valid challenge', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post(`/challenges/${generateUUID()}/leave`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -37,15 +37,15 @@ describe('POST /challenges/:challengeId/leave', () => { let taskText; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 3, }); groupLeader = populatedGroup.groupLeader; group = populatedGroup.group; - leavingUser = populatedGroup.members[0]; - notInChallengeUser = populatedGroup.members[1]; - notInGroupLeavingUser = populatedGroup.members[2]; + leavingUser = populatedGroup.members[0]; // eslint-disable-line prefer-destructuring + notInChallengeUser = populatedGroup.members[1]; // eslint-disable-line prefer-destructuring + notInGroupLeavingUser = populatedGroup.members[2]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${challenge._id}/join`); @@ -53,7 +53,7 @@ describe('POST /challenges/:challengeId/leave', () => { taskText = 'A challenge task text'; await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: taskText}, + { type: 'habit', text: taskText }, ]); await leavingUser.post(`/challenges/${challenge._id}/join`); @@ -87,7 +87,7 @@ describe('POST /challenges/:challengeId/leave', () => { }); it('decreases memberCount of challenge', async () => { - let oldMemberCount = challenge.memberCount; + const oldMemberCount = challenge.memberCount; await leavingUser.post(`/challenges/${challenge._id}/leave`); @@ -100,10 +100,8 @@ describe('POST /challenges/:challengeId/leave', () => { await leavingUser.post(`/challenges/${challenge._id}/leave`, { keep: 'remove-all', }); - let tasks = await leavingUser.get('/tasks/user'); - let tasksTexts = tasks.map((task) => { - return task.text; - }); + const tasks = await leavingUser.get('/tasks/user'); + const tasksTexts = tasks.map(task => task.text); expect(tasksTexts).to.not.include(taskText); }); @@ -113,10 +111,8 @@ describe('POST /challenges/:challengeId/leave', () => { keep: 'test', }); - let tasks = await leavingUser.get('/tasks/user'); - let testTask = _.find(tasks, (task) => { - return task.text === taskText; - }); + const tasks = await leavingUser.get('/tasks/user'); + const testTask = _.find(tasks, task => task.text === taskText); expect(testTask).to.not.be.undefined; }); diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js index 41c655b88c..3f3b75e7fe 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateChallenge, @@ -6,11 +7,10 @@ import { checkExistence, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /challenges/:challengeId/winner/:winnerId', () => { it('returns error when challengeId is not a valid UUID', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post(`/challenges/test/selectWinner/${user._id}`)).to.eventually.be.rejected.and.eql({ code: 400, @@ -20,7 +20,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { }); it('returns error when winnerId is not a valid UUID', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post(`/challenges/${generateUUID()}/selectWinner/test`)).to.eventually.be.rejected.and.eql({ code: 400, @@ -30,7 +30,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { }); it('returns error when challengeId is not for a valid challenge', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post(`/challenges/${generateUUID()}/selectWinner/${user._id}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -44,16 +44,16 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { let group; let challenge; let winningUser; - let taskText = 'A challenge task text'; + const taskText = 'A challenge task text'; beforeEach(async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 1, }); groupLeader = populatedGroup.groupLeader; group = populatedGroup.group; - winningUser = populatedGroup.members[0]; + winningUser = populatedGroup.members[0]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(groupLeader, group, { prize: 1, @@ -61,7 +61,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: taskText}, + { type: 'habit', text: taskText }, ]); await winningUser.post(`/challenges/${challenge._id}/join`); @@ -78,12 +78,12 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { }); it('returns an error when winning user isn\'t part of the challenge', async () => { - let notInChallengeUser = await generateUser(); + const notInChallengeUser = await generateUser(); await expect(groupLeader.post(`/challenges/${challenge._id}/selectWinner/${notInChallengeUser._id}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('winnerNotFound', {userId: notInChallengeUser._id}), + message: t('winnerNotFound', { userId: notInChallengeUser._id }), }); }); @@ -101,12 +101,13 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { await sleep(0.5); await expect(winningUser.sync()).to.eventually.have.nested.property('achievements.challenges').to.include(challenge.name); - expect(winningUser.notifications.length).to.equal(2); // 2 because winningUser just joined the challenge, which now awards an achievement + // 2 because winningUser just joined the challenge, which now awards an achievement + expect(winningUser.notifications.length).to.equal(2); expect(winningUser.notifications[1].type).to.equal('WON_CHALLENGE'); }); it('gives winner gems as reward', async () => { - let oldBalance = winningUser.balance; + const oldBalance = winningUser.balance; await groupLeader.post(`/challenges/${challenge._id}/selectWinner/${winningUser._id}`); @@ -116,8 +117,8 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { }); it('doesn\'t gives winner gems if group policy prevents it', async () => { - let oldBalance = winningUser.balance; - let oldLeaderBalance = (await groupLeader.sync()).balance; + const oldBalance = winningUser.balance; + const oldLeaderBalance = (await groupLeader.sync()).balance; await winningUser.update({ 'purchased.plan.customerId': 'group-plan', @@ -136,7 +137,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { }); it('doesn\'t refund gems to group leader', async () => { - let oldBalance = (await groupLeader.sync()).balance; + const oldBalance = (await groupLeader.sync()).balance; await groupLeader.post(`/challenges/${challenge._id}/selectWinner/${winningUser._id}`); @@ -151,14 +152,10 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { await sleep(0.5); const tasks = await winningUser.get('/tasks/user'); - const testTask = _.find(tasks, (task) => { - return task.text === taskText; - }); + const testTask = _.find(tasks, task => task.text === taskText); const updatedUser = await winningUser.sync(); - const challengeTag = updatedUser.tags.find(tags => { - return tags.id === challenge._id; - }); + const challengeTag = updatedUser.tags.find(tags => tags.id === challenge._id); expect(testTask.challenge.broken).to.eql('CHALLENGE_CLOSED'); expect(testTask.challenge.winner).to.eql(winningUser.profile.name); diff --git a/test/api/v3/integration/challenges/POST_challenges_id_clone.test.js b/test/api/v3/integration/challenges/POST_challenges_id_clone.test.js index 3f2abd8a0b..6f9844b415 100644 --- a/test/api/v3/integration/challenges/POST_challenges_id_clone.test.js +++ b/test/api/v3/integration/challenges/POST_challenges_id_clone.test.js @@ -5,7 +5,7 @@ import { describe('POST /challenges/:challengeId/clone', () => { it('clones a challenge', async () => { - const user = await generateUser({balance: 10}); + const user = await generateUser({ balance: 10 }); const group = await generateGroup(user); const name = 'Test Challenge'; @@ -38,6 +38,7 @@ describe('POST /challenges/:challengeId/clone', () => { expect(cloneChallengeResponse.clonedTasks[0].text).to.eql(challengeTask.text); expect(cloneChallengeResponse.clonedTasks[0]._id).to.not.eql(challengeTask._id); - expect(cloneChallengeResponse.clonedTasks[0].challenge.id).to.eql(cloneChallengeResponse.clonedChallenge._id); + expect(cloneChallengeResponse.clonedTasks[0].challenge.id) + .to.eql(cloneChallengeResponse.clonedChallenge._id); }); }); diff --git a/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js b/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js index d5f5d88c15..6b43a220a2 100644 --- a/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js @@ -6,10 +6,11 @@ import { } from '../../../../helpers/api-integration/v3'; describe('PUT /challenges/:challengeId', () => { - let privateGuild, user, nonMember, challenge, member; + let privateGuild; let user; let nonMember; let challenge; let + member; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'TestPrivateGuild', type: 'guild', @@ -22,7 +23,7 @@ describe('PUT /challenges/:challengeId', () => { user = groupLeader; nonMember = await generateUser(); - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); @@ -48,7 +49,7 @@ describe('PUT /challenges/:challengeId', () => { }); it('only updates allowed fields', async () => { - let res = await user.put(`/challenges/${challenge._id}`, { + const res = await user.put(`/challenges/${challenge._id}`, { // ignored prize: 33, group: 'blabla', @@ -78,7 +79,7 @@ describe('PUT /challenges/:challengeId', () => { expect(res.leader).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, diff --git a/test/api/v3/integration/chat/DELETE-chat_id.test.js b/test/api/v3/integration/chat/DELETE-chat_id.test.js index 929ec790b6..58203ea94d 100644 --- a/test/api/v3/integration/chat/DELETE-chat_id.test.js +++ b/test/api/v3/integration/chat/DELETE-chat_id.test.js @@ -1,15 +1,16 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /groups/:groupId/chat/:chatId', () => { - let groupWithChat, message, user, userThatDidNotCreateChat, admin; + let groupWithChat; let message; let user; let userThatDidNotCreateChat; let + admin; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -21,12 +22,12 @@ describe('DELETE /groups/:groupId/chat/:chatId', () => { message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: 'Some message' }); message = message.message; userThatDidNotCreateChat = await generateUser(); - admin = await generateUser({'contributor.admin': true}); + admin = await generateUser({ 'contributor.admin': true }); }); context('Chat errors', () => { it('returns an error is message does not exist', async () => { - let fakeChatId = generateUUID(); + const fakeChatId = generateUUID(); await expect(user.del(`/groups/${groupWithChat._id}/chat/${fakeChatId}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -55,9 +56,9 @@ describe('DELETE /groups/:groupId/chat/:chatId', () => { await user.del(`/groups/${groupWithChat._id}/chat/${nextMessage.id}`); const returnedMessages = await user.get(`/groups/${groupWithChat._id}/chat/`); - const messageFromUser = returnedMessages.find(returnedMessage => { - return returnedMessage.id === nextMessage.id; - }); + const messageFromUser = returnedMessages.find( + returnedMessage => returnedMessage.id === nextMessage.id, + ); expect(returnedMessages).is.an('array'); expect(messageFromUser).to.not.exist; @@ -67,9 +68,9 @@ describe('DELETE /groups/:groupId/chat/:chatId', () => { await admin.del(`/groups/${groupWithChat._id}/chat/${nextMessage.id}`); const returnedMessages = await user.get(`/groups/${groupWithChat._id}/chat/`); - const messageFromUser = returnedMessages.find(returnedMessage => { - return returnedMessage.id === nextMessage.id; - }); + const messageFromUser = returnedMessages.find( + returnedMessage => returnedMessage.id === nextMessage.id, + ); expect(returnedMessages).is.an('array'); expect(messageFromUser).to.not.exist; diff --git a/test/api/v3/integration/chat/GET-chat.test.js b/test/api/v3/integration/chat/GET-chat.test.js index e3a9d17548..910b094c40 100644 --- a/test/api/v3/integration/chat/GET-chat.test.js +++ b/test/api/v3/integration/chat/GET-chat.test.js @@ -15,7 +15,7 @@ describe('GET /groups/:groupId/chat', () => { let group; before(async () => { - let leader = await generateUser({balance: 2}); + const leader = await generateUser({ balance: 2 }); group = await generateGroup(leader, { name: 'test group', @@ -23,8 +23,8 @@ describe('GET /groups/:groupId/chat', () => { privacy: 'public', }, { chat: [ - {text: 'Hello', flags: {}, id: 1}, - {text: 'Welcome to the Guild', flags: {}, id: 2}, + { text: 'Hello', flags: {}, id: 1 }, + { text: 'Welcome to the Guild', flags: {}, id: 2 }, ], }); }); @@ -41,7 +41,7 @@ describe('GET /groups/:groupId/chat', () => { let group; before(async () => { - let leader = await generateUser({balance: 2}); + const leader = await generateUser({ balance: 2 }); group = await generateGroup(leader, { name: 'test group', diff --git a/test/api/v3/integration/chat/POST-chat.flag.test.js b/test/api/v3/integration/chat/POST-chat.flag.test.js index 723715c80b..d3484452f3 100644 --- a/test/api/v3/integration/chat/POST-chat.flag.test.js +++ b/test/api/v3/integration/chat/POST-chat.flag.test.js @@ -1,24 +1,25 @@ -import { - generateUser, - translate as t, -} from '../../../../helpers/api-integration/v3'; import { find } from 'lodash'; import moment from 'moment'; import nconf from 'nconf'; import { IncomingWebhook } from '@slack/client'; +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; const BASE_URL = nconf.get('BASE_URL'); describe('POST /chat/:chatId/flag', () => { - let user, admin, anotherUser, newUser, group; + let user; let admin; let anotherUser; let newUser; let + group; const TEST_MESSAGE = 'Test Message'; const USER_AGE_FOR_FLAGGING = 3; beforeEach(async () => { - user = await generateUser({balance: 1, 'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate()}); - admin = await generateUser({balance: 1, 'contributor.admin': true}); - anotherUser = await generateUser({'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate()}); - newUser = await generateUser({'auth.timestamps.created': moment().subtract(1, 'days').toDate()}); + user = await generateUser({ balance: 1, 'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate() }); + admin = await generateUser({ balance: 1, 'contributor.admin': true }); + anotherUser = await generateUser({ 'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate() }); + newUser = await generateUser({ 'auth.timestamps.created': moment().subtract(1, 'days').toDate() }); sandbox.stub(IncomingWebhook.prototype, 'send'); group = await user.post('/groups', { @@ -42,20 +43,20 @@ describe('POST /chat/:chatId/flag', () => { }); it('Allows players to flag their own message', async () => { - let message = await user.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const message = await user.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); await expect(user.post(`/groups/${group._id}/chat/${message.message.id}/flag`)).to.eventually.be.ok; }); it('Flags a chat and sends normal message to moderator Slack when user is not new', async () => { - let { message } = await anotherUser.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await anotherUser.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); - let flagResult = await user.post(`/groups/${group._id}/chat/${message.id}/flag`); + const flagResult = await user.post(`/groups/${group._id}/chat/${message.id}/flag`); expect(flagResult.flags[user._id]).to.equal(true); expect(flagResult.flagCount).to.equal(1); - let groupWithFlags = await admin.get(`/groups/${group._id}`); + const groupWithFlags = await admin.get(`/groups/${group._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck.flags[user._id]).to.equal(true); // Slack message to mods @@ -81,16 +82,16 @@ describe('POST /chat/:chatId/flag', () => { }); it('Does not increment message flag count and sends different message to moderator Slack when user is new', async () => { - let automatedComment = `The post's flag count has not been increased because the flagger's account is less than ${USER_AGE_FOR_FLAGGING} days old.`; - let { message } = await newUser.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const automatedComment = `The post's flag count has not been increased because the flagger's account is less than ${USER_AGE_FOR_FLAGGING} days old.`; + const { message } = await newUser.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); - let flagResult = await newUser.post(`/groups/${group._id}/chat/${message.id}/flag`); + const flagResult = await newUser.post(`/groups/${group._id}/chat/${message.id}/flag`); expect(flagResult.flags[newUser._id]).to.equal(true); expect(flagResult.flagCount).to.equal(0); - let groupWithFlags = await admin.get(`/groups/${group._id}`); + const groupWithFlags = await admin.get(`/groups/${group._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck.flags[newUser._id]).to.equal(true); // Slack message to mods @@ -116,38 +117,38 @@ describe('POST /chat/:chatId/flag', () => { }); it('Flags a chat when the author\'s account was deleted', async () => { - let deletedUser = await generateUser(); - let { message } = await deletedUser.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const deletedUser = await generateUser(); + const { message } = await deletedUser.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); await deletedUser.del('/user', { password: 'password', }); - let flagResult = await user.post(`/groups/${group._id}/chat/${message.id}/flag`); + const flagResult = await user.post(`/groups/${group._id}/chat/${message.id}/flag`); expect(flagResult.flags[user._id]).to.equal(true); expect(flagResult.flagCount).to.equal(1); - let groupWithFlags = await admin.get(`/groups/${group._id}`); + const groupWithFlags = await admin.get(`/groups/${group._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck.flags[user._id]).to.equal(true); }); it('Flags a chat with a higher flag acount when an admin flags the message', async () => { - let { message } = await user.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await user.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); - let flagResult = await admin.post(`/groups/${group._id}/chat/${message.id}/flag`); + const flagResult = await admin.post(`/groups/${group._id}/chat/${message.id}/flag`); expect(flagResult.flags[admin._id]).to.equal(true); expect(flagResult.flagCount).to.equal(5); - let groupWithFlags = await admin.get(`/groups/${group._id}`); + const groupWithFlags = await admin.get(`/groups/${group._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck.flags[admin._id]).to.equal(true); expect(messageToCheck.flagCount).to.equal(5); }); it('allows admin to flag a message in a private group', async () => { - let privateGroup = await user.post('/groups', { + const privateGroup = await user.post('/groups', { name: 'Test party', type: 'party', privacy: 'private', @@ -156,26 +157,26 @@ describe('POST /chat/:chatId/flag', () => { uuids: [anotherUser._id], }); await anotherUser.post(`/groups/${privateGroup._id}/join`); - let { message } = await user.post(`/groups/${privateGroup._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await user.post(`/groups/${privateGroup._id}/chat`, { message: TEST_MESSAGE }); - let flagResult = await admin.post(`/groups/${privateGroup._id}/chat/${message.id}/flag`); + const flagResult = await admin.post(`/groups/${privateGroup._id}/chat/${message.id}/flag`); expect(flagResult.flags[admin._id]).to.equal(true); expect(flagResult.flagCount).to.equal(5); - let groupWithFlags = await anotherUser.get(`/groups/${privateGroup._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const groupWithFlags = await anotherUser.get(`/groups/${privateGroup._id}`); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck).to.not.exist; }); it('does not allow non member to flag message in private group', async () => { - let privateGroup = await user.post('/groups', { + const privateGroup = await user.post('/groups', { name: 'Test party', type: 'party', privacy: 'private', }); - let { message } = await user.post(`/groups/${privateGroup._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await user.post(`/groups/${privateGroup._id}/chat`, { message: TEST_MESSAGE }); await expect(anotherUser.post(`/groups/${privateGroup._id}/chat/${message.id}/flag`)) .to.eventually.be.rejected.and.eql({ @@ -186,7 +187,7 @@ describe('POST /chat/:chatId/flag', () => { }); it('Returns an error when user tries to flag a message that they already flagged', async () => { - let { message } = await anotherUser.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await anotherUser.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); await user.post(`/groups/${group._id}/chat/${message.id}/flag`); @@ -199,17 +200,17 @@ describe('POST /chat/:chatId/flag', () => { }); it('shows a hidden message to the original poster', async () => { - let { message } = await user.post(`/groups/${group._id}/chat`, {message: TEST_MESSAGE}); + const { message } = await user.post(`/groups/${group._id}/chat`, { message: TEST_MESSAGE }); await admin.post(`/groups/${group._id}/chat/${message.id}/flag`); - let groupWithFlags = await user.get(`/groups/${group._id}`); - let messageToCheck = find(groupWithFlags.chat, {id: message.id}); + const groupWithFlags = await user.get(`/groups/${group._id}`); + const messageToCheck = find(groupWithFlags.chat, { id: message.id }); expect(messageToCheck).to.exist; - let auGroupWithFlags = await anotherUser.get(`/groups/${group._id}`); - let auMessageToCheck = find(auGroupWithFlags.chat, {id: message.id}); + const auGroupWithFlags = await anotherUser.get(`/groups/${group._id}`); + const auMessageToCheck = find(auGroupWithFlags.chat, { id: message.id }); expect(auMessageToCheck).to.not.exist; }); diff --git a/test/api/v3/integration/chat/POST-chat.like.test.js b/test/api/v3/integration/chat/POST-chat.like.test.js index a6dfb7d795..192f3e3aa7 100644 --- a/test/api/v3/integration/chat/POST-chat.like.test.js +++ b/test/api/v3/integration/chat/POST-chat.like.test.js @@ -1,17 +1,17 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /chat/:chatId/like', () => { let user; let groupWithChat; - let testMessage = 'Test Message'; + const testMessage = 'Test Message'; let anotherUser; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -22,7 +22,7 @@ describe('POST /chat/:chatId/like', () => { user = groupLeader; groupWithChat = group; - anotherUser = members[0]; + anotherUser = members[0]; // eslint-disable-line prefer-destructuring }); it('Returns an error when chat message is not found', async () => { @@ -35,7 +35,7 @@ describe('POST /chat/:chatId/like', () => { }); it('Returns an error when user tries to like their own message', async () => { - let message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); await expect(user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`)) .to.eventually.be.rejected.and.eql({ @@ -46,30 +46,30 @@ describe('POST /chat/:chatId/like', () => { }); it('Likes a chat', async () => { - let message = await anotherUser.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await anotherUser.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); - let likeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); + const likeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); expect(likeResult.likes[user._id]).to.equal(true); - let groupWithChatLikes = await user.get(`/groups/${groupWithChat._id}`); + const groupWithChatLikes = await user.get(`/groups/${groupWithChat._id}`); - let messageToCheck = find(groupWithChatLikes.chat, {id: message.message.id}); + const messageToCheck = find(groupWithChatLikes.chat, { id: message.message.id }); expect(messageToCheck.likes[user._id]).to.equal(true); }); it('Unlikes a chat', async () => { - let message = await anotherUser.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await anotherUser.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); - let likeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); + const likeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); expect(likeResult.likes[user._id]).to.equal(true); - let unlikeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); + const unlikeResult = await user.post(`/groups/${groupWithChat._id}/chat/${message.message.id}/like`); expect(unlikeResult.likes[user._id]).to.equal(false); - let groupWithoutChatLikes = await user.get(`/groups/${groupWithChat._id}`); + const groupWithoutChatLikes = await user.get(`/groups/${groupWithChat._id}`); - let messageToCheck = find(groupWithoutChatLikes.chat, {id: message.message.id}); + const messageToCheck = find(groupWithoutChatLikes.chat, { id: message.message.id }); expect(messageToCheck.likes[user._id]).to.equal(false); }); }); diff --git a/test/api/v3/integration/chat/POST-chat.test.js b/test/api/v3/integration/chat/POST-chat.test.js index 73ac2d3bf9..73abe0728c 100644 --- a/test/api/v3/integration/chat/POST-chat.test.js +++ b/test/api/v3/integration/chat/POST-chat.test.js @@ -1,5 +1,6 @@ import { IncomingWebhook } from '@slack/client'; import nconf from 'nconf'; +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, generateUser, @@ -13,7 +14,6 @@ import { TAVERN_ID, } from '../../../../../website/server/models/group'; import { CHAT_FLAG_FROM_SHADOW_MUTE } from '../../../../../website/common/script/constants'; -import { v4 as generateUUID } from 'uuid'; import { getMatchesByWordArray } from '../../../../../website/server/libs/stringUtils'; import bannedWords from '../../../../../website/server/libs/bannedWords'; import guildsAllowingBannedWords from '../../../../../website/server/libs/guildsAllowingBannedWords'; @@ -22,16 +22,17 @@ import * as email from '../../../../../website/server/libs/email'; const BASE_URL = nconf.get('BASE_URL'); describe('POST /chat', () => { - let user, groupWithChat, member, additionalMember; - let testMessage = 'Test Message'; - let testBannedWordMessage = 'TESTPLACEHOLDERSWEARWORDHERE'; - let testBannedWordMessage1 = 'TESTPLACEHOLDERSWEARWORDHERE1'; - let testSlurMessage = 'message with TESTPLACEHOLDERSLURWORDHERE'; - let testSlurMessage1 = 'TESTPLACEHOLDERSLURWORDHERE1'; - let bannedWordErrorMessage = t('bannedWordUsed', {swearWordsUsed: testBannedWordMessage}); + let user; let groupWithChat; let member; let + additionalMember; + const testMessage = 'Test Message'; + const testBannedWordMessage = 'TESTPLACEHOLDERSWEARWORDHERE'; + const testBannedWordMessage1 = 'TESTPLACEHOLDERSWEARWORDHERE1'; + const testSlurMessage = 'message with TESTPLACEHOLDERSLURWORDHERE'; + const testSlurMessage1 = 'TESTPLACEHOLDERSLURWORDHERE1'; + const bannedWordErrorMessage = t('bannedWordUsed', { swearWordsUsed: testBannedWordMessage }); before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -40,14 +41,14 @@ describe('POST /chat', () => { members: 2, }); user = groupLeader; - await user.update({'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL}); // prevent tests accidentally throwing messageGroupChatSpam + await user.update({ 'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL }); // prevent tests accidentally throwing messageGroupChatSpam groupWithChat = group; - member = members[0]; - additionalMember = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + additionalMember = members[1]; // eslint-disable-line prefer-destructuring }); it('Returns an error when no message is provided', async () => { - await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: ''})) + await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: '' })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -56,7 +57,7 @@ describe('POST /chat', () => { }); it('Returns an error when an empty message is provided', async () => { - await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: ' '})) + await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: ' ' })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -65,7 +66,7 @@ describe('POST /chat', () => { }); it('Returns an error when an message containing only newlines is provided', async () => { - await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: '\n\n'})) + await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: '\n\n' })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -74,7 +75,7 @@ describe('POST /chat', () => { }); it('Returns an error when group is not found', async () => { - await expect(user.post('/groups/invalidID/chat', { message: testMessage})).to.eventually.be.rejected.and.eql({ + await expect(user.post('/groups/invalidID/chat', { message: testMessage })).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('groupNotFound'), @@ -83,12 +84,12 @@ describe('POST /chat', () => { describe('mute user', () => { afterEach(() => { - member.update({'flags.chatRevoked': false}); + member.update({ 'flags.chatRevoked': false }); }); it('returns an error when chat privileges are revoked when sending a message to a public guild', async () => { - const userWithChatRevoked = await member.update({'flags.chatRevoked': true}); - await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ + const userWithChatRevoked = await member.update({ 'flags.chatRevoked': true }); + await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage })).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('chatPrivilegesRevoked'), @@ -106,9 +107,9 @@ describe('POST /chat', () => { }); const privateGuildMemberWithChatsRevoked = members[0]; - await privateGuildMemberWithChatsRevoked.update({'flags.chatRevoked': true}); + await privateGuildMemberWithChatsRevoked.update({ 'flags.chatRevoked': true }); - const message = await privateGuildMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage}); + const message = await privateGuildMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; }); @@ -124,9 +125,9 @@ describe('POST /chat', () => { }); const privatePartyMemberWithChatsRevoked = members[0]; - await privatePartyMemberWithChatsRevoked.update({'flags.chatRevoked': true}); + await privatePartyMemberWithChatsRevoked.update({ 'flags.chatRevoked': true }); - const message = await privatePartyMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage}); + const message = await privatePartyMemberWithChatsRevoked.post(`/groups/${group._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; }); @@ -140,12 +141,12 @@ describe('POST /chat', () => { afterEach(() => { sandbox.restore(); - member.update({'flags.chatShadowMuted': false}); + member.update({ 'flags.chatShadowMuted': false }); }); it('creates a chat with flagCount already set and notifies mods when sending a message to a public guild', async () => { - const userWithChatShadowMuted = await member.update({'flags.chatShadowMuted': true}); - const message = await userWithChatShadowMuted.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const userWithChatShadowMuted = await member.update({ 'flags.chatShadowMuted': true }); + const message = await userWithChatShadowMuted.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; expect(message.message.flagCount).to.eql(CHAT_FLAG_FROM_SHADOW_MUTE); @@ -185,9 +186,9 @@ describe('POST /chat', () => { }); const userWithChatShadowMuted = members[0]; - await userWithChatShadowMuted.update({'flags.chatShadowMuted': true}); + await userWithChatShadowMuted.update({ 'flags.chatShadowMuted': true }); - const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage}); + const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; expect(message.message.flagCount).to.eql(0); @@ -204,16 +205,16 @@ describe('POST /chat', () => { }); const userWithChatShadowMuted = members[0]; - await userWithChatShadowMuted.update({'flags.chatShadowMuted': true}); + await userWithChatShadowMuted.update({ 'flags.chatShadowMuted': true }); - const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage}); + const message = await userWithChatShadowMuted.post(`/groups/${group._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; expect(message.message.flagCount).to.eql(0); }); it('creates a chat with zero flagCount when non-shadow-muted user sends a message to a public guild', async () => { - const message = await member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await member.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; expect(message.message.flagCount).to.eql(0); }); @@ -221,7 +222,7 @@ describe('POST /chat', () => { context('banned word', () => { it('returns an error when chat message contains a banned word in tavern', async () => { - await expect(user.post('/groups/habitrpg/chat', { message: testBannedWordMessage})) + await expect(user.post('/groups/habitrpg/chat', { message: testBannedWordMessage })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -230,7 +231,7 @@ describe('POST /chat', () => { }); it('returns an error when chat message contains a banned word in a public guild', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'public guild', type: 'guild', @@ -239,7 +240,7 @@ describe('POST /chat', () => { members: 1, }); - await expect(members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage})) + await expect(members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -248,8 +249,8 @@ describe('POST /chat', () => { }); it('errors when word is part of a phrase', async () => { - let wordInPhrase = `phrase ${testBannedWordMessage} end`; - await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase})) + const wordInPhrase = `phrase ${testBannedWordMessage} end`; + await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -258,8 +259,8 @@ describe('POST /chat', () => { }); it('errors when word is surrounded by non alphabet characters', async () => { - let wordInPhrase = `_!${testBannedWordMessage}@_`; - await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase})) + const wordInPhrase = `_!${testBannedWordMessage}@_`; + await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -268,47 +269,51 @@ describe('POST /chat', () => { }); it('errors when word is typed in mixed case', async () => { - let substrLength = Math.floor(testBannedWordMessage.length / 2); - let chatMessage = testBannedWordMessage.substring(0, substrLength).toLowerCase() + testBannedWordMessage.substring(substrLength).toUpperCase(); + const substrLength = Math.floor(testBannedWordMessage.length / 2); + const chatMessage = testBannedWordMessage.substring(0, substrLength).toLowerCase() + + testBannedWordMessage.substring(substrLength).toUpperCase(); await expect(user.post('/groups/habitrpg/chat', { message: chatMessage })) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('bannedWordUsed', {swearWordsUsed: chatMessage}), + message: t('bannedWordUsed', { swearWordsUsed: chatMessage }), }); }); it('checks error message has all the banned words used, regardless of case', async () => { - let testBannedWords = [testBannedWordMessage.toUpperCase(), testBannedWordMessage1.toLowerCase()]; - let chatMessage = `Mixing ${testBannedWords[0]} and ${testBannedWords[1]} is bad for you.`; - await expect(user.post('/groups/habitrpg/chat', { message: chatMessage})) + const testBannedWords = [ + testBannedWordMessage.toUpperCase(), + testBannedWordMessage1.toLowerCase(), + ]; + const chatMessage = `Mixing ${testBannedWords[0]} and ${testBannedWords[1]} is bad for you.`; + await expect(user.post('/groups/habitrpg/chat', { message: chatMessage })) .to.eventually.be.rejected .and.have.property('message') .that.includes(testBannedWords.join(', ')); }); it('check all banned words are matched', async () => { - let message = bannedWords.join(',').replace(/\\/g, ''); - let matches = getMatchesByWordArray(message, bannedWords); + const message = bannedWords.join(',').replace(/\\/g, ''); + const matches = getMatchesByWordArray(message, bannedWords); expect(matches.length).to.equal(bannedWords.length); }); it('does not error when bad word is suffix of a word', async () => { - let wordAsSuffix = `prefix${testBannedWordMessage}`; - let message = await user.post('/groups/habitrpg/chat', { message: wordAsSuffix}); + const wordAsSuffix = `prefix${testBannedWordMessage}`; + const message = await user.post('/groups/habitrpg/chat', { message: wordAsSuffix }); expect(message.message.id).to.exist; }); it('does not error when bad word is prefix of a word', async () => { - let wordAsPrefix = `${testBannedWordMessage}suffix`; - let message = await user.post('/groups/habitrpg/chat', { message: wordAsPrefix}); + const wordAsPrefix = `${testBannedWordMessage}suffix`; + const message = await user.post('/groups/habitrpg/chat', { message: wordAsPrefix }); expect(message.message.id).to.exist; }); it('does not error when sending a chat message containing a banned word to a party', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'Party', type: 'party', @@ -317,13 +322,13 @@ describe('POST /chat', () => { members: 1, }); - let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage}); + const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage }); expect(message.message.id).to.exist; }); it('does not error when sending a chat message containing a banned word to a public guild in which banned words are allowed', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'public guild', type: 'guild', @@ -334,13 +339,13 @@ describe('POST /chat', () => { guildsAllowingBannedWords[group._id] = true; - let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage}); + const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage }); expect(message.message.id).to.exist; }); it('does not error when sending a chat message containing a banned word to a private guild', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'private guild', type: 'guild', @@ -349,7 +354,7 @@ describe('POST /chat', () => { members: 1, }); - let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage}); + const message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage }); expect(message.message.id).to.exist; }); @@ -363,11 +368,11 @@ describe('POST /chat', () => { afterEach(() => { sandbox.restore(); - user.update({'flags.chatRevoked': false}); + user.update({ 'flags.chatRevoked': false }); }); it('errors and revokes privileges when chat message contains a banned slur', async () => { - await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: testSlurMessage})).to.eventually.be.rejected.and.eql({ + await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: testSlurMessage })).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: t('bannedSlurUsed'), @@ -398,7 +403,7 @@ describe('POST /chat', () => { /* eslint-enable camelcase */ // Chat privileges are revoked - await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ + await expect(user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage })).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('chatPrivilegesRevoked'), @@ -406,7 +411,7 @@ describe('POST /chat', () => { }); it('does not allow slurs in private groups', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'Party', type: 'party', @@ -415,7 +420,7 @@ describe('POST /chat', () => { members: 1, }); - await expect(members[0].post(`/groups/${group._id}/chat`, { message: testSlurMessage})).to.eventually.be.rejected.and.eql({ + await expect(members[0].post(`/groups/${group._id}/chat`, { message: testSlurMessage })).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: t('bannedSlurUsed'), @@ -446,7 +451,7 @@ describe('POST /chat', () => { /* eslint-enable camelcase */ // Chat privileges are revoked - await expect(members[0].post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ + await expect(members[0].post(`/groups/${groupWithChat._id}/chat`, { message: testMessage })).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('chatPrivilegesRevoked'), @@ -454,8 +459,9 @@ describe('POST /chat', () => { }); it('errors when slur is typed in mixed case', async () => { - let substrLength = Math.floor(testSlurMessage1.length / 2); - let chatMessage = testSlurMessage1.substring(0, substrLength).toLowerCase() + testSlurMessage1.substring(substrLength).toUpperCase(); + const substrLength = Math.floor(testSlurMessage1.length / 2); + const chatMessage = testSlurMessage1.substring(0, substrLength).toLowerCase() + + testSlurMessage1.substring(substrLength).toUpperCase(); await expect(user.post('/groups/habitrpg/chat', { message: chatMessage })) .to.eventually.be.rejected.and.eql({ code: 400, @@ -466,20 +472,30 @@ describe('POST /chat', () => { }); it('creates a chat', async () => { - const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`); expect(newMessage.message.id).to.exist; expect(groupMessages[0].id).to.exist; }); + it('creates a chat with mentions', async () => { + const messageWithMentions = `hi @${member.auth.local.username}`; + const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: messageWithMentions }); + const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`); + + expect(newMessage.message.id).to.exist; + expect(newMessage.message.text).to.include(`[@${member.auth.local.username}](/profile/${member._id})`); + expect(groupMessages[0].id).to.exist; + }); + it('creates a chat with a max length of 3000 chars', async () => { const veryLongMessage = ` 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789. THIS PART WON'T BE IN THE MESSAGE (over 3000) `; - const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: veryLongMessage}); + const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: veryLongMessage }); const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`); expect(newMessage.message.id).to.exist; @@ -501,7 +517,7 @@ describe('POST /chat', () => { }); await userWithStyle.sync(); - const message = await userWithStyle.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await userWithStyle.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); expect(message.message.id).to.exist; expect(message.message.userStyles.items.currentMount).to.eql(userWithStyle.items.currentMount); @@ -511,7 +527,8 @@ describe('POST /chat', () => { expect(message.message.userStyles.preferences.skin).to.eql(userWithStyle.preferences.skin); expect(message.message.userStyles.preferences.shirt).to.eql(userWithStyle.preferences.shirt); expect(message.message.userStyles.preferences.chair).to.eql(userWithStyle.preferences.chair); - expect(message.message.userStyles.preferences.background).to.eql(userWithStyle.preferences.background); + expect(message.message.userStyles.preferences.background) + .to.eql(userWithStyle.preferences.background); }); it('adds backer info to chat', async () => { @@ -524,7 +541,7 @@ describe('POST /chat', () => { backer: backerInfo, }); - const message = await backer.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const message = await backer.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); const messageBackerInfo = message.message.backer; expect(messageBackerInfo.npc).to.equal(backerInfo.npc); @@ -533,8 +550,8 @@ describe('POST /chat', () => { }); it('sends group chat received webhooks', async () => { - let userUuid = generateUUID(); - let memberUuid = generateUUID(); + const userUuid = generateUUID(); + const memberUuid = generateUUID(); await server.start(); await user.post('/user/webhook', { @@ -554,16 +571,16 @@ describe('POST /chat', () => { }, }); - let message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); + const message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); await sleep(); await server.close(); - let userBody = server.getWebhookData(userUuid); - let memberBody = server.getWebhookData(memberUuid); + const userBody = server.getWebhookData(userUuid); + const memberBody = server.getWebhookData(memberUuid); - [userBody, memberBody].forEach((body) => { + [userBody, memberBody].forEach(body => { expect(body.group.id).to.eql(groupWithChat._id); expect(body.group.name).to.eql(groupWithChat.name); expect(body.chat).to.eql(message.message); @@ -572,22 +589,20 @@ describe('POST /chat', () => { context('chat notifications', () => { beforeEach(() => { - member.update({newMessages: {}, notifications: []}); + member.update({ newMessages: {}, notifications: [] }); }); it('notifies other users of new messages for a guild', async () => { - let message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); - let memberWithNotification = await member.get('/user'); + const message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); + const memberWithNotification = await member.get('/user'); expect(message.message.id).to.exist; expect(memberWithNotification.newMessages[`${groupWithChat._id}`]).to.exist; - expect(memberWithNotification.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupWithChat._id; - })).to.exist; + expect(memberWithNotification.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupWithChat._id)).to.exist; }); it('notifies other users of new messages for a party', async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: 'Test Party', type: 'party', @@ -596,36 +611,32 @@ describe('POST /chat', () => { members: 1, }); - let message = await groupLeader.post(`/groups/${group._id}/chat`, { message: testMessage }); - let memberWithNotification = await members[0].get('/user'); + const message = await groupLeader.post(`/groups/${group._id}/chat`, { message: testMessage }); + const memberWithNotification = await members[0].get('/user'); expect(message.message.id).to.exist; expect(memberWithNotification.newMessages[`${group._id}`]).to.exist; - expect(memberWithNotification.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === group._id; - })).to.exist; + expect(memberWithNotification.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === group._id)).to.exist; }); it('does not notify other users of a new message that is already hidden from shadow-muting', async () => { - await user.update({'flags.chatShadowMuted': true}); - let message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); - let memberWithNotification = await member.get('/user'); + await user.update({ 'flags.chatShadowMuted': true }); + const message = await user.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage }); + const memberWithNotification = await member.get('/user'); - await user.update({'flags.chatShadowMuted': false}); + await user.update({ 'flags.chatShadowMuted': false }); expect(message.message.id).to.exist; expect(memberWithNotification.newMessages[`${groupWithChat._id}`]).to.not.exist; - expect(memberWithNotification.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupWithChat._id; - })).to.not.exist; + expect(memberWithNotification.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupWithChat._id)).to.not.exist; }); }); context('Spam prevention', () => { it('Returns an error when the user has been posting too many messages', async () => { // Post as many messages are needed to reach the spam limit - for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) { - let result = await additionalMember.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop + for (let i = 0; i < SPAM_MESSAGE_LIMIT; i += 1) { + const result = await additionalMember.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop expect(result.message.id).to.exist; } @@ -637,11 +648,11 @@ describe('POST /chat', () => { }); it('contributor should not receive spam alert', async () => { - let userSocialite = await member.update({'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL}); + const userSocialite = await member.update({ 'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL }); // Post 1 more message than the spam limit to ensure they do not reach the limit - for (let i = 0; i < SPAM_MESSAGE_LIMIT + 1; i++) { - let result = await userSocialite.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop + for (let i = 0; i < SPAM_MESSAGE_LIMIT + 1; i += 1) { + const result = await userSocialite.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop expect(result.message.id).to.exist; } }); diff --git a/test/api/v3/integration/chat/POST-chat_seen.test.js b/test/api/v3/integration/chat/POST-chat_seen.test.js index 6bd3f87b23..f64df56146 100644 --- a/test/api/v3/integration/chat/POST-chat_seen.test.js +++ b/test/api/v3/integration/chat/POST-chat_seen.test.js @@ -5,10 +5,11 @@ import { describe('POST /groups/:id/chat/seen', () => { context('Guild', () => { - let guild, guildLeader, guildMember, guildMessage; + let guild; let guildLeader; let guildMember; let + guildMessage; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -18,7 +19,7 @@ describe('POST /groups/:id/chat/seen', () => { guild = group; guildLeader = groupLeader; - guildMember = members[0]; + guildMember = members[0]; // eslint-disable-line prefer-destructuring guildMessage = await guildLeader.post(`/groups/${guild._id}/chat`, { message: 'Some guild message' }); guildMessage = guildMessage.message; @@ -32,7 +33,7 @@ describe('POST /groups/:id/chat/seen', () => { await sleep(1); - let guildThatHasSeenChat = await guildMember.get('/user'); + const guildThatHasSeenChat = await guildMember.get('/user'); expect(guildThatHasSeenChat.notifications.length).to.equal(initialNotifications - 1); expect(guildThatHasSeenChat.newMessages).to.be.empty; @@ -40,10 +41,11 @@ describe('POST /groups/:id/chat/seen', () => { }); context('Party', () => { - let party, partyLeader, partyMember, partyMessage; + let party; let partyLeader; let partyMember; let + partyMessage; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private', @@ -53,7 +55,7 @@ describe('POST /groups/:id/chat/seen', () => { party = group; partyLeader = groupLeader; - partyMember = members[0]; + partyMember = members[0]; // eslint-disable-line prefer-destructuring partyMessage = await partyLeader.post(`/groups/${party._id}/chat`, { message: 'Some party message' }); partyMessage = partyMessage.message; @@ -67,7 +69,7 @@ describe('POST /groups/:id/chat/seen', () => { await sleep(1); - let partyMemberThatHasSeenChat = await partyMember.get('/user'); + const partyMemberThatHasSeenChat = await partyMember.get('/user'); expect(partyMemberThatHasSeenChat.notifications.length).to.equal(initialNotifications - 1); expect(partyMemberThatHasSeenChat.newMessages).to.be.empty; diff --git a/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js b/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js index 98ce34d35a..9bbc122244 100644 --- a/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js +++ b/test/api/v3/integration/chat/POST-groups_id_chat_id_clear_flags.test.js @@ -1,18 +1,19 @@ +import moment from 'moment'; +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; import config from '../../../../../config.json'; -import moment from 'moment'; -import { v4 as generateUUID } from 'uuid'; describe('POST /groups/:id/chat/:id/clearflags', () => { const USER_AGE_FOR_FLAGGING = 3; - let groupWithChat, message, author, nonAdmin, admin; + let groupWithChat; let message; let author; let nonAdmin; let + admin; before(async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -21,8 +22,8 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { groupWithChat = group; author = groupLeader; - nonAdmin = await generateUser({'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate()}); - admin = await generateUser({'contributor.admin': true}); + nonAdmin = await generateUser({ 'auth.timestamps.created': moment().subtract(USER_AGE_FOR_FLAGGING + 1, 'days').toDate() }); + admin = await generateUser({ 'contributor.admin': true }); message = await author.post(`/groups/${groupWithChat._id}/chat`, { message: 'Some message' }); message = message.message; @@ -30,17 +31,15 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { }); context('Single Message', () => { - it('returns error when non-admin attempts to clear flags', async () => { - return expect(nonAdmin.post(`/groups/${groupWithChat._id}/chat/${message.id}/clearflags`)) - .to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('messageGroupChatAdminClearFlagCount'), - }); - }); + it('returns error when non-admin attempts to clear flags', async () => expect(nonAdmin.post(`/groups/${groupWithChat._id}/chat/${message.id}/clearflags`)) + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageGroupChatAdminClearFlagCount'), + })); it('returns error if message does not exist', async () => { - let fakeMessageID = generateUUID(); + const fakeMessageID = generateUUID(); await expect(admin.post(`/groups/${groupWithChat._id}/chat/${fakeMessageID}/clearflags`)) .to.eventually.be.rejected.and.eql({ @@ -52,13 +51,13 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { it('clears flags and leaves old flags on the flag object', async () => { await admin.post(`/groups/${groupWithChat._id}/chat/${message.id}/clearflags`); - let messages = await admin.get(`/groups/${groupWithChat._id}/chat`); + const messages = await admin.get(`/groups/${groupWithChat._id}/chat`); expect(messages[0].flagCount).to.eql(0); expect(messages[0].flags).to.have.property(admin._id, true); }); it('clears flags in a private group', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private', @@ -82,7 +81,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { }); it('can\'t flag a system message', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private', @@ -90,7 +89,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { members: 1, }); - let member = members[0]; + const member = members[0]; // make member that can use skills await member.update({ @@ -101,12 +100,12 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { await member.post('/user/class/cast/mpheal'); - let [skillMsg] = await member.get(`/groups/${group.id}/chat`); + const [skillMsg] = await member.get(`/groups/${group.id}/chat`); await expect(member.post(`/groups/${group._id}/chat/${skillMsg.id}/flag`)) .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('messageCannotFlagSystemMessages', {communityManagerEmail: config.EMAILS_COMMUNITY_MANAGER_EMAIL}), + message: t('messageCannotFlagSystemMessages', { communityManagerEmail: config.EMAILS_COMMUNITY_MANAGER_EMAIL }), }); // let messages = await members[0].get(`/groups/${group._id}/chat`); // expect(messages[0].id).to.eql(skillMsg.id); @@ -115,7 +114,8 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { }); context('admin user, group with multiple messages', () => { - let message2, message3, message4; + let message2; let message3; let + message4; before(async () => { message2 = await author.post(`/groups/${groupWithChat._id}/chat`, { message: 'Some message 2' }); @@ -133,14 +133,14 @@ describe('POST /groups/:id/chat/:id/clearflags', () => { it('changes only the message that is flagged', async () => { await admin.post(`/groups/${groupWithChat._id}/chat/${message.id}/clearflags`); - let messages = await admin.get(`/groups/${groupWithChat._id}/chat`); + const messages = await admin.get(`/groups/${groupWithChat._id}/chat`); expect(messages).to.have.lengthOf(4); - let messageThatWasUnflagged = messages[3]; - let messageWith1Flag = messages[2]; - let messageWith2Flag = messages[1]; - let messageWithoutFlags = messages[0]; + const messageThatWasUnflagged = messages[3]; + const messageWith1Flag = messages[2]; + const messageWith2Flag = messages[1]; + const messageWithoutFlags = messages[0]; expect(messageThatWasUnflagged.flagCount).to.eql(0); expect(messageThatWasUnflagged.flags).to.have.property(admin._id, true); diff --git a/test/api/v3/integration/content/GET-content.test.js b/test/api/v3/integration/content/GET-content.test.js index a9f9ce5ee9..a241058be5 100644 --- a/test/api/v3/integration/content/GET-content.test.js +++ b/test/api/v3/integration/content/GET-content.test.js @@ -6,19 +6,19 @@ import i18n from '../../../../../website/common/script/i18n'; describe('GET /content', () => { it('returns content (and does not require authentication)', async () => { - let res = await requester().get('/content'); + const res = await requester().get('/content'); expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText')); }); it('returns content not in English', async () => { - let res = await requester().get('/content?language=de'); + const res = await requester().get('/content?language=de'); expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de')); }); it('falls back to English if the desired language is not found', async () => { - let res = await requester().get('/content?language=wrong'); + const res = await requester().get('/content?language=wrong'); expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText')); }); diff --git a/test/api/v3/integration/coupons/GET-coupons.test.js b/test/api/v3/integration/coupons/GET-coupons.test.js index 9eecfe681c..24cc230e49 100644 --- a/test/api/v3/integration/coupons/GET-coupons.test.js +++ b/test/api/v3/integration/coupons/GET-coupons.test.js @@ -28,9 +28,9 @@ describe('GET /coupons/', () => { 'contributor.sudo': true, }); - let coupons = await user.post('/coupons/generate/wondercon?count=11'); - let res = await user.get('/coupons'); - let splitRes = res.split('\n'); + const coupons = await user.post('/coupons/generate/wondercon?count=11'); + const res = await user.get('/coupons'); + const splitRes = res.split('\n'); expect(splitRes.length).to.equal(13); expect(splitRes[0]).to.equal('code,event,date,user'); diff --git a/test/api/v3/integration/coupons/POST-coupons_enter_code.test.js b/test/api/v3/integration/coupons/POST-coupons_enter_code.test.js index be3f982617..d2b0fdec44 100644 --- a/test/api/v3/integration/coupons/POST-coupons_enter_code.test.js +++ b/test/api/v3/integration/coupons/POST-coupons_enter_code.test.js @@ -36,7 +36,7 @@ describe('POST /coupons/enter/:code', () => { }); it('returns an error if coupon has been used', async () => { - let [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); + const [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); await user.post(`/coupons/enter/${coupon._id}`); // use coupon await expect(user.post(`/coupons/enter/${coupon._id}`)).to.eventually.be.rejected.and.eql({ @@ -47,8 +47,8 @@ describe('POST /coupons/enter/:code', () => { }); it('should apply the coupon to the user', async () => { - let [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); - let userRes = await user.post(`/coupons/enter/${coupon._id}`); + const [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); + const userRes = await user.post(`/coupons/enter/${coupon._id}`); expect(userRes._id).to.equal(user._id); expect(userRes.items.gear.owned.eyewear_special_wondercon_red).to.be.true; expect(userRes.items.gear.owned.eyewear_special_wondercon_black).to.be.true; @@ -57,6 +57,6 @@ describe('POST /coupons/enter/:code', () => { expect(userRes.items.gear.owned.body_special_wondercon_red).to.be.true; expect(userRes.items.gear.owned.body_special_wondercon_black).to.be.true; expect(userRes.items.gear.owned.body_special_wondercon_gold).to.be.true; - expect(userRes.extra).to.eql({signupEvent: 'wondercon'}); + expect(userRes.extra).to.eql({ signupEvent: 'wondercon' }); }); }); diff --git a/test/api/v3/integration/coupons/POST-coupons_generate_event.test.js b/test/api/v3/integration/coupons/POST-coupons_generate_event.test.js index 1fe9af0d7a..591cf1a567 100644 --- a/test/api/v3/integration/coupons/POST-coupons_generate_event.test.js +++ b/test/api/v3/integration/coupons/POST-coupons_generate_event.test.js @@ -1,9 +1,9 @@ +import couponCode from 'coupon-code'; import { generateUser, translate as t, resetHabiticaDB, } from '../../../../helpers/api-integration/v3'; -import couponCode from 'coupon-code'; import apiError from '../../../../../website/server/libs/apiError'; describe('POST /coupons/generate/:event', () => { @@ -51,7 +51,7 @@ describe('POST /coupons/generate/:event', () => { 'contributor.sudo': true, }); - let coupons = await user.post('/coupons/generate/wondercon?count=2'); + const coupons = await user.post('/coupons/generate/wondercon?count=2'); expect(coupons.length).to.equal(2); expect(coupons[0].event).to.equal('wondercon'); expect(couponCode.validate(coupons[1]._id)).to.not.equal(''); // '' means invalid diff --git a/test/api/v3/integration/coupons/POST-coupons_validate_code.test.js b/test/api/v3/integration/coupons/POST-coupons_validate_code.test.js index 52d85c6210..5d6bef2b91 100644 --- a/test/api/v3/integration/coupons/POST-coupons_validate_code.test.js +++ b/test/api/v3/integration/coupons/POST-coupons_validate_code.test.js @@ -5,7 +5,7 @@ import { } from '../../../../helpers/api-integration/v3'; describe('POST /coupons/validate/:code', () => { - let api = requester(); + const api = requester(); before(async () => { await resetHabiticaDB(); @@ -20,17 +20,17 @@ describe('POST /coupons/validate/:code', () => { }); it('returns true if coupon code is valid', async () => { - let sudoUser = await generateUser({ + const sudoUser = await generateUser({ 'contributor.sudo': true, }); - let [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); - let res = await api.post(`/coupons/validate/${coupon._id}`); - expect(res).to.eql({valid: true}); + const [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); + const res = await api.post(`/coupons/validate/${coupon._id}`); + expect(res).to.eql({ valid: true }); }); it('returns false if coupon code is valid', async () => { - let res = await api.post('/coupons/validate/notValid'); - expect(res).to.eql({valid: false}); + const res = await api.post('/coupons/validate/notValid'); + expect(res).to.eql({ valid: false }); }); }); diff --git a/test/api/v3/integration/dataexport/GET-export_avatar-memberId.html.test.js b/test/api/v3/integration/dataexport/GET-export_avatar-memberId.html.test.js index 0b24bb02bd..d75d0ead25 100644 --- a/test/api/v3/integration/dataexport/GET-export_avatar-memberId.html.test.js +++ b/test/api/v3/integration/dataexport/GET-export_avatar-memberId.html.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; xdescribe('GET /export/avatar-:memberId.html', () => { let user; @@ -20,16 +20,16 @@ xdescribe('GET /export/avatar-:memberId.html', () => { }); it('handles non-existing members', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/export/avatar-${dummyId}.html`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); it('returns an html page', async () => { - let res = await user.get(`/export/avatar-${user._id}.html`); + const res = await user.get(`/export/avatar-${user._id}.html`); expect(res.substring(0, 100).indexOf('')).to.equal(0); }); }); diff --git a/test/api/v3/integration/dataexport/GET-export_history.csv.test.js b/test/api/v3/integration/dataexport/GET-export_history.csv.test.js index 5f49213038..4f6a6c76a2 100644 --- a/test/api/v3/integration/dataexport/GET-export_history.csv.test.js +++ b/test/api/v3/integration/dataexport/GET-export_history.csv.test.js @@ -1,26 +1,24 @@ +import moment from 'moment'; import { generateUser, } from '../../../../helpers/api-integration/v3'; import { updateDocument, } from '../../../../helpers/mongo'; -import moment from 'moment'; describe('GET /export/history.csv', () => { // TODO disabled because it randomly causes the build to fail xit('should return a valid CSV file with tasks history data', async () => { - let user = await generateUser(); + const user = await generateUser(); let tasks = await user.post('/tasks/user', [ - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2'}, - {type: 'todo', text: 'todo 1'}, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2' }, + { type: 'todo', text: 'todo 1' }, ]); // to handle occasional inconsistency in task creation order - tasks.sort(function (a, b) { - return a.text.localeCompare(b.text); - }); + tasks.sort((a, b) => a.text.localeCompare(b.text)); // score all the tasks twice await user.post(`/tasks/${tasks[0]._id}/score/up`); @@ -35,16 +33,14 @@ describe('GET /export/history.csv', () => { // adding an history entry to daily 1 manually because cron didn't run yet await updateDocument('tasks', tasks[0], { - history: [{value: 3.2, date: Number(new Date())}], + history: [{ value: 3.2, date: Number(new Date()) }], }); // get updated tasks - tasks = await Promise.all(tasks.map(task => { - return user.get(`/tasks/${task._id}`); - })); + tasks = await Promise.all(tasks.map(task => user.get(`/tasks/${task._id}`))); - let res = await user.get('/export/history.csv'); - let splitRes = res.split('\n'); + const res = await user.get('/export/history.csv'); + const splitRes = res.split('\n'); expect(splitRes[0]).to.equal('Task Name,Task ID,Task Type,Date,Value'); expect(splitRes[1]).to.equal(`daily 1,${tasks[0]._id},daily,${moment(tasks[0].history[0].date).format('YYYY-MM-DD HH:mm:ss')},${tasks[0].history[0].value}`); diff --git a/test/api/v3/integration/dataexport/GET-export_inbox.html.test.js b/test/api/v3/integration/dataexport/GET-export_inbox.html.test.js index 61c4e6b933..b9f9b96fff 100644 --- a/test/api/v3/integration/dataexport/GET-export_inbox.html.test.js +++ b/test/api/v3/integration/dataexport/GET-export_inbox.html.test.js @@ -6,7 +6,7 @@ describe('GET /export/inbox.html', () => { let user; before(async () => { - let otherUser = await generateUser({ + const otherUser = await generateUser({ 'profile.name': 'Other User', }); user = await generateUser({ @@ -30,13 +30,13 @@ describe('GET /export/inbox.html', () => { }); it('returns an html page', async () => { - let res = await user.get('/export/inbox.html'); + const res = await user.get('/export/inbox.html'); expect(res.substring(0, 100).indexOf('')).to.equal(0); }); it('renders the markdown messages as html', async () => { - let res = await user.get('/export/inbox.html'); + const res = await user.get('/export/inbox.html'); expect(res).to.include('img class="habitica-emoji"'); expect(res).to.include('

Hello!

'); @@ -44,11 +44,11 @@ describe('GET /export/inbox.html', () => { }); it('sorts messages from newest to oldest', async () => { - let res = await user.get('/export/inbox.html'); + const res = await user.get('/export/inbox.html'); - let emojiPosition = res.indexOf('img class="habitica-emoji"'); - let headingPosition = res.indexOf('

Hello!

'); - let listPosition = res.indexOf('
  • list 1
  • '); + const emojiPosition = res.indexOf('img class="habitica-emoji"'); + const headingPosition = res.indexOf('

    Hello!

    '); + const listPosition = res.indexOf('
  • list 1
  • '); expect(emojiPosition).to.be.greaterThan(headingPosition); expect(headingPosition).to.be.greaterThan(listPosition); diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js index 38fbf6435f..7156c884a4 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.json.test.js @@ -4,15 +4,15 @@ import { describe('GET /export/userdata.json', () => { it('should return a valid JSON file with user data', async () => { - let user = await generateUser(); - let tasks = await user.post('/tasks/user', [ - {type: 'habit', text: 'habit 1'}, - {type: 'daily', text: 'daily 1'}, - {type: 'reward', text: 'reward 1'}, - {type: 'todo', text: 'todo 1'}, + const user = await generateUser(); + const tasks = await user.post('/tasks/user', [ + { type: 'habit', text: 'habit 1' }, + { type: 'daily', text: 'daily 1' }, + { type: 'reward', text: 'reward 1' }, + { type: 'todo', text: 'todo 1' }, ]); - let res = await user.get('/export/userdata.json'); + const res = await user.get('/export/userdata.json'); expect(res._id).to.equal(user._id); expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']); expect(res.auth.local).not.to.have.keys(['salt', 'hashed_password']); diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js index f99b34d869..685f0072f6 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js @@ -1,25 +1,25 @@ +import xml2js from 'xml2js'; +import util from 'util'; import { generateUser, } from '../../../../helpers/api-integration/v3'; -import xml2js from 'xml2js'; -import util from 'util'; -let parseStringAsync = util.promisify(xml2js.parseString).bind(xml2js); +const parseStringAsync = util.promisify(xml2js.parseString).bind(xml2js); describe('GET /export/userdata.xml', () => { it('should return a valid XML file with user data', async () => { - let user = await generateUser(); - let tasks = await user.post('/tasks/user', [ - {type: 'habit', text: 'habit 1'}, - {type: 'daily', text: 'daily 1'}, - {type: 'reward', text: 'reward 1'}, - {type: 'todo', text: 'todo 1'}, + const user = await generateUser(); + const tasks = await user.post('/tasks/user', [ + { type: 'habit', text: 'habit 1' }, + { type: 'daily', text: 'daily 1' }, + { type: 'reward', text: 'reward 1' }, + { type: 'todo', text: 'todo 1' }, // due to how the xml parser works an array is returned only if there's more than one children // so we create two tasks for each type - {type: 'habit', text: 'habit 2'}, - {type: 'daily', text: 'daily 2'}, - {type: 'reward', text: 'reward 2'}, - {type: 'todo', text: 'todo 2'}, + { type: 'habit', text: 'habit 2' }, + { type: 'daily', text: 'daily 2' }, + { type: 'reward', text: 'reward 2' }, + { type: 'todo', text: 'todo 2' }, ]); @@ -27,15 +27,15 @@ describe('GET /export/userdata.xml', () => { await user.get('/user/toggle-pinned-item/marketGear/gear.flat.shield_rogue_5'); // add a private message - let receiver = await generateUser(); + const receiver = await generateUser(); user.post('/members/send-private-message', { message: 'Your first message, hi!', toUserId: receiver._id, }); - let response = await user.get('/export/userdata.xml'); - let {user: res} = await parseStringAsync(response, {explicitArray: false}); + const response = await user.get('/export/userdata.xml'); + const { user: res } = await parseStringAsync(response, { explicitArray: false }); expect(res._id).to.equal(user._id); expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']); @@ -43,19 +43,19 @@ describe('GET /export/userdata.xml', () => { expect(res.tasks).to.have.all.keys(['dailys', 'habits', 'todos', 'rewards']); expect(res.tasks.habits.length).to.equal(2); - let habitIds = _.map(res.tasks.habits, '_id'); + const habitIds = _.map(res.tasks.habits, '_id'); expect(habitIds).to.have.deep.members([tasks[0]._id, tasks[4]._id]); expect(res.tasks.dailys.length).to.equal(2); - let dailyIds = _.map(res.tasks.dailys, '_id'); + const dailyIds = _.map(res.tasks.dailys, '_id'); expect(dailyIds).to.have.deep.members([tasks[1]._id, tasks[5]._id]); expect(res.tasks.rewards.length).to.equal(2); - let rewardIds = _.map(res.tasks.rewards, '_id'); + const rewardIds = _.map(res.tasks.rewards, '_id'); expect(rewardIds).to.have.deep.members([tasks[2]._id, tasks[6]._id]); expect(res.tasks.todos.length).to.equal(3); - let todoIds = _.map(res.tasks.todos, '_id'); + const todoIds = _.map(res.tasks.todos, '_id'); expect(todoIds).to.deep.include.members([tasks[3]._id, tasks[7]._id]); }); }); diff --git a/test/api/v3/integration/debug/POST-debug_addHourglass.test.js b/test/api/v3/integration/debug/POST-debug_addHourglass.test.js index d528f79a81..b0ad288348 100644 --- a/test/api/v3/integration/debug/POST-debug_addHourglass.test.js +++ b/test/api/v3/integration/debug/POST-debug_addHourglass.test.js @@ -17,7 +17,7 @@ describe('POST /debug/add-hourglass', () => { it('adds Hourglass to the current user', async () => { await userToGetHourGlass.post('/debug/add-hourglass'); - let userWithHourGlass = await userToGetHourGlass.get('/user'); + const userWithHourGlass = await userToGetHourGlass.get('/user'); expect(userWithHourGlass.purchased.plan.consecutive.trinkets).to.equal(1); }); diff --git a/test/api/v3/integration/debug/POST-debug_addTenGems.test.js b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js index faaa2cbd10..74c39a153f 100644 --- a/test/api/v3/integration/debug/POST-debug_addTenGems.test.js +++ b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js @@ -17,7 +17,7 @@ describe('POST /debug/add-ten-gems', () => { it('adds ten gems to the current user', async () => { await userToGainTenGems.post('/debug/add-ten-gems'); - let userWithTenGems = await userToGainTenGems.get('/user'); + const userWithTenGems = await userToGainTenGems.get('/user'); expect(userWithTenGems.balance).to.equal(2.5); }); diff --git a/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js b/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js index cadb9e2b18..8b9f6ac10d 100644 --- a/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js +++ b/test/api/v3/integration/debug/POST-debug_modify-inventory.test.js @@ -6,7 +6,8 @@ import { } from '../../../../helpers/api-integration/v3'; describe('POST /debug/modify-inventory', () => { - let user, originalItems; + let user; let + originalItems; before(async () => { originalItems = { @@ -43,7 +44,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets equipment', async () => { - let gear = { + const gear = { weapon_healer_2: true, weapon_wizard_1: true, weapon_special_critical: true, @@ -59,7 +60,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets special spells', async () => { - let special = { + const special = { shinySeed: 3, }; @@ -73,7 +74,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets mounts', async () => { - let mounts = { + const mounts = { 'Orca-Base': true, 'Mammoth-Base': true, }; @@ -88,7 +89,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets eggs', async () => { - let eggs = { + const eggs = { Gryphon: 3, Hedgehog: 7, }; @@ -103,7 +104,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets hatching potions', async () => { - let hatchingPotions = { + const hatchingPotions = { White: 7, Spooky: 2, }; @@ -118,7 +119,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets food', async () => { - let food = { + const food = { Meat: 5, Candy_Red: 7, }; @@ -133,7 +134,7 @@ describe('POST /debug/modify-inventory', () => { }); it('sets quests', async () => { - let quests = { + const quests = { whale: 5, cheetah: 10, }; diff --git a/test/api/v3/integration/debug/POST-debug_set-cron.test.js b/test/api/v3/integration/debug/POST-debug_set-cron.test.js index 254bca2d1a..dfcd99c625 100644 --- a/test/api/v3/integration/debug/POST-debug_set-cron.test.js +++ b/test/api/v3/integration/debug/POST-debug_set-cron.test.js @@ -15,7 +15,7 @@ describe('POST /debug/set-cron', () => { }); it('sets last cron', async () => { - let newCron = new Date(2015, 11, 20); + const newCron = new Date(2015, 11, 20); await user.post('/debug/set-cron', { lastCron: newCron, diff --git a/test/api/v3/integration/emails/GET-email-unsubscribe.test.js b/test/api/v3/integration/emails/GET-email-unsubscribe.test.js index fcd26b7904..e44f809c73 100644 --- a/test/api/v3/integration/emails/GET-email-unsubscribe.test.js +++ b/test/api/v3/integration/emails/GET-email-unsubscribe.test.js @@ -1,13 +1,13 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; import { encrypt } from '../../../../../website/server/libs/encryption'; -import { v4 as generateUUID } from 'uuid'; describe('GET /email/unsubscribe', () => { let user; - let testEmail = 'test@habitica.com'; + const testEmail = 'test@habitica.com'; beforeEach(async () => { user = await generateUser(); @@ -22,7 +22,7 @@ describe('GET /email/unsubscribe', () => { }); it('return error when user is not found', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ _id: generateUUID(), })); @@ -34,34 +34,34 @@ describe('GET /email/unsubscribe', () => { }); it('unsubscribes a user from email notifications', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ _id: user._id, email: user.email, })); await user.get(`/email/unsubscribe?code=${code}`); - let unsubscribedUser = await user.get('/user'); + const unsubscribedUser = await user.get('/user'); expect(unsubscribedUser.preferences.emailNotifications.unsubscribeFromAll).to.be.true; }); it('unsubscribes an email from notifications', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ email: testEmail, })); - let unsubscribedMessage = await user.get(`/email/unsubscribe?code=${code}`); + const unsubscribedMessage = await user.get(`/email/unsubscribe?code=${code}`); expect(unsubscribedMessage).to.equal('

    Unsubscribed successfully!

    You won\'t receive any other email from Habitica.'); }); it('returns okay when email is already unsubscribed', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ email: testEmail, })); - let unsubscribedMessage = await user.get(`/email/unsubscribe?code=${code}`); + const unsubscribedMessage = await user.get(`/email/unsubscribe?code=${code}`); expect(unsubscribedMessage).to.equal('

    Unsubscribed successfully!

    You won\'t receive any other email from Habitica.'); }); diff --git a/test/api/v3/integration/groups/GET-group-plans.test.js b/test/api/v3/integration/groups/GET-group-plans.test.js index a56c01087d..42e82d133d 100644 --- a/test/api/v3/integration/groups/GET-group-plans.test.js +++ b/test/api/v3/integration/groups/GET-group-plans.test.js @@ -8,7 +8,7 @@ describe('GET /group-plans', () => { let groupPlan; before(async () => { - user = await generateUser({balance: 4}); + user = await generateUser({ balance: 4 }); groupPlan = await generateGroup(user, { name: 'public guild - is member', @@ -25,7 +25,7 @@ describe('GET /group-plans', () => { }); it('returns group plans for the user', async () => { - let groupPlans = await user.get('/group-plans'); + const groupPlans = await user.get('/group-plans'); expect(groupPlans[0]._id).to.eql(groupPlan._id); }); diff --git a/test/api/v3/integration/groups/GET-groups.test.js b/test/api/v3/integration/groups/GET-groups.test.js index 0baf835a02..5359cc4c85 100644 --- a/test/api/v3/integration/groups/GET-groups.test.js +++ b/test/api/v3/integration/groups/GET-groups.test.js @@ -16,7 +16,7 @@ describe('GET /groups', () => { const NUMBER_OF_USERS_PRIVATE_GUILDS = 1; const NUMBER_OF_GROUPS_USER_CAN_VIEW = 5; const GUILD_PER_PAGE = 30; - let categories = [{ + const categories = [{ slug: 'newCat', name: 'New Category', }]; @@ -26,15 +26,15 @@ describe('GET /groups', () => { before(async () => { await resetHabiticaDB(); - let leader = await generateUser({ balance: 10 }); - user = await generateUser({balance: 4}); + const leader = await generateUser({ balance: 10 }); + user = await generateUser({ balance: 4 }); - let publicGuildUserIsMemberOf = await generateGroup(leader, { + const publicGuildUserIsMemberOf = await generateGroup(leader, { name: 'public guild - is member', type: 'guild', privacy: 'public', }); - await leader.post(`/groups/${publicGuildUserIsMemberOf._id}/invite`, { uuids: [user._id]}); + await leader.post(`/groups/${publicGuildUserIsMemberOf._id}/invite`, { uuids: [user._id] }); await user.post(`/groups/${publicGuildUserIsMemberOf._id}/join`); publicGuildNotMember = await generateGroup(leader, { @@ -50,7 +50,7 @@ describe('GET /groups', () => { privacy: 'private', categories, }); - await leader.post(`/groups/${privateGuildUserIsMemberOf._id}/invite`, { uuids: [user._id]}); + await leader.post(`/groups/${privateGuildUserIsMemberOf._id}/invite`, { uuids: [user._id] }); await user.post(`/groups/${privateGuildUserIsMemberOf._id}/join`); await generateGroup(leader, { @@ -110,13 +110,13 @@ describe('GET /groups', () => { describe('filters', () => { it('returns public guilds filtered by category', async () => { - let guilds = await user.get(`/groups?type=publicGuilds&categories=${categories[0].slug}`); + const guilds = await user.get(`/groups?type=publicGuilds&categories=${categories[0].slug}`); expect(guilds[0]._id).to.equal(publicGuildNotMember._id); }); it('returns private guilds filtered by category', async () => { - let guilds = await user.get(`/groups?type=privateGuilds&categories=${categories[0].slug}`); + const guilds = await user.get(`/groups?type=privateGuilds&categories=${categories[0].slug}`); expect(guilds[0]._id).to.equal(privateGuildUserIsMemberOf._id); }); @@ -131,7 +131,7 @@ describe('GET /groups', () => { // @TODO: anyway to set higher memberCount in tests right now? - let guilds = await user.get('/groups?type=publicGuilds&minMemberCount=3'); + const guilds = await user.get('/groups?type=publicGuilds&minMemberCount=3'); expect(guilds.length).to.equal(0); }); @@ -146,7 +146,7 @@ describe('GET /groups', () => { // @TODO: anyway to set higher memberCount in tests right now? - let guilds = await user.get('/groups?type=privateGuilds&minMemberCount=3'); + const guilds = await user.get('/groups?type=privateGuilds&minMemberCount=3'); expect(guilds.length).to.equal(0); }); @@ -181,26 +181,24 @@ describe('GET /groups', () => { }); it('returns 30 guilds per page ordered by number of members', async () => { - await user.update({balance: 9000}); - let groups = await Promise.all(_.times(60, (i) => { - return generateGroup(user, { - name: `public guild ${i} - is member`, - type: 'guild', - privacy: 'public', - }); - })); + await user.update({ balance: 9000 }); + const groups = await Promise.all(_.times(60, i => generateGroup(user, { + name: `public guild ${i} - is member`, + type: 'guild', + privacy: 'public', + }))); // update group number 32 and not the first to make sure sorting works - await groups[32].update({name: 'guild with most members', memberCount: 199}); - await groups[33].update({name: 'guild with less members', memberCount: -100}); + await groups[32].update({ name: 'guild with most members', memberCount: 199 }); + await groups[33].update({ name: 'guild with less members', memberCount: -100 }); - let page0 = await expect(user.get('/groups?type=publicGuilds&paginate=true')) + const page0 = await expect(user.get('/groups?type=publicGuilds&paginate=true')) .to.eventually.have.a.lengthOf(GUILD_PER_PAGE); expect(page0[0].name).to.equal('guild with most members'); await expect(user.get('/groups?type=publicGuilds&paginate=true&page=1')) .to.eventually.have.a.lengthOf(GUILD_PER_PAGE); - let page2 = await expect(user.get('/groups?type=publicGuilds&paginate=true&page=2')) + const page2 = await expect(user.get('/groups?type=publicGuilds&paginate=true&page=2')) .to.eventually.have.a.lengthOf(1 + 4); // 1 created now, 4 by other tests expect(page2[4].name).to.equal('guild with less members'); }).timeout(10000); @@ -208,7 +206,8 @@ describe('GET /groups', () => { it('returns all the user\'s guilds when guilds passed in as query', async () => { await expect(user.get('/groups?type=guilds')) - .to.eventually.have.a.lengthOf(NUMBER_OF_PUBLIC_GUILDS_USER_IS_MEMBER + NUMBER_OF_USERS_PRIVATE_GUILDS); + .to.eventually.have.a + .lengthOf(NUMBER_OF_PUBLIC_GUILDS_USER_IS_MEMBER + NUMBER_OF_USERS_PRIVATE_GUILDS); }); it('returns all private guilds user is a part of when privateGuilds passed in as query', async () => { @@ -222,7 +221,7 @@ describe('GET /groups', () => { }); it('returns a list of groups user has access to', async () => { - let group = await generateGroup(user, { + const group = await generateGroup(user, { name: 'c++ coders', type: 'guild', privacy: 'public', diff --git a/test/api/v3/integration/groups/GET-groups_groupId_invites.test.js b/test/api/v3/integration/groups/GET-groups_groupId_invites.test.js index 832efe66e9..aa2a666bf4 100644 --- a/test/api/v3/integration/groups/GET-groups_groupId_invites.test.js +++ b/test/api/v3/integration/groups/GET-groups_groupId_invites.test.js @@ -1,9 +1,9 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /groups/:groupId/invites', () => { let user; @@ -29,8 +29,8 @@ describe('GET /groups/:groupId/invites', () => { }); it('fails if user doesn\'t have access to the group', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let anotherUser = await generateUser(); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/groups/${group._id}/invites`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -39,17 +39,17 @@ describe('GET /groups/:groupId/invites', () => { }); it('works when passing party as req.params.groupId', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let invited = await generateUser(); - await user.post(`/groups/${group._id}/invite`, {uuids: [invited._id]}); - let res = await user.get('/groups/party/invites'); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const invited = await generateUser(); + await user.post(`/groups/${group._id}/invite`, { uuids: [invited._id] }); + const res = await user.get('/groups/party/invites'); expect(res).to.be.an('array'); expect(res.length).to.equal(1); expect(res[0]).to.eql({ _id: invited._id, id: invited._id, - profile: {name: invited.profile.name}, + profile: { name: invited.profile.name }, auth: { local: { username: invited.auth.local.username, @@ -62,26 +62,26 @@ describe('GET /groups/:groupId/invites', () => { }); it('populates only some fields', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let invited = await generateUser(); - await user.post(`/groups/${group._id}/invite`, {uuids: [invited._id]}); - let res = await user.get('/groups/party/invites'); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const invited = await generateUser(); + await user.post(`/groups/${group._id}/invite`, { uuids: [invited._id] }); + const res = await user.get('/groups/party/invites'); expect(res[0]).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); expect(res[0].profile).to.have.all.keys(['name']); }); it('returns only first 30 invites', async () => { - let leader = await generateUser({balance: 4}); - let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); + const leader = await generateUser({ balance: 4 }); + const group = await generateGroup(leader, { type: 'guild', privacy: 'public', name: generateUUID() }); - let invitesToGenerate = []; - for (let i = 0; i < 31; i++) { + const invitesToGenerate = []; + for (let i = 0; i < 31; i += 1) { invitesToGenerate.push(generateUser()); } - let generatedInvites = await Promise.all(invitesToGenerate); - await leader.post(`/groups/${group._id}/invite`, {uuids: generatedInvites.map(invite => invite._id)}); + const generatedInvites = await Promise.all(invitesToGenerate); + await leader.post(`/groups/${group._id}/invite`, { uuids: generatedInvites.map(invite => invite._id) }); - let res = await leader.get(`/groups/${group._id}/invites`); + const res = await leader.get(`/groups/${group._id}/invites`); expect(res.length).to.equal(30); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -89,25 +89,25 @@ describe('GET /groups/:groupId/invites', () => { }); }).timeout(10000); - it('supports using req.query.lastId to get more invites', async function () { + it('supports using req.query.lastId to get more invites', async function test () { this.timeout(30000); // @TODO: times out after 8 seconds - let leader = await generateUser({balance: 4}); - let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); + const leader = await generateUser({ balance: 4 }); + const group = await generateGroup(leader, { type: 'guild', privacy: 'public', name: generateUUID() }); - let invitesToGenerate = []; - for (let i = 0; i < 32; i++) { + const invitesToGenerate = []; + for (let i = 0; i < 32; i += 1) { invitesToGenerate.push(generateUser()); } - let generatedInvites = await Promise.all(invitesToGenerate); // Group has 32 invites - let expectedIds = generatedInvites.map(generatedInvite => generatedInvite._id); - await user.post(`/groups/${group._id}/invite`, {uuids: expectedIds}); + const generatedInvites = await Promise.all(invitesToGenerate); // Group has 32 invites + const expectedIds = generatedInvites.map(generatedInvite => generatedInvite._id); + await user.post(`/groups/${group._id}/invite`, { uuids: expectedIds }); - let res = await user.get(`/groups/${group._id}/invites`); + const res = await user.get(`/groups/${group._id}/invites`); expect(res.length).to.equal(30); - let res2 = await user.get(`/groups/${group._id}/invites?lastId=${res[res.length - 1]._id}`); + const res2 = await user.get(`/groups/${group._id}/invites?lastId=${res[res.length - 1]._id}`); expect(res2.length).to.equal(2); - let resIds = res.concat(res2).map(invite => invite._id); + const resIds = res.concat(res2).map(invite => invite._id); expect(resIds).to.eql(expectedIds.sort()); }); }); diff --git a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js index 603b2f64b1..b5e6f70c0f 100644 --- a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js +++ b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js @@ -1,9 +1,9 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import common from '../../../../../website/common'; describe('GET /groups/:groupId/members', () => { @@ -12,8 +12,8 @@ describe('GET /groups/:groupId/members', () => { beforeEach(async () => { user = await generateUser({ balance: 10, - contributor: {level: 1}, - backer: {tier: 3}, + contributor: { level: 1 }, + backer: { tier: 3 }, preferences: { costume: false, background: 'volcano', @@ -38,8 +38,8 @@ describe('GET /groups/:groupId/members', () => { }); it('fails if user doesn\'t have access to the group', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); - let anotherUser = await generateUser(); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/groups/${group._id}/members`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -48,14 +48,14 @@ describe('GET /groups/:groupId/members', () => { }); it('works when passing party as req.params.groupId', async () => { - await generateGroup(user, {type: 'party', name: generateUUID()}); - let res = await user.get('/groups/party/members'); + await generateGroup(user, { type: 'party', name: generateUUID() }); + const res = await user.get('/groups/party/members'); expect(res).to.be.an('array'); expect(res.length).to.equal(1); expect(res[0]).to.eql({ _id: user._id, id: user._id, - profile: {name: user.profile.name}, + profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, @@ -68,15 +68,15 @@ describe('GET /groups/:groupId/members', () => { }); it('populates only some fields', async () => { - await generateGroup(user, {type: 'party', name: generateUUID()}); - let res = await user.get('/groups/party/members'); + await generateGroup(user, { type: 'party', name: generateUUID() }); + const res = await user.get('/groups/party/members'); expect(res[0]).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); expect(res[0].profile).to.have.all.keys(['name']); }); it('req.query.includeAllPublicFields === true works with guilds', async () => { - let group = await generateGroup(user, {type: 'guild', name: generateUUID()}); - let [memberRes] = await user.get(`/groups/${group._id}/members?includeAllPublicFields=true`); + const group = await generateGroup(user, { type: 'guild', name: generateUUID() }); + const [memberRes] = await user.get(`/groups/${group._id}/members?includeAllPublicFields=true`); expect(memberRes).to.have.all.keys([ // works as: object has all and only these keys '_id', 'id', 'preferences', 'profile', 'stats', 'achievements', 'party', @@ -96,8 +96,8 @@ describe('GET /groups/:groupId/members', () => { }); it('populates all public fields if req.query.includeAllPublicFields === true and it is a party', async () => { - await generateGroup(user, {type: 'party', name: generateUUID()}); - let [memberRes] = await user.get('/groups/party/members?includeAllPublicFields=true'); + await generateGroup(user, { type: 'party', name: generateUUID() }); + const [memberRes] = await user.get('/groups/party/members?includeAllPublicFields=true'); expect(memberRes).to.have.all.keys([ // works as: object has all and only these keys '_id', 'id', 'preferences', 'profile', 'stats', 'achievements', 'party', @@ -117,15 +117,15 @@ describe('GET /groups/:groupId/members', () => { }); it('returns only first 30 members', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); - let usersToGenerate = []; - for (let i = 0; i < 31; i++) { - usersToGenerate.push(generateUser({party: {_id: group._id}})); + const usersToGenerate = []; + for (let i = 0; i < 31; i += 1) { + usersToGenerate.push(generateUser({ party: { _id: group._id } })); } await Promise.all(usersToGenerate); - let res = await user.get('/groups/party/members'); + const res = await user.get('/groups/party/members'); expect(res.length).to.equal(30); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -134,15 +134,15 @@ describe('GET /groups/:groupId/members', () => { }); it('returns only first 30 members even when ?includeAllMembers=true', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); - let usersToGenerate = []; - for (let i = 0; i < 31; i++) { - usersToGenerate.push(generateUser({party: {_id: group._id}})); + const usersToGenerate = []; + for (let i = 0; i < 31; i += 1) { + usersToGenerate.push(generateUser({ party: { _id: group._id } })); } await Promise.all(usersToGenerate); - let res = await user.get('/groups/party/members?includeAllMembers=true'); + const res = await user.get('/groups/party/members?includeAllMembers=true'); expect(res.length).to.equal(30); res.forEach(member => { expect(member).to.have.all.keys(['_id', 'auth', 'flags', 'id', 'profile']); @@ -150,38 +150,39 @@ describe('GET /groups/:groupId/members', () => { }); }); - it('supports using req.query.lastId to get more members', async function () { + it('supports using req.query.lastId to get more members', async function test () { this.timeout(30000); // @TODO: times out after 8 seconds - let leader = await generateUser({balance: 4}); - let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); + const leader = await generateUser({ balance: 4 }); + const group = await generateGroup(leader, { type: 'guild', privacy: 'public', name: generateUUID() }); - let usersToGenerate = []; - for (let i = 0; i < 57; i++) { - usersToGenerate.push(generateUser({guilds: [group._id]})); + const usersToGenerate = []; + for (let i = 0; i < 57; i += 1) { + usersToGenerate.push(generateUser({ guilds: [group._id] })); } - let generatedUsers = await Promise.all(usersToGenerate); // Group has 59 members (1 is the leader) - let expectedIds = [leader._id].concat(generatedUsers.map(generatedUser => generatedUser._id)); + // Group has 59 members (1 is the leader) + const generatedUsers = await Promise.all(usersToGenerate); + const expectedIds = [leader._id].concat(generatedUsers.map(generatedUser => generatedUser._id)); - let res = await user.get(`/groups/${group._id}/members`); + const res = await user.get(`/groups/${group._id}/members`); expect(res.length).to.equal(30); - let res2 = await user.get(`/groups/${group._id}/members?lastId=${res[res.length - 1]._id}`); + const res2 = await user.get(`/groups/${group._id}/members?lastId=${res[res.length - 1]._id}`); expect(res2.length).to.equal(28); - let resIds = res.concat(res2).map(member => member._id); + const resIds = res.concat(res2).map(member => member._id); expect(resIds).to.eql(expectedIds.sort()); }); it('searches members', async () => { - let group = await generateGroup(user, {type: 'party', name: generateUUID()}); + const group = await generateGroup(user, { type: 'party', name: generateUUID() }); - let usersToGenerate = []; - for (let i = 0; i < 2; i++) { - usersToGenerate.push(generateUser({party: {_id: group._id}})); + const usersToGenerate = []; + for (let i = 0; i < 2; i += 1) { + usersToGenerate.push(generateUser({ party: { _id: group._id } })); } const usersCreated = await Promise.all(usersToGenerate); const userToSearch = usersCreated[0].profile.name; - let res = await user.get(`/groups/party/members?search=${userToSearch}`); + const res = await user.get(`/groups/party/members?search=${userToSearch}`); expect(res.length).to.equal(1); expect(res[0].profile.name).to.equal(userToSearch); }); diff --git a/test/api/v3/integration/groups/GET-groups_id.test.js b/test/api/v3/integration/groups/GET-groups_id.test.js index 9b9aba0e6f..3e2f3b8742 100644 --- a/test/api/v3/integration/groups/GET-groups_id.test.js +++ b/test/api/v3/integration/groups/GET-groups_id.test.js @@ -1,37 +1,38 @@ -import { - generateUser, - createAndPopulateGroup, - translate as t, -} from '../../../../helpers/api-integration/v3'; import { v4 as generateUUID } from 'uuid'; import { each, } from 'lodash'; +import { + generateUser, + createAndPopulateGroup, + translate as t, +} from '../../../../helpers/api-integration/v3'; describe('GET /groups/:id', () => { - let typesOfGroups = {}; + const typesOfGroups = {}; typesOfGroups['public guild'] = { type: 'guild', privacy: 'public' }; typesOfGroups['private guild'] = { type: 'guild', privacy: 'private' }; typesOfGroups.party = { type: 'party', privacy: 'private' }; each(typesOfGroups, (groupDetails, groupType) => { context(`Member of a ${groupType}`, () => { - let leader, member, createdGroup; + let leader; let member; let + createdGroup; before(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ members: 30, groupDetails, }); leader = groupData.groupLeader; - member = groupData.members[0]; + member = groupData.members[0]; // eslint-disable-line prefer-destructuring createdGroup = groupData.group; }); it('returns the group object', async () => { - let group = await member.get(`/groups/${createdGroup._id}`); + const group = await member.get(`/groups/${createdGroup._id}`); expect(group._id).to.eql(createdGroup._id); expect(group.name).to.eql(createdGroup.name); @@ -40,7 +41,7 @@ describe('GET /groups/:id', () => { }); it('transforms leader id to leader object', async () => { - let group = await member.get(`/groups/${createdGroup._id}`); + const group = await member.get(`/groups/${createdGroup._id}`); expect(group.leader._id).to.eql(leader._id); expect(group.leader.profile.name).to.eql(leader.profile.name); @@ -49,10 +50,11 @@ describe('GET /groups/:id', () => { }); context('Non-member of a public guild', () => { - let nonMember, createdGroup; + let nonMember; let + createdGroup; before(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ members: 1, groupDetails: { name: 'test guild', @@ -62,11 +64,11 @@ describe('GET /groups/:id', () => { }); createdGroup = groupData.group; - nonMember = await generateUser(); + nonMember = await generateUser(); }); it('returns the group object for a non-member', async () => { - let group = await nonMember.get(`/groups/${createdGroup._id}`); + const group = await nonMember.get(`/groups/${createdGroup._id}`); expect(group._id).to.eql(createdGroup._id); expect(group.name).to.eql(createdGroup.name); @@ -76,10 +78,11 @@ describe('GET /groups/:id', () => { }); context('Non-member of a private guild', () => { - let nonMember, createdGroup; + let nonMember; let + createdGroup; before(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ members: 1, groupDetails: { name: 'test guild', @@ -103,10 +106,11 @@ describe('GET /groups/:id', () => { }); context('Non-member of a party', () => { - let nonMember, createdGroup; + let nonMember; let + createdGroup; before(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ members: 1, groupDetails: { name: 'test party', @@ -130,10 +134,11 @@ describe('GET /groups/:id', () => { }); context('Member of a party', () => { - let member, createdGroup; + let member; let + createdGroup; before(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ members: 1, groupDetails: { name: 'test party', @@ -143,11 +148,11 @@ describe('GET /groups/:id', () => { }); createdGroup = groupData.group; - member = groupData.members[0]; + member = groupData.members[0]; // eslint-disable-line prefer-destructuring }); it('returns the user\'s party if an id of "party" is passed in', async () => { - let group = await member.get('/groups/party'); + const group = await member.get('/groups/party'); expect(group._id).to.eql(createdGroup._id); expect(group.name).to.eql(createdGroup.name); @@ -173,7 +178,7 @@ describe('GET /groups/:id', () => { }); it('removes non-existant guild from user\'s guild list', async () => { - let guildId = generateUUID(); + const guildId = generateUUID(); await user.update({ guilds: [guildId, generateUUID()], @@ -193,7 +198,7 @@ describe('GET /groups/:id', () => { }); it('removes non-existant party from user\'s party object', async () => { - let partyId = generateUUID(); + const partyId = generateUUID(); await user.update({ party: { _id: partyId }, @@ -215,20 +220,20 @@ describe('GET /groups/:id', () => { context('Flagged messages', () => { let group; - let chat1 = { + const chat1 = { id: 'chat1', text: 'chat 1', flags: {}, }; - let chat2 = { + const chat2 = { id: 'chat2', text: 'chat 2', flags: {}, flagCount: 0, }; - let chat3 = { + const chat3 = { id: 'chat3', text: 'chat 3', flags: { @@ -237,7 +242,7 @@ describe('GET /groups/:id', () => { flagCount: 1, }; - let chat4 = { + const chat4 = { id: 'chat4', text: 'chat 4', flags: { @@ -247,7 +252,7 @@ describe('GET /groups/:id', () => { flagCount: 2, }; - let chat5 = { + const chat5 = { id: 'chat5', text: 'chat 5', flags: { @@ -259,7 +264,7 @@ describe('GET /groups/:id', () => { }; beforeEach(async () => { - let groupData = await createAndPopulateGroup({ + const groupData = await createAndPopulateGroup({ groupDetails: { name: 'test guild', type: 'guild', @@ -287,7 +292,7 @@ describe('GET /groups/:id', () => { }); it('does not include messages with a flag count of 2 or greater', async () => { - let fetchedGroup = await nonAdmin.get(`/groups/${group._id}`); + const fetchedGroup = await nonAdmin.get(`/groups/${group._id}`); expect(fetchedGroup.chat).to.have.lengthOf(3); expect(fetchedGroup.chat[0].id).to.eql(chat1.id); @@ -296,8 +301,8 @@ describe('GET /groups/:id', () => { }); it('does not include user ids in flags object', async () => { - let fetchedGroup = await nonAdmin.get(`/groups/${group._id}`); - let chatWithOneFlag = fetchedGroup.chat[2]; + const fetchedGroup = await nonAdmin.get(`/groups/${group._id}`); + const chatWithOneFlag = fetchedGroup.chat[2]; expect(chatWithOneFlag.id).to.eql(chat3.id); expect(chat3.flags).to.eql({ 'user-id': true }); @@ -315,7 +320,7 @@ describe('GET /groups/:id', () => { }); it('includes all messages', async () => { - let fetchedGroup = await admin.get(`/groups/${group._id}`); + const fetchedGroup = await admin.get(`/groups/${group._id}`); expect(fetchedGroup.chat).to.have.lengthOf(5); expect(fetchedGroup.chat[0].id).to.eql(chat1.id); @@ -326,8 +331,8 @@ describe('GET /groups/:id', () => { }); it('includes user ids in flags object', async () => { - let fetchedGroup = await admin.get(`/groups/${group._id}`); - let chatWithOneFlag = fetchedGroup.chat[2]; + const fetchedGroup = await admin.get(`/groups/${group._id}`); + const chatWithOneFlag = fetchedGroup.chat[2]; expect(chatWithOneFlag.id).to.eql(chat3.id); expect(chat3.flags).to.eql({ 'user-id': true }); diff --git a/test/api/v3/integration/groups/POST-group_remove_manager.test.js b/test/api/v3/integration/groups/POST-group_remove_manager.test.js index c07e868009..e8cae4ab29 100644 --- a/test/api/v3/integration/groups/POST-group_remove_manager.test.js +++ b/test/api/v3/integration/groups/POST-group_remove_manager.test.js @@ -1,13 +1,14 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /group/:groupId/remove-manager', () => { - let leader, nonLeader, groupToUpdate; - let groupName = 'Test Public Guild'; - let groupType = 'guild'; + let leader; let nonLeader; let + groupToUpdate; + const groupName = 'Test Public Guild'; + const groupType = 'guild'; let nonManager; function findAssignedTask (memberTask) { @@ -15,7 +16,7 @@ describe('POST /group/:groupId/remove-manager', () => { } beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: groupName, type: groupType, @@ -26,8 +27,8 @@ describe('POST /group/:groupId/remove-manager', () => { groupToUpdate = group; leader = groupLeader; - nonLeader = members[0]; - nonManager = members[1]; + nonLeader = members[0]; // eslint-disable-line prefer-destructuring + nonManager = members[1]; // eslint-disable-line prefer-destructuring }); it('returns an error when a non group leader tries to add member', async () => { @@ -55,7 +56,7 @@ describe('POST /group/:groupId/remove-manager', () => { managerId: nonLeader._id, }); - let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, { + const updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, { managerId: nonLeader._id, }); @@ -66,14 +67,14 @@ describe('POST /group/:groupId/remove-manager', () => { await leader.post(`/groups/${groupToUpdate._id}/add-manager`, { managerId: nonLeader._id, }); - let task = await leader.post(`/tasks/group/${groupToUpdate._id}`, { + const task = await leader.post(`/tasks/group/${groupToUpdate._id}`, { text: 'test todo', type: 'todo', requiresApproval: true, }); await nonLeader.post(`/tasks/${task._id}/assign/${nonManager._id}`); - let memberTasks = await nonManager.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await nonManager.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(nonManager.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -81,7 +82,7 @@ describe('POST /group/:groupId/remove-manager', () => { message: t('taskApprovalHasBeenRequested'), }); - let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, { + const updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, { managerId: nonLeader._id, }); diff --git a/test/api/v3/integration/groups/POST-groups.test.js b/test/api/v3/integration/groups/POST-groups.test.js index 5fd322a564..934281209f 100644 --- a/test/api/v3/integration/groups/POST-groups.test.js +++ b/test/api/v3/integration/groups/POST-groups.test.js @@ -13,7 +13,7 @@ describe('POST /group', () => { context('All Groups', () => { it('it returns validation error when type is not provided', async () => { await expect( - user.post('/groups', { name: 'Test Group Without Type' }) + user.post('/groups', { name: 'Test Group Without Type' }), ).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -23,7 +23,7 @@ describe('POST /group', () => { it('it returns validation error when type is not supported', async () => { await expect( - user.post('/groups', { name: 'Group with unsupported type', type: 'foo' }) + user.post('/groups', { name: 'Group with unsupported type', type: 'foo' }), ).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -32,7 +32,7 @@ describe('POST /group', () => { }); it('sets the group leader to the user who created the group', async () => { - let group = await user.post('/groups', { + const group = await user.post('/groups', { name: 'Test Public Guild', type: 'guild', }); @@ -80,7 +80,7 @@ describe('POST /group', () => { user.post('/groups', { name: 'Test Public Guild', type: 'guild', - }) + }), ).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', @@ -89,13 +89,13 @@ describe('POST /group', () => { }); it('adds guild to user\'s list of guilds', async () => { - let guild = await user.post('/groups', { + const guild = await user.post('/groups', { name: 'some guild', type: 'guild', privacy: 'public', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.guilds).to.include(guild._id); }); @@ -107,18 +107,18 @@ describe('POST /group', () => { privacy: 'public', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.achievements.joinedGuild).to.eql(true); }); context('public guild', () => { it('creates a group', async () => { - let groupName = 'Test Public Guild'; - let groupType = 'guild'; - let groupPrivacy = 'public'; + const groupName = 'Test Public Guild'; + const groupType = 'guild'; + const groupPrivacy = 'public'; - let publicGuild = await user.post('/groups', { + const publicGuild = await user.post('/groups', { name: groupName, type: groupType, privacy: groupPrivacy, @@ -145,7 +145,7 @@ describe('POST /group', () => { name: 'Test Public Guild', type: 'guild', privacy: 'public', - }) + }), ).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', @@ -155,12 +155,12 @@ describe('POST /group', () => { }); context('private guild', () => { - let groupName = 'Test Private Guild'; - let groupType = 'guild'; - let groupPrivacy = 'private'; + const groupName = 'Test Private Guild'; + const groupType = 'guild'; + const groupPrivacy = 'private'; it('creates a group', async () => { - let privateGuild = await user.post('/groups', { + const privateGuild = await user.post('/groups', { name: groupName, type: groupType, privacy: groupPrivacy, @@ -181,7 +181,7 @@ describe('POST /group', () => { it('creates a private guild when the user has no chat privileges', async () => { await user.update({ 'flags.chatRevoked': true }); - let privateGuild = await user.post('/groups', { + const privateGuild = await user.post('/groups', { name: groupName, type: groupType, privacy: groupPrivacy, @@ -191,7 +191,7 @@ describe('POST /group', () => { }); it('deducts gems from user and adds them to guild bank', async () => { - let privateGuild = await user.post('/groups', { + const privateGuild = await user.post('/groups', { name: groupName, type: groupType, privacy: groupPrivacy, @@ -199,7 +199,7 @@ describe('POST /group', () => { expect(privateGuild.balance).to.eql(1); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.balance).to.eql(user.balance - 1); }); @@ -207,11 +207,11 @@ describe('POST /group', () => { }); context('Parties', () => { - let partyName = 'Test Party'; - let partyType = 'party'; + const partyName = 'Test Party'; + const partyType = 'party'; it('creates a party', async () => { - let party = await user.post('/groups', { + const party = await user.post('/groups', { name: partyName, type: partyType, }); @@ -230,7 +230,7 @@ describe('POST /group', () => { it('creates a party when the user has no chat privileges', async () => { await user.update({ 'flags.chatRevoked': true }); - let party = await user.post('/groups', { + const party = await user.post('/groups', { name: partyName, type: partyType, }); @@ -241,25 +241,25 @@ describe('POST /group', () => { it('does not require gems to create a party', async () => { await user.update({ balance: 0 }); - let party = await user.post('/groups', { + const party = await user.post('/groups', { name: partyName, type: partyType, }); expect(party._id).to.exist; - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.balance).to.eql(user.balance); }); it('sets party id on user object', async () => { - let party = await user.post('/groups', { + const party = await user.post('/groups', { name: partyName, type: partyType, }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.party._id).to.eql(party._id); }); @@ -270,7 +270,7 @@ describe('POST /group', () => { type: partyType, }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.achievements.partyUp).to.not.eql(true); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js index a3d88d82a4..dbb2e00f15 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js @@ -1,16 +1,16 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, createAndPopulateGroup, checkExistence, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /group/:groupId/join', () => { const PET_QUEST = 'whale'; it('returns error when groupId is not for a valid group', async () => { - let joiningUser = await generateUser(); + const joiningUser = await generateUser(); await expect(joiningUser.post(`/groups/${generateUUID()}/join`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -20,10 +20,11 @@ describe('POST /group/:groupId/join', () => { }); context('Joining a public guild', () => { - let user, joiningUser, publicGuild; + let user; let joiningUser; let + publicGuild; beforeEach(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -37,7 +38,7 @@ describe('POST /group/:groupId/join', () => { }); it('allows non-invited users to join public guilds', async () => { - let res = await joiningUser.post(`/groups/${publicGuild._id}/join`); + const res = await joiningUser.post(`/groups/${publicGuild._id}/join`); await expect(joiningUser.get('/user')).to.eventually.have.property('guilds').to.include(publicGuild._id); expect(res.leader._id).to.eql(user._id); @@ -62,7 +63,7 @@ describe('POST /group/:groupId/join', () => { }); it('increments memberCount when joining guilds', async () => { - let oldMemberCount = publicGuild.memberCount; + const oldMemberCount = publicGuild.memberCount; await joiningUser.post(`/groups/${publicGuild._id}/join`); @@ -77,10 +78,11 @@ describe('POST /group/:groupId/join', () => { }); context('Joining a private guild', () => { - let user, invitedUser, guild; + let user; let invitedUser; let + guild; beforeEach(async () => { - let { group, groupLeader, invitees } = await createAndPopulateGroup({ + const { group, groupLeader, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -91,11 +93,11 @@ describe('POST /group/:groupId/join', () => { guild = group; user = groupLeader; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('returns error when user is not invited to private guild', async () => { - let userWithoutInvite = await generateUser(); + const userWithoutInvite = await generateUser(); await expect(userWithoutInvite.post(`/groups/${guild._id}/join`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -116,11 +118,11 @@ describe('POST /group/:groupId/join', () => { await expect(invitedUser.get('/user')) .to.eventually.have.nested.property('invitations.guilds') - .to.not.include({id: guild._id}); + .to.not.include({ id: guild._id }); }); it('increments memberCount when joining guilds', async () => { - let oldMemberCount = guild.memberCount; + const oldMemberCount = guild.memberCount; await invitedUser.post(`/groups/${guild._id}/join`); @@ -144,8 +146,8 @@ describe('POST /group/:groupId/join', () => { it('notifies inviting user that their invitation was accepted', async () => { await invitedUser.post(`/groups/${guild._id}/join`); - let inviter = await user.get('/user'); - let expectedData = { + const inviter = await user.get('/user'); + const expectedData = { headerText: t('invitationAcceptedHeader'), bodyText: t('invitationAcceptedBody', { username: invitedUser.auth.local.username, @@ -166,10 +168,11 @@ describe('POST /group/:groupId/join', () => { }); context('Joining a party', () => { - let user, invitedUser, party; + let user; let invitedUser; let + party; beforeEach(async () => { - let { group, groupLeader, invitees } = await createAndPopulateGroup({ + const { group, groupLeader, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Party', type: 'party', @@ -180,11 +183,11 @@ describe('POST /group/:groupId/join', () => { party = group; user = groupLeader; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('returns error when user is not invited to party', async () => { - let userWithoutInvite = await generateUser(); + const userWithoutInvite = await generateUser(); await expect(userWithoutInvite.post(`/groups/${party._id}/join`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -203,9 +206,9 @@ describe('POST /group/:groupId/join', () => { it('notifies inviting user that their invitation was accepted', async () => { await invitedUser.post(`/groups/${party._id}/join`); - let inviter = await user.get('/user'); + const inviter = await user.get('/user'); - let expectedData = { + const expectedData = { headerText: t('invitationAcceptedHeader'), bodyText: t('invitationAcceptedBody', { username: invitedUser.auth.local.username, @@ -224,7 +227,7 @@ describe('POST /group/:groupId/join', () => { }); it('increments memberCount when joining party', async () => { - let oldMemberCount = party.memberCount; + const oldMemberCount = party.memberCount; await invitedUser.post(`/groups/${party._id}/join`); @@ -238,7 +241,7 @@ describe('POST /group/:groupId/join', () => { }); it('increments basilist quest item count to inviter when joining a party', async () => { - await user.update({'items.quests.basilist': 1 }); + await user.update({ 'items.quests.basilist': 1 }); await invitedUser.post(`/groups/${party._id}/join`); @@ -246,8 +249,8 @@ describe('POST /group/:groupId/join', () => { }); it('deletes previous party where the user was the only member', async () => { - let userToInvite = await generateUser(); - let oldParty = await userToInvite.post('/groups', { // add user to a party + const userToInvite = await generateUser(); + const oldParty = await userToInvite.post('/groups', { // add user to a party name: 'Another Test Party', type: 'party', }); @@ -263,8 +266,8 @@ describe('POST /group/:groupId/join', () => { }); it('does not allow user to leave a party if a quest was active and they were the only member', async () => { - let userToInvite = await generateUser(); - let oldParty = await userToInvite.post('/groups', { // add user to a party + const userToInvite = await generateUser(); + const oldParty = await userToInvite.post('/groups', { // add user to a party name: 'Another Test Party', type: 'party', }); @@ -305,7 +308,8 @@ describe('POST /group/:groupId/join', () => { }); context('Party incentive achievements', () => { - let leader, member, party; + let leader; let member; let + party; beforeEach(async () => { leader = await generateUser(); @@ -314,6 +318,7 @@ describe('POST /group/:groupId/join', () => { name: 'Testing Party', type: 'party', }); + await leader.post(`/groups/${party._id}/invite`, { uuids: [member._id], }); @@ -325,7 +330,9 @@ describe('POST /group/:groupId/join', () => { await leader.sync(); expect(member).to.have.nested.property('achievements.partyUp', true); + expect(member.notifications.find(notification => notification.type === 'ACHIEVEMENT_PARTY_UP')).to.exist; expect(leader).to.have.nested.property('achievements.partyUp', true); + expect(leader.notifications.find(notification => notification.type === 'ACHIEVEMENT_PARTY_UP')).to.exist; }); it('does not award Party On achievement to party of size 2', async () => { @@ -337,8 +344,8 @@ describe('POST /group/:groupId/join', () => { }); it('awards Party On achievement to party of size 4', async () => { - let addlMemberOne = await generateUser(); - let addlMemberTwo = await generateUser(); + const addlMemberOne = await generateUser(); + const addlMemberTwo = await generateUser(); await leader.post(`/groups/${party._id}/invite`, { uuids: [addlMemberOne._id, addlMemberTwo._id], }); @@ -349,7 +356,9 @@ describe('POST /group/:groupId/join', () => { await leader.sync(); expect(member).to.have.nested.property('achievements.partyOn', true); + expect(member.notifications.find(notification => notification.type === 'ACHIEVEMENT_PARTY_ON')).to.exist; expect(leader).to.have.nested.property('achievements.partyOn', true); + expect(leader.notifications.find(notification => notification.type === 'ACHIEVEMENT_PARTY_ON')).to.exist; }); }); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_leave.js b/test/api/v3/integration/groups/POST-groups_groupId_leave.js index 65d76f4714..70d60cc3d0 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_leave.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_leave.js @@ -1,3 +1,7 @@ +import { v4 as generateUUID } from 'uuid'; +import { + each, +} from 'lodash'; import { generateChallenge, checkExistence, @@ -6,15 +10,11 @@ import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { - each, -} from 'lodash'; import { model as User } from '../../../../../website/server/models/user'; -import * as payments from '../../../../../website/server/libs/payments/payments'; +import payments from '../../../../../website/server/libs/payments/payments'; describe('POST /groups/:groupId/leave', () => { - let typesOfGroups = { + const typesOfGroups = { 'public guild': { type: 'guild', privacy: 'public' }, 'private guild': { type: 'guild', privacy: 'private' }, party: { type: 'party', privacy: 'private' }, @@ -28,19 +28,19 @@ describe('POST /groups/:groupId/leave', () => { let memberCount; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails, members: 1, }); groupToLeave = group; leader = groupLeader; - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring memberCount = group.memberCount; }); it('prevents non members from leaving', async () => { - let user = await generateUser(); + const user = await generateUser(); await expect(user.post(`/groups/${groupToLeave._id}/leave`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -51,7 +51,7 @@ describe('POST /groups/:groupId/leave', () => { it(`lets user leave a ${groupType}`, async () => { await member.post(`/groups/${groupToLeave._id}/leave`); - let userThatLeftGroup = await member.get('/user'); + const userThatLeftGroup = await member.get('/user'); expect(userThatLeftGroup.guilds).to.be.empty; expect(userThatLeftGroup.party._id).to.not.exist; @@ -74,17 +74,13 @@ describe('POST /groups/:groupId/leave', () => { await leader.sync(); - expect(leader.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupToLeave._id; - })).to.exist; + expect(leader.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupToLeave._id)).to.exist; expect(leader.newMessages[groupToLeave._id]).to.not.be.empty; await leader.post(`/groups/${groupToLeave._id}/leave`); await leader.sync(); - expect(leader.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupToLeave._id; - })).to.not.exist; + expect(leader.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupToLeave._id)).to.not.exist; expect(leader.newMessages[groupToLeave._id]).to.be.undefined; }); @@ -106,7 +102,7 @@ describe('POST /groups/:groupId/leave', () => { it('removes all challenge tasks when keep parameter is set to remove', async () => { await leader.post(`/groups/${groupToLeave._id}/leave?keep=remove-all`); - let userWithoutChallengeTasks = await leader.get('/user'); + const userWithoutChallengeTasks = await leader.get('/user'); expect(userWithoutChallengeTasks.challenges).to.not.include(challenge._id); expect(userWithoutChallengeTasks.tasksOrder.habits).to.be.empty; @@ -115,16 +111,16 @@ describe('POST /groups/:groupId/leave', () => { it('keeps all challenge tasks when keep parameter is not set', async () => { await leader.post(`/groups/${groupToLeave._id}/leave`); - let userWithChallengeTasks = await leader.get('/user'); + const userWithChallengeTasks = await leader.get('/user'); // @TODO find elegant way to assert against the task existing expect(userWithChallengeTasks.tasksOrder.habits).to.not.be.empty; }); it('keeps the user in the challenge when the keepChallenges parameter is set to remain-in-challenges', async () => { - await leader.post(`/groups/${groupToLeave._id}/leave`, {keepChallenges: 'remain-in-challenges'}); + await leader.post(`/groups/${groupToLeave._id}/leave`, { keepChallenges: 'remain-in-challenges' }); - let userWithChallengeTasks = await leader.get('/user'); + const userWithChallengeTasks = await leader.get('/user'); expect(userWithChallengeTasks.challenges).to.include(challenge._id); }); @@ -132,7 +128,7 @@ describe('POST /groups/:groupId/leave', () => { it('drops the user in the challenge when the keepChallenges parameter isn\'t set', async () => { await leader.post(`/groups/${groupToLeave._id}/leave`); - let userWithChallengeTasks = await leader.get('/user'); + const userWithChallengeTasks = await leader.get('/user'); expect(userWithChallengeTasks.challenges).to.not.include(challenge._id); }); @@ -150,7 +146,7 @@ describe('POST /groups/:groupId/leave', () => { let invitedUser; beforeEach(async () => { - let { group, groupLeader, invitees } = await createAndPopulateGroup({ + const { group, groupLeader, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Private Guild', type: 'guild', @@ -160,7 +156,7 @@ describe('POST /groups/:groupId/leave', () => { privateGuild = group; leader = groupLeader; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring await leader.post(`/groups/${group._id}/chat`, { message: 'Some message' }); }); @@ -174,7 +170,7 @@ describe('POST /groups/:groupId/leave', () => { it('removes invitations when the last member leaves', async () => { await leader.post(`/groups/${privateGuild._id}/leave`); - let userWithoutInvitation = await invitedUser.get('/user'); + const userWithoutInvitation = await invitedUser.get('/user'); expect(userWithoutInvitation.invitations.guilds).to.be.empty; }); @@ -186,7 +182,7 @@ describe('POST /groups/:groupId/leave', () => { let invitedUser; beforeEach(async () => { - let { group, groupLeader, invitees } = await createAndPopulateGroup({ + const { group, groupLeader, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Public Guild', type: 'guild', @@ -197,7 +193,7 @@ describe('POST /groups/:groupId/leave', () => { publicGuild = group; leader = groupLeader; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('keeps the group when the last member leaves', async () => { @@ -209,14 +205,14 @@ describe('POST /groups/:groupId/leave', () => { it('keeps the invitations when the last member leaves a public guild', async () => { await leader.post(`/groups/${publicGuild._id}/leave`); - let userWithoutInvitation = await invitedUser.get('/user'); + const userWithoutInvitation = await invitedUser.get('/user'); expect(userWithoutInvitation.invitations.guilds).to.not.be.empty; }); it('deletes non existant guild from user when user tries to leave', async () => { - let nonExistentGuildId = generateUUID(); - let userWithNonExistentGuild = await generateUser({guilds: [nonExistentGuildId]}); + const nonExistentGuildId = generateUUID(); + const userWithNonExistentGuild = await generateUser({ guilds: [nonExistentGuildId] }); expect(userWithNonExistentGuild.guilds).to.contain(nonExistentGuildId); await expect(userWithNonExistentGuild.post(`/groups/${nonExistentGuildId}/leave`)) @@ -234,7 +230,7 @@ describe('POST /groups/:groupId/leave', () => { let invitedUser; beforeEach(async () => { - let { group, groupLeader, invitees } = await createAndPopulateGroup({ + const { group, groupLeader, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Party', type: 'party', @@ -244,7 +240,7 @@ describe('POST /groups/:groupId/leave', () => { party = group; leader = groupLeader; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('removes a group when the last member leaves a party', async () => { @@ -256,15 +252,15 @@ describe('POST /groups/:groupId/leave', () => { it('removes invitations when the last member leaves a party', async () => { await leader.post(`/groups/${party._id}/leave`); - let userWithoutInvitation = await invitedUser.get('/user'); + const userWithoutInvitation = await invitedUser.get('/user'); expect(userWithoutInvitation.invitations.parties[0]).to.be.undefined; }); }); it('deletes non existant party from user when user tries to leave', async () => { - let nonExistentPartyId = generateUUID(); - let userWithNonExistentParty = await generateUser({'party._id': nonExistentPartyId}); + const nonExistentPartyId = generateUUID(); + const userWithNonExistentParty = await generateUser({ 'party._id': nonExistentPartyId }); expect(userWithNonExistentParty.party._id).to.eql(nonExistentPartyId); await expect(userWithNonExistentParty.post(`/groups/${nonExistentPartyId}/leave`)) @@ -283,17 +279,17 @@ describe('POST /groups/:groupId/leave', () => { let member; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails, members: 1, }); leader = groupLeader; - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring groupWithPlan = group; - let userWithFreePlan = await User.findById(leader._id).exec(); + const userWithFreePlan = await User.findById(leader._id).exec(); // Create subscription - let paymentData = { + const paymentData = { user: userWithFreePlan, groupId: groupWithPlan._id, sub: { @@ -322,7 +318,7 @@ describe('POST /groups/:groupId/leave', () => { it('preserves the free subscription when leaving a any other group without a plan', async () => { // Joining a guild without a group plan - let { group: groupWithNoPlan } = await createAndPopulateGroup({ + const { group: groupWithNoPlan } = await createAndPopulateGroup({ groupDetails: { name: 'Group Without Plan', type: 'guild', diff --git a/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js b/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js index 59d8645d01..68fba0e772 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_reject.test.js @@ -6,10 +6,11 @@ import { describe('POST /group/:groupId/reject-invite', () => { context('Rejecting a public guild invite', () => { - let publicGuild, invitedUser; + let publicGuild; let + invitedUser; beforeEach(async () => { - let {group, invitees} = await createAndPopulateGroup({ + const { group, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -19,11 +20,11 @@ describe('POST /group/:groupId/reject-invite', () => { }); publicGuild = group; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('returns error when user is not invited', async () => { - let userWithoutInvite = await generateUser(); + const userWithoutInvite = await generateUser(); await expect(userWithoutInvite.post(`/groups/${publicGuild._id}/reject-invite`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -37,15 +38,16 @@ describe('POST /group/:groupId/reject-invite', () => { await expect(invitedUser.get('/user')) .to.eventually.have.nested.property('invitations.guilds') - .to.not.include({id: publicGuild._id}); + .to.not.include({ id: publicGuild._id }); }); }); context('Rejecting a private guild invite', () => { - let invitedUser, guild; + let invitedUser; let + guild; beforeEach(async () => { - let { group, invitees } = await createAndPopulateGroup({ + const { group, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -55,11 +57,11 @@ describe('POST /group/:groupId/reject-invite', () => { }); guild = group; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('returns error when user is not invited', async () => { - let userWithoutInvite = await generateUser(); + const userWithoutInvite = await generateUser(); await expect(userWithoutInvite.post(`/groups/${guild._id}/reject-invite`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -73,15 +75,16 @@ describe('POST /group/:groupId/reject-invite', () => { await expect(invitedUser.get('/user')) .to.eventually.have.nested.property('invitations.guilds') - .to.not.include({id: guild._id}); + .to.not.include({ id: guild._id }); }); }); context('Rejecting a party invite', () => { - let invitedUser, party; + let invitedUser; let + party; beforeEach(async () => { - let { group, invitees } = await createAndPopulateGroup({ + const { group, invitees } = await createAndPopulateGroup({ groupDetails: { name: 'Test Party', type: 'party', @@ -91,11 +94,11 @@ describe('POST /group/:groupId/reject-invite', () => { }); party = group; - invitedUser = invitees[0]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring }); it('returns error when user is not invited', async () => { - let userWithoutInvite = await generateUser(); + const userWithoutInvite = await generateUser(); await expect(userWithoutInvite.post(`/groups/${party._id}/reject-invite`)).to.eventually.be.rejected.and.eql({ code: 401, diff --git a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js index b29902bc20..43de0a59ce 100644 --- a/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js +++ b/test/api/v3/integration/groups/POST-groups_id_removeMember.test.js @@ -15,7 +15,9 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { let adminUser; beforeEach(async () => { - let { group, groupLeader, invitees, members } = await createAndPopulateGroup({ + const { + group, groupLeader, invitees, members, + } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -27,15 +29,15 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { guild = group; leader = groupLeader; - invitedUser = invitees[0]; - member = members[0]; - member2 = members[1]; + invitedUser = invitees[0]; // eslint-disable-line prefer-destructuring + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring adminUser = await generateUser({ 'contributor.admin': true }); }); context('All Groups', () => { it('returns an error when user is not member of the group', async () => { - let nonMember = await generateUser(); + const nonMember = await generateUser(); expect(nonMember.post(`/groups/${guild._id}/removeMember/${member._id}`)) .to.eventually.be.rejected.and.eql({ @@ -74,13 +76,13 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { it('can remove other members', async () => { await leader.post(`/groups/${guild._id}/removeMember/${member._id}`); - let memberRemoved = await member.get('/user'); + const memberRemoved = await member.get('/user'); expect(memberRemoved.guilds.indexOf(guild._id)).eql(-1); }); it('updates memberCount', async () => { - let oldMemberCount = guild.memberCount; + const oldMemberCount = guild.memberCount; await leader.post(`/groups/${guild._id}/removeMember/${member._id}`); await expect(leader.get(`/groups/${guild._id}`)).to.eventually.have.property('memberCount', oldMemberCount - 1); }); @@ -88,14 +90,14 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { it('can remove other invites', async () => { await leader.post(`/groups/${guild._id}/removeMember/${invitedUser._id}`); - let invitedUserWithoutInvite = await invitedUser.get('/user'); + const invitedUserWithoutInvite = await invitedUser.get('/user'); expect(_.findIndex(invitedUserWithoutInvite.invitations.guilds, { id: guild._id })).eql(-1); }); it('allows an admin to remove other members', async () => { await adminUser.post(`/groups/${guild._id}/removeMember/${member._id}`); - let memberRemoved = await member.get('/user'); + const memberRemoved = await member.get('/user'); expect(memberRemoved.guilds.indexOf(guild._id)).eql(-1); }); @@ -103,7 +105,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { it('allows an admin to remove other invites', async () => { await adminUser.post(`/groups/${guild._id}/removeMember/${invitedUser._id}`); - let invitedUserWithoutInvite = await invitedUser.get('/user'); + const invitedUserWithoutInvite = await invitedUser.get('/user'); expect(_.findIndex(invitedUserWithoutInvite.invitations.guilds, { id: guild._id })).eql(-1); }); @@ -141,7 +143,9 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { let removedMember; beforeEach(async () => { - let { group, groupLeader, invitees, members } = await createAndPopulateGroup({ + const { + group, groupLeader, invitees, members, + } = await createAndPopulateGroup({ groupDetails: { name: 'Test Party', type: 'party', @@ -153,9 +157,9 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { party = group; partyLeader = groupLeader; - partyInvitedUser = invitees[0]; - partyMember = members[0]; - removedMember = members[1]; + partyInvitedUser = invitees[0]; // eslint-disable-line prefer-destructuring + partyMember = members[0]; // eslint-disable-line prefer-destructuring + removedMember = members[1]; // eslint-disable-line prefer-destructuring sandbox.spy(email, 'sendTxn'); }); @@ -166,13 +170,13 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { it('can remove other members', async () => { await partyLeader.post(`/groups/${party._id}/removeMember/${partyMember._id}`); - let memberRemoved = await partyMember.get('/user'); + const memberRemoved = await partyMember.get('/user'); expect(memberRemoved.party._id).eql(undefined); }); it('updates memberCount', async () => { - let oldMemberCount = party.memberCount; + const oldMemberCount = party.memberCount; await partyLeader.post(`/groups/${party._id}/removeMember/${partyMember._id}`); await expect(partyLeader.get(`/groups/${party._id}`)).to.eventually.have.property('memberCount', oldMemberCount - 1); }); @@ -182,7 +186,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { await partyLeader.post(`/groups/${party._id}/removeMember/${partyInvitedUser._id}`); - let invitedUserWithoutInvite = await partyInvitedUser.get('/user'); + const invitedUserWithoutInvite = await partyInvitedUser.get('/user'); expect(invitedUserWithoutInvite.invitations.parties[0]).to.be.undefined; }); @@ -192,22 +196,18 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { await sleep(0.5); await removedMember.sync(); - expect(removedMember.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === party._id; - })).to.exist; + expect(removedMember.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === party._id)).to.exist; expect(removedMember.newMessages[party._id]).to.not.be.empty; await partyLeader.post(`/groups/${party._id}/removeMember/${removedMember._id}`); await removedMember.sync(); - expect(removedMember.notifications.find(n => { - return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === party._id; - })).to.not.exist; + expect(removedMember.notifications.find(n => n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === party._id)).to.not.exist; expect(removedMember.newMessages[party._id]).to.be.undefined; }); it('removes user from quest when removing user from party after quest starts', async () => { - let petQuest = 'whale'; + const petQuest = 'whale'; await partyLeader.update({ [`items.quests.${petQuest}`]: 1, }); @@ -229,7 +229,7 @@ describe('POST /groups/:groupId/removeMember/:memberId', () => { }); it('removes user from quest when removing user from party before quest starts', async () => { - let petQuest = 'whale'; + const petQuest = 'whale'; await partyLeader.update({ [`items.quests.${petQuest}`]: 1, }); diff --git a/test/api/v3/integration/groups/POST-groups_invite.test.js b/test/api/v3/integration/groups/POST-groups_invite.test.js index 2a648e2bb3..f677f038fe 100644 --- a/test/api/v3/integration/groups/POST-groups_invite.test.js +++ b/test/api/v3/integration/groups/POST-groups_invite.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; +import nconf from 'nconf'; import { generateUser, generateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import nconf from 'nconf'; const INVITES_LIMIT = 100; const PARTY_LIMIT_MEMBERS = 30; @@ -13,10 +13,10 @@ const MAX_EMAIL_INVITES_BY_USER = 200; describe('Post /groups/:groupId/invite', () => { let inviter; let group; - let groupName = 'Test Public Guild'; + const groupName = 'Test Public Guild'; beforeEach(async () => { - inviter = await generateUser({balance: 4}); + inviter = await generateUser({ balance: 4 }); group = await inviter.post('/groups', { name: groupName, type: 'guild', @@ -33,7 +33,7 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithUsernameNotFound', {username: fakeID}), + message: t('userWithUsernameNotFound', { username: fakeID }), }); }); @@ -69,7 +69,10 @@ describe('Post /groups/:groupId/invite', () => { const userToInvite2 = await generateUser(); await expect(inviter.post(`/groups/${group._id}/invite`, { - usernames: [userToInvite.auth.local.lowerCaseUsername, userToInvite2.auth.local.lowerCaseUsername], + usernames: [ + userToInvite.auth.local.lowerCaseUsername, + userToInvite2.auth.local.lowerCaseUsername, + ], })).to.eventually.deep.equal([ { id: group._id, @@ -92,8 +95,8 @@ describe('Post /groups/:groupId/invite', () => { describe('user id invites', () => { it('returns an error when inviter has no chat privileges', async () => { - let inviterMuted = await inviter.update({'flags.chatRevoked': true}); - let userToInvite = await generateUser(); + const inviterMuted = await inviter.update({ 'flags.chatRevoked': true }); + const userToInvite = await generateUser(); await expect(inviterMuted.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], })) @@ -105,7 +108,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when invited user is not found', async () => { - let fakeID = generateUUID(); + const fakeID = generateUUID(); await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [fakeID], @@ -113,7 +116,7 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: fakeID}), + message: t('userWithIDNotFound', { userId: fakeID }), }); }); @@ -129,10 +132,10 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when uuids is not an array', async () => { - let fakeID = generateUUID(); + const fakeID = generateUUID(); await expect(inviter.post(`/groups/${group._id}/invite`, { - uuids: {fakeID}, + uuids: { fakeID }, })) .to.eventually.be.rejected.and.eql({ code: 400, @@ -165,7 +168,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when there are more than INVITES_LIMIT uuids', async () => { - let uuids = []; + const uuids = []; for (let i = 0; i < 101; i += 1) { uuids.push(generateUUID()); @@ -177,13 +180,13 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + message: t('canOnlyInviteMaxInvites', { maxInvites: INVITES_LIMIT }), }); }); it('returns error when recipient has blocked the senders', async () => { - const inviterNoBlocks = await inviter.update({'inbox.blocks': []}); - let userWithBlockedInviter = await generateUser({'inbox.blocks': [inviter._id]}); + const inviterNoBlocks = await inviter.update({ 'inbox.blocks': [] }); + const userWithBlockedInviter = await generateUser({ 'inbox.blocks': [inviter._id] }); await expect(inviterNoBlocks.post(`/groups/${group._id}/invite`, { uuids: [userWithBlockedInviter._id], })) @@ -195,7 +198,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('invites a user to a group by uuid', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], @@ -211,8 +214,8 @@ describe('Post /groups/:groupId/invite', () => { }); it('invites multiple users to a group by uuid', async () => { - let userToInvite = await generateUser(); - let userToInvite2 = await generateUser(); + const userToInvite = await generateUser(); + const userToInvite2 = await generateUser(); await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id, userToInvite2._id], @@ -236,8 +239,8 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when inviting multiple users and a user is not found', async () => { - let userToInvite = await generateUser(); - let fakeID = generateUUID(); + const userToInvite = await generateUser(); + const fakeID = generateUUID(); await expect(inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id, fakeID], @@ -245,16 +248,16 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: fakeID}), + message: t('userWithIDNotFound', { userId: fakeID }), }); }); }); describe('email invites', () => { - let testInvite = {name: 'test', email: 'test@habitica.com'}; + const testInvite = { name: 'test', email: 'test@habitica.com' }; it('returns an error when inviter has no chat privileges', async () => { - let inviterMuted = await inviter.update({'flags.chatRevoked': true}); + const inviterMuted = await inviter.update({ 'flags.chatRevoked': true }); await expect(inviterMuted.post(`/groups/${group._id}/invite`, { emails: [testInvite], inviter: 'inviter name', @@ -268,7 +271,7 @@ describe('Post /groups/:groupId/invite', () => { it('returns an error when invite is missing an email', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { - emails: [{name: 'test'}], + emails: [{ name: 'test' }], })) .to.eventually.be.rejected.and.eql({ code: 400, @@ -279,7 +282,7 @@ describe('Post /groups/:groupId/invite', () => { it('returns an error when emails is not an array', async () => { await expect(inviter.post(`/groups/${group._id}/invite`, { - emails: {testInvite}, + emails: { testInvite }, })) .to.eventually.be.rejected.and.eql({ code: 400, @@ -300,7 +303,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when there are more than INVITES_LIMIT emails', async () => { - let emails = []; + const emails = []; for (let i = 0; i < 101; i += 1) { emails.push(`${generateUUID()}@habitica.com`); @@ -312,16 +315,16 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + message: t('canOnlyInviteMaxInvites', { maxInvites: INVITES_LIMIT }), }); }); it('returns an error when a user has sent the max number of email invites', async () => { - let inviterWithMax = await generateUser({ + const inviterWithMax = await generateUser({ invitesSent: MAX_EMAIL_INVITES_BY_USER, balance: 4, }); - let tmpGroup = await inviterWithMax.post('/groups', { + const tmpGroup = await inviterWithMax.post('/groups', { name: groupName, type: 'guild', }); @@ -333,28 +336,28 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('inviteLimitReached', {techAssistanceEmail: nconf.get('EMAILS_TECH_ASSISTANCE_EMAIL')}), + message: t('inviteLimitReached', { techAssistanceEmail: nconf.get('EMAILS_TECH_ASSISTANCE_EMAIL') }), }); }); it('invites a user to a group by email', async () => { - let res = await inviter.post(`/groups/${group._id}/invite`, { + const res = await inviter.post(`/groups/${group._id}/invite`, { emails: [testInvite], inviter: 'inviter name', }); - let updatedUser = await inviter.sync(); + const updatedUser = await inviter.sync(); expect(res).to.exist; expect(updatedUser.invitesSent).to.eql(1); }); it('invites multiple users to a group by email', async () => { - let res = await inviter.post(`/groups/${group._id}/invite`, { - emails: [testInvite, {name: 'test2', email: 'test2@habitica.com'}], + const res = await inviter.post(`/groups/${group._id}/invite`, { + emails: [testInvite, { name: 'test2', email: 'test2@habitica.com' }], }); - let updatedUser = await inviter.sync(); + const updatedUser = await inviter.sync(); expect(res).to.exist; expect(updatedUser.invitesSent).to.eql(2); @@ -372,8 +375,8 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when there are more than INVITES_LIMIT uuids and emails', async () => { - let emails = []; - let uuids = []; + const emails = []; + const uuids = []; for (let i = 0; i < 50; i += 1) { emails.push(`${generateUUID()}@habitica.com`); @@ -390,35 +393,35 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('canOnlyInviteMaxInvites', {maxInvites: INVITES_LIMIT}), + message: t('canOnlyInviteMaxInvites', { maxInvites: INVITES_LIMIT }), }); }); it('invites users to a group by uuid and email', async () => { - let newUser = await generateUser(); - let invite = await inviter.post(`/groups/${group._id}/invite`, { + const newUser = await generateUser(); + const invite = await inviter.post(`/groups/${group._id}/invite`, { uuids: [newUser._id], - emails: [{name: 'test', email: 'test@habitica.com'}], + emails: [{ name: 'test', email: 'test@habitica.com' }], }); - let invitedUser = await newUser.get('/user'); + const invitedUser = await newUser.get('/user'); expect(invitedUser.invitations.guilds[0].id).to.equal(group._id); expect(invite).to.exist; }); it('invites marks invite with cancelled plan', async () => { - let cancelledPlanGroup = await generateGroup(inviter, { + const cancelledPlanGroup = await generateGroup(inviter, { type: 'guild', name: generateUUID(), }); await cancelledPlanGroup.createCancelledSubscription(); - let newUser = await generateUser(); - let invite = await inviter.post(`/groups/${cancelledPlanGroup._id}/invite`, { + const newUser = await generateUser(); + const invite = await inviter.post(`/groups/${cancelledPlanGroup._id}/invite`, { uuids: [newUser._id], - emails: [{name: 'test', email: 'test@habitica.com'}], + emails: [{ name: 'test', email: 'test@habitica.com' }], }); - let invitedUser = await newUser.get('/user'); + const invitedUser = await newUser.get('/user'); expect(invitedUser.invitations.guilds[0].id).to.equal(cancelledPlanGroup._id); expect(invitedUser.invitations.guilds[0].cancelledPlan).to.be.true; @@ -428,8 +431,8 @@ describe('Post /groups/:groupId/invite', () => { describe('guild invites', () => { it('returns an error when inviter has no chat privileges', async () => { - let inviterMuted = await inviter.update({'flags.chatRevoked': true}); - let userToInvite = await generateUser(); + const inviterMuted = await inviter.update({ 'flags.chatRevoked': true }); + const userToInvite = await generateUser(); await expect(inviterMuted.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], })) @@ -441,7 +444,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when invited user is already invited to the group', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); await inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], }); @@ -452,12 +455,12 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('userAlreadyInvitedToGroup', { userId: userToInvite._id, username: userToInvite.profile.name}), + message: t('userAlreadyInvitedToGroup', { userId: userToInvite._id, username: userToInvite.profile.name }), }); }); it('returns an error when invited user is already in the group', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); await inviter.post(`/groups/${group._id}/invite`, { uuids: [userToInvite._id], }); @@ -469,17 +472,17 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('userAlreadyInGroup', { userId: userToInvite._id, username: userToInvite.profile.name}), + message: t('userAlreadyInGroup', { userId: userToInvite._id, username: userToInvite.profile.name }), }); }); it('allows 30+ members in a guild', async () => { - let invitesToGenerate = []; + const invitesToGenerate = []; // Generate 30 users to invite (30 + leader = 31 members) - for (let i = 0; i < PARTY_LIMIT_MEMBERS; i++) { + for (let i = 0; i < PARTY_LIMIT_MEMBERS; i += 1) { invitesToGenerate.push(generateUser()); } - let generatedInvites = await Promise.all(invitesToGenerate); + const generatedInvites = await Promise.all(invitesToGenerate); // Invite users expect(await inviter.post(`/groups/${group._id}/invite`, { uuids: generatedInvites.map(invite => invite._id), @@ -488,9 +491,9 @@ describe('Post /groups/:groupId/invite', () => { // @TODO: Add this after we are able to mock the group plan route xit('returns an error when a non-leader invites to a group plan', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); - let nonGroupLeader = await generateUser(); + const nonGroupLeader = await generateUser(); await inviter.post(`/groups/${group._id}/invite`, { uuids: [nonGroupLeader._id], }); @@ -518,8 +521,8 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when inviter has no chat privileges', async () => { - let inviterMuted = await inviter.update({'flags.chatRevoked': true}); - let userToInvite = await generateUser(); + const inviterMuted = await inviter.update({ 'flags.chatRevoked': true }); + const userToInvite = await generateUser(); await expect(inviterMuted.post(`/groups/${party._id}/invite`, { uuids: [userToInvite._id], })) @@ -531,7 +534,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('returns an error when invited user has a pending invitation to the party', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); await inviter.post(`/groups/${party._id}/invite`, { uuids: [userToInvite._id], }); @@ -542,13 +545,13 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('userAlreadyPendingInvitation', { userId: userToInvite._id, username: userToInvite.profile.name}), + message: t('userAlreadyPendingInvitation', { userId: userToInvite._id, username: userToInvite.profile.name }), }); }); it('returns an error when invited user is already in a party of more than 1 member', async () => { - let userToInvite = await generateUser(); - let userToInvite2 = await generateUser(); + const userToInvite = await generateUser(); + const userToInvite2 = await generateUser(); await inviter.post(`/groups/${party._id}/invite`, { uuids: [userToInvite._id, userToInvite2._id], }); @@ -561,12 +564,12 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('userAlreadyInAParty', { userId: userToInvite._id, username: userToInvite.profile.name}), + message: t('userAlreadyInAParty', { userId: userToInvite._id, username: userToInvite.profile.name }), }); }); it('allow inviting a user to a party if they are partying solo', async () => { - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); await userToInvite.post('/groups', { // add user to a party name: 'Another Test Party', type: 'party', @@ -580,13 +583,13 @@ describe('Post /groups/:groupId/invite', () => { it('allow inviting a user to 2 different parties', async () => { // Create another inviter - let inviter2 = await generateUser(); + const inviter2 = await generateUser(); // Create user to invite - let userToInvite = await generateUser(); + const userToInvite = await generateUser(); // Create second group - let party2 = await inviter2.post('/groups', { + const party2 = await inviter2.post('/groups', { name: 'Test Party 2', type: 'party', }); @@ -602,7 +605,7 @@ describe('Post /groups/:groupId/invite', () => { }); // Get updated user - let invitedUser = await userToInvite.get('/user'); + const invitedUser = await userToInvite.get('/user'); expect(invitedUser.invitations.parties.length).to.equal(2); expect(invitedUser.invitations.parties[0].id).to.equal(party._id); @@ -610,7 +613,7 @@ describe('Post /groups/:groupId/invite', () => { }); it('allow inviting a user if party id is not associated with a real party', async () => { - let userToInvite = await generateUser({ + const userToInvite = await generateUser({ party: { _id: generateUUID() }, }); @@ -621,12 +624,12 @@ describe('Post /groups/:groupId/invite', () => { }); it('allows 30 members in a party', async () => { - let invitesToGenerate = []; + const invitesToGenerate = []; // Generate 29 users to invite (29 + leader = 30 members) - for (let i = 0; i < PARTY_LIMIT_MEMBERS - 1; i++) { + for (let i = 0; i < PARTY_LIMIT_MEMBERS - 1; i += 1) { invitesToGenerate.push(generateUser()); } - let generatedInvites = await Promise.all(invitesToGenerate); + const generatedInvites = await Promise.all(invitesToGenerate); // Invite users expect(await inviter.post(`/groups/${party._id}/invite`, { uuids: generatedInvites.map(invite => invite._id), @@ -634,12 +637,12 @@ describe('Post /groups/:groupId/invite', () => { }).timeout(10000); it('does not allow 30+ members in a party', async () => { - let invitesToGenerate = []; + const invitesToGenerate = []; // Generate 30 users to invite (30 + leader = 31 members) - for (let i = 0; i < PARTY_LIMIT_MEMBERS; i++) { + for (let i = 0; i < PARTY_LIMIT_MEMBERS; i += 1) { invitesToGenerate.push(generateUser()); } - let generatedInvites = await Promise.all(invitesToGenerate); + const generatedInvites = await Promise.all(invitesToGenerate); // Invite users await expect(inviter.post(`/groups/${party._id}/invite`, { uuids: generatedInvites.map(invite => invite._id), @@ -647,7 +650,7 @@ describe('Post /groups/:groupId/invite', () => { .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: t('partyExceedsMembersLimit', {maxMembersParty: PARTY_LIMIT_MEMBERS}), + message: t('partyExceedsMembersLimit', { maxMembersParty: PARTY_LIMIT_MEMBERS }), }); }).timeout(10000); }); diff --git a/test/api/v3/integration/groups/POST-groups_manager.test.js b/test/api/v3/integration/groups/POST-groups_manager.test.js index 8730ea8c95..e7b6cad9de 100644 --- a/test/api/v3/integration/groups/POST-groups_manager.test.js +++ b/test/api/v3/integration/groups/POST-groups_manager.test.js @@ -5,14 +5,15 @@ import { } from '../../../../helpers/api-integration/v3'; describe('POST /group/:groupId/add-manager', () => { - let leader, nonLeader, groupToUpdate; - let groupName = 'Test Public Guild'; - let groupType = 'guild'; + let leader; let nonLeader; let + groupToUpdate; + const groupName = 'Test Public Guild'; + const groupType = 'guild'; let nonMember; context('Guilds', () => { beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: groupName, type: groupType, @@ -23,7 +24,7 @@ describe('POST /group/:groupId/add-manager', () => { groupToUpdate = group; leader = groupLeader; - nonLeader = members[0]; + nonLeader = members[0]; // eslint-disable-line prefer-destructuring nonMember = await generateUser(); }); @@ -48,7 +49,7 @@ describe('POST /group/:groupId/add-manager', () => { }); it('allows a leader to add managers', async () => { - let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/add-manager`, { + const updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/add-manager`, { managerId: nonLeader._id, }); @@ -57,10 +58,11 @@ describe('POST /group/:groupId/add-manager', () => { }); context('Party', () => { - let party, partyLeader, partyNonLeader; + let party; let partyLeader; let + partyNonLeader; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: groupName, type: 'party', @@ -71,11 +73,11 @@ describe('POST /group/:groupId/add-manager', () => { party = group; partyLeader = groupLeader; - partyNonLeader = members[0]; + partyNonLeader = members[0]; // eslint-disable-line prefer-destructuring }); it('allows leader of party to add managers', async () => { - let updatedGroup = await partyLeader.post(`/groups/${party._id}/add-manager`, { + const updatedGroup = await partyLeader.post(`/groups/${party._id}/add-manager`, { managerId: partyNonLeader._id, }); diff --git a/test/api/v3/integration/groups/PUT-groups.test.js b/test/api/v3/integration/groups/PUT-groups.test.js index 9dc00cb891..a471bafd1c 100644 --- a/test/api/v3/integration/groups/PUT-groups.test.js +++ b/test/api/v3/integration/groups/PUT-groups.test.js @@ -5,13 +5,14 @@ import { } from '../../../../helpers/api-integration/v3'; describe('PUT /group', () => { - let leader, nonLeader, groupToUpdate, adminUser; - let groupName = 'Test Public Guild'; - let groupType = 'guild'; - let groupUpdatedName = 'Test Public Guild Updated'; + let leader; let nonLeader; let groupToUpdate; let + adminUser; + const groupName = 'Test Public Guild'; + const groupType = 'guild'; + const groupUpdatedName = 'Test Public Guild Updated'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: groupName, type: groupType, @@ -22,7 +23,7 @@ describe('PUT /group', () => { adminUser = await generateUser({ 'contributor.admin': true }); groupToUpdate = group; leader = groupLeader; - nonLeader = members[0]; + nonLeader = members[0]; // eslint-disable-line prefer-destructuring }); it('returns an error when a user that is not an admin or group leader tries to update', async () => { @@ -36,7 +37,7 @@ describe('PUT /group', () => { }); it('updates a group', async () => { - let updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { + const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { name: groupUpdatedName, }); @@ -46,12 +47,12 @@ describe('PUT /group', () => { }); it('updates a group categories', async () => { - let categories = [{ + const categories = [{ slug: 'newCat', name: 'New Category', }]; - let updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { + const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { categories, }); @@ -60,7 +61,7 @@ describe('PUT /group', () => { }); it('allows an admin to update a guild', async () => { - let updatedGroup = await adminUser.put(`/groups/${groupToUpdate._id}`, { + const updatedGroup = await adminUser.put(`/groups/${groupToUpdate._id}`, { name: groupUpdatedName, }); expect(updatedGroup.leader._id).to.eql(leader._id); @@ -69,7 +70,7 @@ describe('PUT /group', () => { }); it('allows a leader to change leaders', async () => { - let updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { + const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, { name: groupUpdatedName, leader: nonLeader._id, }); diff --git a/test/api/v3/integration/hall/GET-hall_heroes.test.js b/test/api/v3/integration/hall/GET-hall_heroes.test.js index f0fa59ad6b..a8fb9f70ec 100644 --- a/test/api/v3/integration/hall/GET-hall_heroes.test.js +++ b/test/api/v3/integration/hall/GET-hall_heroes.test.js @@ -7,15 +7,15 @@ describe('GET /hall/heroes', () => { it('returns all heroes sorted by -contributor.level and with correct fields', async () => { await resetHabiticaDB(); - let nonHero = await generateUser(); - let hero1 = await generateUser({ - contributor: {level: 1}, + const nonHero = await generateUser(); + const hero1 = await generateUser({ + contributor: { level: 1 }, }); - let hero2 = await generateUser({ - contributor: {level: 3}, + const hero2 = await generateUser({ + contributor: { level: 3 }, }); - let heroes = await nonHero.get('/hall/heroes'); + const heroes = await nonHero.get('/hall/heroes'); expect(heroes.length).to.equal(2); expect(heroes[0]._id).to.equal(hero2._id); expect(heroes[1]._id).to.equal(hero1._id); diff --git a/test/api/v3/integration/hall/GET-hall_heroes_heroId.test.js b/test/api/v3/integration/hall/GET-hall_heroes_heroId.test.js index 4b5bab8f0b..c3e78a8f79 100644 --- a/test/api/v3/integration/hall/GET-hall_heroes_heroId.test.js +++ b/test/api/v3/integration/hall/GET-hall_heroes_heroId.test.js @@ -1,20 +1,20 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /heroes/:heroId', () => { let user; before(async () => { user = await generateUser({ - contributor: {admin: true}, + contributor: { admin: true }, }); }); it('requires the caller to be an admin', async () => { - let nonAdmin = await generateUser(); + const nonAdmin = await generateUser(); await expect(nonAdmin.get(`/hall/heroes/${user._id}`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -27,24 +27,24 @@ describe('GET /heroes/:heroId', () => { await expect(user.get('/hall/heroes/invalidUUID')).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: 'invalidUUID'}), + message: t('userWithIDNotFound', { userId: 'invalidUUID' }), }); }); it('handles non-existing heroes', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/hall/heroes/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); it('returns only necessary hero data given user id', async () => { - let hero = await generateUser({ - contributor: {tier: 23}, + const hero = await generateUser({ + contributor: { tier: 23 }, }); - let heroRes = await user.get(`/hall/heroes/${hero._id}`); + const heroRes = await user.get(`/hall/heroes/${hero._id}`); expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys '_id', 'id', 'balance', 'profile', 'purchased', @@ -55,10 +55,10 @@ describe('GET /heroes/:heroId', () => { }); it('returns only necessary hero data given username', async () => { - let hero = await generateUser({ - contributor: {tier: 23}, + const hero = await generateUser({ + contributor: { tier: 23 }, }); - let heroRes = await user.get(`/hall/heroes/${hero.auth.local.username}`); + const heroRes = await user.get(`/hall/heroes/${hero.auth.local.username}`); expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys '_id', 'id', 'balance', 'profile', 'purchased', @@ -70,7 +70,7 @@ describe('GET /heroes/:heroId', () => { it('returns correct hero using search with difference case', async () => { await generateUser({}, { username: 'TestUpperCaseName123' }); - let heroRes = await user.get('/hall/heroes/TestuPPerCasEName123'); + const heroRes = await user.get('/hall/heroes/TestuPPerCasEName123'); expect(heroRes.auth.local.username).to.equal('TestUpperCaseName123'); }); }); diff --git a/test/api/v3/integration/hall/GET-hall_patrons.test.js b/test/api/v3/integration/hall/GET-hall_patrons.test.js index 1e9064ad43..ea58db24c4 100644 --- a/test/api/v3/integration/hall/GET-hall_patrons.test.js +++ b/test/api/v3/integration/hall/GET-hall_patrons.test.js @@ -1,9 +1,9 @@ +import { times } from 'lodash'; import { generateUser, translate as t, resetHabiticaDB, } from '../../../../helpers/api-integration/v3'; -import { times } from 'lodash'; describe('GET /hall/patrons', () => { let user; @@ -22,14 +22,14 @@ describe('GET /hall/patrons', () => { }); it('returns all patrons sorted by -backer.tier and with correct fields', async () => { - let patron1 = await generateUser({ - backer: {tier: 1}, + const patron1 = await generateUser({ + backer: { tier: 1 }, }); - let patron2 = await generateUser({ - backer: {tier: 3}, + const patron2 = await generateUser({ + backer: { tier: 3 }, }); - let patrons = await user.get('/hall/patrons'); + const patrons = await user.get('/hall/patrons'); expect(patrons.length).to.equal(2); expect(patrons[0]._id).to.equal(patron2._id); expect(patrons[1]._id).to.equal(patron1._id); @@ -45,14 +45,12 @@ describe('GET /hall/patrons', () => { }); it('returns only first 50 patrons per request, more if req.query.page is passed', async () => { - await Promise.all(times(53, n => { - return generateUser({backer: {tier: n}}); - })); + await Promise.all(times(53, n => generateUser({ backer: { tier: n } }))); - let patrons = await user.get('/hall/patrons'); + const patrons = await user.get('/hall/patrons'); expect(patrons.length).to.equal(50); - let morePatrons = await user.get('/hall/patrons?page=1'); + const morePatrons = await user.get('/hall/patrons?page=1'); expect(morePatrons.length).to.equal(2); expect(morePatrons[0].backer.tier).to.equal(2); expect(morePatrons[1].backer.tier).to.equal(1); diff --git a/test/api/v3/integration/hall/PUT-hall_heores_heroId.test.js b/test/api/v3/integration/hall/PUT-hall_heores_heroId.test.js index 36e8e27842..db6eaf82ae 100644 --- a/test/api/v3/integration/hall/PUT-hall_heores_heroId.test.js +++ b/test/api/v3/integration/hall/PUT-hall_heores_heroId.test.js @@ -1,20 +1,20 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT /heroes/:heroId', () => { let user; before(async () => { user = await generateUser({ - contributor: {admin: true}, + contributor: { admin: true }, }); }); it('requires the caller to be an admin', async () => { - let nonAdmin = await generateUser(); + const nonAdmin = await generateUser(); await expect(nonAdmin.put(`/hall/heroes/${user._id}`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -32,22 +32,22 @@ describe('PUT /heroes/:heroId', () => { }); it('handles non-existing heroes', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.put(`/hall/heroes/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); it('change contributor level, balance, ads', async () => { - let hero = await generateUser(); - let prevBlockState = hero.auth.blocked; - let prevSleepState = hero.preferences.sleep; - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { + const hero = await generateUser(); + const prevBlockState = hero.auth.blocked; + const prevSleepState = hero.preferences.sleep; + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { balance: 3, - contributor: {level: 1}, - purchased: {ads: true}, + contributor: { level: 1 }, + purchased: { ads: true }, }); // test response @@ -74,10 +74,10 @@ describe('PUT /heroes/:heroId', () => { }); it('block a user', async () => { - let hero = await generateUser(); - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { - auth: {blocked: true}, - preferences: {sleep: true}, + const hero = await generateUser(); + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { + auth: { blocked: true }, + preferences: { sleep: true }, }); // test response values @@ -89,10 +89,10 @@ describe('PUT /heroes/:heroId', () => { }); it('unblock a user', async () => { - let hero = await generateUser(); - let prevSleepState = hero.preferences.sleep; - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { - auth: {blocked: false}, + const hero = await generateUser(); + const prevSleepState = hero.preferences.sleep; + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { + auth: { blocked: false }, }); // test response values @@ -104,29 +104,29 @@ describe('PUT /heroes/:heroId', () => { }); it('updates chatRevoked flag', async () => { - let hero = await generateUser(); + const hero = await generateUser(); await user.put(`/hall/heroes/${hero._id}`, { - flags: {chatRevoked: true}, + flags: { chatRevoked: true }, }); await hero.sync(); expect(hero.flags.chatRevoked).to.eql(true); }); it('updates chatShadowMuted flag', async () => { - let hero = await generateUser(); + const hero = await generateUser(); await user.put(`/hall/heroes/${hero._id}`, { - flags: {chatShadowMuted: true}, + flags: { chatShadowMuted: true }, }); await hero.sync(); expect(hero.flags.chatShadowMuted).to.eql(true); }); it('updates contributor level', async () => { - let hero = await generateUser({ - contributor: {level: 5}, + const hero = await generateUser({ + contributor: { level: 5 }, }); - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { - contributor: {level: 6}, + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { + contributor: { level: 6 }, }); // test response @@ -149,11 +149,11 @@ describe('PUT /heroes/:heroId', () => { }); it('updates contributor data', async () => { - let hero = await generateUser({ - contributor: {level: 5}, + const hero = await generateUser({ + contributor: { level: 5 }, }); - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { - contributor: {text: 'Astronaut'}, + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { + contributor: { text: 'Astronaut' }, }); // test response @@ -174,8 +174,8 @@ describe('PUT /heroes/:heroId', () => { }); it('updates items', async () => { - let hero = await generateUser(); - let heroRes = await user.put(`/hall/heroes/${hero._id}`, { + const hero = await generateUser(); + const heroRes = await user.put(`/hall/heroes/${hero._id}`, { itemPath: 'items.special.snowball', itemVal: 5, }); diff --git a/test/api/v3/integration/inbox/GET-inbox_messages.test.js b/test/api/v3/integration/inbox/GET-inbox_messages.test.js index 491b444cab..e3436a3cc4 100644 --- a/test/api/v3/integration/inbox/GET-inbox_messages.test.js +++ b/test/api/v3/integration/inbox/GET-inbox_messages.test.js @@ -47,7 +47,7 @@ describe('GET /inbox/messages', () => { it('returns four messages when using page-query ', async () => { const promises = []; - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 10; i += 1) { promises.push(user.post('/members/send-private-message', { toUserId: user.id, message: 'fourth', diff --git a/test/api/v3/integration/members/GET-achievements.test.js b/test/api/v3/integration/members/GET-achievements.test.js index 9f46780b3e..f3d2f73c99 100644 --- a/test/api/v3/integration/members/GET-achievements.test.js +++ b/test/api/v3/integration/members/GET-achievements.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /members/:memberId/achievements', () => { let user; @@ -20,11 +20,11 @@ describe('GET /members/:memberId/achievements', () => { }); it('returns achievements based on given user', async () => { - let member = await generateUser({ - contributor: {level: 1}, - backer: {tier: 3}, + const member = await generateUser({ + contributor: { level: 1 }, + backer: { tier: 3 }, }); - let achievementsRes = await user.get(`/members/${member._id}/achievements`); + const achievementsRes = await user.get(`/members/${member._id}/achievements`); expect(achievementsRes.special.achievements.contributor.earned).to.equal(true); expect(achievementsRes.special.achievements.contributor.value).to.equal(1); @@ -34,11 +34,11 @@ describe('GET /members/:memberId/achievements', () => { }); it('handles non-existing members', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/members/${dummyId}/achievements`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); }); diff --git a/test/api/v3/integration/members/GET-members_id.test.js b/test/api/v3/integration/members/GET-members_id.test.js index f93ea28498..9b58dd61c1 100644 --- a/test/api/v3/integration/members/GET-members_id.test.js +++ b/test/api/v3/integration/members/GET-members_id.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import common from '../../../../../website/common'; describe('GET /members/:memberId', () => { @@ -21,15 +21,16 @@ describe('GET /members/:memberId', () => { }); it('returns a member public data only', async () => { - let member = await generateUser({ // make sure user has all the fields that can be returned by the getMember call - contributor: {level: 1}, - backer: {tier: 3}, + // make sure user has all the fields that can be returned by the getMember call + const member = await generateUser({ + contributor: { level: 1 }, + backer: { tier: 3 }, preferences: { costume: false, background: 'volcano', }, }); - let memberRes = await user.get(`/members/${member._id}`); + const memberRes = await user.get(`/members/${member._id}`); expect(memberRes).to.have.all.keys([ // works as: object has all and only these keys '_id', 'id', 'preferences', 'profile', 'stats', 'achievements', 'party', 'backer', 'contributor', 'auth', 'items', 'inbox', 'loginIncentives', 'flags', @@ -48,11 +49,11 @@ describe('GET /members/:memberId', () => { }); it('handles non-existing members', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/members/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); }); diff --git a/test/api/v3/integration/members/GET-objections_interaction.test.js b/test/api/v3/integration/members/GET-objections_interaction.test.js index 5c7a8c0677..c117e2f950 100644 --- a/test/api/v3/integration/members/GET-objections_interaction.test.js +++ b/test/api/v3/integration/members/GET-objections_interaction.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /members/:toUserId/objections/:interaction', () => { let user; @@ -13,7 +13,7 @@ describe('GET /members/:toUserId/objections/:interaction', () => { it('validates req.params.memberId', async () => { await expect( - user.get('/members/invalidUUID/objections/send-private-message') + user.get('/members/invalidUUID/objections/send-private-message'), ).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -22,21 +22,21 @@ describe('GET /members/:toUserId/objections/:interaction', () => { }); it('handles non-existing members', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect( - user.get(`/members/${dummyId}/objections/send-private-message`) + user.get(`/members/${dummyId}/objections/send-private-message`), ).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: dummyId}), + message: t('userWithIDNotFound', { userId: dummyId }), }); }); it('handles non-existing interactions', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); await expect( - user.get(`/members/${receiver._id}/objections/hug-a-whole-forest-of-trees`) + user.get(`/members/${receiver._id}/objections/hug-a-whole-forest-of-trees`), ).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -45,18 +45,18 @@ describe('GET /members/:toUserId/objections/:interaction', () => { }); it('returns an empty array if there are no objections', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); await expect( - user.get(`/members/${receiver._id}/objections/send-private-message`) + user.get(`/members/${receiver._id}/objections/send-private-message`), ).to.eventually.be.fulfilled.and.eql([]); }); it('returns an array of objections if any exist', async () => { - let receiver = await generateUser({'inbox.blocks': [user._id]}); + const receiver = await generateUser({ 'inbox.blocks': [user._id] }); await expect( - user.get(`/members/${receiver._id}/objections/send-private-message`) + user.get(`/members/${receiver._id}/objections/send-private-message`), ).to.eventually.be.fulfilled.and.eql([ t('notAuthorizedToSendMessageToThisUser'), ]); diff --git a/test/api/v3/integration/members/POST-send_private_message.test.js b/test/api/v3/integration/members/POST-send_private_message.test.js index 0012e6ce37..47bc0ea574 100644 --- a/test/api/v3/integration/members/POST-send_private_message.test.js +++ b/test/api/v3/integration/members/POST-send_private_message.test.js @@ -1,12 +1,12 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /members/send-private-message', () => { let userToSendMessage; - let messageToSend = 'Test Private Message'; + const messageToSend = 'Test Private Message'; beforeEach(async () => { userToSendMessage = await generateUser(); @@ -43,7 +43,7 @@ describe('POST /members/send-private-message', () => { }); it('returns error when to user has blocked the sender', async () => { - let receiver = await generateUser({'inbox.blocks': [userToSendMessage._id]}); + const receiver = await generateUser({ 'inbox.blocks': [userToSendMessage._id] }); await expect(userToSendMessage.post('/members/send-private-message', { message: messageToSend, @@ -56,8 +56,8 @@ describe('POST /members/send-private-message', () => { }); it('returns error when sender has blocked to user', async () => { - let receiver = await generateUser(); - let sender = await generateUser({'inbox.blocks': [receiver._id]}); + const receiver = await generateUser(); + const sender = await generateUser({ 'inbox.blocks': [receiver._id] }); await expect(sender.post('/members/send-private-message', { message: messageToSend, @@ -70,7 +70,7 @@ describe('POST /members/send-private-message', () => { }); it('returns error when to user has opted out of messaging', async () => { - let receiver = await generateUser({'inbox.optOut': true}); + const receiver = await generateUser({ 'inbox.optOut': true }); await expect(userToSendMessage.post('/members/send-private-message', { message: messageToSend, @@ -83,8 +83,8 @@ describe('POST /members/send-private-message', () => { }); it('returns an error when chat privileges are revoked', async () => { - let userWithChatRevoked = await generateUser({'flags.chatRevoked': true}); - let receiver = await generateUser(); + const userWithChatRevoked = await generateUser({ 'flags.chatRevoked': true }); + const receiver = await generateUser(); await expect(userWithChatRevoked.post('/members/send-private-message', { message: messageToSend, @@ -97,7 +97,7 @@ describe('POST /members/send-private-message', () => { }); it('sends a private message to a user', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); // const initialNotifications = receiver.notifications.length; const response = await userToSendMessage.post('/members/send-private-message', { @@ -105,16 +105,18 @@ describe('POST /members/send-private-message', () => { toUserId: receiver._id, }); - let updatedReceiver = await receiver.get('/user'); - let updatedSender = await userToSendMessage.get('/user'); + const updatedReceiver = await receiver.get('/user'); + const updatedSender = await userToSendMessage.get('/user'); - let sendersMessageInReceiversInbox = _.find(updatedReceiver.inbox.messages, (message) => { - return message.uuid === userToSendMessage._id && message.text === messageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + updatedReceiver.inbox.messages, + message => message.uuid === userToSendMessage._id && message.text === messageToSend, + ); - let sendersMessageInSendersInbox = _.find(updatedSender.inbox.messages, (message) => { - return message.uuid === receiver._id && message.text === messageToSend; - }); + const sendersMessageInSendersInbox = _.find( + updatedSender.inbox.messages, + message => message.uuid === receiver._id && message.text === messageToSend, + ); expect(response.message.text).to.deep.equal(sendersMessageInSendersInbox.text); expect(response.message.uuid).to.deep.equal(sendersMessageInSendersInbox.uuid); @@ -133,22 +135,34 @@ describe('POST /members/send-private-message', () => { expect(sendersMessageInSendersInbox).to.exist; }); + it('sends a private message with mentions to a user', async () => { + const receiver = await generateUser(); + + const response = await userToSendMessage.post('/members/send-private-message', { + message: `hi @${receiver.auth.local.username}`, + toUserId: receiver._id, + }); + + expect(response.message.text).to.include(`[@${receiver.auth.local.username}](/profile/${receiver._id})`); + }); + // @TODO waiting for mobile support xit('creates a notification with an excerpt if the message is too long', async () => { - let receiver = await generateUser(); - let longerMessageToSend = 'A very long message, that for sure exceeds the limit of 100 chars for the excerpt that we set to 100 chars'; - let messageExcerpt = `${longerMessageToSend.substring(0, 100)}...`; + const receiver = await generateUser(); + const longerMessageToSend = 'A very long message, that for sure exceeds the limit of 100 chars for the excerpt that we set to 100 chars'; + const messageExcerpt = `${longerMessageToSend.substring(0, 100)}...`; await userToSendMessage.post('/members/send-private-message', { message: longerMessageToSend, toUserId: receiver._id, }); - let updatedReceiver = await receiver.get('/user'); + const updatedReceiver = await receiver.get('/user'); - let sendersMessageInReceiversInbox = _.find(updatedReceiver.inbox.messages, (message) => { - return message.uuid === userToSendMessage._id && message.text === longerMessageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + updatedReceiver.inbox.messages, + message => message.uuid === userToSendMessage._id && message.text === longerMessageToSend, + ); const notification = updatedReceiver.notifications[updatedReceiver.notifications.length - 1]; @@ -161,7 +175,7 @@ describe('POST /members/send-private-message', () => { userToSendMessage = await generateUser({ 'contributor.admin': 1, }); - const receiver = await generateUser({'inbox.blocks': [userToSendMessage._id]}); + const receiver = await generateUser({ 'inbox.blocks': [userToSendMessage._id] }); await userToSendMessage.post('/members/send-private-message', { message: messageToSend, @@ -171,13 +185,15 @@ describe('POST /members/send-private-message', () => { const updatedReceiver = await receiver.get('/user'); const updatedSender = await userToSendMessage.get('/user'); - const sendersMessageInReceiversInbox = _.find(updatedReceiver.inbox.messages, (message) => { - return message.uuid === userToSendMessage._id && message.text === messageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + updatedReceiver.inbox.messages, + message => message.uuid === userToSendMessage._id && message.text === messageToSend, + ); - const sendersMessageInSendersInbox = _.find(updatedSender.inbox.messages, (message) => { - return message.uuid === receiver._id && message.text === messageToSend; - }); + const sendersMessageInSendersInbox = _.find( + updatedSender.inbox.messages, + message => message.uuid === receiver._id && message.text === messageToSend, + ); expect(sendersMessageInReceiversInbox).to.exist; expect(sendersMessageInSendersInbox).to.exist; @@ -187,7 +203,7 @@ describe('POST /members/send-private-message', () => { userToSendMessage = await generateUser({ 'contributor.admin': 1, }); - const receiver = await generateUser({'inbox.optOut': true}); + const receiver = await generateUser({ 'inbox.optOut': true }); await userToSendMessage.post('/members/send-private-message', { message: messageToSend, @@ -197,13 +213,15 @@ describe('POST /members/send-private-message', () => { const updatedReceiver = await receiver.get('/user'); const updatedSender = await userToSendMessage.get('/user'); - const sendersMessageInReceiversInbox = _.find(updatedReceiver.inbox.messages, (message) => { - return message.uuid === userToSendMessage._id && message.text === messageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + updatedReceiver.inbox.messages, + message => message.uuid === userToSendMessage._id && message.text === messageToSend, + ); - const sendersMessageInSendersInbox = _.find(updatedSender.inbox.messages, (message) => { - return message.uuid === receiver._id && message.text === messageToSend; - }); + const sendersMessageInSendersInbox = _.find( + updatedSender.inbox.messages, + message => message.uuid === receiver._id && message.text === messageToSend, + ); expect(sendersMessageInReceiversInbox).to.exist; expect(sendersMessageInSendersInbox).to.exist; diff --git a/test/api/v3/integration/members/POST-transfer_gems.test.js b/test/api/v3/integration/members/POST-transfer_gems.test.js index 0b5b0cfa93..88c6446097 100644 --- a/test/api/v3/integration/members/POST-transfer_gems.test.js +++ b/test/api/v3/integration/members/POST-transfer_gems.test.js @@ -1,13 +1,11 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; function findMessage (messages, receiverId) { - let message = _.find(messages, (inboxMessage) => { - return inboxMessage.uuid === receiverId; - }); + const message = _.find(messages, inboxMessage => inboxMessage.uuid === receiverId); return message; } @@ -15,11 +13,11 @@ function findMessage (messages, receiverId) { describe('POST /members/transfer-gems', () => { let userToSendMessage; let receiver; - let message = 'Test Private Message'; - let gemAmount = 20; + const message = 'Test Private Message'; + const gemAmount = 20; beforeEach(async () => { - userToSendMessage = await generateUser({balance: 5}); + userToSendMessage = await generateUser({ balance: 5 }); receiver = await generateUser(); }); @@ -68,7 +66,7 @@ describe('POST /members/transfer-gems', () => { }); it('returns error when recipient has blocked the sender', async () => { - let receiverWhoBlocksUser = await generateUser({'inbox.blocks': [userToSendMessage._id]}); + const receiverWhoBlocksUser = await generateUser({ 'inbox.blocks': [userToSendMessage._id] }); await expect(userToSendMessage.post('/members/transfer-gems', { message, @@ -82,7 +80,7 @@ describe('POST /members/transfer-gems', () => { }); it('returns error when sender has blocked recipient', async () => { - let sender = await generateUser({'inbox.blocks': [receiver._id]}); + const sender = await generateUser({ 'inbox.blocks': [receiver._id] }); await expect(sender.post('/members/transfer-gems', { message, @@ -96,7 +94,7 @@ describe('POST /members/transfer-gems', () => { }); it('returns an error when chat privileges are revoked', async () => { - let userWithChatRevoked = await generateUser({'flags.chatRevoked': true}); + const userWithChatRevoked = await generateUser({ 'flags.chatRevoked': true }); await expect(userWithChatRevoked.post('/members/transfer-gems', { message, @@ -110,7 +108,7 @@ describe('POST /members/transfer-gems', () => { }); it('works when only the recipient\'s chat privileges are revoked', async () => { - let receiverWithChatRevoked = await generateUser({'flags.chatRevoked': true}); + const receiverWithChatRevoked = await generateUser({ 'flags.chatRevoked': true }); await expect(userToSendMessage.post('/members/transfer-gems', { message, @@ -118,8 +116,8 @@ describe('POST /members/transfer-gems', () => { toUserId: receiverWithChatRevoked._id, })).to.eventually.be.fulfilled; - let updatedReceiver = await receiverWithChatRevoked.get('/user'); - let updatedSender = await userToSendMessage.get('/user'); + const updatedReceiver = await receiverWithChatRevoked.get('/user'); + const updatedSender = await userToSendMessage.get('/user'); expect(updatedReceiver.balance).to.equal(gemAmount / 4); expect(updatedSender.balance).to.equal(0); @@ -179,18 +177,20 @@ describe('POST /members/transfer-gems', () => { toUserId: receiver._id, }); - let updatedReceiver = await receiver.get('/user'); - let updatedSender = await userToSendMessage.get('/user'); + const updatedReceiver = await receiver.get('/user'); + const updatedSender = await userToSendMessage.get('/user'); - let sendersMessageInReceiversInbox = findMessage(updatedReceiver.inbox.messages, userToSendMessage._id); - let sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); + const sendersMessageInReceiversInbox = findMessage( + updatedReceiver.inbox.messages, userToSendMessage._id, + ); + const sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); let messageSentContent = t('privateMessageGiftGemsMessage', { receiverName: receiver.profile.name, senderName: userToSendMessage.profile.name, gemAmount, }); - messageSentContent = `\`${messageSentContent}\` `; + messageSentContent = `\`${messageSentContent}\` `; messageSentContent += message; expect(sendersMessageInReceiversInbox).to.exist; @@ -208,18 +208,20 @@ describe('POST /members/transfer-gems', () => { toUserId: receiver._id, }); - let updatedReceiver = await receiver.get('/user'); - let updatedSender = await userToSendMessage.get('/user'); + const updatedReceiver = await receiver.get('/user'); + const updatedSender = await userToSendMessage.get('/user'); - let sendersMessageInReceiversInbox = findMessage(updatedReceiver.inbox.messages, userToSendMessage._id); - let sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); + const sendersMessageInReceiversInbox = findMessage( + updatedReceiver.inbox.messages, userToSendMessage._id, + ); + const sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); let messageSentContent = t('privateMessageGiftGemsMessage', { receiverName: receiver.profile.name, senderName: userToSendMessage.profile.name, gemAmount, }); - messageSentContent = `\`${messageSentContent}\` `; + messageSentContent = `\`${messageSentContent}\` `; expect(sendersMessageInReceiversInbox).to.exist; expect(sendersMessageInReceiversInbox.text).to.equal(messageSentContent); @@ -242,14 +244,16 @@ describe('POST /members/transfer-gems', () => { toUserId: receiver._id, }); - let updatedReceiver = await receiver.get('/user'); - let updatedSender = await userToSendMessage.get('/user'); + const updatedReceiver = await receiver.get('/user'); + const updatedSender = await userToSendMessage.get('/user'); - let sendersMessageInReceiversInbox = findMessage(updatedReceiver.inbox.messages, userToSendMessage._id); - let sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); + const sendersMessageInReceiversInbox = findMessage( + updatedReceiver.inbox.messages, userToSendMessage._id, + ); + const sendersMessageInSendersInbox = findMessage(updatedSender.inbox.messages, receiver._id); - let [receieversMessageContent, sendersMessageContent] = ['es', 'cs'].map((lang) => { - let messageContent = t('privateMessageGiftGemsMessage', { + const [receieversMessageContent, sendersMessageContent] = ['es', 'cs'].map(lang => { + const messageContent = t('privateMessageGiftGemsMessage', { receiverName: receiver.profile.name, senderName: userToSendMessage.profile.name, gemAmount, diff --git a/test/api/v3/integration/models/GET-model_paths.test.js b/test/api/v3/integration/models/GET-model_paths.test.js index 9e4b4fb4fa..15ef35faed 100644 --- a/test/api/v3/integration/models/GET-model_paths.test.js +++ b/test/api/v3/integration/models/GET-model_paths.test.js @@ -18,10 +18,10 @@ describe('GET /models/:model/paths', () => { }); }); - let models = ['habit', 'daily', 'todo', 'reward', 'user', 'tag', 'challenge', 'group']; + const models = ['habit', 'daily', 'todo', 'reward', 'user', 'tag', 'challenge', 'group']; models.forEach(model => { it(`returns the model paths for ${model}`, async () => { - let res = await user.get(`/models/${model}/paths`); + const res = await user.get(`/models/${model}/paths`); if (model !== 'tag') expect(res._id).to.equal('String'); if (model === 'tag') expect(res.id).to.equal('String'); diff --git a/test/api/v3/integration/notFound.test.js b/test/api/v3/integration/notFound.test.js index 747b370af9..721b4f391c 100644 --- a/test/api/v3/integration/notFound.test.js +++ b/test/api/v3/integration/notFound.test.js @@ -2,7 +2,7 @@ import { requester } from '../../../helpers/api-integration/v3'; describe('notFound Middleware', () => { it('returns a 404 error when the resource is not found', async () => { - let request = requester().get('/api/v3/dummy-url'); + const request = requester().get('/api/v3/dummy-url'); await expect(request).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/notifications/POST-notifications_notificationId_read.test.js b/test/api/v3/integration/notifications/POST-notifications_notificationId_read.test.js index a5678d3c80..29011cb3fa 100644 --- a/test/api/v3/integration/notifications/POST-notifications_notificationId_read.test.js +++ b/test/api/v3/integration/notifications/POST-notifications_notificationId_read.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /notifications/:notificationId/read', () => { let user; @@ -12,7 +12,7 @@ describe('POST /notifications/:notificationId/read', () => { }); it('errors when notification is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.post(`/notifications/${dummyId}/read`)).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/notifications/POST-notifications_notificationId_see.test.js b/test/api/v3/integration/notifications/POST-notifications_notificationId_see.test.js index a31b60d18c..f1104563ee 100644 --- a/test/api/v3/integration/notifications/POST-notifications_notificationId_see.test.js +++ b/test/api/v3/integration/notifications/POST-notifications_notificationId_see.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /notifications/:notificationId/see', () => { let user; @@ -12,7 +12,7 @@ describe('POST /notifications/:notificationId/see', () => { }); it('errors when notification is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.post(`/notifications/${dummyId}/see`)).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/notifications/POST-notifications_read.test.js b/test/api/v3/integration/notifications/POST-notifications_read.test.js index 47844bcd18..1839e38630 100644 --- a/test/api/v3/integration/notifications/POST-notifications_read.test.js +++ b/test/api/v3/integration/notifications/POST-notifications_read.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /notifications/read', () => { let user; @@ -12,7 +12,7 @@ describe('POST /notifications/read', () => { }); it('errors when notification is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.post('/notifications/read', { notificationIds: [dummyId], diff --git a/test/api/v3/integration/notifications/POST_notifications_see.test.js b/test/api/v3/integration/notifications/POST_notifications_see.test.js index bb8f6b7fbf..eb1cb599db 100644 --- a/test/api/v3/integration/notifications/POST_notifications_see.test.js +++ b/test/api/v3/integration/notifications/POST_notifications_see.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /notifications/see', () => { let user; @@ -12,7 +12,7 @@ describe('POST /notifications/see', () => { }); it('errors when notification is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.post('/notifications/see', { notificationIds: [dummyId], diff --git a/test/api/v3/integration/notifications/prevent-multiple-notification.js b/test/api/v3/integration/notifications/prevent-multiple-notification.js index 6fcf655d55..cc4fd20a3d 100644 --- a/test/api/v3/integration/notifications/prevent-multiple-notification.js +++ b/test/api/v3/integration/notifications/prevent-multiple-notification.js @@ -3,10 +3,11 @@ import { } from '../../../../helpers/api-integration/v3'; describe('Prevent multiple notifications', () => { - let partyLeader, partyMembers, party; + let partyLeader; let partyMembers; let + party; before(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private', @@ -22,10 +23,10 @@ describe('Prevent multiple notifications', () => { it('does not add the same notification twice', async () => { const multipleChatMessages = []; - for (let i = 0; i < 4; i++) { - for (let memberIndex = 0; memberIndex < partyMembers.length; memberIndex++) { + for (let i = 0; i < 4; i += 1) { + for (let memberIndex = 0; memberIndex < partyMembers.length; memberIndex += 1) { multipleChatMessages.push( - partyMembers[memberIndex].post(`/groups/${party._id}/chat`, { message: `Message ${i}_${memberIndex}`}), + partyMembers[memberIndex].post(`/groups/${party._id}/chat`, { message: `Message ${i}_${memberIndex}` }), ); } } diff --git a/test/api/v3/integration/payments/amazon/GET-payments_amazon_subscribe_cancel.test.js b/test/api/v3/integration/payments/amazon/GET-payments_amazon_subscribe_cancel.test.js index c6de3b1709..67313693be 100644 --- a/test/api/v3/integration/payments/amazon/GET-payments_amazon_subscribe_cancel.test.js +++ b/test/api/v3/integration/payments/amazon/GET-payments_amazon_subscribe_cancel.test.js @@ -6,8 +6,9 @@ import { import amzLib from '../../../../../../website/server/libs/payments/amazon'; describe('payments : amazon #subscribeCancel', () => { - let endpoint = '/amazon/subscribe/cancel?noRedirect=true'; - let user, group, amazonSubscribeCancelStub; + const endpoint = '/amazon/subscribe/cancel?noRedirect=true'; + let user; let group; let + amazonSubscribeCancelStub; beforeEach(async () => { user = await generateUser(); diff --git a/test/api/v3/integration/payments/amazon/POST-payments_amazon_checkout.test.js b/test/api/v3/integration/payments/amazon/POST-payments_amazon_checkout.test.js index 948c948f13..93d08dc44b 100644 --- a/test/api/v3/integration/payments/amazon/POST-payments_amazon_checkout.test.js +++ b/test/api/v3/integration/payments/amazon/POST-payments_amazon_checkout.test.js @@ -4,8 +4,9 @@ import { import amzLib from '../../../../../../website/server/libs/payments/amazon'; describe('payments - amazon - #checkout', () => { - let endpoint = '/amazon/checkout'; - let user, amazonCheckoutStub; + const endpoint = '/amazon/checkout'; + let user; let + amazonCheckoutStub; beforeEach(async () => { user = await generateUser(); @@ -37,7 +38,7 @@ describe('payments - amazon - #checkout', () => { balance: 2, }); - let gift = { + const gift = { type: 'gems', gems: { amount: 16, @@ -45,7 +46,7 @@ describe('payments - amazon - #checkout', () => { }, }; - let orderReferenceId = 'orderReferenceId-example'; + const orderReferenceId = 'orderReferenceId-example'; await user.post(endpoint, { gift, diff --git a/test/api/v3/integration/payments/amazon/POST-payments_amazon_createOrderReferenceId.test.js b/test/api/v3/integration/payments/amazon/POST-payments_amazon_createOrderReferenceId.test.js index ce9a361353..d965253426 100644 --- a/test/api/v3/integration/payments/amazon/POST-payments_amazon_createOrderReferenceId.test.js +++ b/test/api/v3/integration/payments/amazon/POST-payments_amazon_createOrderReferenceId.test.js @@ -3,7 +3,7 @@ import { } from '../../../../../helpers/api-integration/v3'; describe('payments - amazon - #createOrderReferenceId', () => { - let endpoint = '/amazon/createOrderReferenceId'; + const endpoint = '/amazon/createOrderReferenceId'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/amazon/POST-payments_amazon_subscribe.test.js b/test/api/v3/integration/payments/amazon/POST-payments_amazon_subscribe.test.js index c925579979..b6c09848a3 100644 --- a/test/api/v3/integration/payments/amazon/POST-payments_amazon_subscribe.test.js +++ b/test/api/v3/integration/payments/amazon/POST-payments_amazon_subscribe.test.js @@ -6,8 +6,9 @@ import { import amzLib from '../../../../../../website/server/libs/payments/amazon'; describe('payments - amazon - #subscribe', () => { - let endpoint = '/amazon/subscribe'; - let user, group, subscribeWithAmazonStub; + const endpoint = '/amazon/subscribe'; + let user; let group; let + subscribeWithAmazonStub; beforeEach(async () => { user = await generateUser(); @@ -22,8 +23,8 @@ describe('payments - amazon - #subscribe', () => { }); describe('success', () => { - let billingAgreementId = 'billingAgreementId-example'; - let subscription = 'basic_3mo'; + const billingAgreementId = 'billingAgreementId-example'; + const subscription = 'basic_3mo'; let coupon; beforeEach(() => { diff --git a/test/api/v3/integration/payments/amazon/POST-payments_amazon_verifyAccessToken.test.js b/test/api/v3/integration/payments/amazon/POST-payments_amazon_verifyAccessToken.test.js index e086091d05..e7e0b81d65 100644 --- a/test/api/v3/integration/payments/amazon/POST-payments_amazon_verifyAccessToken.test.js +++ b/test/api/v3/integration/payments/amazon/POST-payments_amazon_verifyAccessToken.test.js @@ -3,7 +3,7 @@ import { } from '../../../../../helpers/api-integration/v3'; describe('payments : amazon', () => { - let endpoint = '/amazon/verifyAccessToken'; + const endpoint = '/amazon/verifyAccessToken'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/apple/GET-payments_apple_cancelSubscribe.js b/test/api/v3/integration/payments/apple/GET-payments_apple_cancelSubscribe.js index 797d2126bb..778626b5b9 100644 --- a/test/api/v3/integration/payments/apple/GET-payments_apple_cancelSubscribe.js +++ b/test/api/v3/integration/payments/apple/GET-payments_apple_cancelSubscribe.js @@ -1,8 +1,8 @@ -import {generateUser} from '../../../../../helpers/api-integration/v3'; +import { generateUser } from '../../../../../helpers/api-integration/v3'; import applePayments from '../../../../../../website/server/libs/payments/apple'; describe('payments : apple #cancelSubscribe', () => { - let endpoint = '/iap/ios/subscribe/cancel?noRedirect=true'; + const endpoint = '/iap/ios/subscribe/cancel?noRedirect=true'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/apple/POST-payments_apple_norenewsubscribe.test.js b/test/api/v3/integration/payments/apple/POST-payments_apple_norenewsubscribe.test.js index bd4223d247..78b7bc3a38 100644 --- a/test/api/v3/integration/payments/apple/POST-payments_apple_norenewsubscribe.test.js +++ b/test/api/v3/integration/payments/apple/POST-payments_apple_norenewsubscribe.test.js @@ -1,9 +1,9 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import applePayments from '../../../../../../website/server/libs/payments/apple'; describe('payments : apple #norenewsubscribe', () => { - let endpoint = '/iap/ios/norenew-subscribe'; - let sku = 'com.habitrpg.ios.habitica.subscription.3month'; + const endpoint = '/iap/ios/norenew-subscribe'; + const sku = 'com.habitrpg.ios.habitica.subscription.3month'; let user; beforeEach(async () => { @@ -50,7 +50,7 @@ describe('payments : apple #norenewsubscribe', () => { await user.post(endpoint, { sku, - transaction: {receipt: 'receipt'}, + transaction: { receipt: 'receipt' }, gift: { uuid: '1', }, diff --git a/test/api/v3/integration/payments/apple/POST-payments_apple_subscribe.test.js b/test/api/v3/integration/payments/apple/POST-payments_apple_subscribe.test.js index 63d76fcea0..faf5f0e6ea 100644 --- a/test/api/v3/integration/payments/apple/POST-payments_apple_subscribe.test.js +++ b/test/api/v3/integration/payments/apple/POST-payments_apple_subscribe.test.js @@ -1,8 +1,8 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import applePayments from '../../../../../../website/server/libs/payments/apple'; describe('payments : apple #subscribe', () => { - let endpoint = '/iap/ios/subscribe'; + const endpoint = '/iap/ios/subscribe'; let user; beforeEach(async () => { @@ -37,7 +37,7 @@ describe('payments : apple #subscribe', () => { balance: 2, }); - let sku = 'com.habitrpg.ios.habitica.subscription.3month'; + const sku = 'com.habitrpg.ios.habitica.subscription.3month'; await user.post(endpoint, { sku, diff --git a/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js b/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js index b0b52ffdd8..d142fe2a24 100644 --- a/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js +++ b/test/api/v3/integration/payments/apple/POST-payments_apple_verifyiap.js @@ -1,8 +1,8 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import applePayments from '../../../../../../website/server/libs/payments/apple'; describe('payments : apple #verify', () => { - let endpoint = '/iap/ios/verify'; + const endpoint = '/iap/ios/verify'; let user; beforeEach(async () => { @@ -36,7 +36,8 @@ describe('payments : apple #verify', () => { await user.post(endpoint, { transaction: { receipt: 'receipt', - }}); + }, + }); expect(verifyStub).to.be.calledOnce; expect(verifyStub.args[0][0].user._id).to.eql(user._id); @@ -56,7 +57,8 @@ describe('payments : apple #verify', () => { }, gift: { uuid: '1', - }}); + }, + }); expect(verifyStub).to.be.calledOnce; expect(verifyStub.args[0][0].user._id).to.eql(user._id); diff --git a/test/api/v3/integration/payments/google/GET-payments_google_cancelSubscribe.js b/test/api/v3/integration/payments/google/GET-payments_google_cancelSubscribe.js index ad375b89c5..9bc3a443c8 100644 --- a/test/api/v3/integration/payments/google/GET-payments_google_cancelSubscribe.js +++ b/test/api/v3/integration/payments/google/GET-payments_google_cancelSubscribe.js @@ -1,8 +1,8 @@ -import {generateUser} from '../../../../../helpers/api-integration/v3'; +import { generateUser } from '../../../../../helpers/api-integration/v3'; import googlePayments from '../../../../../../website/server/libs/payments/google'; describe('payments : google #cancelSubscribe', () => { - let endpoint = '/iap/android/subscribe/cancel?noRedirect=true'; + const endpoint = '/iap/android/subscribe/cancel?noRedirect=true'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/google/POST-payments_google_norenewsubscribe.test.js b/test/api/v3/integration/payments/google/POST-payments_google_norenewsubscribe.test.js index 9d15135537..888ffe3bbb 100644 --- a/test/api/v3/integration/payments/google/POST-payments_google_norenewsubscribe.test.js +++ b/test/api/v3/integration/payments/google/POST-payments_google_norenewsubscribe.test.js @@ -1,9 +1,9 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import googlePayments from '../../../../../../website/server/libs/payments/google'; describe('payments : google #norenewsubscribe', () => { - let endpoint = '/iap/android/norenew-subscribe'; - let sku = 'com.habitrpg.android.habitica.subscription.3month'; + const endpoint = '/iap/android/norenew-subscribe'; + const sku = 'com.habitrpg.android.habitica.subscription.3month'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/google/POST-payments_google_subscribe.test.js b/test/api/v3/integration/payments/google/POST-payments_google_subscribe.test.js index 1ee940efef..48e4b68281 100644 --- a/test/api/v3/integration/payments/google/POST-payments_google_subscribe.test.js +++ b/test/api/v3/integration/payments/google/POST-payments_google_subscribe.test.js @@ -1,8 +1,8 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import googlePayments from '../../../../../../website/server/libs/payments/google'; describe('payments : google #subscribe', () => { - let endpoint = '/iap/android/subscribe'; + const endpoint = '/iap/android/subscribe'; let user; beforeEach(async () => { @@ -37,11 +37,11 @@ describe('payments : google #subscribe', () => { balance: 2, }); - let sku = 'com.habitrpg.android.habitica.subscription.3month'; + const sku = 'com.habitrpg.android.habitica.subscription.3month'; await user.post(endpoint, { sku, - transaction: {receipt: 'receipt', signature: 'signature'}, + transaction: { receipt: 'receipt', signature: 'signature' }, }); expect(subscribeStub).to.be.calledOnce; diff --git a/test/api/v3/integration/payments/google/POST-payments_google_verifyiap.js b/test/api/v3/integration/payments/google/POST-payments_google_verifyiap.js index 0149a44fc3..ecdf17dfc0 100644 --- a/test/api/v3/integration/payments/google/POST-payments_google_verifyiap.js +++ b/test/api/v3/integration/payments/google/POST-payments_google_verifyiap.js @@ -1,8 +1,8 @@ -import {generateUser, translate as t} from '../../../../../helpers/api-integration/v3'; +import { generateUser, translate as t } from '../../../../../helpers/api-integration/v3'; import googlePayments from '../../../../../../website/server/libs/payments/google'; describe('payments : google #verify', () => { - let endpoint = '/iap/android/verify'; + const endpoint = '/iap/android/verify'; let user; beforeEach(async () => { @@ -34,7 +34,7 @@ describe('payments : google #verify', () => { }); await user.post(endpoint, { - transaction: {receipt: 'receipt', signature: 'signature'}, + transaction: { receipt: 'receipt', signature: 'signature' }, }); expect(verifyStub).to.be.calledOnce; @@ -51,8 +51,8 @@ describe('payments : google #verify', () => { }); await user.post(endpoint, { - transaction: {receipt: 'receipt', signature: 'signature'}, - gift: {uuid: '1'}, + transaction: { receipt: 'receipt', signature: 'signature' }, + gift: { uuid: '1' }, }); expect(verifyStub).to.be.calledOnce; diff --git a/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout.test.js b/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout.test.js index ffaf8fbc8d..da1d342b7f 100644 --- a/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout.test.js +++ b/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout.test.js @@ -4,7 +4,7 @@ import { import paypalPayments from '../../../../../../website/server/libs/payments/paypal'; describe('payments : paypal #checkout', () => { - let endpoint = '/paypal/checkout'; + const endpoint = '/paypal/checkout'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout_success.test.js b/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout_success.test.js index 9c2947c95e..24544903fd 100644 --- a/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout_success.test.js +++ b/test/api/v3/integration/payments/paypal/GET-payments_paypal_checkout_success.test.js @@ -5,7 +5,7 @@ import paypalPayments from '../../../../../../website/server/libs/payments/paypa import apiError from '../../../../../../website/server/libs/apiError'; describe('payments : paypal #checkoutSuccess', () => { - let endpoint = '/paypal/checkout/success'; + const endpoint = '/paypal/checkout/success'; let user; beforeEach(async () => { @@ -42,8 +42,8 @@ describe('payments : paypal #checkoutSuccess', () => { }); it('makes a purchase', async () => { - let paymentId = 'test-paymentid'; - let customerId = 'test-customerId'; + const paymentId = 'test-paymentid'; + const customerId = 'test-customerId'; user = await generateUser({ 'profile.name': 'sender', diff --git a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe.test.js b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe.test.js index 156df85340..735750786c 100644 --- a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe.test.js +++ b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe.test.js @@ -6,7 +6,7 @@ import shared from '../../../../../../website/common'; import apiError from '../../../../../../website/server/libs/apiError'; describe('payments : paypal #subscribe', () => { - let endpoint = '/paypal/subscribe'; + const endpoint = '/paypal/subscribe'; let user; beforeEach(async () => { @@ -33,8 +33,8 @@ describe('payments : paypal #subscribe', () => { }); it('makes a purchase', async () => { - let subKey = 'basic_3mo'; - let sub = shared.content.subscriptionBlocks[subKey]; + const subKey = 'basic_3mo'; + const sub = shared.content.subscriptionBlocks[subKey]; user = await generateUser({ 'profile.name': 'sender', diff --git a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_cancel.test.js b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_cancel.test.js index 4a3f416dd8..ff50da8a0e 100644 --- a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_cancel.test.js +++ b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_cancel.test.js @@ -5,7 +5,7 @@ import { import paypalPayments from '../../../../../../website/server/libs/payments/paypal'; describe('payments : paypal #subscribeCancel', () => { - let endpoint = '/paypal/subscribe/cancel'; + const endpoint = '/paypal/subscribe/cancel'; let user; beforeEach(async () => { diff --git a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_success.test.js b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_success.test.js index db0d53838f..bd402c5600 100644 --- a/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_success.test.js +++ b/test/api/v3/integration/payments/paypal/GET-payments_paypal_subscribe_success.test.js @@ -5,7 +5,7 @@ import apiError from '../../../../../../website/server/libs/apiError'; import paypalPayments from '../../../../../../website/server/libs/payments/paypal'; describe('payments : paypal #subscribeSuccess', () => { - let endpoint = '/paypal/subscribe/success'; + const endpoint = '/paypal/subscribe/success'; let user; beforeEach(async () => { @@ -32,7 +32,7 @@ describe('payments : paypal #subscribeSuccess', () => { }); it('creates a subscription', async () => { - let token = 'test-token'; + const token = 'test-token'; user = await generateUser({ 'profile.name': 'sender', diff --git a/test/api/v3/integration/payments/paypal/POST-payments_paypal_ipn.test.js b/test/api/v3/integration/payments/paypal/POST-payments_paypal_ipn.test.js index 3e233ce9c5..7632a79e9c 100644 --- a/test/api/v3/integration/payments/paypal/POST-payments_paypal_ipn.test.js +++ b/test/api/v3/integration/payments/paypal/POST-payments_paypal_ipn.test.js @@ -4,7 +4,7 @@ import { import paypalPayments from '../../../../../../website/server/libs/payments/paypal'; describe('payments - paypal - #ipn', () => { - let endpoint = '/paypal/ipn'; + const endpoint = '/paypal/ipn'; let user; beforeEach(async () => { @@ -12,7 +12,7 @@ describe('payments - paypal - #ipn', () => { }); it('verifies credentials', async () => { - let result = await user.post(endpoint); + const result = await user.post(endpoint); expect(result).to.eql('OK'); }); diff --git a/test/api/v3/integration/payments/stripe/GET-payments_stripe_subscribe_cancel.test.js b/test/api/v3/integration/payments/stripe/GET-payments_stripe_subscribe_cancel.test.js index 6f074ac077..d6ec1e0312 100644 --- a/test/api/v3/integration/payments/stripe/GET-payments_stripe_subscribe_cancel.test.js +++ b/test/api/v3/integration/payments/stripe/GET-payments_stripe_subscribe_cancel.test.js @@ -6,8 +6,9 @@ import { import stripePayments from '../../../../../../website/server/libs/payments/stripe'; describe('payments - stripe - #subscribeCancel', () => { - let endpoint = '/stripe/subscribe/cancel?noRedirect=true'; - let user, group, stripeCancelSubscriptionStub; + const endpoint = '/stripe/subscribe/cancel?noRedirect=true'; + let user; let group; let + stripeCancelSubscriptionStub; beforeEach(async () => { user = await generateUser(); diff --git a/test/api/v3/integration/payments/stripe/POST-payments_stripe_checkout.test.js b/test/api/v3/integration/payments/stripe/POST-payments_stripe_checkout.test.js index c7ad5015b9..a576e4aed8 100644 --- a/test/api/v3/integration/payments/stripe/POST-payments_stripe_checkout.test.js +++ b/test/api/v3/integration/payments/stripe/POST-payments_stripe_checkout.test.js @@ -5,15 +5,16 @@ import { import stripePayments from '../../../../../../website/server/libs/payments/stripe'; describe('payments - stripe - #checkout', () => { - let endpoint = '/stripe/checkout'; - let user, group; + const endpoint = '/stripe/checkout'; + let user; let + group; beforeEach(async () => { user = await generateUser(); }); it('verifies credentials', async () => { - await expect(user.post(endpoint, {id: 123})).to.eventually.be.rejected.and.include({ + await expect(user.post(endpoint, { id: 123 })).to.eventually.be.rejected.and.include({ code: 401, error: 'Error', message: 'Invalid API Key provided: aaaabbbb********************1111', diff --git a/test/api/v3/integration/payments/stripe/POST-payments_stripe_subscribe_edit.test.js b/test/api/v3/integration/payments/stripe/POST-payments_stripe_subscribe_edit.test.js index a071580ae6..640182f168 100644 --- a/test/api/v3/integration/payments/stripe/POST-payments_stripe_subscribe_edit.test.js +++ b/test/api/v3/integration/payments/stripe/POST-payments_stripe_subscribe_edit.test.js @@ -6,8 +6,9 @@ import { import stripePayments from '../../../../../../website/server/libs/payments/stripe'; describe('payments - stripe - #subscribeEdit', () => { - let endpoint = '/stripe/subscribe/edit'; - let user, group; + const endpoint = '/stripe/subscribe/edit'; + let user; let + group; beforeEach(async () => { user = await generateUser(); diff --git a/test/api/v3/integration/qrcodes/GET-qrcodes_user.test.js b/test/api/v3/integration/qrcodes/GET-qrcodes_user.test.js index df5df6604b..796494cecd 100644 --- a/test/api/v3/integration/qrcodes/GET-qrcodes_user.test.js +++ b/test/api/v3/integration/qrcodes/GET-qrcodes_user.test.js @@ -1,9 +1,9 @@ +import superagent from 'superagent'; +import nconf from 'nconf'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import superagent from 'superagent'; -import nconf from 'nconf'; const API_TEST_SERVER_PORT = nconf.get('PORT'); xdescribe('GET /qr-code/user/:memberId', () => { @@ -22,8 +22,8 @@ xdescribe('GET /qr-code/user/:memberId', () => { }); it('redirects to profile page', async () => { - let url = `http://localhost:${API_TEST_SERVER_PORT}/qr-code/user/${user._id}`; - let response = await superagent.get(url).end(function (err, res) { + const url = `http://localhost:${API_TEST_SERVER_PORT}/qr-code/user/${user._id}`; + const response = await superagent.get(url).end((err, res) => { expect(err).to.be(undefined); return res; }); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js index bd2579c351..940d660232 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_accept.test.js @@ -17,7 +17,7 @@ describe('POST /groups/:groupId/quests/accept', () => { beforeEach(async () => { user = await generateUser(); - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -51,7 +51,7 @@ describe('POST /groups/:groupId/quests/accept', () => { }); it('does not accept quest for a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -134,7 +134,7 @@ describe('POST /groups/:groupId/quests/accept', () => { }); it('cleans up user quest data for non-quest members when last member accepts', async () => { - let rejectingMember = partyMembers[0]; + const rejectingMember = partyMembers[0]; await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await rejectingMember.post(`/groups/${questingGroup._id}/quests/reject`); @@ -162,7 +162,7 @@ describe('POST /groups/:groupId/quests/accept', () => { expect(groupChat[0]._meta).to.exist; expect(groupChat[0]._meta).to.have.all.keys(['participatingMembers']); - let returnedGroup = await leader.get(`/groups/${questingGroup._id}`); + const returnedGroup = await leader.get(`/groups/${questingGroup._id}`); expect(returnedGroup.chat[0]._meta).to.be.undefined; }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js index 025643cd93..0eb4745f1c 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_force-start.test.js @@ -14,7 +14,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { let partyMembers; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 3, }); @@ -30,7 +30,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { context('failure conditions', () => { it('does not force start a quest for a group in which user is not a member', async () => { - let nonMember = await generateUser(); + const nonMember = await generateUser(); await expect(nonMember.post(`/groups/${questingGroup._id}/quests/force-start`)) .to.eventually.be.rejected.and.eql({ @@ -41,7 +41,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('does not force start quest for a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -91,8 +91,8 @@ describe('POST /groups/:groupId/quests/force-start', () => { context('successfully force starting a quest', () => { it('allows quest leader to force start quest', async () => { - let questLeader = partyMembers[0]; - await questLeader.update({[`items.quests.${PET_QUEST}`]: 1}); + const questLeader = partyMembers[0]; + await questLeader.update({ [`items.quests.${PET_QUEST}`]: 1 }); await questLeader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await questLeader.post(`/groups/${questingGroup._id}/quests/force-start`); @@ -103,8 +103,8 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('allows group leader to force start quest', async () => { - let questLeader = partyMembers[0]; - await questLeader.update({[`items.quests.${PET_QUEST}`]: 1}); + const questLeader = partyMembers[0]; + await questLeader.update({ [`items.quests.${PET_QUEST}`]: 1 }); await questLeader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await leader.post(`/groups/${questingGroup._id}/quests/force-start`); @@ -117,7 +117,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { it('sends back the quest object', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); - let quest = await leader.post(`/groups/${questingGroup._id}/quests/force-start`); + const quest = await leader.post(`/groups/${questingGroup._id}/quests/force-start`); expect(quest.active).to.eql(true); expect(quest.key).to.eql(PET_QUEST); @@ -127,8 +127,8 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('cleans up user quest data for non-quest members', async () => { - let partyMemberThatRejects = partyMembers[1]; - let partyMemberThatIgnores = partyMembers[2]; + const partyMemberThatRejects = partyMembers[1]; + const partyMemberThatIgnores = partyMembers[2]; await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); @@ -152,9 +152,9 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('removes users who have not accepted the quest from quest.members', async () => { - let partyMemberThatRejects = partyMembers[1]; - let partyMemberThatIgnores = partyMembers[2]; - let partyMemberThatAccepts = partyMembers[0]; + const partyMemberThatRejects = partyMembers[1]; + const partyMemberThatIgnores = partyMembers[2]; + const partyMemberThatAccepts = partyMembers[0]; await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMemberThatAccepts.post(`/groups/${questingGroup._id}/quests/accept`); @@ -174,7 +174,7 @@ describe('POST /groups/:groupId/quests/force-start', () => { it('removes users who are not in the party from quest.members', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); - let notInPartyUser = await generateUser(); + const notInPartyUser = await generateUser(); await questingGroup.update({ [`quest.members.${notInPartyUser._id}`]: true, @@ -210,8 +210,8 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('removes users who don\'t have true value in quest.members from quest.members', async () => { - let partyMemberThatRejects = partyMembers[1]; - let partyMemberThatIgnores = partyMembers[2]; + const partyMemberThatRejects = partyMembers[1]; + const partyMemberThatIgnores = partyMembers[2]; await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); @@ -234,8 +234,8 @@ describe('POST /groups/:groupId/quests/force-start', () => { }); it('allows group leader to force start quest and verifies chat', async () => { - let questLeader = partyMembers[0]; - await questLeader.update({[`items.quests.${PET_QUEST}`]: 1}); + const questLeader = partyMembers[0]; + await questLeader.update({ [`items.quests.${PET_QUEST}`]: 1 }); await questLeader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await leader.post(`/groups/${questingGroup._id}/quests/force-start`); diff --git a/test/api/v3/integration/quests/POST-groups_groupId_quests_invite.test.js b/test/api/v3/integration/quests/POST-groups_groupId_quests_invite.test.js index bd4b910c12..3581663c6e 100644 --- a/test/api/v3/integration/quests/POST-groups_groupId_quests_invite.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupId_quests_invite.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, sleep, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { quests as questScrolls } from '../../../../../website/common/script/content'; +import { quests as questScrolls } from '../../../../../website/common/script/content/quests'; import { chatModel as Chat } from '../../../../../website/server/models/message'; import apiError from '../../../../../website/server/libs/apiError'; @@ -15,14 +15,14 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { const PET_QUEST = 'whale'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); questingGroup = group; leader = groupLeader; - member = members[0]; + member = members[0]; // eslint-disable-line prefer-destructuring }); context('failure conditions', () => { @@ -35,12 +35,12 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('does not issue invites for a group in which user is not a member', async () => { - let { group } = await createAndPopulateGroup({ + const { group } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - let alternateGroup = group; + const alternateGroup = group; await expect(leader.post(`/groups/${alternateGroup._id}/quests/invite/${PET_QUEST}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -50,12 +50,12 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('does not issue invites for Guilds', async () => { - let { group } = await createAndPopulateGroup({ + const { group } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public' }, members: 1, }); - let alternateGroup = group; + const alternateGroup = group; await expect(leader.post(`/groups/${alternateGroup._id}/quests/invite/${PET_QUEST}`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -70,7 +70,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { await expect(leader.post(`/groups/${questingGroup._id}/quests/invite/${FAKE_QUEST}`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('questNotFound', {key: FAKE_QUEST}), + message: apiError('questNotFound', { key: FAKE_QUEST }), }); }); @@ -94,7 +94,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { await expect(leader.post(`/groups/${questingGroup._id}/quests/invite/${LEVELED_QUEST}`)).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('questLevelTooHigh', {level: LEVELED_QUEST_REQ}), + message: t('questLevelTooHigh', { level: LEVELED_QUEST_REQ }), }); }); @@ -130,7 +130,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { await questingGroup.sync(); - let quest = questingGroup.quest; + const { quest } = questingGroup; expect(quest.key).to.eql(PET_QUEST); expect(quest.active).to.eql(false); @@ -157,7 +157,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('sends back the quest object', async () => { - let inviteResponse = await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); + const inviteResponse = await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); expect(inviteResponse.key).to.eql(PET_QUEST); expect(inviteResponse.active).to.eql(false); @@ -168,7 +168,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('allows non-party-leader party members to send invites', async () => { - let inviteResponse = await member.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); + const inviteResponse = await member.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await questingGroup.sync(); @@ -177,9 +177,9 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('starts quest automatically if user is in a solo party', async () => { - let leaderDetails = { balance: 10 }; + const leaderDetails = { balance: 10 }; leaderDetails[`items.quests.${PET_QUEST}`] = 1; - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, leaderDetails, }); @@ -192,9 +192,9 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { }); it('starts quest automatically if user is in a solo party and verifies chat', async () => { - let leaderDetails = { balance: 10 }; + const leaderDetails = { balance: 10 }; leaderDetails[`items.quests.${PET_QUEST}`] = 1; - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, leaderDetails, }); @@ -207,7 +207,7 @@ describe('POST /groups/:groupId/quests/invite/:questKey', () => { expect(groupChat[0]._meta).to.exist; expect(groupChat[0]._meta).to.have.all.keys(['participatingMembers']); - let returnedGroup = await groupLeader.get(`/groups/${group._id}`); + const returnedGroup = await groupLeader.get(`/groups/${group._id}`); expect(returnedGroup.chat[0]._meta).to.be.undefined; }); }); diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js index bbfb871a63..7a42166a2c 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_abort.test.js @@ -1,9 +1,9 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, generateUser, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import { model as Group } from '../../../../../website/server/models/group'; describe('POST /groups/:groupId/quests/abort', () => { @@ -15,7 +15,7 @@ describe('POST /groups/:groupId/quests/abort', () => { const PET_QUEST = 'whale'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -50,7 +50,7 @@ describe('POST /groups/:groupId/quests/abort', () => { }); it('returns an error when group is a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -90,9 +90,9 @@ describe('POST /groups/:groupId/quests/abort', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); - let stub = sandbox.spy(Group.prototype, 'sendChat'); + const stub = sandbox.spy(Group.prototype, 'sendChat'); - let res = await leader.post(`/groups/${questingGroup._id}/quests/abort`); + const res = await leader.post(`/groups/${questingGroup._id}/quests/abort`); await Promise.all([ leader.sync(), questingGroup.sync(), @@ -100,7 +100,7 @@ describe('POST /groups/:groupId/quests/abort', () => { partyMembers[1].sync(), ]); - let cleanUserQuestObj = { + const cleanUserQuestObj = { key: null, progress: { up: 0, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js index 4032c36306..7df6dbd0f4 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_cancel.test.js @@ -1,9 +1,9 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, generateUser, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import { model as Group } from '../../../../../website/server/models/group'; describe('POST /groups/:groupId/quests/cancel', () => { @@ -15,7 +15,7 @@ describe('POST /groups/:groupId/quests/cancel', () => { const PET_QUEST = 'whale'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -50,7 +50,7 @@ describe('POST /groups/:groupId/quests/cancel', () => { }); it('returns an error when group is a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -103,9 +103,9 @@ describe('POST /groups/:groupId/quests/cancel', () => { // partyMembers[1] hasn't accepted the invitation, because if he accepts, invitation phase ends. // The cancel command can be done only in the invitation phase. - let stub = sandbox.spy(Group.prototype, 'sendChat'); + const stub = sandbox.spy(Group.prototype, 'sendChat'); - let res = await leader.post(`/groups/${questingGroup._id}/quests/cancel`); + const res = await leader.post(`/groups/${questingGroup._id}/quests/cancel`); await Promise.all([ leader.sync(), @@ -114,7 +114,7 @@ describe('POST /groups/:groupId/quests/cancel', () => { questingGroup.sync(), ]); - let clean = { + const clean = { key: null, progress: { up: 0, diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js index 9475af23c5..d8e6e9c70b 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_leave.test.js @@ -1,9 +1,9 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, generateUser, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /groups/:groupId/quests/leave', () => { let questingGroup; @@ -14,7 +14,7 @@ describe('POST /groups/:groupId/quests/leave', () => { const PET_QUEST = 'whale'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -49,7 +49,7 @@ describe('POST /groups/:groupId/quests/leave', () => { }); it('returns an error when group is a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -102,7 +102,7 @@ describe('POST /groups/:groupId/quests/leave', () => { await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); - let leaveResult = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`); + const leaveResult = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`); await Promise.all([ partyMembers[0].sync(), questingGroup.sync(), diff --git a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js index 8f6f4e6442..c36df1e6dc 100644 --- a/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js +++ b/test/api/v3/integration/quests/POST-groups_groupid_quests_reject.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, generateUser, sleep, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import { chatModel as Chat } from '../../../../../website/server/models/message'; describe('POST /groups/:groupId/quests/reject', () => { @@ -16,7 +16,7 @@ describe('POST /groups/:groupId/quests/reject', () => { const PET_QUEST = 'whale'; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); @@ -51,7 +51,7 @@ describe('POST /groups/:groupId/quests/reject', () => { }); it('returns an error when group is a guild', async () => { - let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ + const { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); @@ -127,7 +127,7 @@ describe('POST /groups/:groupId/quests/reject', () => { }); context('successfully quest rejection', () => { - let cleanUserQuestObj = { + const cleanUserQuestObj = { key: null, progress: { up: 0, @@ -142,7 +142,7 @@ describe('POST /groups/:groupId/quests/reject', () => { it('rejects a quest invitation', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); - let res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`); + const res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`); await partyMembers[0].sync(); await questingGroup.sync(); @@ -162,7 +162,7 @@ describe('POST /groups/:groupId/quests/reject', () => { }); it('cleans up user quest data for non-quest members when last member rejects', async () => { - let rejectingMember = partyMembers[1]; + const rejectingMember = partyMembers[1]; await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); @@ -193,7 +193,7 @@ describe('POST /groups/:groupId/quests/reject', () => { expect(groupChat[0]._meta).to.exist; expect(groupChat[0]._meta).to.have.all.keys(['participatingMembers']); - let returnedGroup = await leader.get(`/groups/${questingGroup._id}`); + const returnedGroup = await leader.get(`/groups/${questingGroup._id}`); expect(returnedGroup.chat[0]._meta).to.be.undefined; }); }); diff --git a/test/api/v3/integration/shops/GET-shops_backgrounds.test.js b/test/api/v3/integration/shops/GET-shops_backgrounds.test.js index 738b92dde3..ed9d65a429 100644 --- a/test/api/v3/integration/shops/GET-shops_backgrounds.test.js +++ b/test/api/v3/integration/shops/GET-shops_backgrounds.test.js @@ -11,15 +11,15 @@ describe('GET /shops/backgrounds', () => { }); it('returns a valid shop object', async () => { - let shop = await user.get('/shops/backgrounds'); + const shop = await user.get('/shops/backgrounds'); expect(shop.identifier).to.equal('backgroundShop'); expect(shop.text).to.eql(t('backgroundShop')); expect(shop.notes).to.eql(t('backgroundShopText')); expect(shop.imageName).to.equal('background_shop'); expect(shop.sets).to.be.an('array'); - let sets = shop.sets.map(set => set.identifier); + const sets = shop.sets.map(set => set.identifier); expect(sets).to.include('incentiveBackgrounds'); expect(sets).to.include('backgrounds062014'); }); -}); \ No newline at end of file +}); diff --git a/test/api/v3/integration/shops/GET-shops_market.test.js b/test/api/v3/integration/shops/GET-shops_market.test.js index 8c9c941fcc..8feadaa89e 100644 --- a/test/api/v3/integration/shops/GET-shops_market.test.js +++ b/test/api/v3/integration/shops/GET-shops_market.test.js @@ -11,7 +11,7 @@ describe('GET /shops/market', () => { }); it('returns a valid shop object', async () => { - let shop = await user.get('/shops/market'); + const shop = await user.get('/shops/market'); expect(shop.identifier).to.equal('market'); expect(shop.text).to.eql(t('market')); @@ -19,7 +19,7 @@ describe('GET /shops/market', () => { expect(shop.imageName).to.be.a('string'); expect(shop.categories).to.be.an('array'); - let categories = shop.categories.map(cat => cat.identifier); + const categories = shop.categories.map(cat => cat.identifier); expect(categories).to.include('eggs'); expect(categories).to.include('hatchingPotions'); @@ -32,22 +32,22 @@ describe('GET /shops/market', () => { 'stats.gp': 99999999, }); - let shop = await user.get('/shops/market'); - let items = shop.categories.reduce((array, category) => { - category.items.forEach((item) => { + const shop = await user.get('/shops/market'); + const items = shop.categories.reduce((array, category) => { + category.items.forEach(item => { array.push(item); }); return array; }, []); - let results = await Promise.all(items.map((item) => { - let { purchaseType, key } = item; + const results = await Promise.all(items.map(item => { + const { purchaseType, key } = item; return user.post(`/user/purchase/${purchaseType}/${key}`); })); expect(results.length).to.be.greaterThan(0); - items.forEach((item) => { + items.forEach(item => { expect(item).to.include.keys('key', 'text', 'notes', 'class', 'value', 'currency'); }); }); diff --git a/test/api/v3/integration/shops/GET-shops_quests.test.js b/test/api/v3/integration/shops/GET-shops_quests.test.js index e4546fb4b5..5412328c24 100644 --- a/test/api/v3/integration/shops/GET-shops_quests.test.js +++ b/test/api/v3/integration/shops/GET-shops_quests.test.js @@ -11,7 +11,7 @@ describe('GET /shops/quests', () => { }); it('returns a valid shop object', async () => { - let shop = await user.get('/shops/quests'); + const shop = await user.get('/shops/quests'); expect(shop.identifier).to.equal('questShop'); expect(shop.text).to.eql(t('quests')); @@ -19,7 +19,7 @@ describe('GET /shops/quests', () => { expect(shop.imageName).to.be.a('string'); expect(shop.categories).to.be.an('array'); - let categories = shop.categories.map(cat => cat.identifier); + const categories = shop.categories.map(cat => cat.identifier); expect(categories).to.include('unlockable'); expect(categories).to.include('gold'); diff --git a/test/api/v3/integration/shops/GET-shops_seasonal.test.js b/test/api/v3/integration/shops/GET-shops_seasonal.test.js index 9b4ffc2be9..6f88812064 100644 --- a/test/api/v3/integration/shops/GET-shops_seasonal.test.js +++ b/test/api/v3/integration/shops/GET-shops_seasonal.test.js @@ -11,7 +11,7 @@ describe('GET /shops/seasonal', () => { }); it('returns a valid shop object', async () => { - let shop = await user.get('/shops/seasonal'); + const shop = await user.get('/shops/seasonal'); expect(shop.identifier).to.equal('seasonalShop'); expect(shop.text).to.eql(t('seasonalShop')); diff --git a/test/api/v3/integration/shops/GET-shops_time_travelers.test.js b/test/api/v3/integration/shops/GET-shops_time_travelers.test.js index 5ae901f657..81e3c3c23e 100644 --- a/test/api/v3/integration/shops/GET-shops_time_travelers.test.js +++ b/test/api/v3/integration/shops/GET-shops_time_travelers.test.js @@ -11,7 +11,7 @@ describe('GET /shops/time-travelers', () => { }); it('returns a valid shop object', async () => { - let shop = await user.get('/shops/time-travelers'); + const shop = await user.get('/shops/time-travelers'); expect(shop.identifier).to.equal('timeTravelersShop'); expect(shop.text).to.eql(t('timeTravelers')); @@ -19,17 +19,17 @@ describe('GET /shops/time-travelers', () => { expect(shop.imageName).to.be.a('string'); expect(shop.categories).to.be.an('array'); - let categories = shop.categories.map(cat => cat.identifier); + const categories = shop.categories.map(cat => cat.identifier); expect(categories).to.include('pets'); expect(categories).to.include('mounts'); expect(categories).to.include('201606'); - let mammothPet = shop.categories + const mammothPet = shop.categories .find(cat => cat.identifier === 'pets') .items .find(pet => pet.key === 'Mammoth-Base'); - let mantisShrimp = shop.categories + const mantisShrimp = shop.categories .find(cat => cat.identifier === 'mounts') .items .find(pet => pet.key === 'MantisShrimp-Base'); @@ -43,14 +43,14 @@ describe('GET /shops/time-travelers', () => { 'purchased.plan.consecutive.trinkets': 1, }); - let shop = await user.get('/shops/time-travelers'); + const shop = await user.get('/shops/time-travelers'); expect(shop.notes).to.eql(t('timeTravelersPopover')); expect(shop.imageName).to.eql('npc_timetravelers_active'); }); it('returns inactive shop notes and imageName if user has trinkets', async () => { - let shop = await user.get('/shops/time-travelers'); + const shop = await user.get('/shops/time-travelers'); expect(shop.notes).to.eql(t('timeTravelersPopoverNoSubMobile')); expect(shop.imageName).to.eql('npc_timetravelers'); @@ -64,9 +64,9 @@ describe('GET /shops/time-travelers', () => { }, }); - let shop = await user.get('/shops/time-travelers'); + const shop = await user.get('/shops/time-travelers'); - let categories = shop.categories.map(cat => cat.identifier); + const categories = shop.categories.map(cat => cat.identifier); expect(categories).to.not.include('201606'); }); @@ -81,13 +81,13 @@ describe('GET /shops/time-travelers', () => { }, }); - let shop = await user.get('/shops/time-travelers'); + const shop = await user.get('/shops/time-travelers'); - let mammothPet = shop.categories + const mammothPet = shop.categories .find(cat => cat.identifier === 'pets') .items .find(pet => pet.key === 'Mammoth-Base'); - let mantisShrimp = shop.categories + const mantisShrimp = shop.categories .find(cat => cat.identifier === 'mounts') .items .find(pet => pet.key === 'MantisShrimp-Base'); diff --git a/test/api/v3/integration/status/GET-status.test.js b/test/api/v3/integration/status/GET-status.test.js index 38fbcb69dd..03c3eac4b5 100644 --- a/test/api/v3/integration/status/GET-status.test.js +++ b/test/api/v3/integration/status/GET-status.test.js @@ -4,7 +4,7 @@ import { describe('GET /status', () => { it('returns status: up', async () => { - let res = await requester().get('/status'); + const res = await requester().get('/status'); expect(res).to.eql({ status: 'up', }); diff --git a/test/api/v3/integration/tags/DELETE-tags_id.test.js b/test/api/v3/integration/tags/DELETE-tags_id.test.js index c03e8bb9e0..dc0f1be8ba 100644 --- a/test/api/v3/integration/tags/DELETE-tags_id.test.js +++ b/test/api/v3/integration/tags/DELETE-tags_id.test.js @@ -10,16 +10,14 @@ describe('DELETE /tags/:tagId', () => { }); it('deletes a tag given it\'s id', async () => { - let tagName = 'Tag 1'; - let tag = await user.post('/tags', {name: tagName}); - let numberOfTags = (await user.get('/tags')).length; + const tagName = 'Tag 1'; + const tag = await user.post('/tags', { name: tagName }); + const numberOfTags = (await user.get('/tags')).length; await user.del(`/tags/${tag.id}`); - let tags = await user.get('/tags'); - let tagNames = tags.map((t) => { - return t.name; - }); + const tags = await user.get('/tags'); + const tagNames = tags.map(t => t.name); expect(tags.length).to.equal(numberOfTags - 1); expect(tagNames).to.not.include(tagName); diff --git a/test/api/v3/integration/tags/GET-tags.test.js b/test/api/v3/integration/tags/GET-tags.test.js index ef080a2ee7..30d5ce5fec 100644 --- a/test/api/v3/integration/tags/GET-tags.test.js +++ b/test/api/v3/integration/tags/GET-tags.test.js @@ -12,10 +12,10 @@ describe('GET /tags', () => { }); it('returns all user\'s tags', async () => { - let tag1 = await user.post('/tags', {name: 'Tag 1'}); - let tag2 = await user.post('/tags', {name: 'Tag 2'}); + const tag1 = await user.post('/tags', { name: 'Tag 1' }); + const tag2 = await user.post('/tags', { name: 'Tag 2' }); - let tags = await user.get('/tags'); + const tags = await user.get('/tags'); expect(tags.length).to.equal(2); expect(tags[0].name).to.equal(tag1.name); diff --git a/test/api/v3/integration/tags/GET-tags_id.test.js b/test/api/v3/integration/tags/GET-tags_id.test.js index 4ab818593d..1b6e126e0a 100644 --- a/test/api/v3/integration/tags/GET-tags_id.test.js +++ b/test/api/v3/integration/tags/GET-tags_id.test.js @@ -10,8 +10,8 @@ describe('GET /tags/:tagId', () => { }); it('returns a tag given it\'s id', async () => { - let createdTag = await user.post('/tags', {name: 'Tag 1'}); - let tag = await user.get(`/tags/${createdTag.id}`); + const createdTag = await user.post('/tags', { name: 'Tag 1' }); + const tag = await user.get(`/tags/${createdTag.id}`); expect(tag).to.deep.equal(createdTag); }); diff --git a/test/api/v3/integration/tags/POST-tag-reorder.test.js b/test/api/v3/integration/tags/POST-tag-reorder.test.js index 5d12eb974f..bd5bb0daf7 100644 --- a/test/api/v3/integration/tags/POST-tag-reorder.test.js +++ b/test/api/v3/integration/tags/POST-tag-reorder.test.js @@ -22,7 +22,7 @@ describe('POST /reorder-tags', () => { }); it('returns error when tag is not found', async () => { - await expect(user.post('/reorder-tags', {tagId: 'fake-id', to: 3})) + await expect(user.post('/reorder-tags', { tagId: 'fake-id', to: 3 })) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', @@ -31,13 +31,13 @@ describe('POST /reorder-tags', () => { }); it('updates tags', async () => { - let tag1Name = 'Tag 1'; - let tag2Name = 'Tag 2'; - await user.post('/tags', {name: tag1Name}); - await user.post('/tags', {name: tag2Name}); + const tag1Name = 'Tag 1'; + const tag2Name = 'Tag 2'; + await user.post('/tags', { name: tag1Name }); + await user.post('/tags', { name: tag2Name }); await user.sync(); - await user.post('/reorder-tags', {tagId: user.tags[0].id, to: 1}); + await user.post('/reorder-tags', { tagId: user.tags[0].id, to: 1 }); await user.sync(); expect(user.tags[0].name).to.equal(tag2Name); diff --git a/test/api/v3/integration/tags/POST-tags.test.js b/test/api/v3/integration/tags/POST-tags.test.js index 93f2dfdb60..5c9296fc7d 100644 --- a/test/api/v3/integration/tags/POST-tags.test.js +++ b/test/api/v3/integration/tags/POST-tags.test.js @@ -10,13 +10,13 @@ describe('POST /tags', () => { }); it('creates a tag correctly', async () => { - let tagName = 'Tag 1'; - let createdTag = await user.post('/tags', { + const tagName = 'Tag 1'; + const createdTag = await user.post('/tags', { name: tagName, ignored: false, }); - let tag = await user.get(`/tags/${createdTag.id}`); + const tag = await user.get(`/tags/${createdTag.id}`); expect(tag.name).to.equal(tagName); expect(tag.ignored).to.not.exist; diff --git a/test/api/v3/integration/tags/PUT-tags_id.test.js b/test/api/v3/integration/tags/PUT-tags_id.test.js index 4c16453ac3..409ae23318 100644 --- a/test/api/v3/integration/tags/PUT-tags_id.test.js +++ b/test/api/v3/integration/tags/PUT-tags_id.test.js @@ -10,9 +10,9 @@ describe('PUT /tags/:tagId', () => { }); it('updates a tag given it\'s id', async () => { - let updatedTagName = 'Tag updated'; - let createdTag = await user.post('/tags', {name: 'Tag 1'}); - let updatedTag = await user.put(`/tags/${createdTag.id}`, { + const updatedTagName = 'Tag updated'; + let createdTag = await user.post('/tags', { name: 'Tag 1' }); + const updatedTag = await user.put(`/tags/${createdTag.id}`, { name: updatedTagName, ignored: true, }); diff --git a/test/api/v3/integration/tasks/DELETE-tasks_id.test.js b/test/api/v3/integration/tasks/DELETE-tasks_id.test.js index fadf21973e..d1835ac022 100644 --- a/test/api/v3/integration/tasks/DELETE-tasks_id.test.js +++ b/test/api/v3/integration/tasks/DELETE-tasks_id.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, @@ -6,7 +7,6 @@ import { generateChallenge, server, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /tasks/:id', () => { let user; @@ -57,9 +57,9 @@ describe('DELETE /tasks/:id', () => { }); it('sends task activity webhooks if task is user owned', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -78,20 +78,20 @@ describe('DELETE /tasks/:id', () => { await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.type).to.eql('deleted'); expect(body.task).to.eql(task); }); it('does not send task activity webhooks if task is not user owned', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.update({ balance: 10, }); - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post('/user/webhook', { @@ -104,7 +104,7 @@ describe('DELETE /tasks/:id', () => { }, }); - let challengeTask = await user.post(`/tasks/challenge/${challenge._id}`, { + const challengeTask = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit', type: 'habit', }); @@ -113,7 +113,7 @@ describe('DELETE /tasks/:id', () => { await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body).to.not.exist; }); @@ -129,8 +129,8 @@ describe('DELETE /tasks/:id', () => { }); it('cannot delete a task owned by someone else', async () => { - let anotherUser = await generateUser(); - let anotherUsersTask = await anotherUser.post('/tasks/user', { + const anotherUser = await generateUser(); + const anotherUsersTask = await anotherUser.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -143,7 +143,7 @@ describe('DELETE /tasks/:id', () => { }); it('removes a task from user.tasksOrder', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); diff --git a/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js b/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js index b1865f8008..9a2a0eb40b 100644 --- a/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js @@ -1,18 +1,18 @@ +import { each } from 'lodash'; +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { each } from 'lodash'; -import { v4 as generateUUID } from 'uuid'; describe('GET /tasks/:taskId', () => { let user; let guild; let challenge; let task; - let tasksToTest = { + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -58,12 +58,12 @@ describe('GET /tasks/:taskId', () => { }); it('gets challenge task', async () => { - let getTask = await user.get(`/tasks/${task._id}`); + const getTask = await user.get(`/tasks/${task._id}`); expect(getTask).to.eql(task); }); it('returns error when user is not a member of the challenge', async () => { - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/tasks/${task._id}`)).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/tasks/GET-tasks_id.test.js b/test/api/v3/integration/tasks/GET-tasks_id.test.js index 98c107d932..e46a08706c 100644 --- a/test/api/v3/integration/tasks/GET-tasks_id.test.js +++ b/test/api/v3/integration/tasks/GET-tasks_id.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('GET /tasks/:id', () => { let user; @@ -23,13 +23,13 @@ describe('GET /tasks/:id', () => { }); it('gets specified task', async () => { - let getTask = await user.get(`/tasks/${task._id}`); + const getTask = await user.get(`/tasks/${task._id}`); expect(getTask).to.eql(task); }); it('can use alias to retrieve task', async () => { - let getTask = await user.get(`/tasks/${task.alias}`); + const getTask = await user.get(`/tasks/${task.alias}`); expect(getTask).to.eql(task); }); @@ -40,7 +40,7 @@ describe('GET /tasks/:id', () => { context('task cannot be accessed', () => { it('cannot get a non-existant task', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/tasks/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -50,8 +50,8 @@ describe('GET /tasks/:id', () => { }); it('cannot get a task owned by someone else', async () => { - let anotherUser = await generateUser(); - let task = await user.post('/tasks/user', { + const anotherUser = await generateUser(); + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); diff --git a/test/api/v3/integration/tasks/GET-tasks_user.test.js b/test/api/v3/integration/tasks/GET-tasks_user.test.js index ea8f2a49d0..fa2cd94884 100644 --- a/test/api/v3/integration/tasks/GET-tasks_user.test.js +++ b/test/api/v3/integration/tasks/GET-tasks_user.test.js @@ -11,21 +11,21 @@ describe('GET /tasks/user', () => { }); it('returns all user\'s tasks', async () => { - let createdTasks = await user.post('/tasks/user', [{text: 'test habit', type: 'habit'}, {text: 'test todo', type: 'todo'}]); - let tasks = await user.get('/tasks/user'); + const createdTasks = await user.post('/tasks/user', [{ text: 'test habit', type: 'habit' }, { text: 'test todo', type: 'todo' }]); + const tasks = await user.get('/tasks/user'); expect(tasks.length).to.equal(createdTasks.length + 1); // Plus one for generated todo }); it('returns only a type of user\'s tasks if req.query.type is specified', async () => { - let createdTasks = await user.post('/tasks/user', [ - {text: 'test habit', type: 'habit'}, - {text: 'test daily', type: 'daily'}, - {text: 'test reward', type: 'reward'}, - {text: 'test todo', type: 'todo'}, + const createdTasks = await user.post('/tasks/user', [ + { text: 'test habit', type: 'habit' }, + { text: 'test daily', type: 'daily' }, + { text: 'test reward', type: 'reward' }, + { text: 'test todo', type: 'todo' }, ]); - let habits = await user.get('/tasks/user?type=habits'); - let dailys = await user.get('/tasks/user?type=dailys'); - let rewards = await user.get('/tasks/user?type=rewards'); + const habits = await user.get('/tasks/user?type=habits'); + const dailys = await user.get('/tasks/user?type=dailys'); + const rewards = await user.get('/tasks/user?type=rewards'); expect(habits.length).to.be.at.least(1); expect(habits[0]._id).to.equal(createdTasks[0]._id); @@ -36,28 +36,28 @@ describe('GET /tasks/user', () => { }); it('returns uncompleted todos if req.query.type is "todos"', async () => { - let existingTodos = await user.get('/tasks/user?type=todos'); + const existingTodos = await user.get('/tasks/user?type=todos'); // populate user with other task types await user.post('/tasks/user', [ - {text: 'daily', type: 'daily'}, - {text: 'reward', type: 'reward'}, - {text: 'habit', type: 'habit'}, + { text: 'daily', type: 'daily' }, + { text: 'reward', type: 'reward' }, + { text: 'habit', type: 'habit' }, ]); - let newUncompletedTodos = await user.post('/tasks/user', [ - {text: 'test todo 1', type: 'todo'}, - {text: 'test todo 2', type: 'todo'}, + const newUncompletedTodos = await user.post('/tasks/user', [ + { text: 'test todo 1', type: 'todo' }, + { text: 'test todo 2', type: 'todo' }, ]); - let todoToBeCompleted = await user.post('/tasks/user', { + const todoToBeCompleted = await user.post('/tasks/user', { text: 'wll be completed todo', type: 'todo', }); await user.post(`/tasks/${todoToBeCompleted._id}/score/up`); - let uncompletedTodos = [...existingTodos, ...newUncompletedTodos]; + const uncompletedTodos = [...existingTodos, ...newUncompletedTodos]; - let todos = await user.get('/tasks/user?type=todos'); + const todos = await user.get('/tasks/user?type=todos'); expect(todos.length).to.be.gte(2); expect(todos.length).to.eql(uncompletedTodos.length); @@ -66,11 +66,11 @@ describe('GET /tasks/user', () => { }); it('returns completed todos sorted by reverse completion date if req.query.type is "completedTodos"', async () => { - let todo1 = await user.post('/tasks/user', {text: 'todo to complete 1', type: 'todo'}); - let todo2 = await user.post('/tasks/user', {text: 'todo to complete 2', type: 'todo'}); + const todo1 = await user.post('/tasks/user', { text: 'todo to complete 1', type: 'todo' }); + const todo2 = await user.post('/tasks/user', { text: 'todo to complete 2', type: 'todo' }); await user.sync(); - let initialTodoCount = user.tasksOrder.todos.length; + const initialTodoCount = user.tasksOrder.todos.length; await user.post(`/tasks/${todo2._id}/score/up`); await user.post(`/tasks/${todo1._id}/score/up`); @@ -78,17 +78,17 @@ describe('GET /tasks/user', () => { expect(user.tasksOrder.todos.length).to.equal(initialTodoCount - 2); - let completedTodos = await user.get('/tasks/user?type=completedTodos'); + const completedTodos = await user.get('/tasks/user?type=completedTodos'); expect(completedTodos.length).to.equal(2); expect(completedTodos[completedTodos.length - 1].text).to.equal('todo to complete 2'); // last is the todo that was completed most recently }); it('returns completed todos sorted by reverse completion date if req.query.type is "_allCompletedTodos"', async () => { - let todo1 = await user.post('/tasks/user', {text: 'todo to complete 1', type: 'todo'}); - let todo2 = await user.post('/tasks/user', {text: 'todo to complete 2', type: 'todo'}); + const todo1 = await user.post('/tasks/user', { text: 'todo to complete 1', type: 'todo' }); + const todo2 = await user.post('/tasks/user', { text: 'todo to complete 2', type: 'todo' }); await user.sync(); - let initialTodoCount = user.tasksOrder.todos.length; + const initialTodoCount = user.tasksOrder.todos.length; await user.post(`/tasks/${todo2._id}/score/up`); await user.post(`/tasks/${todo1._id}/score/up`); @@ -96,25 +96,25 @@ describe('GET /tasks/user', () => { expect(user.tasksOrder.todos.length).to.equal(initialTodoCount - 2); - let allCompletedTodos = await user.get('/tasks/user?type=_allCompletedTodos'); + const allCompletedTodos = await user.get('/tasks/user?type=_allCompletedTodos'); expect(allCompletedTodos.length).to.equal(2); expect(allCompletedTodos[allCompletedTodos.length - 1].text).to.equal('todo to complete 2'); }); it('returns only some completed todos if req.query.type is "completedTodos" or "_allCompletedTodos"', async () => { const LIMIT = 30; - let numberOfTodos = LIMIT + 1; - let todosInput = []; + const numberOfTodos = LIMIT + 1; + const todosInput = []; - for (let i = 0; i < numberOfTodos; i++) { - todosInput[i] = {text: 'todo to complete ${i}', type: 'todo'}; + for (let i = 0; i < numberOfTodos; i += 1) { + todosInput[i] = { text: `todo to complete ${i}`, type: 'todo' }; } - let todos = await user.post('/tasks/user', todosInput); + const todos = await user.post('/tasks/user', todosInput); await user.sync(); - let initialTodoCount = user.tasksOrder.todos.length; + const initialTodoCount = user.tasksOrder.todos.length; - for (let i = 0; i < numberOfTodos; i++) { - let id = todos[i]._id; + for (let i = 0; i < numberOfTodos; i += 1) { + const id = todos[i]._id; await user.post(`/tasks/${id}/score/up`); // eslint-disable-line no-await-in-loop } @@ -122,17 +122,17 @@ describe('GET /tasks/user', () => { expect(user.tasksOrder.todos.length).to.equal(initialTodoCount - numberOfTodos); - let completedTodos = await user.get('/tasks/user?type=completedTodos'); + const completedTodos = await user.get('/tasks/user?type=completedTodos'); expect(completedTodos.length).to.equal(LIMIT); - let allCompletedTodos = await user.get('/tasks/user?type=_allCompletedTodos'); + const allCompletedTodos = await user.get('/tasks/user?type=_allCompletedTodos'); expect(allCompletedTodos.length).to.equal(numberOfTodos); }); it('returns dailies with isDue for the date specified', async () => { // @TODO Add required format - let startDate = moment().subtract('1', 'days').toISOString(); - let createdTasks = await user.post('/tasks/user', [ + const startDate = moment().subtract('1', 'days').toISOString(); + const createdTasks = await user.post('/tasks/user', [ { text: 'test daily', type: 'daily', @@ -141,24 +141,25 @@ describe('GET /tasks/user', () => { everyX: 2, }, ]); - let dailys = await user.get('/tasks/user?type=dailys'); + const dailys = await user.get('/tasks/user?type=dailys'); expect(dailys.length).to.be.at.least(1); expect(dailys[0]._id).to.equal(createdTasks._id); expect(dailys[0].isDue).to.be.false; - let dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${startDate}`); + const dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${startDate}`); expect(dailys2[0]._id).to.equal(createdTasks._id); expect(dailys2[0].isDue).to.be.true; }); xit('returns dailies with isDue for the date specified and will add CDS offset if time is not supplied and assumes timezones', async () => { - let timezone = 420; + const timezone = 420; await user.update({ 'preferences.dayStart': 0, 'preferences.timezoneOffset': timezone, }); - let startDate = moment().zone(timezone).subtract('4', 'days').startOf('day').toISOString(); + const startDate = moment().zone(timezone).subtract('4', 'days').startOf('day') + .toISOString(); await user.post('/tasks/user', [ { text: 'test daily', @@ -169,23 +170,24 @@ describe('GET /tasks/user', () => { }, ]); - let today = moment().format('YYYY-MM-DD'); - let dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); + const today = moment().format('YYYY-MM-DD'); + const dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); expect(dailys[0].isDue).to.be.true; - let yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); - let dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); + const yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); + const dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); expect(dailys2[0].isDue).to.be.false; }); xit('returns dailies with isDue for the date specified and will add CDS offset if time is not supplied and assumes timezones', async () => { - let timezone = 240; + const timezone = 240; await user.update({ 'preferences.dayStart': 0, 'preferences.timezoneOffset': timezone, }); - let startDate = moment().zone(timezone).subtract('4', 'days').startOf('day').toISOString(); + const startDate = moment().zone(timezone).subtract('4', 'days').startOf('day') + .toISOString(); await user.post('/tasks/user', [ { text: 'test daily', @@ -196,22 +198,23 @@ describe('GET /tasks/user', () => { }, ]); - let today = moment().format('YYYY-MM-DD'); - let dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); + const today = moment().format('YYYY-MM-DD'); + const dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); expect(dailys[0].isDue).to.be.true; - let yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); - let dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); + const yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); + const dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); expect(dailys2[0].isDue).to.be.false; }); xit('returns dailies with isDue for the date specified and will add CDS offset if time is not supplied and assumes timezones', async () => { - let timezone = 540; + const timezone = 540; await user.update({ 'preferences.dayStart': 0, 'preferences.timezoneOffset': timezone, }); - let startDate = moment().zone(timezone).subtract('4', 'days').startOf('day').toISOString(); + const startDate = moment().zone(timezone).subtract('4', 'days').startOf('day') + .toISOString(); await user.post('/tasks/user', [ { text: 'test daily', @@ -222,12 +225,12 @@ describe('GET /tasks/user', () => { }, ]); - let today = moment().format('YYYY-MM-DD'); - let dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); + const today = moment().format('YYYY-MM-DD'); + const dailys = await user.get(`/tasks/user?type=dailys&dueDate=${today}`); expect(dailys[0].isDue).to.be.true; - let yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); - let dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); + const yesterday = moment().subtract('1', 'days').format('YYYY-MM-DD'); + const dailys2 = await user.get(`/tasks/user?type=dailys&dueDate=${yesterday}`); expect(dailys2[0].isDue).to.be.false; }); }); diff --git a/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js b/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js index 2014b1c65c..f3328fbb64 100644 --- a/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js @@ -6,18 +6,18 @@ import { describe('POST /tasks/clearCompletedTodos', () => { it('deletes all completed todos except the ones from a challenge and group', async () => { - let user = await generateUser({balance: 1}); - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const user = await generateUser({ balance: 1 }); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); - let initialTodoCount = user.tasksOrder.todos.length; + const initialTodoCount = user.tasksOrder.todos.length; await user.post('/tasks/user', [ - {text: 'todo 1', type: 'todo'}, - {text: 'todo 2', type: 'todo'}, - {text: 'todo 3', type: 'todo'}, - {text: 'todo 4', type: 'todo'}, - {text: 'todo 5', type: 'todo'}, + { text: 'todo 1', type: 'todo' }, + { text: 'todo 2', type: 'todo' }, + { text: 'todo 3', type: 'todo' }, + { text: 'todo 4', type: 'todo' }, + { text: 'todo 5', type: 'todo' }, ]); await user.post(`/tasks/challenge/${challenge._id}`, { @@ -25,26 +25,27 @@ describe('POST /tasks/clearCompletedTodos', () => { type: 'todo', }); - let groupTask = await user.post(`/tasks/group/${guild._id}`, { + const groupTask = await user.post(`/tasks/group/${guild._id}`, { text: 'todo 7', type: 'todo', }); await user.post(`/tasks/${groupTask._id}/assign/${user._id}`); - let tasks = await user.get('/tasks/user?type=todos'); + const tasks = await user.get('/tasks/user?type=todos'); expect(tasks.length).to.equal(initialTodoCount + 7); - for (let task of tasks) { + for (const task of tasks) { // eslint-disable-line if (['todo 2', 'todo 3', 'todo 6'].indexOf(task.text) !== -1) { await user.post(`/tasks/${task._id}/score/up`); // eslint-disable-line no-await-in-loop } } await user.post('/tasks/clearCompletedTodos'); - let completedTodos = await user.get('/tasks/user?type=completedTodos'); - let todos = await user.get('/tasks/user?type=todos'); - let allTodos = todos.concat(completedTodos); - expect(allTodos.length).to.equal(initialTodoCount + 5); // + 7 - 3 completed (but one is from challenge) + const completedTodos = await user.get('/tasks/user?type=completedTodos'); + const todos = await user.get('/tasks/user?type=todos'); + const allTodos = todos.concat(completedTodos); + // + 7 - 3 completed (but one is from challenge) + expect(allTodos.length).to.equal(initialTodoCount + 5); expect(allTodos[allTodos.length - 1].text).to.equal('todo 6'); // last completed todo }); }); diff --git a/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js index c34b94ed05..bdfc00fce0 100644 --- a/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_id_score_direction.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, sleep, translate as t, server, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:id/score/:direction', () => { let user; @@ -17,25 +17,25 @@ describe('POST /tasks/:id/score/:direction', () => { context('all', () => { it('can use an id to identify the task', async () => { - let todo = await user.post('/tasks/user', { + const todo = await user.post('/tasks/user', { text: 'test todo', type: 'todo', alias: 'alias', }); - let res = await user.post(`/tasks/${todo._id}/score/up`); + const res = await user.post(`/tasks/${todo._id}/score/up`); expect(res).to.be.ok; }); it('can use a alias in place of the id', async () => { - let todo = await user.post('/tasks/user', { + const todo = await user.post('/tasks/user', { text: 'test todo', type: 'todo', alias: 'alias', }); - let res = await user.post(`/tasks/${todo.alias}/score/up`); + const res = await user.post(`/tasks/${todo.alias}/score/up`); expect(res).to.be.ok; }); @@ -49,7 +49,7 @@ describe('POST /tasks/:id/score/:direction', () => { }); it('sends task scored webhooks', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await server.start(); await user.post('/user/webhook', { @@ -62,7 +62,7 @@ describe('POST /tasks/:id/score/:direction', () => { }, }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -73,7 +73,7 @@ describe('POST /tasks/:id/score/:direction', () => { await server.close(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.user).to.have.all.keys('_id', '_tmp', 'stats'); expect(body.user.stats).to.have.all.keys('hp', 'mp', 'exp', 'gp', 'lvl', 'class', 'points', 'str', 'con', 'int', 'per', 'buffs', 'training', 'maxHealth', 'maxMP', 'toNextLevel'); @@ -92,7 +92,7 @@ describe('POST /tasks/:id/score/:direction', () => { }); it('sends user activity webhook when the user levels up', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -108,7 +108,7 @@ describe('POST /tasks/:id/score/:direction', () => { await user.update({ 'stats.exp': 3000, }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -117,7 +117,7 @@ describe('POST /tasks/:id/score/:direction', () => { await user.sync(); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.type).to.eql('leveledUp'); expect(body.initialLvl).to.eql(initialLvl); @@ -138,44 +138,45 @@ describe('POST /tasks/:id/score/:direction', () => { it('completes todo when direction is up', async () => { await user.post(`/tasks/${todo._id}/score/up`); - let task = await user.get(`/tasks/${todo._id}`); + const task = await user.get(`/tasks/${todo._id}`); expect(task.completed).to.equal(true); expect(task.dateCompleted).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type }); it('moves completed todos out of user.tasksOrder.todos', async () => { - let getUser = await user.get('/user'); + const getUser = await user.get('/user'); expect(getUser.tasksOrder.todos.indexOf(todo._id)).to.not.equal(-1); await user.post(`/tasks/${todo._id}/score/up`); - let updatedTask = await user.get(`/tasks/${todo._id}`); + const updatedTask = await user.get(`/tasks/${todo._id}`); expect(updatedTask.completed).to.equal(true); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.todos.indexOf(todo._id)).to.equal(-1); }); it('moves un-completed todos back into user.tasksOrder.todos', async () => { - let getUser = await user.get('/user'); + const getUser = await user.get('/user'); expect(getUser.tasksOrder.todos.indexOf(todo._id)).to.not.equal(-1); await user.post(`/tasks/${todo._id}/score/up`); await user.post(`/tasks/${todo._id}/score/down`); - let updatedTask = await user.get(`/tasks/${todo._id}`); + const updatedTask = await user.get(`/tasks/${todo._id}`); expect(updatedTask.completed).to.equal(false); - let updatedUser = await user.get('/user'); - let l = updatedUser.tasksOrder.todos.length; + const updatedUser = await user.get('/user'); + const l = updatedUser.tasksOrder.todos.length; expect(updatedUser.tasksOrder.todos.indexOf(todo._id)).not.to.equal(-1); - expect(updatedUser.tasksOrder.todos.indexOf(todo._id)).to.equal(l - 1); // Check that it was pushed at the bottom + // Check that it was pushed at the bottom + expect(updatedUser.tasksOrder.todos.indexOf(todo._id)).to.equal(l - 1); }); it('uncompletes todo when direction is down', async () => { await user.post(`/tasks/${todo._id}/score/up`); await user.post(`/tasks/${todo._id}/score/down`); - let updatedTask = await user.get(`/tasks/${todo._id}`); + const updatedTask = await user.get(`/tasks/${todo._id}`); expect(updatedTask.completed).to.equal(false); expect(updatedTask.dateCompleted).to.be.a('undefined'); @@ -221,7 +222,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); context('user stats when direction is down', () => { - let updatedUser, initialUser; + let updatedUser; let + initialUser; beforeEach(async () => { await user.post(`/tasks/${todo._id}/score/up`); @@ -256,7 +258,7 @@ describe('POST /tasks/:id/score/:direction', () => { it('completes daily when direction is up', async () => { await user.post(`/tasks/${daily._id}/score/up`); - let task = await user.get(`/tasks/${daily._id}`); + const task = await user.get(`/tasks/${daily._id}`); expect(task.completed).to.equal(true); }); @@ -264,21 +266,21 @@ describe('POST /tasks/:id/score/:direction', () => { it('uncompletes daily when direction is down', async () => { await user.post(`/tasks/${daily._id}/score/up`); await user.post(`/tasks/${daily._id}/score/down`); - let task = await user.get(`/tasks/${daily._id}`); + const task = await user.get(`/tasks/${daily._id}`); expect(task.completed).to.equal(false); }); it('computes isDue', async () => { await user.post(`/tasks/${daily._id}/score/up`); - let task = await user.get(`/tasks/${daily._id}`); + const task = await user.get(`/tasks/${daily._id}`); expect(task.isDue).to.equal(true); }); it('computes nextDue', async () => { await user.post(`/tasks/${daily._id}/score/up`); - let task = await user.get(`/tasks/${daily._id}`); + const task = await user.get(`/tasks/${daily._id}`); expect(task.nextDue.length).to.eql(6); }); @@ -322,7 +324,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); context('user stats when direction is down', () => { - let updatedUser, initialUser; + let updatedUser; let + initialUser; beforeEach(async () => { await user.post(`/tasks/${daily._id}/score/up`); @@ -346,7 +349,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); context('habits', () => { - let habit, minusHabit, plusHabit, neitherHabit; // eslint-disable-line no-unused-vars + let habit; let + neitherHabit; // eslint-disable-line no-unused-vars beforeEach(async () => { habit = await user.post('/tasks/user', { @@ -354,18 +358,6 @@ describe('POST /tasks/:id/score/:direction', () => { type: 'habit', }); - minusHabit = await user.post('/tasks/user', { - text: 'test min habit', - type: 'habit', - up: false, - }); - - plusHabit = await user.post('/tasks/user', { - text: 'test plus habit', - type: 'habit', - down: false, - }); - neitherHabit = await user.post('/tasks/user', { text: 'test neither habit', type: 'habit', @@ -380,40 +372,40 @@ describe('POST /tasks/:id/score/:direction', () => { it('increases user\'s mp when direction is up', async () => { await user.post(`/tasks/${habit._id}/score/up`); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.stats.mp).to.be.greaterThan(user.stats.mp); }); it('decreases user\'s mp when direction is down', async () => { await user.post(`/tasks/${habit._id}/score/down`); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.stats.mp).to.be.lessThan(user.stats.mp); }); it('increases user\'s exp when direction is up', async () => { await user.post(`/tasks/${habit._id}/score/up`); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.stats.exp).to.be.greaterThan(user.stats.exp); }); it('increases user\'s gold when direction is up', async () => { await user.post(`/tasks/${habit._id}/score/up`); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.stats.gp).to.be.greaterThan(user.stats.gp); }); // not supported anymore it('does not add score notes to task', async () => { - let scoreNotesString = 'test-notes'; + const scoreNotesString = 'test-notes'; await user.post(`/tasks/${habit._id}/score/up`, { scoreNotes: scoreNotesString, }); - let updatedTask = await user.get(`/tasks/${habit._id}`); + const updatedTask = await user.get(`/tasks/${habit._id}`); expect(updatedTask.history[0].scoreNotes).to.eql(undefined); }); @@ -437,7 +429,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); context('reward', () => { - let reward, updatedUser; + let reward; let + updatedUser; beforeEach(async () => { reward = await user.post('/tasks/user', { diff --git a/test/api/v3/integration/tasks/POST-tasks_move_taskId_to_position.test.js b/test/api/v3/integration/tasks/POST-tasks_move_taskId_to_position.test.js index 2b17cd3919..b14085fb75 100644 --- a/test/api/v3/integration/tasks/POST-tasks_move_taskId_to_position.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_move_taskId_to_position.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:taskId/move/to/:position', () => { let user; @@ -28,20 +28,20 @@ describe('POST /tasks/:taskId/move/to/:position', () => { }); it('can move task to new position', async () => { - let tasks = await user.post('/tasks/user', [ - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2'}, - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 3'}, - {type: 'habit', text: 'habit 4'}, - {type: 'todo', text: 'todo 1'}, - {type: 'habit', text: 'habit 5'}, + const tasks = await user.post('/tasks/user', [ + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2' }, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 3' }, + { type: 'habit', text: 'habit 4' }, + { type: 'todo', text: 'todo 1' }, + { type: 'habit', text: 'habit 5' }, ]); - let taskToMove = tasks[1]; + const taskToMove = tasks[1]; expect(taskToMove.text).to.equal('habit 2'); - let newOrder = await user.post(`/tasks/${tasks[1]._id}/move/to/3`); + const newOrder = await user.post(`/tasks/${tasks[1]._id}/move/to/3`); await user.sync(); expect(newOrder[3]).to.equal(taskToMove._id); @@ -50,25 +50,25 @@ describe('POST /tasks/:taskId/move/to/:position', () => { }); it('can move task to new position using alias', async () => { - let tasks = await user.post('/tasks/user', [ - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2', alias: 'move'}, - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 3'}, - {type: 'habit', text: 'habit 4'}, - {type: 'todo', text: 'todo 1'}, - {type: 'habit', text: 'habit 5'}, + const tasks = await user.post('/tasks/user', [ + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2', alias: 'move' }, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 3' }, + { type: 'habit', text: 'habit 4' }, + { type: 'todo', text: 'todo 1' }, + { type: 'habit', text: 'habit 5' }, ]); - let taskToMove = tasks[1]; + const taskToMove = tasks[1]; expect(taskToMove.text).to.equal('habit 2'); - let newOrder = await user.post(`/tasks/${taskToMove.alias}/move/to/3`); + const newOrder = await user.post(`/tasks/${taskToMove.alias}/move/to/3`); expect(newOrder[3]).to.equal(taskToMove._id); expect(newOrder.length).to.equal(5); }); it('can\'t move completed todo', async () => { - let task = await user.post('/tasks/user', {type: 'todo', text: 'todo 1'}); + const task = await user.post('/tasks/user', { type: 'todo', text: 'todo 1' }); await user.post(`/tasks/${task._id}/score/up`); await expect(user.post(`/tasks/${task._id}/move/to/1`)).to.eventually.be.rejected.and.eql({ @@ -79,19 +79,19 @@ describe('POST /tasks/:taskId/move/to/:position', () => { }); it('can push to bottom', async () => { - let tasks = await user.post('/tasks/user', [ - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2'}, - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 3'}, - {type: 'habit', text: 'habit 4'}, - {type: 'todo', text: 'todo 1'}, - {type: 'habit', text: 'habit 5'}, + const tasks = await user.post('/tasks/user', [ + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2' }, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 3' }, + { type: 'habit', text: 'habit 4' }, + { type: 'todo', text: 'todo 1' }, + { type: 'habit', text: 'habit 5' }, ]); - let taskToMove = tasks[1]; + const taskToMove = tasks[1]; expect(taskToMove.text).to.equal('habit 2'); - let newOrder = await user.post(`/tasks/${tasks[1]._id}/move/to/-1`); + const newOrder = await user.post(`/tasks/${tasks[1]._id}/move/to/-1`); expect(newOrder[4]).to.equal(taskToMove._id); expect(newOrder.length).to.equal(5); }); diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js index c1dfd6a522..86715bd6dc 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js @@ -9,7 +9,7 @@ describe('POST /tasks/unlink-all/:challengeId', () => { let user; let guild; let challenge; - let tasksToTest = { + const tasksToTest = { habit: { text: 'test habit', type: 'habit', diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js index aefc379865..e8ee1f2727 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js @@ -1,16 +1,16 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/unlink-one/:taskId', () => { let user; let guild; let challenge; - let tasksToTest = { + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -70,7 +70,7 @@ describe('POST /tasks/unlink-one/:taskId', () => { }); it('fails on task unlinked to challenge', async () => { - let daily = await user.post('/tasks/user', tasksToTest.daily); + const daily = await user.post('/tasks/user', tasksToTest.daily); await expect(user.post(`/tasks/unlink-one/${daily._id}?keep=keep`)) .to.eventually.be.rejected.and.eql({ code: 400, @@ -81,7 +81,7 @@ describe('POST /tasks/unlink-one/:taskId', () => { it('fails on unbroken challenge', async () => { await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); - let [daily] = await user.get('/tasks/user'); + const [daily] = await user.get('/tasks/user'); await expect(user.post(`/tasks/unlink-one/${daily._id}?keep=keep`)) .to.eventually.be.rejected.and.eql({ code: 400, @@ -101,11 +101,11 @@ describe('POST /tasks/unlink-one/:taskId', () => { it('unlinks a task from a challenge and deletes it on keep=remove', async () => { await user.post(`/tasks/challenge/${challenge._id}`, tasksToTest.daily); - let [, daily] = await user.get('/tasks/user'); + const [, daily] = await user.get('/tasks/user'); await user.del(`/challenges/${challenge._id}`); await user.post(`/tasks/unlink-one/${daily._id}?keep=remove`); const tasks = await user.get('/tasks/user'); // Only the default task should remain expect(tasks.length).to.eql(1); }); -}); \ No newline at end of file +}); diff --git a/test/api/v3/integration/tasks/POST-tasks_user.test.js b/test/api/v3/integration/tasks/POST-tasks_user.test.js index 22297da8ff..af08c21961 100644 --- a/test/api/v3/integration/tasks/POST-tasks_user.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_user.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, sleep, translate as t, server, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/user', () => { let user; @@ -36,8 +36,8 @@ describe('POST /tasks/user', () => { it('returns an error if one object inside an array is invalid', async () => { await expect(user.post('/tasks/user', [ - {type: 'habitF'}, - {type: 'habit'}, + { type: 'habitF' }, + { type: 'habit' }, ])).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', @@ -56,7 +56,7 @@ describe('POST /tasks/user', () => { }); it('does not update user.tasksOrder.{taskType} when the task is not saved because invalid', async () => { - let originalHabitsOrder = (await user.get('/user')).tasksOrder.habits; + const originalHabitsOrder = (await user.get('/user')).tasksOrder.habits; await expect(user.post('/tasks/user', { type: 'habit', })).to.eventually.be.rejected.and.eql({ @@ -65,43 +65,43 @@ describe('POST /tasks/user', () => { message: 'habit validation failed', }); - let updatedHabitsOrder = (await user.get('/user')).tasksOrder.habits; + const updatedHabitsOrder = (await user.get('/user')).tasksOrder.habits; expect(updatedHabitsOrder).to.eql(originalHabitsOrder); }); it('does not update user.tasksOrder.{taskType} when a task inside an array is not saved because invalid', async () => { - let originalHabitsOrder = (await user.get('/user')).tasksOrder.habits; + const originalHabitsOrder = (await user.get('/user')).tasksOrder.habits; await expect(user.post('/tasks/user', [ - {type: 'habit'}, // Missing text - {type: 'habit', text: 'valid'}, // Valid + { type: 'habit' }, // Missing text + { type: 'habit', text: 'valid' }, // Valid ])).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: 'habit validation failed', }); - let updatedHabitsOrder = (await user.get('/user')).tasksOrder.habits; + const updatedHabitsOrder = (await user.get('/user')).tasksOrder.habits; expect(updatedHabitsOrder).to.eql(originalHabitsOrder); }); it('does not save any task sent in an array when 1 is invalid', async () => { - let originalTasks = await user.get('/tasks/user'); + const originalTasks = await user.get('/tasks/user'); await expect(user.post('/tasks/user', [ - {type: 'habit'}, // Missing text - {type: 'habit', text: 'valid'}, // Valid + { type: 'habit' }, // Missing text + { type: 'habit', text: 'valid' }, // Valid ])).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: 'habit validation failed', }).then(async () => { - let updatedTasks = await user.get('/tasks/user'); + const updatedTasks = await user.get('/tasks/user'); expect(updatedTasks).to.eql(originalTasks); }); }); it('automatically sets "task.userId" to user\'s uuid', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -112,7 +112,7 @@ describe('POST /tasks/user', () => { it(`ignores setting userId, history, createdAt, updatedAt, challenge, completed, dateCompleted fields`, async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', userId: 123, @@ -137,7 +137,7 @@ describe('POST /tasks/user', () => { }); it('ignores invalid fields', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', notValid: true, @@ -218,7 +218,7 @@ describe('POST /tasks/user', () => { }); it('sends task activity webhooks', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -229,20 +229,20 @@ describe('POST /tasks/user', () => { }, }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.task).to.eql(task); }); it('sends a task activity webhook for each task', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -253,7 +253,7 @@ describe('POST /tasks/user', () => { }, }); - let tasks = await user.post('/tasks/user', [{ + const tasks = await user.post('/tasks/user', [{ text: 'test habit', type: 'habit', }, { @@ -263,7 +263,7 @@ describe('POST /tasks/user', () => { await sleep(); - let taskBodies = [ + const taskBodies = [ server.getWebhookData(uuid), server.getWebhookData(uuid), ]; @@ -275,13 +275,13 @@ describe('POST /tasks/user', () => { context('all types', () => { it('can create reminders', async () => { - let id1 = generateUUID(); + const id1 = generateUUID(); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', reminders: [ - {id: id1, startDate: new Date(), time: new Date()}, + { id: id1, startDate: new Date(), time: new Date() }, ], }); @@ -294,7 +294,7 @@ describe('POST /tasks/user', () => { }); it('can create a task with a alias', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', alias: 'a_alias012', @@ -305,7 +305,7 @@ describe('POST /tasks/user', () => { // This is a special case for iOS requests it('will round a priority (difficulty)', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', priority: 0.10000000000005, @@ -317,7 +317,7 @@ describe('POST /tasks/user', () => { context('habits', () => { it('creates a habit', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', up: false, @@ -334,20 +334,20 @@ describe('POST /tasks/user', () => { }); it('updates user.tasksOrder.habits when a new habit is created', async () => { - let originalHabitsOrderLen = (await user.get('/user')).tasksOrder.habits.length; - let task = await user.post('/tasks/user', { + const originalHabitsOrderLen = (await user.get('/user')).tasksOrder.habits.length; + const task = await user.post('/tasks/user', { type: 'habit', text: 'an habit', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.habits[0]).to.eql(task._id); expect(updatedUser.tasksOrder.habits.length).to.eql(originalHabitsOrderLen + 1); }); it('updates user.tasksOrder.habits when multiple habits are created', async () => { - let originalHabitsOrderLen = (await user.get('/user')).tasksOrder.habits.length; - let [task, task2] = await user.post('/tasks/user', [{ + const originalHabitsOrderLen = (await user.get('/user')).tasksOrder.habits.length; + const [task, task2] = await user.post('/tasks/user', [{ type: 'habit', text: 'an habit', }, { @@ -355,14 +355,14 @@ describe('POST /tasks/user', () => { text: 'another habit', }]); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.habits[0]).to.eql(task2._id); expect(updatedUser.tasksOrder.habits[1]).to.eql(task._id); expect(updatedUser.tasksOrder.habits.length).to.eql(originalHabitsOrderLen + 2); }); it('creates multiple habits', async () => { - let [task, task2] = await user.post('/tasks/user', [{ + const [task, task2] = await user.post('/tasks/user', [{ text: 'test habit', type: 'habit', up: false, @@ -392,7 +392,7 @@ describe('POST /tasks/user', () => { }); it('defaults to setting up and down to true', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', notes: 1976, @@ -403,11 +403,11 @@ describe('POST /tasks/user', () => { }); it('cannot create checklists', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', checklist: [ - {_id: 123, completed: false, text: 'checklist'}, + { _id: 123, completed: false, text: 'checklist' }, ], }); @@ -417,7 +417,7 @@ describe('POST /tasks/user', () => { context('todos', () => { it('creates a todo', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test todo', type: 'todo', notes: 1976, @@ -430,7 +430,7 @@ describe('POST /tasks/user', () => { }); it('creates multiple todos', async () => { - let [task, task2] = await user.post('/tasks/user', [{ + const [task, task2] = await user.post('/tasks/user', [{ text: 'test todo', type: 'todo', notes: 1976, @@ -452,20 +452,20 @@ describe('POST /tasks/user', () => { }); it('updates user.tasksOrder.todos when a new todo is created', async () => { - let originalTodosOrderLen = (await user.get('/user')).tasksOrder.todos.length; - let task = await user.post('/tasks/user', { + const originalTodosOrderLen = (await user.get('/user')).tasksOrder.todos.length; + const task = await user.post('/tasks/user', { type: 'todo', text: 'a todo', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.todos[0]).to.eql(task._id); expect(updatedUser.tasksOrder.todos.length).to.eql(originalTodosOrderLen + 1); }); it('updates user.tasksOrder.todos when multiple todos are created', async () => { - let originalTodosOrderLen = (await user.get('/user')).tasksOrder.todos.length; - let [task, task2] = await user.post('/tasks/user', [{ + const originalTodosOrderLen = (await user.get('/user')).tasksOrder.todos.length; + const [task, task2] = await user.post('/tasks/user', [{ type: 'todo', text: 'a todo', }, { @@ -473,18 +473,18 @@ describe('POST /tasks/user', () => { text: 'another todo', }]); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.todos[0]).to.eql(task2._id); expect(updatedUser.tasksOrder.todos[1]).to.eql(task._id); expect(updatedUser.tasksOrder.todos.length).to.eql(originalTodosOrderLen + 2); }); it('can create checklists', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test todo', type: 'todo', checklist: [ - {completed: false, text: 'checklist'}, + { completed: false, text: 'checklist' }, ], }); @@ -499,9 +499,9 @@ describe('POST /tasks/user', () => { context('dailys', () => { it('creates a daily', async () => { - let now = new Date(); + const now = new Date(); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', notes: 1976, @@ -526,7 +526,7 @@ describe('POST /tasks/user', () => { }); it('creates multiple dailys', async () => { - let [task, task2] = await user.post('/tasks/user', [{ + const [task, task2] = await user.post('/tasks/user', [{ text: 'test daily', type: 'daily', notes: 1976, @@ -548,20 +548,20 @@ describe('POST /tasks/user', () => { }); it('updates user.tasksOrder.dailys when a new daily is created', async () => { - let originalDailysOrderLen = (await user.get('/user')).tasksOrder.dailys.length; - let task = await user.post('/tasks/user', { + const originalDailysOrderLen = (await user.get('/user')).tasksOrder.dailys.length; + const task = await user.post('/tasks/user', { type: 'daily', text: 'a daily', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.dailys[0]).to.eql(task._id); expect(updatedUser.tasksOrder.dailys.length).to.eql(originalDailysOrderLen + 1); }); it('updates user.tasksOrder.dailys when multiple dailys are created', async () => { - let originalDailysOrderLen = (await user.get('/user')).tasksOrder.dailys.length; - let [task, task2] = await user.post('/tasks/user', [{ + const originalDailysOrderLen = (await user.get('/user')).tasksOrder.dailys.length; + const [task, task2] = await user.post('/tasks/user', [{ type: 'daily', text: 'a daily', }, { @@ -569,14 +569,14 @@ describe('POST /tasks/user', () => { text: 'another daily', }]); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.dailys[0]).to.eql(task2._id); expect(updatedUser.tasksOrder.dailys[1]).to.eql(task._id); expect(updatedUser.tasksOrder.dailys.length).to.eql(originalDailysOrderLen + 2); }); it('defaults to a weekly frequency, with every day set', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', }); @@ -595,7 +595,7 @@ describe('POST /tasks/user', () => { }); it('allows repeat field to be configured', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', repeat: { @@ -617,9 +617,9 @@ describe('POST /tasks/user', () => { }); it('defaults startDate to today', async () => { - let today = (new Date()).getDay(); + const today = (new Date()).getDay(); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', }); @@ -677,11 +677,11 @@ describe('POST /tasks/user', () => { it('can create checklists', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', checklist: [ - {completed: false, text: 'checklist'}, + { completed: false, text: 'checklist' }, ], }); @@ -696,7 +696,7 @@ describe('POST /tasks/user', () => { context('rewards', () => { it('creates a reward', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', notes: 1976, @@ -711,7 +711,7 @@ describe('POST /tasks/user', () => { }); it('creates multiple rewards', async () => { - let [task, task2] = await user.post('/tasks/user', [{ + const [task, task2] = await user.post('/tasks/user', [{ text: 'test reward', type: 'reward', notes: 1976, @@ -737,20 +737,20 @@ describe('POST /tasks/user', () => { }); it('updates user.tasksOrder.rewards when a new reward is created', async () => { - let originalRewardsOrderLen = (await user.get('/user')).tasksOrder.rewards.length; - let task = await user.post('/tasks/user', { + const originalRewardsOrderLen = (await user.get('/user')).tasksOrder.rewards.length; + const task = await user.post('/tasks/user', { type: 'reward', text: 'a reward', }); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.rewards[0]).to.eql(task._id); expect(updatedUser.tasksOrder.rewards.length).to.eql(originalRewardsOrderLen + 1); }); it('updates user.tasksOrder.dreward when multiple rewards are created', async () => { - let originalRewardsOrderLen = (await user.get('/user')).tasksOrder.rewards.length; - let [task, task2] = await user.post('/tasks/user', [{ + const originalRewardsOrderLen = (await user.get('/user')).tasksOrder.rewards.length; + const [task, task2] = await user.post('/tasks/user', [{ type: 'reward', text: 'a reward', }, { @@ -758,14 +758,14 @@ describe('POST /tasks/user', () => { text: 'another reward', }]); - let updatedUser = await user.get('/user'); + const updatedUser = await user.get('/user'); expect(updatedUser.tasksOrder.rewards[0]).to.eql(task2._id); expect(updatedUser.tasksOrder.rewards[1]).to.eql(task._id); expect(updatedUser.tasksOrder.rewards.length).to.eql(originalRewardsOrderLen + 2); }); it('defaults to a 0 value', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', }); @@ -774,7 +774,7 @@ describe('POST /tasks/user', () => { }); it('requires value to be coerced into a number', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', value: '10', @@ -784,11 +784,11 @@ describe('POST /tasks/user', () => { }); it('cannot create checklists', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', checklist: [ - {_id: 123, completed: false, text: 'checklist'}, + { _id: 123, completed: false, text: 'checklist' }, ], }); diff --git a/test/api/v3/integration/tasks/PUT-tasks_id.test.js b/test/api/v3/integration/tasks/PUT-tasks_id.test.js index ad1555237c..1ad083e50e 100644 --- a/test/api/v3/integration/tasks/PUT-tasks_id.test.js +++ b/test/api/v3/integration/tasks/PUT-tasks_id.test.js @@ -1,4 +1,5 @@ import moment from 'moment'; +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, @@ -6,7 +7,6 @@ import { generateChallenge, server, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT /tasks/:id', () => { let user; @@ -28,7 +28,7 @@ describe('PUT /tasks/:id', () => { it(`ignores setting _id, type, userId, history, createdAt, updatedAt, challenge, completed, streak, dateCompleted fields`, async () => { - let savedTask = await user.put(`/tasks/${task._id}`, { + const savedTask = await user.put(`/tasks/${task._id}`, { _id: 123, type: 'daily', userId: 123, @@ -54,7 +54,7 @@ describe('PUT /tasks/:id', () => { }); it('ignores invalid fields', async () => { - let savedTask = await user.put(`/tasks/${task._id}`, { + const savedTask = await user.put(`/tasks/${task._id}`, { notValid: true, }); @@ -63,18 +63,18 @@ describe('PUT /tasks/:id', () => { it(`only allows setting streak, alias, reminders, checklist, notes, attribute, tags fields for challenge tasks owned by a user`, async () => { - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); - let challengeTask = await user.post(`/tasks/challenge/${challenge._id}`, { + const challengeTask = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily in challenge', reminders: [ - {time: new Date(), startDate: new Date()}, + { time: new Date(), startDate: new Date() }, ], checklist: [ - {text: 123, completed: false}, + { text: 123, completed: false }, ], collapseChecklist: false, }); @@ -83,11 +83,11 @@ describe('PUT /tasks/:id', () => { await user.sync(); // Pick challenge task - let challengeUserTaskId = user.tasksOrder.dailys[user.tasksOrder.dailys.length - 1]; + const challengeUserTaskId = user.tasksOrder.dailys[user.tasksOrder.dailys.length - 1]; - let challengeUserTask = await user.get(`/tasks/${challengeUserTaskId}`); + const challengeUserTask = await user.get(`/tasks/${challengeUserTaskId}`); - let savedChallengeUserTask = await user.put(`/tasks/${challengeUserTaskId}`, { + const savedChallengeUserTask = await user.put(`/tasks/${challengeUserTaskId}`, { _id: 123, type: 'daily', userId: 123, @@ -107,12 +107,12 @@ describe('PUT /tasks/:id', () => { text: 'new text', dateCompleted: 'never', reminders: [ - {time: new Date(), startDate: new Date()}, - {time: new Date(), startDate: new Date()}, + { time: new Date(), startDate: new Date() }, + { time: new Date(), startDate: new Date() }, ], checklist: [ - {text: 123, completed: false}, - {text: 456, completed: true}, + { text: 123, completed: false }, + { text: 456, completed: true }, ], collapseChecklist: true, notes: 'new notes', @@ -121,7 +121,7 @@ describe('PUT /tasks/:id', () => { }); // original task is not touched - let updatedChallengeTask = await user.get(`/tasks/${challengeTask._id}`); + const updatedChallengeTask = await user.get(`/tasks/${challengeTask._id}`); expect(updatedChallengeTask).to.eql(challengeTask); // ignored @@ -134,7 +134,8 @@ describe('PUT /tasks/:id', () => { expect(savedChallengeUserTask.text).to.equal(challengeUserTask.text); expect(savedChallengeUserTask.history).to.eql(challengeUserTask.history); expect(savedChallengeUserTask.createdAt).to.equal(challengeUserTask.createdAt); - expect(new Date(savedChallengeUserTask.updatedAt)).to.be.greaterThan(new Date(challengeUserTask.updatedAt)); + expect(new Date(savedChallengeUserTask.updatedAt)) + .to.be.greaterThan(new Date(challengeUserTask.updatedAt)); expect(savedChallengeUserTask.challenge).to.eql(challengeUserTask.challenge); expect(savedChallengeUserTask.completed).to.equal(challengeUserTask.completed); expect(savedChallengeUserTask.dateCompleted).to.equal(challengeUserTask.dateCompleted); @@ -162,7 +163,7 @@ describe('PUT /tasks/:id', () => { }); it('sends task activity webhooks if task is user owned', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -174,31 +175,31 @@ describe('PUT /tasks/:id', () => { }, }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); - let updatedTask = await user.put(`/tasks/${task.id}`, { + const updatedTask = await user.put(`/tasks/${task.id}`, { text: 'updated text', }); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.type).to.eql('updated'); expect(body.task).to.eql(updatedTask); }); it('does not send task activity webhooks if task is not user owned', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.update({ balance: 10, }); - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post('/user/webhook', { @@ -211,7 +212,7 @@ describe('PUT /tasks/:id', () => { }, }); - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit', type: 'habit', }); @@ -222,7 +223,7 @@ describe('PUT /tasks/:id', () => { await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body).to.not.exist; }); @@ -242,17 +243,17 @@ describe('PUT /tasks/:id', () => { it('can update reminders (replace them)', async () => { await user.put(`/tasks/${daily._id}`, { reminders: [ - {time: new Date(), startDate: new Date()}, + { time: new Date(), startDate: new Date() }, ], }); - let id1 = generateUUID(); - let id2 = generateUUID(); + const id1 = generateUUID(); + const id2 = generateUUID(); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { reminders: [ - {id: id1, time: new Date(), startDate: new Date()}, - {id: id2, time: new Date(), startDate: new Date()}, + { id: id1, time: new Date(), startDate: new Date() }, + { id: id2, time: new Date(), startDate: new Date() }, ], }); @@ -262,7 +263,7 @@ describe('PUT /tasks/:id', () => { }); it('can set a alias if no other task has that alias', async () => { - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { alias: 'alias', }); @@ -294,7 +295,7 @@ describe('PUT /tasks/:id', () => { text: 'saved', }); - let fetchedDaily = await user.get(`/tasks/${daily._id}`); + const fetchedDaily = await user.get(`/tasks/${daily._id}`); expect(fetchedDaily.text).to.eql('saved'); }); @@ -322,7 +323,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a habit', async () => { - let savedHabit = await user.put(`/tasks/${habit._id}`, { + const savedHabit = await user.put(`/tasks/${habit._id}`, { text: 'some new text', up: false, down: false, @@ -348,7 +349,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a todo', async () => { - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { text: 'some new text', notes: 'some new notes', }); @@ -360,14 +361,14 @@ describe('PUT /tasks/:id', () => { it('can update checklists (replace it)', async () => { await user.put(`/tasks/${todo._id}`, { checklist: [ - {text: 123, completed: false}, - {text: 456, completed: true}, + { text: 123, completed: false }, + { text: 456, completed: true }, ], }); - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { checklist: [ - {text: 789, completed: false}, + { text: 789, completed: false }, ], }); @@ -377,12 +378,12 @@ describe('PUT /tasks/:id', () => { }); it('can update tags (replace them)', async () => { - let finalUUID = generateUUID(); + const finalUUID = generateUUID(); await user.put(`/tasks/${todo._id}`, { tags: [generateUUID(), generateUUID()], }); - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { tags: [finalUUID], }); @@ -403,7 +404,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a daily', async () => { - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { text: 'some new text', notes: 'some new notes', frequency: 'daily', @@ -424,14 +425,14 @@ describe('PUT /tasks/:id', () => { it('can update checklists (replace it)', async () => { await user.put(`/tasks/${daily._id}`, { checklist: [ - {text: 123, completed: false}, - {text: 456, completed: true}, + { text: 123, completed: false }, + { text: 456, completed: true }, ], }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { checklist: [ - {text: 789, completed: false}, + { text: 789, completed: false }, ], }); @@ -441,12 +442,12 @@ describe('PUT /tasks/:id', () => { }); it('can update tags (replace them)', async () => { - let finalUUID = generateUUID(); + const finalUUID = generateUUID(); await user.put(`/tasks/${daily._id}`, { tags: [generateUUID(), generateUUID()], }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { tags: [finalUUID], }); @@ -459,7 +460,7 @@ describe('PUT /tasks/:id', () => { frequency: 'daily', }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { repeat: { m: false, su: false, @@ -482,7 +483,7 @@ describe('PUT /tasks/:id', () => { frequency: 'weekly', }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { everyX: 5, }); @@ -490,7 +491,7 @@ describe('PUT /tasks/:id', () => { }); it('defaults startDate to today if none date object is passed in', async () => { - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { frequency: 'weekly', }); @@ -511,7 +512,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a reward', async () => { - let savedReward = await user.put(`/tasks/${reward._id}`, { + const savedReward = await user.put(`/tasks/${reward._id}`, { text: 'some new text', notes: 'some new notes', value: 10, @@ -523,7 +524,7 @@ describe('PUT /tasks/:id', () => { }); it('requires value to be coerced into a number', async () => { - let savedReward = await user.put(`/tasks/${reward._id}`, { + const savedReward = await user.put(`/tasks/${reward._id}`, { value: '100', }); diff --git a/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js b/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js index 5cdbce319b..02c66a0139 100644 --- a/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /tasks/:taskId/checklist/:itemId', () => { let user; @@ -27,7 +27,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post(`/tasks/challenge/${challenge._id}`, { + const createdTask = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'daily with checklist', }); @@ -40,17 +40,17 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('returns error when user is not a member of the challenge', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, { + const savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false, }); - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`)) .to.eventually.be.rejected.and.eql({ @@ -61,12 +61,12 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('deletes a checklist item from a daily', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false}); + let savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false }); await user.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`); savedTask = await user.get(`/tasks/${task._id}`); @@ -75,12 +75,12 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('deletes a checklist item from a todo', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'todo', text: 'Todo with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false}); + let savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false }); await user.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`); savedTask = await user.get(`/tasks/${task._id}`); @@ -89,7 +89,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with habits', async () => { - let habit = await user.post(`/tasks/challenge/${challenge._id}`, { + const habit = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'habit', text: 'habit with checklist', }); @@ -102,7 +102,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with rewards', async () => { - let reward = await user.post(`/tasks/challenge/${challenge._id}`, { + const reward = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'reward', text: 'reward with checklist', }); diff --git a/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js b/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js index 44478e67b6..14245c3e54 100644 --- a/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, @@ -5,7 +6,6 @@ import { sleep, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /tasks/:id', () => { let user; @@ -36,7 +36,7 @@ describe('DELETE /tasks/:id', () => { }); it('returns error when user is not leader of the challenge', async () => { - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.del(`/tasks/${task._id}`)).to.eventually.be.rejected.and.eql({ code: 401, @@ -71,8 +71,9 @@ describe('DELETE /tasks/:id', () => { type: 'habit', }); - let anotherUserWithNewChallengeTask = await anotherUser.get('/user'); - anotherUsersNewChallengeTaskID = anotherUserWithNewChallengeTask.tasksOrder.habits[0]; + const anotherUserWithNewChallengeTask = await anotherUser.get('/user'); + anotherUsersNewChallengeTaskID = anotherUserWithNewChallengeTask // eslint-disable-line prefer-destructuring, max-len + .tasksOrder.habits[0]; }); it('returns error when user attempts to delete an active challenge task', async () => { @@ -96,7 +97,8 @@ describe('DELETE /tasks/:id', () => { }); }); - // TODO for some reason this test fails on TravisCI, review after mongodb indexes have been added + // TODO for some reason this test fails on TravisCI, + // review after mongodb indexes have been added xit('allows user to delete challenge task after challenge task is broken', async () => { await expect(user.del(`/tasks/${newChallengeTask._id}`)); diff --git a/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js b/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js index 8947db4929..9765ec05a3 100644 --- a/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js +++ b/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js @@ -1,20 +1,20 @@ +import { v4 as generateUUID } from 'uuid'; +import { each } from 'lodash'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { each } from 'lodash'; describe('GET /tasks/challenge/:challengeId', () => { let user; let guild; let challenge; let task; - let tasks = []; + const tasks = []; let challengeWithTask; - let tasksToTest = { + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -46,7 +46,7 @@ describe('GET /tasks/challenge/:challengeId', () => { }); it('returns error when challenge is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/tasks/challenge/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -64,17 +64,17 @@ describe('GET /tasks/challenge/:challengeId', () => { }); it('gets challenge tasks', async () => { - let getTask = await user.get(`/tasks/challenge/${challengeWithTask._id}`); + const getTask = await user.get(`/tasks/challenge/${challengeWithTask._id}`); expect(getTask).to.eql(tasks); }); it('gets challenge tasks filtered by type', async () => { - let challengeTasks = await user.get(`/tasks/challenge/${challengeWithTask._id}?type=${task.type}s`); + const challengeTasks = await user.get(`/tasks/challenge/${challengeWithTask._id}?type=${task.type}s`); expect(challengeTasks).to.eql([task]); }); it('cannot get a task owned by someone else', async () => { - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/tasks/challenge/${challengeWithTask._id}`)).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js index fcf4323f8f..a8e249d4cc 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:taskId/checklist/', () => { let user; @@ -29,12 +29,12 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('returns error when user is not a member of the challenge', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily with checklist', }); - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', @@ -49,12 +49,12 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('adds a checklist item to a daily', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, { + const savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', ignored: false, _id: 123, @@ -69,12 +69,12 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('adds a checklist item to a todo', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'todo', text: 'Todo with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, { + const savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', ignored: false, _id: 123, @@ -89,7 +89,7 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to habits', async () => { - let habit = await user.post(`/tasks/challenge/${challenge._id}`, { + const habit = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'habit', text: 'habit with checklist', }); @@ -104,7 +104,7 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to rewards', async () => { - let reward = await user.post(`/tasks/challenge/${challenge._id}`, { + const reward = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'reward', text: 'reward with checklist', }); diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js index 54c99ac964..f458d97e46 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js @@ -1,11 +1,11 @@ +import { v4 as generateUUID } from 'uuid'; +import { find } from 'lodash'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { find } from 'lodash'; describe('POST /tasks/challenge/:challengeId', () => { let user; @@ -17,14 +17,14 @@ describe('POST /tasks/challenge/:challengeId', () => { } beforeEach(async () => { - user = await generateUser({balance: 1}); + user = await generateUser({ balance: 1 }); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); }); it('returns error when challenge is not found', async () => { - let fakeChallengeId = generateUUID(); + const fakeChallengeId = generateUUID(); await expect(user.post(`/tasks/challenge/${fakeChallengeId}`, { text: 'test habit', @@ -41,7 +41,7 @@ describe('POST /tasks/challenge/:challengeId', () => { it('allows leader to add tasks to a challenge when not a member', async () => { await user.post(`/challenges/${challenge._id}/leave`); - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit', type: 'habit', up: false, @@ -49,14 +49,14 @@ describe('POST /tasks/challenge/:challengeId', () => { notes: 1976, }); - let {tasksOrder} = await user.get(`/challenges/${challenge._id}`); + const { tasksOrder } = await user.get(`/challenges/${challenge._id}`); expect(tasksOrder.habits).to.include(task.id); }); it('allows non-leader admin to add tasks to a challenge when not a member', async () => { - const admin = await generateUser({'contributor.admin': true}); - let task = await admin.post(`/tasks/challenge/${challenge._id}`, { + const admin = await generateUser({ 'contributor.admin': true }); + const task = await admin.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit from admin', type: 'habit', up: false, @@ -64,7 +64,7 @@ describe('POST /tasks/challenge/:challengeId', () => { notes: 1976, }); - let {tasksOrder} = await user.get(`/challenges/${challenge._id}`); + const { tasksOrder } = await user.get(`/challenges/${challenge._id}`); expect(tasksOrder.habits).to.include(task.id); }); @@ -82,7 +82,7 @@ describe('POST /tasks/challenge/:challengeId', () => { }); it('returns error when non leader tries to edit challenge', async () => { - let userThatIsNotLeaderOfChallenge = await generateUser({ + const userThatIsNotLeaderOfChallenge = await generateUser({ challenges: [challenge._id], }); @@ -100,17 +100,17 @@ describe('POST /tasks/challenge/:challengeId', () => { }); it('creates a habit', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit', type: 'habit', up: false, down: true, notes: 1976, }); - let challengeWithTask = await user.get(`/challenges/${challenge._id}`); + const challengeWithTask = await user.get(`/challenges/${challenge._id}`); - let memberTasks = await user.get('/tasks/user'); - let userChallengeTask = find(memberTasks, findUserChallengeTask); + const memberTasks = await user.get('/tasks/user'); + const userChallengeTask = find(memberTasks, findUserChallengeTask); expect(challengeWithTask.tasksOrder.habits.indexOf(task._id)).to.be.above(-1); expect(task.challenge.id).to.equal(challenge._id); @@ -124,15 +124,15 @@ describe('POST /tasks/challenge/:challengeId', () => { }); it('creates a todo', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test todo', type: 'todo', notes: 1976, }); - let challengeWithTask = await user.get(`/challenges/${challenge._id}`); + const challengeWithTask = await user.get(`/challenges/${challenge._id}`); - let memberTasks = await user.get('/tasks/user'); - let userChallengeTask = find(memberTasks, findUserChallengeTask); + const memberTasks = await user.get('/tasks/user'); + const userChallengeTask = find(memberTasks, findUserChallengeTask); expect(challengeWithTask.tasksOrder.todos.indexOf(task._id)).to.be.above(-1); expect(task.challenge.id).to.equal(challenge._id); @@ -144,8 +144,8 @@ describe('POST /tasks/challenge/:challengeId', () => { }); it('creates a daily', async () => { - let now = new Date(); - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const now = new Date(); + const task = await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test daily', type: 'daily', notes: 1976, @@ -153,10 +153,10 @@ describe('POST /tasks/challenge/:challengeId', () => { everyX: 5, startDate: now, }); - let challengeWithTask = await user.get(`/challenges/${challenge._id}`); + const challengeWithTask = await user.get(`/challenges/${challenge._id}`); - let memberTasks = await user.get('/tasks/user'); - let userChallengeTask = find(memberTasks, findUserChallengeTask); + const memberTasks = await user.get('/tasks/user'); + const userChallengeTask = find(memberTasks, findUserChallengeTask); expect(challengeWithTask.tasksOrder.dailys.indexOf(task._id)).to.be.above(-1); expect(task.challenge.id).to.equal(challenge._id); diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js index d65b931056..59b37f2b50 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js @@ -1,10 +1,10 @@ +import { find } from 'lodash'; import { generateUser, generateGroup, generateChallenge, sleep, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /tasks/:id/score/:direction', () => { let user; @@ -29,16 +29,16 @@ describe('POST /tasks/:id/score/:direction', () => { type: 'habit', }); await sleep(1); - let updatedUser = await user.get('/user'); - usersChallengeTaskId = updatedUser.tasksOrder.habits[0]; + const updatedUser = await user.get('/user'); + usersChallengeTaskId = updatedUser.tasksOrder.habits[0]; // eslint-disable-line prefer-destructuring, max-len }); it('scores and adds history', async () => { await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: habit._id}); - previousTaskHistory = task.history[0]; + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: habit._id }); + previousTaskHistory = task.history[0]; // eslint-disable-line prefer-destructuring, max-len expect(task.value).to.equal(1); expect(task.history).to.have.lengthOf(1); @@ -47,8 +47,8 @@ describe('POST /tasks/:id/score/:direction', () => { it('should update the history', async () => { await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: habit._id}); + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: habit._id }); expect(task.history).to.have.lengthOf(1); expect(task.history[0].date).to.not.equal(previousTaskHistory.date); @@ -67,23 +67,23 @@ describe('POST /tasks/:id/score/:direction', () => { type: 'daily', }); await sleep(1); - let updatedUser = await user.get('/user'); - usersChallengeTaskId = updatedUser.tasksOrder.dailys[0]; + const updatedUser = await user.get('/user'); + usersChallengeTaskId = updatedUser.tasksOrder.dailys[0]; // eslint-disable-line prefer-destructuring, max-len }); it('it scores and adds history', async () => { await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: daily._id}); - previousTaskHistory = task.history[0]; + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: daily._id }); + previousTaskHistory = task.history[0]; // eslint-disable-line prefer-destructuring expect(task.history).to.have.lengthOf(1); expect(task.value).to.equal(1); }); it('should update the history', async () => { - let newCron = new Date(2015, 11, 20); + const newCron = new Date(2015, 11, 20); await user.post('/debug/set-cron', { lastCron: newCron, @@ -92,8 +92,8 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post('/cron'); await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: daily._id}); + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: daily._id }); expect(task.history).to.have.lengthOf(1); expect(task.history[0].date).to.not.equal(previousTaskHistory.date); @@ -111,15 +111,15 @@ describe('POST /tasks/:id/score/:direction', () => { type: 'todo', }); await sleep(1); - let updatedUser = await user.get('/user'); - usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; + const updatedUser = await user.get('/user'); + usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; // eslint-disable-line prefer-destructuring, max-len }); it('scores but does not add history', async () => { await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: todo._id}); + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: todo._id }); expect(task.history).to.not.exist; expect(task.value).to.equal(1); @@ -136,15 +136,15 @@ describe('POST /tasks/:id/score/:direction', () => { type: 'reward', }); await sleep(1); - let updatedUser = await user.get('/user'); - usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; + const updatedUser = await user.get('/user'); + usersChallengeTaskId = updatedUser.tasksOrder.todos[0]; // eslint-disable-line prefer-destructuring, max-len }); it('does not score', async () => { await user.post(`/tasks/${usersChallengeTaskId}/score/up`); - let tasks = await user.get(`/tasks/challenge/${challenge._id}`); - let task = find(tasks, {_id: reward._id}); + const tasks = await user.get(`/tasks/challenge/${challenge._id}`); + const task = find(tasks, { _id: reward._id }); expect(task.history).to.not.exist; expect(task.value).to.equal(0); diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js index 2a5fe64d25..d7ee94728c 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT /tasks/:id', () => { let user; @@ -42,7 +42,7 @@ describe('PUT /tasks/:id', () => { }); it('returns error when user is not a member of the challenge', async () => { - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.put(`/tasks/${task._id}`, { text: 'some new text', @@ -80,7 +80,7 @@ describe('PUT /tasks/:id', () => { it(`ignores setting _id, type, userId, history, createdAt, updatedAt, challenge, completed, streak, dateCompleted fields`, async () => { - let savedTask = await user.put(`/tasks/${task._id}`, { + const savedTask = await user.put(`/tasks/${task._id}`, { _id: 123, type: 'daily', userId: 123, @@ -108,7 +108,7 @@ describe('PUT /tasks/:id', () => { }); it('ignores invalid fields', async () => { - let savedTask = await user.put(`/tasks/${task._id}`, { + const savedTask = await user.put(`/tasks/${task._id}`, { notValid: true, }); @@ -128,7 +128,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a habit', async () => { - let savedHabit = await user.put(`/tasks/${habit._id}`, { + const savedHabit = await user.put(`/tasks/${habit._id}`, { text: 'some new text', up: false, down: false, @@ -171,7 +171,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a todo', async () => { - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { text: 'some new text', notes: 'some new notes', }); @@ -183,14 +183,14 @@ describe('PUT /tasks/:id', () => { it('can update checklists (replace it)', async () => { await user.put(`/tasks/${todo._id}`, { checklist: [ - {text: 123, completed: false}, - {text: 456, completed: true}, + { text: 123, completed: false }, + { text: 456, completed: true }, ], }); - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { checklist: [ - {text: 789, completed: false}, + { text: 789, completed: false }, ], }); @@ -200,12 +200,12 @@ describe('PUT /tasks/:id', () => { }); it('can update tags (replace them)', async () => { - let finalUUID = generateUUID(); + const finalUUID = generateUUID(); await user.put(`/tasks/${todo._id}`, { tags: [generateUUID(), generateUUID()], }); - let savedTodo = await user.put(`/tasks/${todo._id}`, { + const savedTodo = await user.put(`/tasks/${todo._id}`, { tags: [finalUUID], }); @@ -226,7 +226,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a daily', async () => { - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { text: 'some new text', notes: 'some new notes', frequency: 'daily', @@ -242,14 +242,14 @@ describe('PUT /tasks/:id', () => { it('can update checklists (replace it)', async () => { await user.put(`/tasks/${daily._id}`, { checklist: [ - {text: 123, completed: false}, - {text: 456, completed: true}, + { text: 123, completed: false }, + { text: 456, completed: true }, ], }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { checklist: [ - {text: 789, completed: false}, + { text: 789, completed: false }, ], }); @@ -259,12 +259,12 @@ describe('PUT /tasks/:id', () => { }); it('can update tags (replace them)', async () => { - let finalUUID = generateUUID(); + const finalUUID = generateUUID(); await user.put(`/tasks/${daily._id}`, { tags: [generateUUID(), generateUUID()], }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { tags: [finalUUID], }); @@ -277,7 +277,7 @@ describe('PUT /tasks/:id', () => { frequency: 'daily', }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { repeat: { m: false, su: false, @@ -300,7 +300,7 @@ describe('PUT /tasks/:id', () => { frequency: 'weekly', }); - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { everyX: 5, }); @@ -308,7 +308,7 @@ describe('PUT /tasks/:id', () => { }); it('defaults startDate to today if none date object is passed in', async () => { - let savedDaily = await user.put(`/tasks/${daily._id}`, { + const savedDaily = await user.put(`/tasks/${daily._id}`, { frequency: 'weekly', }); @@ -329,7 +329,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a reward', async () => { - let savedReward = await user.put(`/tasks/${reward._id}`, { + const savedReward = await user.put(`/tasks/${reward._id}`, { text: 'some new text', notes: 'some new notes', value: 11, @@ -341,7 +341,7 @@ describe('PUT /tasks/:id', () => { }); it('requires value to be coerced into a number', async () => { - let savedReward = await user.put(`/tasks/${reward._id}`, { + const savedReward = await user.put(`/tasks/${reward._id}`, { value: '100', }); diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js index 19e72e9617..5e8a45dc9f 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT /tasks/:taskId/checklist/:itemId', () => { let user; @@ -19,7 +19,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on task not found', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'todo', text: 'Todo with checklist', }); @@ -37,17 +37,17 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('returns error when user is not a member of the challenge', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'todo', text: 'Todo with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, { + const savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false, }); - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.put(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`, { text: 'updated', @@ -62,7 +62,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('updates a checklist item on dailies', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', text: 'Daily with checklist', }); @@ -85,7 +85,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('updates a checklist item on todos', async () => { - let task = await user.post(`/tasks/challenge/${challenge._id}`, { + const task = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'todo', text: 'Todo with checklist', }); @@ -108,7 +108,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on habits', async () => { - let habit = await user.post('/tasks/user', { + const habit = await user.post('/tasks/user', { type: 'habit', text: 'habit with checklist', }); @@ -121,7 +121,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on rewards', async () => { - let reward = await user.post('/tasks/user', { + const reward = await user.post('/tasks/user', { type: 'reward', text: 'reward with checklist', }); @@ -142,7 +142,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post('/tasks/user', { + const createdTask = await user.post('/tasks/user', { type: 'daily', text: 'daily with checklist', }); diff --git a/test/api/v3/integration/tasks/checklists/DELETE-tasks_taskId_checklist_itemId.test.js b/test/api/v3/integration/tasks/checklists/DELETE-tasks_taskId_checklist_itemId.test.js index 940a3479b1..2016454178 100644 --- a/test/api/v3/integration/tasks/checklists/DELETE-tasks_taskId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/checklists/DELETE-tasks_taskId_checklist_itemId.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /tasks/:taskId/checklist/:itemId', () => { let user; @@ -12,12 +12,12 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('deletes a checklist item', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false}); + let savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false }); await user.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`); savedTask = await user.get(`/tasks/${task._id}`); @@ -26,13 +26,13 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('deletes a checklist item using task alias', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', alias: 'daily-with-alias', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false}); + let savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false }); await user.del(`/tasks/${task.alias}/checklist/${savedTask.checklist[0].id}`); savedTask = await user.get(`/tasks/${task._id}`); @@ -41,7 +41,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with habits', async () => { - let habit = await user.post('/tasks/user', { + const habit = await user.post('/tasks/user', { type: 'habit', text: 'habit with checklist', }); @@ -54,7 +54,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with rewards', async () => { - let reward = await user.post('/tasks/user', { + const reward = await user.post('/tasks/user', { type: 'reward', text: 'reward with checklist', }); @@ -75,7 +75,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post('/tasks/user', { + const createdTask = await user.post('/tasks/user', { type: 'daily', text: 'daily with checklist', }); diff --git a/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist.test.js b/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist.test.js index 488e0005d9..80bb5377e4 100644 --- a/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist.test.js +++ b/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:taskId/checklist/', () => { let user; @@ -12,12 +12,12 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('adds a checklist item to a task', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, { + const savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', ignored: false, _id: 123, @@ -32,13 +32,13 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('can use a alias to add checklist', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', alias: 'task-with-shortname', }); - let savedTask = await user.post(`/tasks/${task.alias}/checklist`, { + const savedTask = await user.post(`/tasks/${task.alias}/checklist`, { text: 'Checklist Item 1', ignored: false, _id: 123, @@ -53,7 +53,7 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to habits', async () => { - let habit = await user.post('/tasks/user', { + const habit = await user.post('/tasks/user', { type: 'habit', text: 'habit with checklist', }); @@ -68,7 +68,7 @@ describe('POST /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to rewards', async () => { - let reward = await user.post('/tasks/user', { + const reward = await user.post('/tasks/user', { type: 'reward', text: 'reward with checklist', }); diff --git a/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist_itemId_score.test.js b/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist_itemId_score.test.js index 00c238208a..b54b860ebe 100644 --- a/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist_itemId_score.test.js +++ b/test/api/v3/integration/tasks/checklists/POST-tasks_taskId_checklist_itemId_score.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, server, sleep, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:taskId/checklist/:itemId/score', () => { let user; @@ -14,7 +14,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('scores a checklist item', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', }); @@ -31,7 +31,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('can use a alias to score a checklist item', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', alias: 'daily-with-shortname', @@ -49,7 +49,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('fails on habits', async () => { - let habit = await user.post('/tasks/user', { + const habit = await user.post('/tasks/user', { type: 'habit', text: 'habit with checklist', }); @@ -64,7 +64,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('fails on rewards', async () => { - let reward = await user.post('/tasks/user', { + const reward = await user.post('/tasks/user', { type: 'reward', text: 'reward with checklist', }); @@ -85,7 +85,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post('/tasks/user', { + const createdTask = await user.post('/tasks/user', { type: 'daily', text: 'daily with checklist', }); @@ -107,7 +107,7 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }); it('sends task activity webhooks', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -119,22 +119,22 @@ describe('POST /tasks/:taskId/checklist/:itemId/score', () => { }, }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', }); - let updatedTask = await user.post(`/tasks/${task.id}/checklist`, { + const updatedTask = await user.post(`/tasks/${task.id}/checklist`, { text: 'checklist item text', }); - let checklistItem = updatedTask.checklist[0]; + const checklistItem = updatedTask.checklist[0]; - let scoredItemTask = await user.post(`/tasks/${task.id}/checklist/${checklistItem.id}/score`); + const scoredItemTask = await user.post(`/tasks/${task.id}/checklist/${checklistItem.id}/score`); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.type).to.eql('checklistScored'); expect(body.task).to.eql(scoredItemTask); diff --git a/test/api/v3/integration/tasks/checklists/PUT-tasks_taskId_checklist_itemId.test.js b/test/api/v3/integration/tasks/checklists/PUT-tasks_taskId_checklist_itemId.test.js index 2c4b259ee5..cef2cbaac4 100644 --- a/test/api/v3/integration/tasks/checklists/PUT-tasks_taskId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/checklists/PUT-tasks_taskId_checklist_itemId.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT /tasks/:taskId/checklist/:itemId', () => { let user; @@ -12,7 +12,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('updates a checklist item', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', }); @@ -35,7 +35,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('updates a checklist item using task alias', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'daily', text: 'Daily with checklist', alias: 'daily-with-shortname', @@ -59,7 +59,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on habits', async () => { - let habit = await user.post('/tasks/user', { + const habit = await user.post('/tasks/user', { type: 'habit', text: 'habit with checklist', }); @@ -72,7 +72,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on rewards', async () => { - let reward = await user.post('/tasks/user', { + const reward = await user.post('/tasks/user', { type: 'reward', text: 'reward with checklist', }); @@ -93,7 +93,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post('/tasks/user', { + const createdTask = await user.post('/tasks/user', { type: 'daily', text: 'daily with checklist', }); diff --git a/test/api/v3/integration/tasks/groups/DELETE-group_tasks_id.test.js b/test/api/v3/integration/tasks/groups/DELETE-group_tasks_id.test.js index 0364869af9..59dba9f5ed 100644 --- a/test/api/v3/integration/tasks/groups/DELETE-group_tasks_id.test.js +++ b/test/api/v3/integration/tasks/groups/DELETE-group_tasks_id.test.js @@ -1,18 +1,19 @@ +import { find } from 'lodash'; import { translate as t, createAndPopulateGroup, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('Groups DELETE /tasks/:id', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -22,8 +23,8 @@ describe('Groups DELETE /tasks/:id', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test habit', @@ -70,8 +71,8 @@ describe('Groups DELETE /tasks/:id', () => { await user.put(`/tasks/${task._id}/`, { requiresApproval: true, }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -98,8 +99,8 @@ describe('Groups DELETE /tasks/:id', () => { it('unlinks assigned user', async () => { await user.del(`/tasks/${task._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(syncedTask.group.broken).to.equal('TASK_DELETED'); }); @@ -107,19 +108,19 @@ describe('Groups DELETE /tasks/:id', () => { it('unlinks all assigned users', async () => { await user.del(`/tasks/${task._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); - let member2Tasks = await member2.get('/tasks/user'); - let member2SyncedTask = find(member2Tasks, findAssignedTask); + const member2Tasks = await member2.get('/tasks/user'); + const member2SyncedTask = find(member2Tasks, findAssignedTask); expect(syncedTask.group.broken).to.equal('TASK_DELETED'); expect(member2SyncedTask.group.broken).to.equal('TASK_DELETED'); }); it('prevents a user from deleting a task they are assigned to', async () => { - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.del(`/tasks/${syncedTask._id}`)) .to.eventually.be.rejected.and.eql({ @@ -130,8 +131,8 @@ describe('Groups DELETE /tasks/:id', () => { }); it('allows a user to delete a broken task', async () => { - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await user.del(`/tasks/${task._id}`); @@ -146,8 +147,8 @@ describe('Groups DELETE /tasks/:id', () => { }); it('allows a user to delete a task after leaving a group', async () => { - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await member.post(`/groups/${guild._id}/leave`); diff --git a/test/api/v3/integration/tasks/groups/GET-approvals_group_id.test.js b/test/api/v3/integration/tasks/groups/GET-approvals_group_id.test.js index fe831b4452..a80b33ed5f 100644 --- a/test/api/v3/integration/tasks/groups/GET-approvals_group_id.test.js +++ b/test/api/v3/integration/tasks/groups/GET-approvals_group_id.test.js @@ -1,17 +1,18 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('GET /approvals/group/:groupId', () => { - let user, guild, member, addlMember, task, syncedTask, addlSyncedTask; + let user; let guild; let member; let addlMember; let task; let syncedTask; let + addlSyncedTask; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -21,8 +22,8 @@ describe('GET /approvals/group/:groupId', () => { guild = group; user = groupLeader; - member = members[0]; - addlMember = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + addlMember = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test todo', @@ -33,10 +34,10 @@ describe('GET /approvals/group/:groupId', () => { await user.post(`/tasks/${task._id}/assign/${member._id}`); await user.post(`/tasks/${task._id}/assign/${addlMember._id}`); - let memberTasks = await member.get('/tasks/user'); + const memberTasks = await member.get('/tasks/user'); syncedTask = find(memberTasks, findAssignedTask); - let addlMemberTasks = await addlMember.get('/tasks/user'); + const addlMemberTasks = await addlMember.get('/tasks/user'); addlSyncedTask = find(addlMemberTasks, findAssignedTask); try { @@ -53,13 +54,13 @@ describe('GET /approvals/group/:groupId', () => { }); it('provides only user\'s own tasks when user is not the group leader', async () => { - let approvals = await member.get(`/approvals/group/${guild._id}`); + const approvals = await member.get(`/approvals/group/${guild._id}`); expect(approvals[0]._id).to.equal(syncedTask._id); expect(approvals[1]).to.not.exist; }); it('allows group leaders to get a list of tasks that need approval', async () => { - let approvals = await user.get(`/approvals/group/${guild._id}`); + const approvals = await user.get(`/approvals/group/${guild._id}`); expect(approvals[0]._id).to.equal(syncedTask._id); expect(approvals[1]._id).to.equal(addlSyncedTask._id); }); @@ -69,7 +70,7 @@ describe('GET /approvals/group/:groupId', () => { managerId: member._id, }); - let approvals = await member.get(`/approvals/group/${guild._id}`); + const approvals = await member.get(`/approvals/group/${guild._id}`); expect(approvals[0]._id).to.equal(syncedTask._id); expect(approvals[1]._id).to.equal(addlSyncedTask._id); }); diff --git a/test/api/v3/integration/tasks/groups/GET-tasks_group_id.test.js b/test/api/v3/integration/tasks/groups/GET-tasks_group_id.test.js index e81eef76e6..87988bb78a 100644 --- a/test/api/v3/integration/tasks/groups/GET-tasks_group_id.test.js +++ b/test/api/v3/integration/tasks/groups/GET-tasks_group_id.test.js @@ -1,15 +1,16 @@ +import { v4 as generateUUID } from 'uuid'; +import { each } from 'lodash'; import { generateUser, generateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { each } from 'lodash'; describe('GET /tasks/group/:groupId', () => { - let user, group, task, groupWithTask; - let tasks = []; - let tasksToTest = { + let user; let group; let task; let + groupWithTask; + const tasks = []; + const tasksToTest = { habit: { text: 'test habit', type: 'habit', @@ -39,7 +40,7 @@ describe('GET /tasks/group/:groupId', () => { }); it('returns error when group is not found', async () => { - let dummyId = generateUUID(); + const dummyId = generateUUID(); await expect(user.get(`/tasks/group/${dummyId}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -57,17 +58,17 @@ describe('GET /tasks/group/:groupId', () => { }); it('gets group tasks', async () => { - let getTask = await user.get(`/tasks/group/${groupWithTask._id}`); + const getTask = await user.get(`/tasks/group/${groupWithTask._id}`); expect(getTask).to.eql(tasks); }); it('gets group tasks filtered by type', async () => { - let groupTasks = await user.get(`/tasks/group/${groupWithTask._id}?type=${task.type}s`); + const groupTasks = await user.get(`/tasks/group/${groupWithTask._id}?type=${task.type}s`); expect(groupTasks).to.eql([task]); }); it('cannot get a task owned by someone else', async () => { - let anotherUser = await generateUser(); + const anotherUser = await generateUser(); await expect(anotherUser.get(`/tasks/group/${groupWithTask._id}`)).to.eventually.be.rejected.and.eql({ code: 404, diff --git a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_approve_userId.test.js b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_approve_userId.test.js index a483eaa7fa..599086e463 100644 --- a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_approve_userId.test.js +++ b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_approve_userId.test.js @@ -1,18 +1,19 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /tasks/:id/approve/:userId', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -22,8 +23,8 @@ describe('POST /tasks/:id/approve/:userId', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test todo', @@ -70,9 +71,9 @@ describe('POST /tasks/:id/approve/:userId', () => { expect(member.notifications.length).to.equal(3); expect(member.notifications[1].type).to.equal('GROUP_TASK_APPROVED'); - expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text})); + expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text })); expect(member.notifications[2].type).to.equal('SCORED_TASK'); - expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text})); + expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text })); memberTasks = await member.get('/tasks/user'); syncedTask = find(memberTasks, findAssignedTask); @@ -104,9 +105,9 @@ describe('POST /tasks/:id/approve/:userId', () => { expect(member.notifications.length).to.equal(3); expect(member.notifications[1].type).to.equal('GROUP_TASK_APPROVED'); - expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text})); + expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text })); expect(member.notifications[2].type).to.equal('SCORED_TASK'); - expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text})); + expect(member.notifications[2].data.message).to.equal(t('yourTaskHasBeenApproved', { taskText: task.text })); memberTasks = await member.get('/tasks/user'); syncedTask = find(memberTasks, findAssignedTask); @@ -122,8 +123,8 @@ describe('POST /tasks/:id/approve/:userId', () => { }); await member2.post(`/tasks/${task._id}/assign/${member._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -154,8 +155,8 @@ describe('POST /tasks/:id/approve/:userId', () => { await member2.post(`/tasks/${task._id}/assign/${member._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -184,7 +185,7 @@ describe('POST /tasks/:id/approve/:userId', () => { }); it('completes master task when single-completion task is approved', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: true, @@ -194,8 +195,8 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -205,17 +206,15 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/approve/${member._id}`); - let groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); + const groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(true); }); it('deletes other assigned user tasks when single-completion task is approved', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: true, @@ -225,8 +224,8 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -236,17 +235,18 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/approve/${member._id}`); - let member2Tasks = await member2.get('/tasks/user'); + const member2Tasks = await member2.get('/tasks/user'); - let syncedTask2 = find(member2Tasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const syncedTask2 = find( + member2Tasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); expect(syncedTask2).to.equal(undefined); }); it('does not complete master task when not all user tasks are approved if all assigned must complete', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: true, @@ -256,8 +256,8 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -267,17 +267,15 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/approve/${member._id}`); - let groupTasks = await user.get(`/tasks/group/${guild._id}`); + const groupTasks = await user.get(`/tasks/group/${guild._id}`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(false); }); it('completes master task when all user tasks are approved if all assigned must complete', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: true, @@ -287,8 +285,8 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -296,8 +294,8 @@ describe('POST /tasks/:id/approve/:userId', () => { message: t('taskApprovalHasBeenRequested'), }); - let member2Tasks = await member2.get('/tasks/user'); - let member2SyncedTask = find(member2Tasks, findAssignedTask); + const member2Tasks = await member2.get('/tasks/user'); + const member2SyncedTask = find(member2Tasks, findAssignedTask); await expect(member2.post(`/tasks/${member2SyncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ code: 401, @@ -308,11 +306,9 @@ describe('POST /tasks/:id/approve/:userId', () => { await user.post(`/tasks/${sharedCompletionTask._id}/approve/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/approve/${member2._id}`); - let groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); + const groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(true); }); diff --git a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_needs-work_userId.test.js b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_needs-work_userId.test.js index a474e97732..91026baeae 100644 --- a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_needs-work_userId.test.js +++ b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_needs-work_userId.test.js @@ -1,18 +1,19 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /tasks/:id/needs-work/:userId', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -22,8 +23,8 @@ describe('POST /tasks/:id/needs-work/:userId', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test todo', @@ -84,7 +85,7 @@ describe('POST /tasks/:id/needs-work/:userId', () => { const taskText = syncedTask.text; const managerName = user.profile.name; - expect(notification.data.message).to.equal(t('taskNeedsWork', {taskText, managerName})); + expect(notification.data.message).to.equal(t('taskNeedsWork', { taskText, managerName })); expect(notification.data.task.id).to.equal(syncedTask._id); expect(notification.data.task.text).to.equal(taskText); @@ -98,8 +99,8 @@ describe('POST /tasks/:id/needs-work/:userId', () => { // Check that the managers' GROUP_TASK_APPROVAL notifications have been removed await user.sync(); - expect(user.notifications.find(n => { - n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; + expect(user.notifications.find(n => { // eslint-disable-line arrow-body-style + return n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; })).to.equal(undefined); }); @@ -138,7 +139,7 @@ describe('POST /tasks/:id/needs-work/:userId', () => { const taskText = syncedTask.text; const managerName = member2.profile.name; - expect(notification.data.message).to.equal(t('taskNeedsWork', {taskText, managerName})); + expect(notification.data.message).to.equal(t('taskNeedsWork', { taskText, managerName })); expect(notification.data.task.id).to.equal(syncedTask._id); expect(notification.data.task.text).to.equal(taskText); @@ -152,12 +153,12 @@ describe('POST /tasks/:id/needs-work/:userId', () => { // Check that the managers' GROUP_TASK_APPROVAL notifications have been removed await Promise.all([user.sync(), member2.sync()]); - expect(user.notifications.find(n => { - n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; + expect(user.notifications.find(n => { // eslint-disable-line arrow-body-style + return n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; })).to.equal(undefined); - expect(member2.notifications.find(n => { - n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; + expect(member2.notifications.find(n => { // eslint-disable-line arrow-body-style + return n.data.taskId === syncedTask._id && n.type === 'GROUP_TASK_APPROVAL'; })).to.equal(undefined); }); @@ -168,8 +169,8 @@ describe('POST /tasks/:id/needs-work/:userId', () => { await member2.post(`/tasks/${task._id}/assign/${member._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ diff --git a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js index 43380b64dc..80710c701b 100644 --- a/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/groups/POST-group_tasks_id_score_direction.test.js @@ -1,18 +1,19 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /tasks/:id/score/:direction', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -22,8 +23,8 @@ describe('POST /tasks/:id/score/:direction', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test todo', @@ -39,8 +40,8 @@ describe('POST /tasks/:id/score/:direction', () => { 'preferences.language': 'cs', }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); const direction = 'up'; await expect(member.post(`/tasks/${syncedTask._id}/score/${direction}`)) @@ -49,7 +50,7 @@ describe('POST /tasks/:id/score/:direction', () => { error: 'NotAuthorized', message: t('taskApprovalHasBeenRequested'), }); - let updatedTask = await member.get(`/tasks/${syncedTask._id}`); + const updatedTask = await member.get(`/tasks/${syncedTask._id}`); await user.sync(); @@ -71,8 +72,8 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post(`/groups/${guild._id}/add-manager`, { managerId: member2._id, }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); const direction = 'up'; await expect(member.post(`/tasks/${syncedTask._id}/score/${direction}`)) @@ -81,7 +82,7 @@ describe('POST /tasks/:id/score/:direction', () => { error: 'NotAuthorized', message: t('taskApprovalHasBeenRequested'), }); - let updatedTask = await member.get(`/tasks/${syncedTask._id}`); + const updatedTask = await member.get(`/tasks/${syncedTask._id}`); await user.sync(); await member2.sync(); @@ -107,8 +108,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); it('errors when approval has already been requested', async () => { - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ @@ -126,8 +127,8 @@ describe('POST /tasks/:id/score/:direction', () => { }); it('allows a user to score an approved task', async () => { - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); await expect(member.post(`/tasks/${syncedTask._id}/score/up`)) .to.eventually.be.rejected.and.to.eql({ @@ -139,14 +140,14 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post(`/tasks/${task._id}/approve/${member._id}`); await member.post(`/tasks/${syncedTask._id}/score/up`); - let updatedTask = await member.get(`/tasks/${syncedTask._id}`); + const updatedTask = await member.get(`/tasks/${syncedTask._id}`); expect(updatedTask.completed).to.equal(true); expect(updatedTask.dateCompleted).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type }); it('completes master task when single-completion task is completed', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: false, @@ -154,24 +155,23 @@ describe('POST /tasks/:id/score/:direction', () => { }); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); - let memberTasks = await member.get('/tasks/user'); + const memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const syncedTask = find( + memberTasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); await member.post(`/tasks/${syncedTask._id}/score/up`); - let groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(true); }); it('deletes other assigned user tasks when single-completion task is completed', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: false, @@ -180,25 +180,27 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); + const memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const syncedTask = find( + memberTasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); await member.post(`/tasks/${syncedTask._id}/score/up`); - let member2Tasks = await member2.get('/tasks/user'); + const member2Tasks = await member2.get('/tasks/user'); - let syncedTask2 = find(member2Tasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const syncedTask2 = find( + member2Tasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); expect(syncedTask2).to.equal(undefined); }); it('does not complete master task when not all user tasks are completed if all assigned must complete', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: false, @@ -207,24 +209,23 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); + const memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const syncedTask = find( + memberTasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); await member.post(`/tasks/${syncedTask._id}/score/up`); - let groupTasks = await user.get(`/tasks/group/${guild._id}`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const groupTasks = await user.get(`/tasks/group/${guild._id}`); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(false); }); it('completes master task when all user tasks are completed if all assigned must complete', async () => { - let sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { + const sharedCompletionTask = await user.post(`/tasks/group/${guild._id}`, { text: 'shared completion todo', type: 'todo', requiresApproval: false, @@ -233,22 +234,22 @@ describe('POST /tasks/:id/score/:direction', () => { await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member._id}`); await user.post(`/tasks/${sharedCompletionTask._id}/assign/${member2._id}`); - let memberTasks = await member.get('/tasks/user'); - let member2Tasks = await member2.get('/tasks/user'); - let syncedTask = find(memberTasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); - let syncedTask2 = find(member2Tasks, (memberTask) => { - return memberTask.group.taskId === sharedCompletionTask._id; - }); + const memberTasks = await member.get('/tasks/user'); + const member2Tasks = await member2.get('/tasks/user'); + const syncedTask = find( + memberTasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); + const syncedTask2 = find( + member2Tasks, + memberTask => memberTask.group.taskId === sharedCompletionTask._id, + ); await member.post(`/tasks/${syncedTask._id}/score/up`); await member2.post(`/tasks/${syncedTask2._id}/score/up`); - let groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); - let masterTask = find(groupTasks, (groupTask) => { - return groupTask._id === sharedCompletionTask._id; - }); + const groupTasks = await user.get(`/tasks/group/${guild._id}?type=completedTodos`); + const masterTask = find(groupTasks, groupTask => groupTask._id === sharedCompletionTask._id); expect(masterTask.completed).to.equal(true); }); diff --git a/test/api/v3/integration/tasks/groups/POST-tasks_group_id.test.js b/test/api/v3/integration/tasks/groups/POST-tasks_group_id.test.js index b14f32eb91..85d9dcc3f6 100644 --- a/test/api/v3/integration/tasks/groups/POST-tasks_group_id.test.js +++ b/test/api/v3/integration/tasks/groups/POST-tasks_group_id.test.js @@ -1,18 +1,19 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/group/:groupid', () => { - let user, guild, manager; - let groupName = 'Test Public Guild'; - let groupType = 'guild'; + let user; let guild; let + manager; + const groupName = 'Test Public Guild'; + const groupType = 'guild'; beforeEach(async () => { - user = await generateUser({balance: 1}); - let { group, groupLeader, members } = await createAndPopulateGroup({ + user = await generateUser({ balance: 1 }); + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { name: groupName, type: groupType, @@ -23,7 +24,7 @@ describe('POST /tasks/group/:groupid', () => { guild = group; user = groupLeader; - manager = members[0]; + manager = members[0]; // eslint-disable-line prefer-destructuring }); it('returns error when group is not found', async () => { @@ -41,7 +42,7 @@ describe('POST /tasks/group/:groupid', () => { }); it('returns error when user is not a member of the group', async () => { - let userWithoutChallenge = await generateUser(); + const userWithoutChallenge = await generateUser(); await expect(userWithoutChallenge.post(`/tasks/group/${guild._id}`, { text: 'test habit', @@ -57,7 +58,7 @@ describe('POST /tasks/group/:groupid', () => { }); it('returns error when non leader tries to create a task', async () => { - let userThatIsNotLeaderOfGroup = await generateUser({ + const userThatIsNotLeaderOfGroup = await generateUser({ guilds: [guild._id], }); @@ -75,7 +76,7 @@ describe('POST /tasks/group/:groupid', () => { }); it('creates a habit', async () => { - let task = await user.post(`/tasks/group/${guild._id}`, { + const task = await user.post(`/tasks/group/${guild._id}`, { text: 'test habit', type: 'habit', up: false, @@ -83,7 +84,7 @@ describe('POST /tasks/group/:groupid', () => { notes: 1976, }); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); expect(groupTask[0].group.id).to.equal(guild._id); expect(task.text).to.eql('test habit'); @@ -94,13 +95,13 @@ describe('POST /tasks/group/:groupid', () => { }); it('creates a todo', async () => { - let task = await user.post(`/tasks/group/${guild._id}`, { + const task = await user.post(`/tasks/group/${guild._id}`, { text: 'test todo', type: 'todo', notes: 1976, }); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); expect(groupTask[0].group.id).to.equal(guild._id); expect(task.text).to.eql('test todo'); @@ -109,8 +110,8 @@ describe('POST /tasks/group/:groupid', () => { }); it('creates a daily', async () => { - let now = new Date(); - let task = await user.post(`/tasks/group/${guild._id}`, { + const now = new Date(); + const task = await user.post(`/tasks/group/${guild._id}`, { text: 'test daily', type: 'daily', notes: 1976, @@ -119,7 +120,7 @@ describe('POST /tasks/group/:groupid', () => { startDate: now, }); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); expect(groupTask[0].group.id).to.equal(guild._id); expect(task.text).to.eql('test daily'); @@ -135,7 +136,7 @@ describe('POST /tasks/group/:groupid', () => { managerId: manager._id, }); - let task = await manager.post(`/tasks/group/${guild._id}`, { + const task = await manager.post(`/tasks/group/${guild._id}`, { text: 'test habit', type: 'habit', up: false, @@ -143,7 +144,7 @@ describe('POST /tasks/group/:groupid', () => { notes: 1976, }); - let groupTask = await manager.get(`/tasks/group/${guild._id}`); + const groupTask = await manager.get(`/tasks/group/${guild._id}`); expect(groupTask[0].group.id).to.equal(guild._id); expect(task.text).to.eql('test habit'); diff --git a/test/api/v3/integration/tasks/groups/POST-tasks_group_id_assign_user_id.test.js b/test/api/v3/integration/tasks/groups/POST-tasks_group_id_assign_user_id.test.js index 9364ea11d8..214a50fc03 100644 --- a/test/api/v3/integration/tasks/groups/POST-tasks_group_id_assign_user_id.test.js +++ b/test/api/v3/integration/tasks/groups/POST-tasks_group_id_assign_user_id.test.js @@ -1,20 +1,21 @@ +import { v4 as generateUUID } from 'uuid'; +import { find } from 'lodash'; import { generateUser, createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { find } from 'lodash'; describe('POST /tasks/:taskId/assign/:memberId', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -24,8 +25,8 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test habit', @@ -46,7 +47,7 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { }); it('returns error when task is not a group task', async () => { - let nonGroupTask = await user.post('/tasks/user', { + const nonGroupTask = await user.post('/tasks/user', { text: 'test habit', type: 'habit', up: false, @@ -63,7 +64,7 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { }); it('returns error when user is not a member of the group', async () => { - let nonUser = await generateUser(); + const nonUser = await generateUser(); await expect(nonUser.post(`/tasks/${task._id}/assign/${member._id}`)) .to.eventually.be.rejected.and.eql({ @@ -85,9 +86,9 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { it('allows user to assign themselves (claim)', async () => { await member.post(`/tasks/${task._id}/assign/${member._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await user.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.contain(member._id); expect(syncedTask).to.exist; @@ -100,7 +101,7 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { await member.post(`/tasks/${task._id}/assign/${member._id}`); await user.sync(); await member2.sync(); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); expect(user.notifications.length).to.equal(2); // includes Guild Joined achievement expect(user.notifications[1].type).to.equal('GROUP_TASK_CLAIMED'); @@ -115,9 +116,9 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { it('assigns a task to a user', async () => { await user.post(`/tasks/${task._id}/assign/${member._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await user.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.contain(member._id); expect(syncedTask).to.exist; @@ -127,7 +128,7 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { await user.post(`/tasks/${task._id}/assign/${member._id}`); await member.sync(); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); expect(member.notifications.length).to.equal(1); expect(member.notifications[0].type).to.equal('GROUP_TASK_ASSIGNED'); @@ -138,13 +139,13 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { await user.post(`/tasks/${task._id}/assign/${member._id}`); await user.post(`/tasks/${task._id}/assign/${member2._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let member1SyncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const member1SyncedTask = find(memberTasks, findAssignedTask); - let member2Tasks = await member2.get('/tasks/user'); - let member2SyncedTask = find(member2Tasks, findAssignedTask); + const member2Tasks = await member2.get('/tasks/user'); + const member2SyncedTask = find(member2Tasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.contain(member._id); expect(groupTask[0].group.assignedUsers).to.contain(member2._id); @@ -159,9 +160,9 @@ describe('POST /tasks/:taskId/assign/:memberId', () => { await member2.post(`/tasks/${task._id}/assign/${member._id}`); - let groupTask = await member2.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await member2.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.contain(member._id); expect(syncedTask).to.exist; diff --git a/test/api/v3/integration/tasks/groups/POST-tasks_move_taskId_to_position.test.js b/test/api/v3/integration/tasks/groups/POST-tasks_move_taskId_to_position.test.js index cefef5c832..9dcc956e1b 100644 --- a/test/api/v3/integration/tasks/groups/POST-tasks_move_taskId_to_position.test.js +++ b/test/api/v3/integration/tasks/groups/POST-tasks_move_taskId_to_position.test.js @@ -4,45 +4,46 @@ import { } from '../../../../../helpers/api-integration/v3'; describe('POST group-tasks/:taskId/move/to/:position', () => { - let user, guild; + let user; let + guild; beforeEach(async () => { - user = await generateUser({balance: 1}); - guild = await generateGroup(user, {type: 'guild'}); + user = await generateUser({ balance: 1 }); + guild = await generateGroup(user, { type: 'guild' }); }); it('can move task to new position', async () => { - let tasks = await user.post(`/tasks/group/${guild._id}`, [ - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2'}, - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 3'}, - {type: 'habit', text: 'habit 4'}, - {type: 'todo', text: 'todo 1'}, - {type: 'habit', text: 'habit 5'}, + const tasks = await user.post(`/tasks/group/${guild._id}`, [ + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2' }, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 3' }, + { type: 'habit', text: 'habit 4' }, + { type: 'todo', text: 'todo 1' }, + { type: 'habit', text: 'habit 5' }, ]); - let taskToMove = tasks[1]; + const taskToMove = tasks[1]; expect(taskToMove.text).to.equal('habit 2'); - let newOrder = await user.post(`/group-tasks/${tasks[1]._id}/move/to/3`); + const newOrder = await user.post(`/group-tasks/${tasks[1]._id}/move/to/3`); expect(newOrder[3]).to.equal(taskToMove._id); expect(newOrder.length).to.equal(5); }); it('can push to bottom', async () => { - let tasks = await user.post(`/tasks/group/${guild._id}`, [ - {type: 'habit', text: 'habit 1'}, - {type: 'habit', text: 'habit 2'}, - {type: 'daily', text: 'daily 1'}, - {type: 'habit', text: 'habit 3'}, - {type: 'habit', text: 'habit 4'}, - {type: 'todo', text: 'todo 1'}, - {type: 'habit', text: 'habit 5'}, + const tasks = await user.post(`/tasks/group/${guild._id}`, [ + { type: 'habit', text: 'habit 1' }, + { type: 'habit', text: 'habit 2' }, + { type: 'daily', text: 'daily 1' }, + { type: 'habit', text: 'habit 3' }, + { type: 'habit', text: 'habit 4' }, + { type: 'todo', text: 'todo 1' }, + { type: 'habit', text: 'habit 5' }, ]); - let taskToMove = tasks[1]; + const taskToMove = tasks[1]; expect(taskToMove.text).to.equal('habit 2'); - let newOrder = await user.post(`/group-tasks/${tasks[1]._id}/move/to/-1`); + const newOrder = await user.post(`/group-tasks/${tasks[1]._id}/move/to/-1`); expect(newOrder[4]).to.equal(taskToMove._id); expect(newOrder.length).to.equal(5); }); diff --git a/test/api/v3/integration/tasks/groups/POST-tasks_task_id_unassign.test.js b/test/api/v3/integration/tasks/groups/POST-tasks_task_id_unassign.test.js index a3fbd3c8bb..c1981b3061 100644 --- a/test/api/v3/integration/tasks/groups/POST-tasks_task_id_unassign.test.js +++ b/test/api/v3/integration/tasks/groups/POST-tasks_task_id_unassign.test.js @@ -1,20 +1,21 @@ +import { v4 as generateUUID } from 'uuid'; +import { find } from 'lodash'; import { generateUser, createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -import { find } from 'lodash'; describe('POST /tasks/:taskId/unassign/:memberId', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -24,8 +25,8 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test habit', @@ -48,7 +49,7 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { }); it('returns error when task is not a group task', async () => { - let nonGroupTask = await user.post('/tasks/user', { + const nonGroupTask = await user.post('/tasks/user', { text: 'test habit', type: 'habit', up: false, @@ -65,7 +66,7 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { }); it('returns error when user is not a member of the group', async () => { - let nonUser = await generateUser(); + const nonUser = await generateUser(); await expect(nonUser.post(`/tasks/${task._id}/unassign/${member._id}`)) .to.eventually.be.rejected.and.eql({ @@ -78,9 +79,9 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { it('unassigns a user from a task', async () => { await user.post(`/tasks/${task._id}/unassign/${member._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await user.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.not.contain(member._id); expect(syncedTask).to.not.exist; @@ -98,13 +99,13 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { await user.post(`/tasks/${task._id}/unassign/${member._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); + const groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let member1SyncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const member1SyncedTask = find(memberTasks, findAssignedTask); - let member2Tasks = await member2.get('/tasks/user'); - let member2SyncedTask = find(member2Tasks, findAssignedTask); + const member2Tasks = await member2.get('/tasks/user'); + const member2SyncedTask = find(member2Tasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.not.contain(member._id); expect(member1SyncedTask).to.not.exist; @@ -120,9 +121,9 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { await member2.post(`/tasks/${task._id}/unassign/${member._id}`); - let groupTask = await member2.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await member2.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.not.contain(member._id); expect(syncedTask).to.not.exist; @@ -131,9 +132,9 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => { it('allows a user to unassign themselves', async () => { await member.post(`/tasks/${task._id}/unassign/${member._id}`); - let groupTask = await user.get(`/tasks/group/${guild._id}`); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const groupTask = await user.get(`/tasks/group/${guild._id}`); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(groupTask[0].group.assignedUsers).to.not.contain(member._id); expect(syncedTask).to.not.exist; diff --git a/test/api/v3/integration/tasks/groups/PUT-group_task_id.test.js b/test/api/v3/integration/tasks/groups/PUT-group_task_id.test.js index aa2b3876a6..d7a193c025 100644 --- a/test/api/v3/integration/tasks/groups/PUT-group_task_id.test.js +++ b/test/api/v3/integration/tasks/groups/PUT-group_task_id.test.js @@ -1,17 +1,18 @@ +import { find } from 'lodash'; import { createAndPopulateGroup, translate as t, } from '../../../../../helpers/api-integration/v3'; -import {find} from 'lodash'; describe('PUT /tasks/:id', () => { - let user, guild, member, member2, task; + let user; let guild; let member; let member2; let + task; function findAssignedTask (memberTask) { return memberTask.group.id === guild._id; } beforeEach(async () => { - let {group, members, groupLeader} = await createAndPopulateGroup({ + const { group, members, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -21,8 +22,8 @@ describe('PUT /tasks/:id', () => { guild = group; user = groupLeader; - member = members[0]; - member2 = members[1]; + member = members[0]; // eslint-disable-line prefer-destructuring + member2 = members[1]; // eslint-disable-line prefer-destructuring task = await user.post(`/tasks/group/${guild._id}`, { text: 'test habit', @@ -37,7 +38,7 @@ describe('PUT /tasks/:id', () => { }); it('updates a group task', async () => { - let savedHabit = await user.put(`/tasks/${task._id}`, { + const savedHabit = await user.put(`/tasks/${task._id}`, { notes: 'some new notes', }); @@ -56,8 +57,8 @@ describe('PUT /tasks/:id', () => { requiresApproval: true, }); - let memberTasks = await member2.get('/tasks/user'); - let syncedTask = find(memberTasks, (memberTask) => memberTask.group.taskId === task._id); + const memberTasks = await member2.get('/tasks/user'); + const syncedTask = find(memberTasks, memberTask => memberTask.group.taskId === task._id); // score up to trigger approval await expect(member2.post(`/tasks/${syncedTask._id}/score/up`)) @@ -107,8 +108,8 @@ describe('PUT /tasks/:id', () => { }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(syncedTask.text).to.eql('some new text'); expect(syncedTask.up).to.eql(false); @@ -123,11 +124,11 @@ describe('PUT /tasks/:id', () => { notes: 'some new notes', }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); - let member2Tasks = await member2.get('/tasks/user'); - let member2SyncedTask = find(member2Tasks, findAssignedTask); + const member2Tasks = await member2.get('/tasks/user'); + const member2SyncedTask = find(member2Tasks, findAssignedTask); expect(syncedTask.text).to.eql('some new text'); expect(syncedTask.up).to.eql(false); @@ -151,8 +152,8 @@ describe('PUT /tasks/:id', () => { }); - let memberTasks = await member.get('/tasks/user'); - let syncedTask = find(memberTasks, findAssignedTask); + const memberTasks = await member.get('/tasks/user'); + const syncedTask = find(memberTasks, findAssignedTask); expect(syncedTask.text).to.eql('some new text'); expect(syncedTask.up).to.eql(false); diff --git a/test/api/v3/integration/tasks/groups/checklists/DELETE-group_tasks_taskId_checklist_item.test.js b/test/api/v3/integration/tasks/groups/checklists/DELETE-group_tasks_taskId_checklist_item.test.js index ace15b6039..1830faa9f0 100644 --- a/test/api/v3/integration/tasks/groups/checklists/DELETE-group_tasks_taskId_checklist_item.test.js +++ b/test/api/v3/integration/tasks/groups/checklists/DELETE-group_tasks_taskId_checklist_item.test.js @@ -1,14 +1,15 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, } from '../../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE group /tasks/:taskId/checklist/:itemId', () => { - let user, guild, task; + let user; let guild; let + task; before(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -26,7 +27,7 @@ describe('DELETE group /tasks/:taskId/checklist/:itemId', () => { text: 'Daily with checklist', }); - let savedTask = await user.post(`/tasks/${task._id}/checklist`, {text: 'Checklist Item 1', completed: false}); + let savedTask = await user.post(`/tasks/${task._id}/checklist`, { text: 'Checklist Item 1', completed: false }); await user.del(`/tasks/${task._id}/checklist/${savedTask.checklist[0].id}`); savedTask = await user.get(`/tasks/group/${guild._id}`); @@ -35,7 +36,7 @@ describe('DELETE group /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with habits', async () => { - let habit = await user.post(`/tasks/group/${guild._id}`, { + const habit = await user.post(`/tasks/group/${guild._id}`, { type: 'habit', text: 'habit with checklist', }); @@ -48,7 +49,7 @@ describe('DELETE group /tasks/:taskId/checklist/:itemId', () => { }); it('does not work with rewards', async () => { - let reward = await user.post(`/tasks/group/${guild._id}`, { + const reward = await user.post(`/tasks/group/${guild._id}`, { type: 'reward', text: 'reward with checklist', }); @@ -69,7 +70,7 @@ describe('DELETE group /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post(`/tasks/group/${guild._id}`, { + const createdTask = await user.post(`/tasks/group/${guild._id}`, { type: 'daily', text: 'daily with checklist', }); diff --git a/test/api/v3/integration/tasks/groups/checklists/POST-group_tasks_taskId_checklist.test.js b/test/api/v3/integration/tasks/groups/checklists/POST-group_tasks_taskId_checklist.test.js index f6e18027a7..f1e553984d 100644 --- a/test/api/v3/integration/tasks/groups/checklists/POST-group_tasks_taskId_checklist.test.js +++ b/test/api/v3/integration/tasks/groups/checklists/POST-group_tasks_taskId_checklist.test.js @@ -1,14 +1,15 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, } from '../../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST group /tasks/:taskId/checklist/', () => { - let user, guild, task; + let user; let guild; let + task; before(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -32,8 +33,8 @@ describe('POST group /tasks/:taskId/checklist/', () => { _id: 123, }); - let updatedTasks = await user.get(`/tasks/group/${guild._id}`); - let updatedTask = updatedTasks[0]; + const updatedTasks = await user.get(`/tasks/group/${guild._id}`); + const updatedTask = updatedTasks[0]; expect(updatedTask.checklist.length).to.equal(1); expect(updatedTask.checklist[0].text).to.equal('Checklist Item 1'); @@ -44,7 +45,7 @@ describe('POST group /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to habits', async () => { - let habit = await user.post(`/tasks/group/${guild._id}`, { + const habit = await user.post(`/tasks/group/${guild._id}`, { type: 'habit', text: 'habit with checklist', }); @@ -59,7 +60,7 @@ describe('POST group /tasks/:taskId/checklist/', () => { }); it('does not add a checklist to rewards', async () => { - let reward = await user.post(`/tasks/group/${guild._id}`, { + const reward = await user.post(`/tasks/group/${guild._id}`, { type: 'reward', text: 'reward with checklist', }); diff --git a/test/api/v3/integration/tasks/groups/checklists/PUT-group_tasks_taskId_checklist_itemId.test.js b/test/api/v3/integration/tasks/groups/checklists/PUT-group_tasks_taskId_checklist_itemId.test.js index 27b3e19b11..06c612f71b 100644 --- a/test/api/v3/integration/tasks/groups/checklists/PUT-group_tasks_taskId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/groups/checklists/PUT-group_tasks_taskId_checklist_itemId.test.js @@ -1,14 +1,15 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, } from '../../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('PUT group /tasks/:taskId/checklist/:itemId', () => { - let user, guild, task; + let user; let guild; let + task; before(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -44,7 +45,7 @@ describe('PUT group /tasks/:taskId/checklist/:itemId', () => { }); it('fails on habits', async () => { - let habit = await user.post(`/tasks/group/${guild._id}`, { + const habit = await user.post(`/tasks/group/${guild._id}`, { type: 'habit', text: 'habit with checklist', }); @@ -57,7 +58,7 @@ describe('PUT group /tasks/:taskId/checklist/:itemId', () => { }); it('fails on rewards', async () => { - let reward = await user.post(`/tasks/group/${guild._id}`, { + const reward = await user.post(`/tasks/group/${guild._id}`, { type: 'reward', text: 'reward with checklist', }); @@ -78,7 +79,7 @@ describe('PUT group /tasks/:taskId/checklist/:itemId', () => { }); it('fails on checklist item not found', async () => { - let createdTask = await user.post(`/tasks/group/${guild._id}`, { + const createdTask = await user.post(`/tasks/group/${guild._id}`, { type: 'daily', text: 'daily with checklist', }); diff --git a/test/api/v3/integration/tasks/groups/tags/DELETE-group_tasks_taskId_tags_tagId.test.js b/test/api/v3/integration/tasks/groups/tags/DELETE-group_tasks_taskId_tags_tagId.test.js index 05a792dee5..9c97c2860c 100644 --- a/test/api/v3/integration/tasks/groups/tags/DELETE-group_tasks_taskId_tags_tagId.test.js +++ b/test/api/v3/integration/tasks/groups/tags/DELETE-group_tasks_taskId_tags_tagId.test.js @@ -1,14 +1,17 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, } from '../../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -// Currently we do not support adding tags to group original tasks, but if we do in the future, these tests will check + +// Currently we do not support adding tags to group original tasks, +// but if we do in the future, these tests will check xdescribe('DELETE group /tasks/:taskId/tags/:tagId', () => { - let user, guild, task; + let user; let guild; let + task; before(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -26,18 +29,18 @@ xdescribe('DELETE group /tasks/:taskId/tags/:tagId', () => { text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); + const tag = await user.post('/tags', { name: 'Tag 1' }); await user.post(`/tasks/${task._id}/tags/${tag.id}`); await user.del(`/tasks/${task._id}/tags/${tag.id}`); - let updatedTask = await user.get(`/tasks/group/${guild._id}`); + const updatedTask = await user.get(`/tasks/group/${guild._id}`); expect(updatedTask[0].tags.length).to.equal(0); }); it('only deletes existing tags', async () => { - let createdTask = await user.post(`/tasks/group/${guild._id}`, { + const createdTask = await user.post(`/tasks/group/${guild._id}`, { type: 'habit', text: 'Task with tag', }); diff --git a/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js b/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js index ead583d122..615f87ba47 100644 --- a/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js +++ b/test/api/v3/integration/tasks/groups/tags/POST-tasks_taskId_tags.test.js @@ -1,15 +1,17 @@ +import { v4 as generateUUID } from 'uuid'; import { createAndPopulateGroup, translate as t, } from '../../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; -// Currently we do not support adding tags to group original tasks, but if we do in the future, these tests will check +// Currently we do not support adding tags to group original tasks, +// but if we do in the future, these tests will check xdescribe('POST group /tasks/:taskId/tags/:tagId', () => { - let user, guild, task; + let user; let guild; let + task; before(async () => { - let {group, groupLeader} = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'Test Guild', type: 'guild', @@ -27,8 +29,8 @@ xdescribe('POST group /tasks/:taskId/tags/:tagId', () => { text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); - let savedTask = await user.post(`/tasks/${task._id}/tags/${tag.id}`); + const tag = await user.post('/tags', { name: 'Tag 1' }); + const savedTask = await user.post(`/tasks/${task._id}/tags/${tag.id}`); expect(savedTask.tags[0]).to.equal(tag.id); }); @@ -39,7 +41,7 @@ xdescribe('POST group /tasks/:taskId/tags/:tagId', () => { text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); + const tag = await user.post('/tags', { name: 'Tag 1' }); await user.post(`/tasks/${task._id}/tags/${tag.id}`); diff --git a/test/api/v3/integration/tasks/tags/DELETE-tasks_taskId_tags_tagId.test.js b/test/api/v3/integration/tasks/tags/DELETE-tasks_taskId_tags_tagId.test.js index 0a39cfbac7..f1269050c5 100644 --- a/test/api/v3/integration/tasks/tags/DELETE-tasks_taskId_tags_tagId.test.js +++ b/test/api/v3/integration/tasks/tags/DELETE-tasks_taskId_tags_tagId.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /tasks/:taskId/tags/:tagId', () => { let user; @@ -12,40 +12,40 @@ describe('DELETE /tasks/:taskId/tags/:tagId', () => { }); it('removes a tag from a task', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); + const tag = await user.post('/tags', { name: 'Tag 1' }); await user.post(`/tasks/${task._id}/tags/${tag.id}`); await user.del(`/tasks/${task._id}/tags/${tag.id}`); - let updatedTask = await user.get(`/tasks/${task._id}`); + const updatedTask = await user.get(`/tasks/${task._id}`); expect(updatedTask.tags.length).to.equal(0); }); it('removes a tag from a task using task short name', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', alias: 'habit-with-alias', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); + const tag = await user.post('/tags', { name: 'Tag 1' }); await user.post(`/tasks/${task._id}/tags/${tag.id}`); await user.del(`/tasks/${task.alias}/tags/${tag.id}`); - let updatedTask = await user.get(`/tasks/${task._id}`); + const updatedTask = await user.get(`/tasks/${task._id}`); expect(updatedTask.tags.length).to.equal(0); }); it('only deletes existing tags', async () => { - let createdTask = await user.post('/tasks/user', { + const createdTask = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', }); diff --git a/test/api/v3/integration/tasks/tags/POST-tasks_taskId_tags_tagId.test.js b/test/api/v3/integration/tasks/tags/POST-tasks_taskId_tags_tagId.test.js index 66fb002c69..3e48f7e2bc 100644 --- a/test/api/v3/integration/tasks/tags/POST-tasks_taskId_tags_tagId.test.js +++ b/test/api/v3/integration/tasks/tags/POST-tasks_taskId_tags_tagId.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /tasks/:taskId/tags/:tagId', () => { let user; @@ -12,37 +12,37 @@ describe('POST /tasks/:taskId/tags/:tagId', () => { }); it('adds a tag to a task', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); - let savedTask = await user.post(`/tasks/${task._id}/tags/${tag.id}`); + const tag = await user.post('/tags', { name: 'Tag 1' }); + const savedTask = await user.post(`/tasks/${task._id}/tags/${tag.id}`); expect(savedTask.tags[0]).to.equal(tag.id); }); it('adds a tag to a task with alias', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', alias: 'habit-with-alias', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); - let savedTask = await user.post(`/tasks/${task.alias}/tags/${tag.id}`); + const tag = await user.post('/tags', { name: 'Tag 1' }); + const savedTask = await user.post(`/tasks/${task.alias}/tags/${tag.id}`); expect(savedTask.tags[0]).to.equal(tag.id); }); it('does not add a tag to a task twice', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', }); - let tag = await user.post('/tags', {name: 'Tag 1'}); + const tag = await user.post('/tags', { name: 'Tag 1' }); await user.post(`/tasks/${task._id}/tags/${tag.id}`); @@ -54,7 +54,7 @@ describe('POST /tasks/:taskId/tags/:tagId', () => { }); it('does not add a non existing tag to a task', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { type: 'habit', text: 'Task with tag', }); diff --git a/test/api/v3/integration/user/DELETE-user.test.js b/test/api/v3/integration/user/DELETE-user.test.js index 2fbe493d43..644a2d57ba 100644 --- a/test/api/v3/integration/user/DELETE-user.test.js +++ b/test/api/v3/integration/user/DELETE-user.test.js @@ -1,3 +1,8 @@ +import { + find, + each, + map, +} from 'lodash'; import { checkExistence, createAndPopulateGroup, @@ -6,11 +11,6 @@ import { generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { - find, - each, - map, -} from 'lodash'; import { sha1MakeSalt, sha1Encrypt as sha1EncryptPassword, @@ -21,11 +21,11 @@ const DELETE_CONFIRMATION = 'DELETE'; describe('DELETE /user', () => { let user; - let password = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js + const password = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js context('user with local auth', async () => { beforeEach(async () => { - user = await generateUser({balance: 10}); + user = await generateUser({ balance: 10 }); }); it('returns an error if password is wrong', async () => { @@ -56,10 +56,10 @@ describe('DELETE /user', () => { }); it('returns an error if excessive feedback is supplied', async () => { - let feedbackText = 'spam feedback '; + const feedbackText = 'spam feedback '; let feedback = feedbackText; while (feedback.length < 10000) { - feedback = feedback + feedbackText; + feedback += feedbackText; } await expect(user.del('/user', { @@ -73,7 +73,7 @@ describe('DELETE /user', () => { }); it('returns an error if user has active subscription', async () => { - let userWithSubscription = await generateUser({'purchased.plan.customerId': 'fake-customer-id'}); + const userWithSubscription = await generateUser({ 'purchased.plan.customerId': 'fake-customer-id' }); await expect(userWithSubscription.del('/user', { password, @@ -92,8 +92,8 @@ describe('DELETE /user', () => { await user.sync(); // gets the user's tasks ids - let ids = []; - each(user.tasksOrder, (idsForOrder) => { + const ids = []; + each(user.tasksOrder, idsForOrder => { ids.push(...idsForOrder); }); @@ -103,20 +103,18 @@ describe('DELETE /user', () => { password, }); - await Promise.all(map(ids, id => { - return expect(checkExistence('tasks', id)).to.eventually.eql(false); - })); + await Promise.all(map(ids, id => expect(checkExistence('tasks', id)).to.eventually.eql(false))); }); it('reduces memberCount in challenges user is linked to', async () => { - let populatedGroup = await createAndPopulateGroup({ + const populatedGroup = await createAndPopulateGroup({ members: 2, }); - let group = populatedGroup.group; - let authorizedUser = populatedGroup.members[1]; + const { group } = populatedGroup; + const authorizedUser = populatedGroup.members[1]; - let challenge = await generateChallenge(populatedGroup.groupLeader, group); + const challenge = await generateChallenge(populatedGroup.groupLeader, group); await populatedGroup.groupLeader.post(`/challenges/${challenge._id}/join`); await authorizedUser.post(`/challenges/${challenge._id}/join`); @@ -136,7 +134,7 @@ describe('DELETE /user', () => { it('sends feedback to the admin email', async () => { sandbox.spy(email, 'sendTxn'); - let feedback = 'Reasons for Deletion'; + const feedback = 'Reasons for Deletion'; await user.del('/user', { password, feedback, @@ -160,9 +158,9 @@ describe('DELETE /user', () => { }); it('deletes the user with a legacy sha1 password', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -220,10 +218,11 @@ describe('DELETE /user', () => { }); context('groups user is leader of', () => { - let guild, oldLeader, newLeader; + let guild; let oldLeader; let + newLeader; beforeEach(async () => { - let { group, groupLeader, members } = await createAndPopulateGroup({ + const { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -232,7 +231,7 @@ describe('DELETE /user', () => { }); guild = group; - newLeader = members[0]; + newLeader = members[0]; // eslint-disable-line prefer-destructuring oldLeader = groupLeader; }); @@ -241,7 +240,7 @@ describe('DELETE /user', () => { password, }); - let updatedGuild = await newLeader.get(`/groups/${guild._id}`); + const updatedGuild = await newLeader.get(`/groups/${guild._id}`); expect(updatedGuild.leader).to.exist; expect(updatedGuild.leader._id).to.not.eql(oldLeader._id); @@ -249,17 +248,18 @@ describe('DELETE /user', () => { }); context('groups user is a part of', () => { - let group1, group2, userToDelete, otherUser; + let group1; let group2; let userToDelete; let + otherUser; beforeEach(async () => { - userToDelete = await generateUser({balance: 10}); + userToDelete = await generateUser({ balance: 10 }); group1 = await generateGroup(userToDelete, { type: 'guild', privacy: 'public', }); - let {group, members} = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'public', @@ -268,7 +268,7 @@ describe('DELETE /user', () => { }); group2 = group; - otherUser = members[0]; + otherUser = members[0]; // eslint-disable-line prefer-destructuring await userToDelete.post(`/groups/${group2._id}/join`); }); @@ -278,11 +278,9 @@ describe('DELETE /user', () => { password, }); - let updatedGroup1Members = await otherUser.get(`/groups/${group1._id}/members`); - let updatedGroup2Members = await otherUser.get(`/groups/${group2._id}/members`); - let userInGroup = find(updatedGroup2Members, (member) => { - return member._id === userToDelete._id; - }); + const updatedGroup1Members = await otherUser.get(`/groups/${group1._id}/members`); + const updatedGroup2Members = await otherUser.get(`/groups/${group2._id}/members`); + const userInGroup = find(updatedGroup2Members, member => member._id === userToDelete._id); expect(updatedGroup1Members).to.be.empty; expect(updatedGroup2Members).to.not.be.empty; @@ -308,7 +306,7 @@ describe('DELETE /user', () => { })).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('incorrectDeletePhrase', {magicWord: 'DELETE'}), + message: t('incorrectDeletePhrase', { magicWord: 'DELETE' }), }); }); diff --git a/test/api/v3/integration/user/DELETE-user_messages.test.js b/test/api/v3/integration/user/DELETE-user_messages.test.js index 079550b136..f71fc89b95 100644 --- a/test/api/v3/integration/user/DELETE-user_messages.test.js +++ b/test/api/v3/integration/user/DELETE-user_messages.test.js @@ -3,7 +3,8 @@ import { } from '../../../../helpers/api-integration/v3'; describe('DELETE user message', () => { - let user, messagesId, otherUser; + let user; let messagesId; let + otherUser; before(async () => { [user, otherUser] = await Promise.all([generateUser(), generateUser()]); @@ -16,7 +17,7 @@ describe('DELETE user message', () => { message: 'second', }); - let userRes = await user.get('/user'); + const userRes = await user.get('/user'); messagesId = Object.keys(userRes.inbox.messages); expect(messagesId.length).to.eql(2); @@ -25,18 +26,18 @@ describe('DELETE user message', () => { }); it('one message', async () => { - let result = await user.del(`/user/messages/${messagesId[0]}`); + const result = await user.del(`/user/messages/${messagesId[0]}`); messagesId = Object.keys(result); expect(messagesId.length).to.eql(1); - let userRes = await user.get('/user'); + const userRes = await user.get('/user'); expect(Object.keys(userRes.inbox.messages).length).to.eql(1); expect(userRes.inbox.messages[messagesId[0]].text).to.eql('first'); }); it('clear all', async () => { - let result = await user.del('/user/messages'); - let userRes = await user.get('/user'); + const result = await user.del('/user/messages'); + const userRes = await user.get('/user'); expect(userRes.inbox.messages).to.eql({}); expect(result).to.eql({}); }); diff --git a/test/api/v3/integration/user/DELETE-user_push_device.test.js b/test/api/v3/integration/user/DELETE-user_push_device.test.js index 129df28d87..665968bd42 100644 --- a/test/api/v3/integration/user/DELETE-user_push_device.test.js +++ b/test/api/v3/integration/user/DELETE-user_push_device.test.js @@ -5,8 +5,8 @@ import { describe('DELETE /user/push-devices', () => { let user; - let regId = '10'; - let type = 'ios'; + const regId = '10'; + const type = 'ios'; beforeEach(async () => { user = await generateUser(); @@ -22,8 +22,8 @@ describe('DELETE /user/push-devices', () => { }); it('removes a push device from the user', async () => { - await user.post('/user/push-devices', {type, regId}); - let response = await user.del(`/user/push-devices/${regId}`); + await user.post('/user/push-devices', { type, regId }); + const response = await user.del(`/user/push-devices/${regId}`); await user.sync(); expect(response.message).to.equal(t('pushDeviceRemoved')); diff --git a/test/api/v3/integration/user/GET-user.test.js b/test/api/v3/integration/user/GET-user.test.js index fc86e779db..437cc70cb3 100644 --- a/test/api/v3/integration/user/GET-user.test.js +++ b/test/api/v3/integration/user/GET-user.test.js @@ -11,7 +11,7 @@ describe('GET /user', () => { }); it('returns the authenticated user with computed stats', async () => { - let returnedUser = await user.get('/user'); + const returnedUser = await user.get('/user'); expect(returnedUser._id).to.equal(user._id); expect(returnedUser.stats.maxMP).to.exist; @@ -20,7 +20,7 @@ describe('GET /user', () => { }); it('does not return private paths (and apiToken)', async () => { - let returnedUser = await user.get('/user'); + const returnedUser = await user.get('/user'); expect(returnedUser.auth.local.hashed_password).to.not.exist; expect(returnedUser.auth.local.passwordHashMethod).to.not.exist; @@ -29,7 +29,7 @@ describe('GET /user', () => { }); it('returns only user properties requested', async () => { - let returnedUser = await user.get('/user?userFields=achievements,items.mounts'); + const returnedUser = await user.get('/user?userFields=achievements,items.mounts'); expect(returnedUser._id).to.equal(user._id); expect(returnedUser.achievements).to.exist; diff --git a/test/api/v3/integration/user/GET-user_anonymized.test.js b/test/api/v3/integration/user/GET-user_anonymized.test.js index 65c99f104e..b9c8207de5 100644 --- a/test/api/v3/integration/user/GET-user_anonymized.test.js +++ b/test/api/v3/integration/user/GET-user_anonymized.test.js @@ -1,3 +1,4 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, generateHabit, @@ -5,11 +6,10 @@ import { generateReward, } from '../../../../helpers/api-integration/v3'; import common from '../../../../../website/common'; -import { v4 as generateUUID } from 'uuid'; describe('GET /user/anonymized', () => { let user; - let endpoint = '/user/anonymized'; + const endpoint = '/user/anonymized'; before(async () => { user = await generateUser(); @@ -26,7 +26,7 @@ describe('GET /user/anonymized', () => { }, 'items.special.nyeReceived': 'some', 'items.special.valentineReceived': 'some', - webhooks: [{url: 'https://somurl.com'}], + webhooks: [{ url: 'https://somurl.com' }], 'achievements.challenges': 'some', 'inbox.messages': [{ text: 'some text' }], tags: [{ name: 'some name', challenge: 'some challenge' }], @@ -35,7 +35,7 @@ describe('GET /user/anonymized', () => { await generateHabit({ userId: user._id }); await generateHabit({ userId: user._id, text: generateUUID() }); - let daily = await generateDaily({ userId: user._id, checklist: [{ completed: false, text: 'this-text' }] }); + const daily = await generateDaily({ userId: user._id, checklist: [{ completed: false, text: 'this-text' }] }); expect(daily.checklist[0].text.substr(0, 5)).to.not.eql('item '); await generateReward({ userId: user._id, text: 'some text 4' }); @@ -63,7 +63,7 @@ describe('GET /user/anonymized', () => { it('does not return private paths (and apiToken)', async () => { let returnedUser = await user.get(endpoint); - let tasks2 = returnedUser.tasks; + const tasks2 = returnedUser.tasks; returnedUser = returnedUser.user; expect(returnedUser.auth.local).to.not.exist; expect(returnedUser.apiToken).to.not.exist; @@ -80,10 +80,10 @@ describe('GET /user/anonymized', () => { expect(returnedUser.items.special.valentineReceived).to.not.exist; expect(returnedUser.webhooks).to.not.exist; expect(returnedUser.achievements.challenges).to.not.exist; - _.forEach(returnedUser.inbox.messages, (msg) => { + _.forEach(returnedUser.inbox.messages, msg => { expect(msg.text).to.eql('inbox message text'); }); - _.forEach(returnedUser.tags, (tag) => { + _.forEach(returnedUser.tags, tag => { expect(tag.name).to.eql('tag'); expect(tag.challenge).to.eql('challenge'); }); @@ -91,11 +91,11 @@ describe('GET /user/anonymized', () => { expect(tasks2).to.exist; expect(tasks2.length).to.eql(5); expect(tasks2[0].checklist).to.exist; - _.forEach(tasks2, (task) => { + _.forEach(tasks2, task => { expect(task.text).to.eql('task text'); expect(task.notes).to.eql('task notes'); if (task.checklist) { - _.forEach(task.checklist, (c) => { + _.forEach(task.checklist, c => { expect(c.text.substr(0, 5)).to.eql('item '); }); } diff --git a/test/api/v3/integration/user/GET-user_inAppRewards.test.js b/test/api/v3/integration/user/GET-user_inAppRewards.test.js index a2583dc43f..9a498861cf 100644 --- a/test/api/v3/integration/user/GET-user_inAppRewards.test.js +++ b/test/api/v3/integration/user/GET-user_inAppRewards.test.js @@ -11,14 +11,10 @@ describe('GET /user/in-app-rewards', () => { }); it('returns the reward items available for purchase', async () => { - let buyList = await user.get('/user/in-app-rewards'); + const buyList = await user.get('/user/in-app-rewards'); - expect(_.find(buyList, item => { - return item.text === t('armorWarrior1Text'); - })).to.exist; + expect(_.find(buyList, item => item.text === t('armorWarrior1Text'))).to.exist; - expect(_.find(buyList, item => { - return item.text === t('armorWarrior2Text'); - })).to.not.exist; + expect(_.find(buyList, item => item.text === t('armorWarrior2Text'))).to.not.exist; }); }); diff --git a/test/api/v3/integration/user/GET-user_inventory_buy.test.js b/test/api/v3/integration/user/GET-user_inventory_buy.test.js index fd2a25b4ee..ea663142ec 100644 --- a/test/api/v3/integration/user/GET-user_inventory_buy.test.js +++ b/test/api/v3/integration/user/GET-user_inventory_buy.test.js @@ -13,14 +13,10 @@ describe('GET /user/inventory/buy', () => { // More tests in common code unit tests it('returns the gear items available for purchase', async () => { - let buyList = await user.get('/user/inventory/buy'); + const buyList = await user.get('/user/inventory/buy'); - expect(_.find(buyList, item => { - return item.text === t('armorWarrior1Text'); - })).to.exist; + expect(_.find(buyList, item => item.text === t('armorWarrior1Text'))).to.exist; - expect(_.find(buyList, item => { - return item.text === t('armorWarrior2Text'); - })).to.not.exist; + expect(_.find(buyList, item => item.text === t('armorWarrior2Text'))).to.not.exist; }); }); diff --git a/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js b/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js index a183cdf9e1..a3cb368766 100644 --- a/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js +++ b/test/api/v3/integration/user/GET-user_toggle-pinned-item.test.js @@ -20,7 +20,7 @@ describe('GET /user/toggle-pinned-item', () => { }); it('can pin shield_rogue_5', async () => { - let result = await user.get('/user/toggle-pinned-item/marketGear/gear.flat.shield_rogue_5'); + const result = await user.get('/user/toggle-pinned-item/marketGear/gear.flat.shield_rogue_5'); expect(result.pinnedItems.length).to.be.eql(user.pinnedItems.length + 1); }); diff --git a/test/api/v3/integration/user/POST-move-pinned-item.js b/test/api/v3/integration/user/POST-move-pinned-item.js index 010e09d722..f7de9c65b2 100644 --- a/test/api/v3/integration/user/POST-move-pinned-item.js +++ b/test/api/v3/integration/user/POST-move-pinned-item.js @@ -2,7 +2,7 @@ import { generateUser, } from '../../../../helpers/api-integration/v3'; -import getOfficialPinnedItems from '../../../../../website/common/script/libs/getOfficialPinnedItems.js'; +import getOfficialPinnedItems from '../../../../../website/common/script/libs/getOfficialPinnedItems'; describe('POST /user/move-pinned-item/:path/move/to/:position', () => { let user; @@ -14,14 +14,15 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { officialPinnedItems = getOfficialPinnedItems(user); officialPinnedItemPaths = []; - // officialPinnedItems are returned in { type: ..., path:... } format but we just need the paths for testPinnedItemsOrder + // officialPinnedItems are returned in { type: ..., path:... } format + // but we just need the paths for testPinnedItemsOrder if (officialPinnedItems.length > 0) { officialPinnedItemPaths = officialPinnedItems.map(item => item.path); } }); it('adjusts the order of pinned items with no order mismatch', async () => { - let testPinnedItems = [ + const testPinnedItems = [ { type: 'armoire', path: 'armoire' }, { type: 'potion', path: 'potion' }, { type: 'marketGear', path: 'gear.flat.weapon_warrior_1' }, @@ -56,7 +57,7 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { pinnedItemsOrder: testPinnedItemsOrder, }); - let res = await user.post('/user/move-pinned-item/armoire/move/to/5'); + const res = await user.post('/user/move-pinned-item/armoire/move/to/5'); await user.sync(); expect(user.pinnedItemsOrder[5]).to.equal('armoire'); @@ -83,14 +84,14 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { }); it('adjusts the order of pinned items with order mismatch', async () => { - let testPinnedItems = [ + const testPinnedItems = [ { type: 'card', path: 'cardTypes.thankyou' }, { type: 'card', path: 'cardTypes.greeting' }, { type: 'potion', path: 'potion' }, { type: 'armoire', path: 'armoire' }, ]; - let testPinnedItemsOrder = [ + const testPinnedItemsOrder = [ 'armoire', 'potion', ]; @@ -100,7 +101,7 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { pinnedItemsOrder: testPinnedItemsOrder, }); - let res = await user.post('/user/move-pinned-item/armoire/move/to/1'); + const res = await user.post('/user/move-pinned-item/armoire/move/to/1'); await user.sync(); // The basic test @@ -115,7 +116,8 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { 'cardTypes.greeting', 'potion', ]; - // inAppRewards is used here and will by default put these seasonal items in the front like this: + // inAppRewards is used here and will by default + // put these seasonal items in the front like this: expectedResponse = officialPinnedItemPaths.concat(expectedResponse); // now put "armoire" in where we moved it: expectedResponse.splice(1, 0, 'armoire'); @@ -124,12 +126,12 @@ describe('POST /user/move-pinned-item/:path/move/to/:position', () => { }); it('cannot move pinned item that you do not have pinned', async () => { - let testPinnedItems = [ + const testPinnedItems = [ { type: 'potion', path: 'potion' }, { type: 'armoire', path: 'armoire' }, ]; - let testPinnedItemsOrder = [ + const testPinnedItemsOrder = [ 'armoire', 'potion', ]; diff --git a/test/api/v3/integration/user/POST-user_block.test.js b/test/api/v3/integration/user/POST-user_block.test.js index 51766eb51e..92fdacfb5e 100644 --- a/test/api/v3/integration/user/POST-user_block.test.js +++ b/test/api/v3/integration/user/POST-user_block.test.js @@ -25,7 +25,7 @@ describe('block user', () => { }); it('successfully', async () => { - let response = await user.post(`/user/block/${blockedUser2._id}`); + const response = await user.post(`/user/block/${blockedUser2._id}`); await user.sync(); expect(response).to.eql([blockedUser._id, blockedUser2._id]); expect(user.inbox.blocks.length).to.eql(2); diff --git a/test/api/v3/integration/user/POST-user_change-class.test.js b/test/api/v3/integration/user/POST-user_change-class.test.js index d4b4192f23..928cb77979 100644 --- a/test/api/v3/integration/user/POST-user_change-class.test.js +++ b/test/api/v3/integration/user/POST-user_change-class.test.js @@ -15,7 +15,7 @@ describe('POST /user/change-class', () => { // More tests in common code unit tests it('changes class', async () => { - let res = await user.post('/user/change-class?class=rogue'); + const res = await user.post('/user/change-class?class=rogue'); await user.sync(); expect(res).to.eql(JSON.parse( @@ -24,7 +24,7 @@ describe('POST /user/change-class', () => { stats: user.stats, flags: user.flags, items: user.items, - }) + }), )); }); }); diff --git a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js index 379d04a9ec..fdd30bac68 100644 --- a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js +++ b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js @@ -1,3 +1,6 @@ + +import { v4 as generateUUID } from 'uuid'; +import { find } from 'lodash'; import { generateUser, translate as t, @@ -6,9 +9,6 @@ import { generateChallenge, sleep, } from '../../../../helpers/api-integration/v3'; - -import { v4 as generateUUID } from 'uuid'; -import { find } from 'lodash'; import apiError from '../../../../../website/server/libs/apiError'; describe('POST /user/class/cast/:spellId', () => { @@ -19,28 +19,28 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if spell does not exist', async () => { - await user.update({'stats.class': 'rogue'}); - let spellId = 'invalidSpell'; + await user.update({ 'stats.class': 'rogue' }); + const spellId = 'invalidSpell'; await expect(user.post(`/user/class/cast/${spellId}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('spellNotFound', {spellId}), + message: apiError('spellNotFound', { spellId }), }); }); it('returns an error if spell does not exist in user\'s class', async () => { - let spellId = 'pickPocket'; + const spellId = 'pickPocket'; await expect(user.post(`/user/class/cast/${spellId}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('spellNotFound', {spellId}), + message: apiError('spellNotFound', { spellId }), }); }); it('returns an error if spell.mana > user.mana', async () => { - await user.update({'stats.class': 'rogue'}); + await user.update({ 'stats.class': 'rogue' }); await expect(user.post('/user/class/cast/backStab')) .to.eventually.be.rejected.and.eql({ code: 401, @@ -74,12 +74,12 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if spell.lvl > user.level', async () => { - await user.update({'stats.mp': 200, 'stats.class': 'wizard'}); + await user.update({ 'stats.mp': 200, 'stats.class': 'wizard' }); await expect(user.post('/user/class/cast/earth')) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('spellLevelTooHigh', {level: 13}), + message: t('spellLevelTooHigh', { level: 13 }), }); }); @@ -102,7 +102,7 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targetId is required but missing', async () => { - await user.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await expect(user.post('/user/class/cast/pickPocket')) .to.eventually.be.rejected.and.eql({ code: 400, @@ -112,7 +112,7 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targeted task doesn\'t exist', async () => { - await user.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await expect(user.post(`/user/class/cast/pickPocket?targetId=${generateUUID()}`)) .to.eventually.be.rejected.and.eql({ code: 404, @@ -122,13 +122,13 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if a challenge task was targeted', async () => { - let {group, groupLeader} = await createAndPopulateGroup(); - let challenge = await generateChallenge(groupLeader, group); + const { group, groupLeader } = await createAndPopulateGroup(); + const challenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: 'task text'}, + { type: 'habit', text: 'task text' }, ]); - await groupLeader.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await groupLeader.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await sleep(0.5); await groupLeader.sync(); await expect(groupLeader.post(`/user/class/cast/pickPocket?targetId=${groupLeader.tasksOrder.habits[0]}`)) @@ -140,19 +140,17 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if a group task was targeted', async () => { - let {group, groupLeader} = await createAndPopulateGroup(); + const { group, groupLeader } = await createAndPopulateGroup(); - let groupTask = await groupLeader.post(`/tasks/group/${group._id}`, { + const groupTask = await groupLeader.post(`/tasks/group/${group._id}`, { text: 'todo group', type: 'todo', }); await groupLeader.post(`/tasks/${groupTask._id}/assign/${groupLeader._id}`); - let memberTasks = await groupLeader.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === group._id; - }); + const memberTasks = await groupLeader.get('/tasks/user'); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === group._id); - await groupLeader.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await groupLeader.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await sleep(0.5); await groupLeader.sync(); @@ -165,23 +163,23 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targeted party member doesn\'t exist', async () => { - let {groupLeader} = await createAndPopulateGroup({ + const { groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'items.special.snowball': 3}); + await groupLeader.update({ 'items.special.snowball': 3 }); - let target = generateUUID(); + const target = generateUUID(); await expect(groupLeader.post(`/user/class/cast/snowball?targetId=${target}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: target}), + message: t('userWithIDNotFound', { userId: target }), }); }); it('returns an error if party does not exists', async () => { - await user.update({'items.special.snowball': 3}); + await user.update({ 'items.special.snowball': 3 }); await expect(user.post(`/user/class/cast/snowball?targetId=${generateUUID()}`)) .to.eventually.be.rejected.and.eql({ @@ -192,11 +190,11 @@ describe('POST /user/class/cast/:spellId', () => { }); it('send message in party chat if party && !spell.silent', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13}); + await groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13 }); await groupLeader.post('/user/class/cast/earth'); await sleep(1); @@ -207,17 +205,17 @@ describe('POST /user/class/cast/:spellId', () => { }); it('Ethereal Surge does not recover mp of other mages', async () => { - let group = await createAndPopulateGroup({ + const group = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 4, }); let promises = []; - promises.push(group.groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 20})); - promises.push(group.members[0].update({'stats.mp': 0, 'stats.class': 'warrior', 'stats.lvl': 20})); - promises.push(group.members[1].update({'stats.mp': 0, 'stats.class': 'wizard', 'stats.lvl': 20})); - promises.push(group.members[2].update({'stats.mp': 0, 'stats.class': 'rogue', 'stats.lvl': 20})); - promises.push(group.members[3].update({'stats.mp': 0, 'stats.class': 'healer', 'stats.lvl': 20})); + promises.push(group.groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 20 })); + promises.push(group.members[0].update({ 'stats.mp': 0, 'stats.class': 'warrior', 'stats.lvl': 20 })); + promises.push(group.members[1].update({ 'stats.mp': 0, 'stats.class': 'wizard', 'stats.lvl': 20 })); + promises.push(group.members[2].update({ 'stats.mp': 0, 'stats.class': 'rogue', 'stats.lvl': 20 })); + promises.push(group.members[3].update({ 'stats.mp': 0, 'stats.class': 'healer', 'stats.lvl': 20 })); await Promise.all(promises); await group.groupLeader.post('/user/class/cast/mpheal'); @@ -236,13 +234,13 @@ describe('POST /user/class/cast/:spellId', () => { }); it('cast bulk', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + let { group, groupLeader } = await createAndPopulateGroup({ // eslint-disable-line prefer-const groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13}); - await groupLeader.post('/user/class/cast/earth', {quantity: 2}); + await groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13 }); + await groupLeader.post('/user/class/cast/earth', { quantity: 2 }); await sleep(1); group = await groupLeader.get(`/groups/${group._id}`); @@ -252,33 +250,32 @@ describe('POST /user/class/cast/:spellId', () => { }); it('searing brightness does not affect challenge or group tasks', async () => { - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', }); - let groupTask = await user.post(`/tasks/group/${guild._id}`, { + const groupTask = await user.post(`/tasks/group/${guild._id}`, { text: 'todo group', type: 'todo', }); - await user.update({'stats.class': 'healer', 'stats.mp': 200, 'stats.lvl': 15}); + await user.update({ 'stats.class': 'healer', 'stats.mp': 200, 'stats.lvl': 15 }); await user.post(`/tasks/${groupTask._id}/assign/${user._id}`); await user.post('/user/class/cast/brightness'); await user.sync(); - let memberTasks = await user.get('/tasks/user'); + const memberTasks = await user.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === guild._id; - }); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === guild._id); - let userChallengeTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.challenge.id === challenge._id; - }); + const userChallengeTask = find( + memberTasks, + memberTask => memberTask.challenge.id === challenge._id, + ); expect(userChallengeTask).to.exist; expect(syncedGroupTask).to.exist; @@ -287,12 +284,12 @@ describe('POST /user/class/cast/:spellId', () => { }); it('increases both user\'s achievement values', async () => { - let party = await createAndPopulateGroup({ + const party = await createAndPopulateGroup({ members: 1, }); - let leader = party.groupLeader; - let recipient = party.members[0]; - await leader.update({'stats.gp': 10}); + const leader = party.groupLeader; + const recipient = party.members[0]; + await leader.update({ 'stats.gp': 10 }); await leader.post(`/user/class/cast/birthday?targetId=${recipient._id}`); await leader.sync(); await recipient.sync(); @@ -301,29 +298,29 @@ describe('POST /user/class/cast/:spellId', () => { }); it('only increases user\'s achievement one if target == caster', async () => { - await user.update({'stats.gp': 10}); + await user.update({ 'stats.gp': 10 }); await user.post(`/user/class/cast/birthday?targetId=${user._id}`); await user.sync(); expect(user.achievements.birthday).to.equal(1); }); it('passes correct target to spell when targetType === \'task\'', async () => { - await user.update({'stats.class': 'wizard', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'wizard', 'stats.lvl': 11 }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); - let result = await user.post(`/user/class/cast/fireball?targetId=${task._id}`); + const result = await user.post(`/user/class/cast/fireball?targetId=${task._id}`); expect(result.task._id).to.equal(task._id); }); it('passes correct target to spell when targetType === \'self\'', async () => { - await user.update({'stats.class': 'wizard', 'stats.lvl': 14, 'stats.mp': 50}); + await user.update({ 'stats.class': 'wizard', 'stats.lvl': 14, 'stats.mp': 50 }); - let result = await user.post('/user/class/cast/frost'); + const result = await user.post('/user/class/cast/frost'); expect(result.user.stats.mp).to.equal(10); }); diff --git a/test/api/v3/integration/user/POST-user_custom-day-start.test.js b/test/api/v3/integration/user/POST-user_custom-day-start.test.js index 868b9ae91d..158c3667ae 100644 --- a/test/api/v3/integration/user/POST-user_custom-day-start.test.js +++ b/test/api/v3/integration/user/POST-user_custom-day-start.test.js @@ -5,7 +5,7 @@ import { } from '../../../../helpers/api-integration/v3'; let user; -let endpoint = '/user/custom-day-start'; +const endpoint = '/user/custom-day-start'; describe('POST /user/custom-day-start', () => { beforeEach(async () => { @@ -22,9 +22,9 @@ describe('POST /user/custom-day-start', () => { }); it('sets lastCron to the current time to prevent an unexpected cron', async () => { - let oldCron = moment().subtract(7, 'hours'); + const oldCron = moment().subtract(7, 'hours'); - await user.update({lastCron: oldCron}); + await user.update({ lastCron: oldCron }); await user.post(endpoint, { dayStart: 1 }); await user.sync(); @@ -32,7 +32,7 @@ describe('POST /user/custom-day-start', () => { }); it('returns a confirmation message', async () => { - let {message} = await user.post(endpoint, { dayStart: 1 }); + const { message } = await user.post(endpoint, { dayStart: 1 }); expect(message).to.eql(t('customDayStartHasChanged')); }); @@ -41,7 +41,7 @@ describe('POST /user/custom-day-start', () => { await expect(user.post(endpoint, { dayStart: 'foo' })) .to.eventually.be.rejected; - await expect(user.post(endpoint, { dayStart: 24})) + await expect(user.post(endpoint, { dayStart: 24 })) .to.eventually.be.rejected; }); }); diff --git a/test/api/v3/integration/user/POST-user_disable-classes.test.js b/test/api/v3/integration/user/POST-user_disable-classes.test.js index 0632a8adc7..30763e09af 100644 --- a/test/api/v3/integration/user/POST-user_disable-classes.test.js +++ b/test/api/v3/integration/user/POST-user_disable-classes.test.js @@ -12,7 +12,7 @@ describe('POST /user/disable-classes', () => { // More tests in common code unit tests it('disable classes', async () => { - let res = await user.post('/user/disable-classes'); + const res = await user.post('/user/disable-classes'); await user.sync(); expect(res).to.eql(JSON.parse( @@ -20,7 +20,7 @@ describe('POST /user/disable-classes', () => { preferences: user.preferences, stats: user.stats, flags: user.flags, - }) + }), )); }); }); diff --git a/test/api/v3/integration/user/POST-user_equip_type_key.test.js b/test/api/v3/integration/user/POST-user_equip_type_key.test.js index c5cde777df..aed598d583 100644 --- a/test/api/v3/integration/user/POST-user_equip_type_key.test.js +++ b/test/api/v3/integration/user/POST-user_equip_type_key.test.js @@ -32,7 +32,7 @@ describe('POST /user/equip/:type/:key', () => { }); await user.post('/user/equip/equipped/weapon_warrior_1'); - let res = await user.post('/user/equip/equipped/weapon_warrior_2'); + const res = await user.post('/user/equip/equipped/weapon_warrior_2'); await user.sync(); expect(res).to.eql(JSON.parse(JSON.stringify(user.items))); diff --git a/test/api/v3/integration/user/POST-user_feed_pet_food.test.js b/test/api/v3/integration/user/POST-user_feed_pet_food.test.js index 5026416795..c56be573c3 100644 --- a/test/api/v3/integration/user/POST-user_feed_pet_food.test.js +++ b/test/api/v3/integration/user/POST-user_feed_pet_food.test.js @@ -1,5 +1,6 @@ /* eslint-disable camelcase */ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, @@ -7,7 +8,6 @@ import { sleep, } from '../../../../helpers/api-integration/v3'; import content from '../../../../../website/common/script/content'; -import { v4 as generateUUID } from 'uuid'; describe('POST /user/feed/:pet/:food', () => { let user; @@ -24,10 +24,10 @@ describe('POST /user/feed/:pet/:food', () => { 'items.food.Milk': 2, }); - let food = content.food.Milk; - let pet = content.petInfo['Wolf-Base']; + const food = content.food.Milk; + const pet = content.petInfo['Wolf-Base']; - let res = await user.post('/user/feed/Wolf-Base/Milk'); + const res = await user.post('/user/feed/Wolf-Base/Milk'); await user.sync(); expect(res).to.eql({ data: user.items.pets['Wolf-Base'], @@ -51,7 +51,7 @@ describe('POST /user/feed/:pet/:food', () => { }); it('sends user activity webhook when a new mount is raised', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -66,12 +66,13 @@ describe('POST /user/feed/:pet/:food', () => { 'items.pets.Wolf-Base': 49, 'items.food.Milk': 2, }); - let res = await user.post('/user/feed/Wolf-Base/Milk'); + const res = await user.post('/user/feed/Wolf-Base/Milk'); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); + expect(user.achievements.allYourBase).to.not.equal(true); expect(body.type).to.eql('mountRaised'); expect(body.pet).to.eql('Wolf-Base'); expect(body.message).to.eql(res.message); diff --git a/test/api/v3/integration/user/POST-user_hatch_egg_hatchingPotion.test.js b/test/api/v3/integration/user/POST-user_hatch_egg_hatchingPotion.test.js index 2aaa54e5e5..35fb766f38 100644 --- a/test/api/v3/integration/user/POST-user_hatch_egg_hatchingPotion.test.js +++ b/test/api/v3/integration/user/POST-user_hatch_egg_hatchingPotion.test.js @@ -1,10 +1,10 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, server, sleep, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; describe('POST /user/hatch/:egg/:hatchingPotion', () => { let user; @@ -20,11 +20,12 @@ describe('POST /user/hatch/:egg/:hatchingPotion', () => { 'items.eggs.Wolf': 1, 'items.hatchingPotions.Base': 1, }); - let res = await user.post('/user/hatch/Wolf/Base'); + const res = await user.post('/user/hatch/Wolf/Base'); await user.sync(); expect(user.items.pets['Wolf-Base']).to.equal(5); expect(user.items.eggs.Wolf).to.equal(0); expect(user.items.hatchingPotions.Base).to.equal(0); + expect(user.achievements.backToBasics).to.not.equal(true); expect(res).to.eql({ message: t('messageHatched'), @@ -42,7 +43,7 @@ describe('POST /user/hatch/:egg/:hatchingPotion', () => { }); it('sends user activity webhook when a new pet is hatched', async () => { - let uuid = generateUUID(); + const uuid = generateUUID(); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, @@ -57,11 +58,11 @@ describe('POST /user/hatch/:egg/:hatchingPotion', () => { 'items.eggs.Wolf': 1, 'items.hatchingPotions.Base': 1, }); - let res = await user.post('/user/hatch/Wolf/Base'); + const res = await user.post('/user/hatch/Wolf/Base'); await sleep(); - let body = server.getWebhookData(uuid); + const body = server.getWebhookData(uuid); expect(body.type).to.eql('petHatched'); expect(body.pet).to.eql('Wolf-Base'); diff --git a/test/api/v3/integration/user/POST-user_open_mystery_item.test.js b/test/api/v3/integration/user/POST-user_open_mystery_item.test.js index 1c81cfe439..9fbd3cadcc 100644 --- a/test/api/v3/integration/user/POST-user_open_mystery_item.test.js +++ b/test/api/v3/integration/user/POST-user_open_mystery_item.test.js @@ -6,16 +6,16 @@ import content from '../../../../../website/common/script/content/index'; describe('POST /user/open-mystery-item', () => { let user; - let mysteryItemKey = 'eyewear_special_summerRogue'; - let mysteryItemIndex = content.gear.flat[mysteryItemKey].index; - let mysteryItemType = content.gear.flat[mysteryItemKey].type; - let mysteryItemText = content.gear.flat[mysteryItemKey].text(); + const mysteryItemKey = 'eyewear_special_summerRogue'; + const mysteryItemIndex = content.gear.flat[mysteryItemKey].index; + const mysteryItemType = content.gear.flat[mysteryItemKey].type; + const mysteryItemText = content.gear.flat[mysteryItemKey].text(); beforeEach(async () => { user = await generateUser({ 'purchased.plan.mysteryItems': [mysteryItemKey], notifications: [ - {type: 'NEW_MYSTERY_ITEMS', data: { items: [mysteryItemKey] }}, + { type: 'NEW_MYSTERY_ITEMS', data: { items: [mysteryItemKey] } }, ], }); }); @@ -24,7 +24,7 @@ describe('POST /user/open-mystery-item', () => { it('opens a mystery item', async () => { expect(user.notifications.length).to.equal(1); - let response = await user.post('/user/open-mystery-item'); + const response = await user.post('/user/open-mystery-item'); await user.sync(); expect(user.notifications.length).to.equal(0); diff --git a/test/api/v3/integration/user/POST-user_purchase.test.js b/test/api/v3/integration/user/POST-user_purchase.test.js index b1d3749256..502bcb3790 100644 --- a/test/api/v3/integration/user/POST-user_purchase.test.js +++ b/test/api/v3/integration/user/POST-user_purchase.test.js @@ -6,8 +6,8 @@ import { describe('POST /user/purchase/:type/:key', () => { let user; - let type = 'hatchingPotions'; - let key = 'Base'; + const type = 'hatchingPotions'; + const key = 'Base'; beforeEach(async () => { user = await generateUser({ @@ -34,7 +34,7 @@ describe('POST /user/purchase/:type/:key', () => { }); it('can convert gold to gems if subscribed', async () => { - let oldBalance = user.balance; + const oldBalance = user.balance; await user.update({ 'purchased.plan.customerId': 'group-plan', 'stats.gp': 1000, @@ -45,7 +45,7 @@ describe('POST /user/purchase/:type/:key', () => { }); it('leader can convert gold to gems even if the group plan prevents it', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'test', type: 'guild', @@ -57,7 +57,7 @@ describe('POST /user/purchase/:type/:key', () => { 'purchased.plan.customerId': 123, }); await groupLeader.sync(); - let oldBalance = groupLeader.balance; + const oldBalance = groupLeader.balance; await groupLeader.update({ 'purchased.plan.customerId': 'group-plan', @@ -70,7 +70,7 @@ describe('POST /user/purchase/:type/:key', () => { }); it('cannot convert gold to gems if the group plan prevents it', async () => { - let { group, members } = await createAndPopulateGroup({ + const { group, members } = await createAndPopulateGroup({ groupDetails: { name: 'test', type: 'guild', @@ -82,7 +82,7 @@ describe('POST /user/purchase/:type/:key', () => { 'leaderOnly.getGems': true, 'purchased.plan.customerId': 123, }); - let oldBalance = members[0].balance; + const oldBalance = members[0].balance; await members[0].update({ 'purchased.plan.customerId': 'group-plan', @@ -101,19 +101,19 @@ describe('POST /user/purchase/:type/:key', () => { describe('bulk purchasing', () => { it('purchases a gem item', async () => { - await user.post(`/user/purchase/${type}/${key}`, {quantity: 2}); + await user.post(`/user/purchase/${type}/${key}`, { quantity: 2 }); await user.sync(); expect(user.items[type][key]).to.equal(2); }); it('can convert gold to gems if subscribed', async () => { - let oldBalance = user.balance; + const oldBalance = user.balance; await user.update({ 'purchased.plan.customerId': 'group-plan', 'stats.gp': 1000, }); - await user.post('/user/purchase/gems/gem', {quantity: 2}); + await user.post('/user/purchase/gems/gem', { quantity: 2 }); await user.sync(); expect(user.balance).to.equal(oldBalance + 0.50); }); diff --git a/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js b/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js index 721eb69aa9..3133354b71 100644 --- a/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js +++ b/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js @@ -15,7 +15,7 @@ describe('POST /user/purchase-hourglass/:type/:key', () => { // More tests in common code unit tests it('buys an hourglass pet', async () => { - let response = await user.post('/user/purchase-hourglass/pets/MantisShrimp-Base'); + const response = await user.post('/user/purchase-hourglass/pets/MantisShrimp-Base'); await user.sync(); expect(response.message).to.eql(t('hourglassPurchase')); @@ -24,7 +24,7 @@ describe('POST /user/purchase-hourglass/:type/:key', () => { }); it('buys an hourglass quest', async () => { - let response = await user.post('/user/purchase-hourglass/quests/robot'); + const response = await user.post('/user/purchase-hourglass/quests/robot'); await user.sync(); expect(response.message).to.eql(t('hourglassPurchase')); @@ -33,7 +33,7 @@ describe('POST /user/purchase-hourglass/:type/:key', () => { }); it('buys multiple hourglass quests', async () => { - let response = await user.post('/user/purchase-hourglass/quests/robot', {quantity: 2}); + const response = await user.post('/user/purchase-hourglass/quests/robot', { quantity: 2 }); await user.sync(); expect(response.message).to.eql(t('hourglassPurchase')); diff --git a/test/api/v3/integration/user/POST-user_push_device.test.js b/test/api/v3/integration/user/POST-user_push_device.test.js index a0c302de71..06b5b9d229 100644 --- a/test/api/v3/integration/user/POST-user_push_device.test.js +++ b/test/api/v3/integration/user/POST-user_push_device.test.js @@ -5,15 +5,15 @@ import { describe('POST /user/push-devices', () => { let user; - let regId = '10'; - let type = 'ios'; + const regId = '10'; + const type = 'ios'; beforeEach(async () => { user = await generateUser(); }); it('returns an error when regId is not provided', async () => { - await expect(user.post('/user/push-devices'), {type}) + await expect(user.post('/user/push-devices'), { type }) .to.eventually.be.rejected.and.to.eql({ code: 400, error: 'BadRequest', @@ -22,7 +22,7 @@ describe('POST /user/push-devices', () => { }); it('returns an error when type is not provided', async () => { - await expect(user.post('/user/push-devices', {regId})) + await expect(user.post('/user/push-devices', { regId })) .to.eventually.be.rejected.and.to.eql({ code: 400, error: 'BadRequest', @@ -31,7 +31,7 @@ describe('POST /user/push-devices', () => { }); it('returns an error when type is not valid', async () => { - await expect(user.post('/user/push-devices', {regId, type: 'invalid'})) + await expect(user.post('/user/push-devices', { regId, type: 'invalid' })) .to.eventually.be.rejected.and.to.eql({ code: 400, error: 'BadRequest', @@ -40,8 +40,8 @@ describe('POST /user/push-devices', () => { }); it('fails silently if user already has the push device', async () => { - await user.post('/user/push-devices', {type, regId}); - const response = await user.post('/user/push-devices', {type, regId}); + await user.post('/user/push-devices', { type, regId }); + const response = await user.post('/user/push-devices', { type, regId }); await user.sync(); expect(response.message).to.equal(t('pushDeviceAdded')); @@ -52,7 +52,7 @@ describe('POST /user/push-devices', () => { }); it('adds a push device to the user', async () => { - const response = await user.post('/user/push-devices', {type, regId}); + const response = await user.post('/user/push-devices', { type, regId }); await user.sync(); expect(response.message).to.equal(t('pushDeviceAdded')); @@ -61,15 +61,4 @@ describe('POST /user/push-devices', () => { expect(user.pushDevices[0].type).to.equal(type); expect(user.pushDevices[0].regId).to.equal(regId); }); - - it('removes a push device to the user', async () => { - await user.post('/user/push-devices', {type, regId}); - - const response = await user.del(`/user/push-devices/${regId}`); - await user.sync(); - - expect(response.message).to.equal(t('pushDeviceRemoved')); - expect(response.data[0]).to.not.exist; - expect(user.pushDevices[0]).to.not.exist; - }); }); diff --git a/test/api/v3/integration/user/POST-user_read_card.test.js b/test/api/v3/integration/user/POST-user_read_card.test.js index bb8f388db2..c04d24c734 100644 --- a/test/api/v3/integration/user/POST-user_read_card.test.js +++ b/test/api/v3/integration/user/POST-user_read_card.test.js @@ -5,7 +5,7 @@ import { describe('POST /user/read-card/:cardType', () => { let user; - let cardType = 'greeting'; + const cardType = 'greeting'; beforeEach(async () => { user = await generateUser(); @@ -28,17 +28,17 @@ describe('POST /user/read-card/:cardType', () => { 'flags.cardReceived': true, notifications: [{ type: 'CARD_RECEIVED', - data: {card: cardType}, + data: { card: cardType }, }], }); await user.sync(); expect(user.notifications.length).to.equal(1); - let response = await user.post(`/user/read-card/${cardType}`); + const response = await user.post(`/user/read-card/${cardType}`); await user.sync(); - expect(response.message).to.equal(t('readCard', {cardType})); + expect(response.message).to.equal(t('readCard', { cardType })); expect(user.items.special[`${cardType}Received`]).to.be.empty; expect(user.flags.cardReceived).to.be.false; expect(user.notifications.length).to.equal(0); diff --git a/test/api/v3/integration/user/POST-user_rebirth.test.js b/test/api/v3/integration/user/POST-user_rebirth.test.js index 6182091ad7..87826148f4 100644 --- a/test/api/v3/integration/user/POST-user_rebirth.test.js +++ b/test/api/v3/integration/user/POST-user_rebirth.test.js @@ -28,7 +28,7 @@ describe('POST /user/rebirth', () => { balance: 1.5, }); - let daily = await generateDaily({ + const daily = await generateDaily({ text: 'test habit', type: 'daily', value: 1, @@ -36,21 +36,21 @@ describe('POST /user/rebirth', () => { userId: user._id, }); - let reward = await generateReward({ + const reward = await generateReward({ text: 'test reward', type: 'reward', value: 1, userId: user._id, }); - let response = await user.post('/user/rebirth'); + const response = await user.post('/user/rebirth'); await user.sync(); expect(user.notifications.length).to.equal(1); expect(user.notifications[0].type).to.equal('REBIRTH_ACHIEVEMENT'); - let updatedDaily = await user.get(`/tasks/${daily._id}`); - let updatedReward = await user.get(`/tasks/${reward._id}`); + const updatedDaily = await user.get(`/tasks/${daily._id}`); + const updatedReward = await user.get(`/tasks/${reward._id}`); expect(response.message).to.equal(t('rebirthComplete')); expect(updatedDaily.streak).to.equal(0); diff --git a/test/api/v3/integration/user/POST-user_release_both.test.js b/test/api/v3/integration/user/POST-user_release_both.test.js index bbd11587c0..8519f1b359 100644 --- a/test/api/v3/integration/user/POST-user_release_both.test.js +++ b/test/api/v3/integration/user/POST-user_release_both.test.js @@ -6,21 +6,21 @@ import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-both', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; const loadPets = () => { - let pets = {}; - for (let p in content.pets) { + const pets = {}; + Object.keys(content.pets).forEach(p => { pets[p] = content.pets[p]; pets[p] = 5; - } + }); return pets; }; const loadMounts = () => { - let mounts = {}; - for (let m in content.pets) { + const mounts = {}; + Object.keys(content.pets).forEach(m => { mounts[m] = content.pets[m]; mounts[m] = true; - } + }); return mounts; }; @@ -49,7 +49,7 @@ describe('POST /user/release-both', () => { it('grants triad bingo with gems', async () => { await user.update(); - let response = await user.post('/user/release-both'); + const response = await user.post('/user/release-both'); await user.sync(); expect(response.message).to.equal(t('mountsAndPetsReleased')); diff --git a/test/api/v3/integration/user/POST-user_release_mounts.test.js b/test/api/v3/integration/user/POST-user_release_mounts.test.js index 728aa99c8c..10403028c3 100644 --- a/test/api/v3/integration/user/POST-user_release_mounts.test.js +++ b/test/api/v3/integration/user/POST-user_release_mounts.test.js @@ -6,14 +6,14 @@ import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-mounts', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; const loadMounts = () => { - let mounts = {}; - for (let m in content.pets) { + const mounts = {}; + Object.keys(content.pets).forEach(m => { mounts[m] = content.pets[m]; mounts[m] = true; - } + }); return mounts; }; @@ -40,7 +40,7 @@ describe('POST /user/release-mounts', () => { balance: 1, }); - let response = await user.post('/user/release-mounts'); + const response = await user.post('/user/release-mounts'); await user.sync(); expect(response.message).to.equal(t('mountsReleased')); diff --git a/test/api/v3/integration/user/POST-user_release_pets.test.js b/test/api/v3/integration/user/POST-user_release_pets.test.js index 35b8126a82..96834cc044 100644 --- a/test/api/v3/integration/user/POST-user_release_pets.test.js +++ b/test/api/v3/integration/user/POST-user_release_pets.test.js @@ -6,14 +6,14 @@ import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-pets', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; const loadPets = () => { - let pets = {}; - for (let p in content.pets) { + const pets = {}; + Object.keys(content.pets).forEach(p => { pets[p] = content.pets[p]; pets[p] = 5; - } + }); return pets; }; @@ -40,7 +40,7 @@ describe('POST /user/release-pets', () => { balance: 1, }); - let response = await user.post('/user/release-pets'); + const response = await user.post('/user/release-pets'); await user.sync(); expect(response.message).to.equal(t('petsReleased')); diff --git a/test/api/v3/integration/user/POST-user_reroll.test.js b/test/api/v3/integration/user/POST-user_reroll.test.js index 29774d1239..37d4b6eb6d 100644 --- a/test/api/v3/integration/user/POST-user_reroll.test.js +++ b/test/api/v3/integration/user/POST-user_reroll.test.js @@ -28,24 +28,24 @@ describe('POST /user/reroll', () => { balance: 2, }); - let daily = await generateDaily({ + const daily = await generateDaily({ text: 'test habit', type: 'daily', userId: user._id, }); - let reward = await generateReward({ + const reward = await generateReward({ text: 'test reward', type: 'reward', value: 1, userId: user._id, }); - let response = await user.post('/user/reroll'); + const response = await user.post('/user/reroll'); await user.sync(); - let updatedDaily = await user.get(`/tasks/${daily._id}`); - let updatedReward = await user.get(`/tasks/${reward._id}`); + const updatedDaily = await user.get(`/tasks/${daily._id}`); + const updatedReward = await user.get(`/tasks/${reward._id}`); expect(response.message).to.equal(t('fortifyComplete')); expect(updatedDaily.value).to.equal(0); diff --git a/test/api/v3/integration/user/POST-user_reset.test.js b/test/api/v3/integration/user/POST-user_reset.test.js index 902dd7cd65..389b840d92 100644 --- a/test/api/v3/integration/user/POST-user_reset.test.js +++ b/test/api/v3/integration/user/POST-user_reset.test.js @@ -1,10 +1,10 @@ +import { find } from 'lodash'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../../helpers/api-integration/v3'; -import { find } from 'lodash'; describe('POST /user/reset', () => { let user; @@ -16,7 +16,7 @@ describe('POST /user/reset', () => { // More tests in common code unit tests it('resets user\'s habits', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -34,7 +34,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s dailys', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', }); @@ -52,7 +52,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s todos', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test todo', type: 'todo', }); @@ -70,7 +70,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s rewards', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', }); @@ -88,15 +88,15 @@ describe('POST /user/reset', () => { }); it('does not delete challenge or group tasks', async () => { - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', }); - let groupTask = await user.post(`/tasks/group/${guild._id}`, { + const groupTask = await user.post(`/tasks/group/${guild._id}`, { text: 'todo group', type: 'todo', }); @@ -105,15 +105,14 @@ describe('POST /user/reset', () => { await user.post('/user/reset'); await user.sync(); - let memberTasks = await user.get('/tasks/user'); + const memberTasks = await user.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === guild._id; - }); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === guild._id); - let userChallengeTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.challenge.id === challenge._id; - }); + const userChallengeTask = find( + memberTasks, + memberTask => memberTask.challenge.id === challenge._id, + ); expect(userChallengeTask).to.exist; expect(syncedGroupTask).to.exist; diff --git a/test/api/v3/integration/user/POST-user_revive.test.js b/test/api/v3/integration/user/POST-user_revive.test.js index 6ba85ac87f..e042dfd9f7 100644 --- a/test/api/v3/integration/user/POST-user_revive.test.js +++ b/test/api/v3/integration/user/POST-user_revive.test.js @@ -8,7 +8,7 @@ describe('POST /user/revive', () => { beforeEach(async () => { user = await generateUser({ - 'user.items.gear.owned': {weaponKey: true}, + 'user.items.gear.owned': { weaponKey: true }, }); }); diff --git a/test/api/v3/integration/user/POST-user_sell.test.js b/test/api/v3/integration/user/POST-user_sell.test.js index c9a0fdba64..896e9bf280 100644 --- a/test/api/v3/integration/user/POST-user_sell.test.js +++ b/test/api/v3/integration/user/POST-user_sell.test.js @@ -6,8 +6,8 @@ import content from '../../../../../website/common/script/content'; describe('POST /user/sell/:type/:key', () => { let user; - let type = 'eggs'; - let key = 'Wolf'; + const type = 'eggs'; + const key = 'Wolf'; beforeEach(async () => { user = await generateUser(); @@ -20,7 +20,7 @@ describe('POST /user/sell/:type/:key', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userItemsKeyNotFound', {type}), + message: t('userItemsKeyNotFound', { type }), }); }); diff --git a/test/api/v3/integration/user/POST-user_sleep.test.js b/test/api/v3/integration/user/POST-user_sleep.test.js index 292b77e9db..9afb4a1956 100644 --- a/test/api/v3/integration/user/POST-user_sleep.test.js +++ b/test/api/v3/integration/user/POST-user_sleep.test.js @@ -13,12 +13,12 @@ describe('POST /user/sleep', () => { // More tests in common code unit tests it('toggles sleep status', async () => { - let res = await user.post('/user/sleep'); + const res = await user.post('/user/sleep'); expect(res).to.eql(true); await user.sync(); expect(user.preferences.sleep).to.be.true; - let res2 = await user.post('/user/sleep'); + const res2 = await user.post('/user/sleep'); expect(res2).to.eql(false); await user.sync(); expect(user.preferences.sleep).to.be.false; diff --git a/test/api/v3/integration/user/POST-user_unlock.js b/test/api/v3/integration/user/POST-user_unlock.js index 6dbdb3c1b1..4418af54c3 100644 --- a/test/api/v3/integration/user/POST-user_unlock.js +++ b/test/api/v3/integration/user/POST-user_unlock.js @@ -5,9 +5,9 @@ import { describe('POST /user/unlock', () => { let user; - let unlockPath = 'shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie'; - let unlockCost = 1.25; - let usersStartingGems = 5; + const unlockPath = 'shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie'; + const unlockCost = 1.25; + const usersStartingGems = 5; beforeEach(async () => { user = await generateUser(); @@ -28,7 +28,7 @@ describe('POST /user/unlock', () => { await user.update({ balance: usersStartingGems, }); - let response = await user.post(`/user/unlock?path=${unlockPath}`); + const response = await user.post(`/user/unlock?path=${unlockPath}`); await user.sync(); expect(response.message).to.equal(t('unlocked')); diff --git a/test/api/v3/integration/user/PUT-user.test.js b/test/api/v3/integration/user/PUT-user.test.js index bef5ec25d0..b1f576a791 100644 --- a/test/api/v3/integration/user/PUT-user.test.js +++ b/test/api/v3/integration/user/PUT-user.test.js @@ -1,9 +1,9 @@ +import { each, get } from 'lodash'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { each, get } from 'lodash'; describe('PUT /user', () => { let user; @@ -40,7 +40,7 @@ describe('PUT /user', () => { }); it('update tags', async () => { - let userTags = user.tags; + const userTags = user.tags; await user.put('/user', { tags: [...user.tags, { @@ -98,20 +98,20 @@ describe('PUT /user', () => { }); context('Top Level Protected Operations', () => { - let protectedOperations = { - 'gem balance': {balance: 100}, - auth: {'auth.blocked': true, 'auth.timestamps.created': new Date()}, - contributor: {'contributor.level': 9, 'contributor.admin': true, 'contributor.text': 'some text'}, - backer: {'backer.tier': 10, 'backer.npc': 'Bilbo'}, - subscriptions: {'purchased.plan.extraMonths': 500, 'purchased.plan.consecutive.trinkets': 1000}, - 'customization gem purchases': {'purchased.background.tavern': true, 'purchased.skin.bear': true}, - notifications: [{type: 123}], - webhooks: {webhooks: [{url: 'https://foobar.com'}]}, + const protectedOperations = { + 'gem balance': { balance: 100 }, + auth: { 'auth.blocked': true, 'auth.timestamps.created': new Date() }, + contributor: { 'contributor.level': 9, 'contributor.admin': true, 'contributor.text': 'some text' }, + backer: { 'backer.tier': 10, 'backer.npc': 'Bilbo' }, + subscriptions: { 'purchased.plan.extraMonths': 500, 'purchased.plan.consecutive.trinkets': 1000 }, + 'customization gem purchases': { 'purchased.background.tavern': true, 'purchased.skin.bear': true }, + notifications: [{ type: 123 }], + webhooks: { webhooks: [{ url: 'https://foobar.com' }] }, }; each(protectedOperations, (data, testName) => { it(`does not allow updating ${testName}`, async () => { - let errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); + const errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); await expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({ code: 401, @@ -123,17 +123,17 @@ describe('PUT /user', () => { }); context('Sub-Level Protected Operations', () => { - let protectedOperations = { - 'class stat': {'stats.class': 'wizard'}, - 'flags unless whitelisted': {'flags.dropsEnabled': true}, - webhooks: {'preferences.webhooks': [1, 2, 3]}, - sleep: {'preferences.sleep': true}, - 'disable classes': {'preferences.disableClasses': true}, + const protectedOperations = { + 'class stat': { 'stats.class': 'wizard' }, + 'flags unless whitelisted': { 'flags.dropsEnabled': true }, + webhooks: { 'preferences.webhooks': [1, 2, 3] }, + sleep: { 'preferences.sleep': true }, + 'disable classes': { 'preferences.disableClasses': true }, }; each(protectedOperations, (data, testName) => { it(`does not allow updating ${testName}`, async () => { - let errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); + const errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); await expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({ code: 401, @@ -145,7 +145,7 @@ describe('PUT /user', () => { }); context('Default Appearance Preferences', () => { - let testCases = { + const testCases = { shirt: 'yellow', skin: 'ddc994', 'hair.color': 'blond', @@ -160,14 +160,14 @@ describe('PUT /user', () => { update[`preferences.${type}`] = item; it(`updates user with ${type} that is a default`, async () => { - let dbUpdate = {}; + const dbUpdate = {}; dbUpdate[`purchased.${type}.${item}`] = true; await user.update(dbUpdate); // Sanity checks to make sure user is not already equipped with item expect(get(user.preferences, type)).to.not.eql(item); - let updatedUser = await user.put('/user', update); + const updatedUser = await user.put('/user', update); expect(get(updatedUser.preferences, type)).to.eql(item); }); @@ -189,7 +189,7 @@ describe('PUT /user', () => { 'preferences.hair.beard': 3, }); - let updatedUser = await user.put('/user', { + const updatedUser = await user.put('/user', { 'preferences.hair.beard': 0, }); @@ -202,7 +202,7 @@ describe('PUT /user', () => { 'preferences.hair.mustache': 2, }); - let updatedUser = await user.put('/user', { + const updatedUser = await user.put('/user', { 'preferences.hair.mustache': 0, }); @@ -211,7 +211,7 @@ describe('PUT /user', () => { }); context('Purchasable Appearance Preferences', () => { - let testCases = { + const testCases = { background: 'volcano', shirt: 'convict', skin: 'cactus', @@ -229,19 +229,19 @@ describe('PUT /user', () => { await expect(user.put('/user', update)).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('mustPurchaseToSet', {val: item, key: `preferences.${type}`}), + message: t('mustPurchaseToSet', { val: item, key: `preferences.${type}` }), }); }); it(`updates user with ${type} user does own`, async () => { - let dbUpdate = {}; + const dbUpdate = {}; dbUpdate[`purchased.${type}.${item}`] = true; await user.update(dbUpdate); // Sanity check to make sure user is not already equipped with item expect(get(user.preferences, type)).to.not.eql(item); - let updatedUser = await user.put('/user', update); + const updatedUser = await user.put('/user', update); expect(get(updatedUser.preferences, type)).to.eql(item); }); diff --git a/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js b/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js index 55c5522322..3f25404d50 100644 --- a/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js +++ b/test/api/v3/integration/user/auth/DELETE-user_auth_social_network.test.js @@ -38,7 +38,7 @@ describe('DELETE social registration', () => { 'auth.facebook.id': 'some-fb-id', }); - let response = await user.del('/user/auth/social/facebook'); + const response = await user.del('/user/auth/social/facebook'); expect(response).to.eql({}); await user.sync(); expect(user.auth.facebook).to.be.undefined; @@ -51,7 +51,7 @@ describe('DELETE social registration', () => { 'auth.local': { ok: true }, }); - let response = await user.del('/user/auth/social/facebook'); + const response = await user.del('/user/auth/social/facebook'); expect(response).to.eql({}); await user.sync(); expect(user.auth.facebook).to.be.undefined; @@ -76,7 +76,7 @@ describe('DELETE social registration', () => { 'auth.google.id': 'some-google-id', }); - let response = await user.del('/user/auth/social/google'); + const response = await user.del('/user/auth/social/google'); expect(response).to.eql({}); await user.sync(); expect(user.auth.google).to.be.undefined; @@ -89,7 +89,7 @@ describe('DELETE social registration', () => { 'auth.local': { ok: true }, }); - let response = await user.del('/user/auth/social/google'); + const response = await user.del('/user/auth/social/google'); expect(response).to.eql({}); await user.sync(); expect(user.auth.goodl).to.be.undefined; diff --git a/test/api/v3/integration/user/auth/GET-auth_reset-password-set-new-one.js b/test/api/v3/integration/user/auth/GET-auth_reset-password-set-new-one.js index 760041b529..b805c4be02 100644 --- a/test/api/v3/integration/user/auth/GET-auth_reset-password-set-new-one.js +++ b/test/api/v3/integration/user/auth/GET-auth_reset-password-set-new-one.js @@ -1,18 +1,18 @@ -import { - encrypt, -} from '../../../../../../website/server/libs/encryption'; import moment from 'moment'; +import superagent from 'superagent'; +import nconf from 'nconf'; import { generateUser, } from '../../../../../helpers/api-integration/v3'; -import superagent from 'superagent'; -import nconf from 'nconf'; +import { + encrypt, +} from '../../../../../../website/server/libs/encryption'; const API_TEST_SERVER_PORT = nconf.get('PORT'); // @TODO skipped because on travis the client isn't available and the redirect fails xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { - let endpoint = `http://localhost:${API_TEST_SERVER_PORT}/static/user/auth/local/reset-password-set-new-one`; + const endpoint = `http://localhost:${API_TEST_SERVER_PORT}/static/user/auth/local/reset-password-set-new-one`; // Tests to validate the validatePasswordResetCodeAndFindUser function @@ -27,9 +27,9 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { }); it('renders an error page if the code cannot be decrypted', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = JSON.stringify({ // not encrypted + const code = JSON.stringify({ // not encrypted userId: user._id, expiresAt: new Date(), }); @@ -38,11 +38,11 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { }); it('renders an error page if the code is expired', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().subtract({minutes: 1}), + expiresAt: moment().subtract({ minutes: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, @@ -53,9 +53,9 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { }); it('renders an error page if the user does not exist', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: Date.now().toString(), - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); const res = await superagent.get(`${endpoint}?code=${code}`); @@ -63,11 +63,11 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { }); it('renders an error page if the user has no local auth', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ auth: 'not an object with valid fields', @@ -78,11 +78,11 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { }); it('renders an error page if the code doesn\'t match the one saved at user.auth.passwordResetCode', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': 'invalid', @@ -95,19 +95,18 @@ xdescribe('GET /user/auth/local/reset-password-set-new-one', () => { // it('returns the password reset page if the password reset code is valid', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, }); - let res = await superagent.get(`${endpoint}?code=${code}`); + const res = await superagent.get(`${endpoint}?code=${code}`); expect(res.req.path.indexOf('hasError=false') !== -1).to.equal(true); expect(res.req.path.indexOf('code=') !== -1).to.equal(true); }); }); - diff --git a/test/api/v3/integration/user/auth/POST-auth_reset-password-set-new-one.js b/test/api/v3/integration/user/auth/POST-auth_reset-password-set-new-one.js index f4a9a4cbf1..ed3cf27e63 100644 --- a/test/api/v3/integration/user/auth/POST-auth_reset-password-set-new-one.js +++ b/test/api/v3/integration/user/auth/POST-auth_reset-password-set-new-one.js @@ -1,3 +1,4 @@ +import moment from 'moment'; import { encrypt, } from '../../../../../../website/server/libs/encryption'; @@ -7,7 +8,6 @@ import { sha1MakeSalt, sha1Encrypt as sha1EncryptPassword, } from '../../../../../../website/server/libs/password'; -import moment from 'moment'; import { generateUser, requester, @@ -36,9 +36,9 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders an error page if the code cannot be decrypted', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = JSON.stringify({ // not encrypted + const code = JSON.stringify({ // not encrypted userId: user._id, expiresAt: new Date(), }); @@ -53,11 +53,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders an error page if the code is expired', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().subtract({minutes: 1}), + expiresAt: moment().subtract({ minutes: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, @@ -73,9 +73,9 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders an error page if the user does not exist', async () => { - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: Date.now().toString(), - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await expect(api.post(`${endpoint}`, { @@ -88,11 +88,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders an error page if the user has no local auth', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await expect(api.post(`${endpoint}`, { @@ -105,11 +105,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders an error page if the code doesn\'t match the one saved at user.auth.passwordResetCode', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': 'invalid', @@ -127,11 +127,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { // it('renders the error page if the new password is missing', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, @@ -147,11 +147,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders the error page if the password confirmation is missing', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, @@ -168,11 +168,11 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders the error page if the password confirmation does not match', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, @@ -190,17 +190,17 @@ describe('POST /user/auth/reset-password-set-new-one', () => { }); it('renders the success page and save the user', async () => { - let user = await generateUser(); + const user = await generateUser(); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, }); - let res = await api.post(`${endpoint}`, { + const res = await api.post(`${endpoint}`, { newPassword: 'my new password', confirmPassword: 'my new password', code, @@ -212,16 +212,16 @@ describe('POST /user/auth/reset-password-set-new-one', () => { expect(user.auth.local.passwordResetCode).to.equal(undefined); expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); expect(user.auth.local.salt).to.be.undefined; - let isPassValid = await compare(user, 'my new password'); + const isPassValid = await compare(user, 'my new password'); expect(isPassValid).to.equal(true); }); it('renders the success page and convert the password from sha1 to bcrypt', async () => { - let user = await generateUser(); + const user = await generateUser(); - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -234,15 +234,15 @@ describe('POST /user/auth/reset-password-set-new-one', () => { expect(user.auth.local.salt).to.equal(salt); expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); - let code = encrypt(JSON.stringify({ + const code = encrypt(JSON.stringify({ userId: user._id, - expiresAt: moment().add({days: 1}), + expiresAt: moment().add({ days: 1 }), })); await user.update({ 'auth.local.passwordResetCode': code, }); - let res = await api.post(`${endpoint}`, { + const res = await api.post(`${endpoint}`, { newPassword: 'my new password', confirmPassword: 'my new password', code, @@ -256,7 +256,7 @@ describe('POST /user/auth/reset-password-set-new-one', () => { expect(user.auth.local.salt).to.be.undefined; expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); - let isValidPassword = await bcryptCompare('my new password', user.auth.local.hashed_password); + const isValidPassword = await bcryptCompare('my new password', user.auth.local.hashed_password); expect(isValidPassword).to.equal(true); }); }); diff --git a/test/api/v3/integration/user/auth/POST-login-local.test.js b/test/api/v3/integration/user/auth/POST-login-local.test.js index 484ff16af5..c88176576d 100644 --- a/test/api/v3/integration/user/auth/POST-login-local.test.js +++ b/test/api/v3/integration/user/auth/POST-login-local.test.js @@ -1,3 +1,4 @@ +import nconf from 'nconf'; import { generateUser, requester, @@ -9,20 +10,19 @@ import { sha1Encrypt as sha1EncryptPassword, } from '../../../../../../website/server/libs/password'; -import nconf from 'nconf'; describe('POST /user/auth/local/login', () => { let api; let user; - let endpoint = '/user/auth/local/login'; - let password = 'password'; + const endpoint = '/user/auth/local/login'; + const password = 'password'; beforeEach(async () => { api = requester(); user = await generateUser(); }); it('success with username', async () => { - let response = await api.post(endpoint, { + const response = await api.post(endpoint, { username: user.auth.local.username, password, }); @@ -30,7 +30,7 @@ describe('POST /user/auth/local/login', () => { }); it('success with email', async () => { - let response = await api.post(endpoint, { + const response = await api.post(endpoint, { username: user.auth.local.email, password, }); @@ -81,9 +81,9 @@ describe('POST /user/auth/local/login', () => { }); it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -107,7 +107,7 @@ describe('POST /user/auth/local/login', () => { expect(user.auth.local.salt).to.be.undefined; expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); - let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + const isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); expect(isValidPassword).to.equal(true); }); diff --git a/test/api/v3/integration/user/auth/POST-register_local.test.js b/test/api/v3/integration/user/auth/POST-register_local.test.js index c6b3248258..896e20a0c0 100644 --- a/test/api/v3/integration/user/auth/POST-register_local.test.js +++ b/test/api/v3/integration/user/auth/POST-register_local.test.js @@ -1,3 +1,5 @@ +import { v4 as uuid } from 'uuid'; +import { each } from 'lodash'; import { generateUser, requester, @@ -6,8 +8,6 @@ import { getProperty, } from '../../../../../helpers/api-integration/v3'; import { ApiUser } from '../../../../../helpers/api-integration/api-classes'; -import { v4 as uuid } from 'uuid'; -import { each } from 'lodash'; import { encrypt } from '../../../../../../website/server/libs/encryption'; function generateRandomUserName () { @@ -23,11 +23,11 @@ describe('POST /user/auth/local/register', () => { }); it('registers a new user', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -42,11 +42,11 @@ describe('POST /user/auth/local/register', () => { }); it('registers a new user and sets verifiedUsername to true', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -60,11 +60,11 @@ describe('POST /user/auth/local/register', () => { xit('remove spaces from username', async () => { // TODO can probably delete this test now - let username = ' usernamewithspaces '; - let email = 'test@example.com'; - let password = 'password'; + const username = ' usernamewithspaces '; + const email = 'test@example.com'; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -125,24 +125,24 @@ describe('POST /user/auth/local/register', () => { context('provides default tags and tasks', async () => { it('for a generic API consumer', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -162,26 +162,26 @@ describe('POST /user/auth/local/register', () => { xit('for Web', async () => { api = requester( null, - {'x-client': 'habitica-web'}, + { 'x-client': 'habitica-web' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(3); expect(habits[0].text).to.eql(t('defaultHabit1Text')); @@ -216,26 +216,26 @@ describe('POST /user/auth/local/register', () => { it('for Android', async () => { api = requester( null, - {'x-client': 'habitica-android'}, + { 'x-client': 'habitica-android' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -247,26 +247,26 @@ describe('POST /user/auth/local/register', () => { it('for iOS', async () => { api = requester( null, - {'x-client': 'habitica-ios'}, + { 'x-client': 'habitica-ios' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -277,11 +277,11 @@ describe('POST /user/auth/local/register', () => { }); xit('enrolls new users in an A/B test', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -292,11 +292,11 @@ describe('POST /user/auth/local/register', () => { }); it('includes items awarded by default when creating a new user', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -309,10 +309,10 @@ describe('POST /user/auth/local/register', () => { }); it('requires password and confirmPassword to match', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; - let confirmPassword = 'not password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; + const confirmPassword = 'not password'; await expect(api.post('/user/auth/local/register', { username, @@ -327,9 +327,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a username', async () => { - let email = `${generateRandomUserName()}@example.com`; - let password = 'password'; - let confirmPassword = 'password'; + const email = `${generateRandomUserName()}@example.com`; + const password = 'password'; + const confirmPassword = 'password'; await expect(api.post('/user/auth/local/register', { email, @@ -343,8 +343,8 @@ describe('POST /user/auth/local/register', () => { }); it('requires an email', async () => { - let username = generateRandomUserName(); - let password = 'password'; + const username = generateRandomUserName(); + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -358,9 +358,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a valid email', async () => { - let username = generateRandomUserName(); - let email = 'notanemail@sdf'; - let password = 'password'; + const username = generateRandomUserName(); + const email = 'notanemail@sdf'; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -375,11 +375,11 @@ describe('POST /user/auth/local/register', () => { }); it('sanitizes email params to a lowercase string before creating the user', async () => { - let username = generateRandomUserName(); - let email = 'ISANEmAiL@ExAmPle.coM'; - let password = 'password'; + const username = generateRandomUserName(); + const email = 'ISANEmAiL@ExAmPle.coM'; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -390,9 +390,9 @@ describe('POST /user/auth/local/register', () => { }); it('fails on a habitica.com email', async () => { - let username = generateRandomUserName(); - let email = `${username}@habitica.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@habitica.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -407,9 +407,9 @@ describe('POST /user/auth/local/register', () => { }); it('fails on a habitrpg.com email', async () => { - let username = generateRandomUserName(); - let email = `${username}@habitrpg.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@habitrpg.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -424,9 +424,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a password', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let confirmPassword = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const confirmPassword = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -442,9 +442,9 @@ describe('POST /user/auth/local/register', () => { context('attach to facebook user', () => { let user; - let email = 'some@email.net'; - let username = 'some-username'; - let password = 'some-password'; + const email = 'some@email.net'; + const username = 'some-username'; + const password = 'some-password'; beforeEach(async () => { user = await generateUser(); }); @@ -475,7 +475,8 @@ describe('POST /user/auth/local/register', () => { }); context('login is already taken', () => { - let username, email, api; + let username; let email; let + api; beforeEach(async () => { api = requester(); @@ -490,8 +491,8 @@ describe('POST /user/auth/local/register', () => { }); it('rejects if username is already taken', async () => { - let uniqueEmail = `${generateRandomUserName()}@exampe.com`; - let password = 'password'; + const uniqueEmail = `${generateRandomUserName()}@exampe.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -506,8 +507,8 @@ describe('POST /user/auth/local/register', () => { }); it('rejects if email is already taken', async () => { - let uniqueUsername = generateRandomUserName(); - let password = 'password'; + const uniqueUsername = generateRandomUserName(); + const password = 'password'; await expect(api.post('/user/auth/local/register', { username: uniqueUsername, @@ -523,7 +524,8 @@ describe('POST /user/auth/local/register', () => { }); context('req.query.groupInvite', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { api = requester(); @@ -533,7 +535,7 @@ describe('POST /user/auth/local/register', () => { }); it('does not crash the signup process when it\'s invalid', async () => { - let user = await api.post('/user/auth/local/register?groupInvite=aaaaInvalid', { + const user = await api.post('/user/auth/local/register?groupInvite=aaaaInvalid', { username, email, password, @@ -544,17 +546,17 @@ describe('POST /user/auth/local/register', () => { }); it('supports invite using req.query.groupInvite', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), // so we can let it expire })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -567,11 +569,11 @@ describe('POST /user/auth/local/register', () => { }); it('awards achievement to inviter', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), @@ -589,17 +591,17 @@ describe('POST /user/auth/local/register', () => { }); it('user not added to a party on expired invite', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now() - 6.912e8, // 8 days old })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -610,17 +612,17 @@ describe('POST /user/auth/local/register', () => { }); it('adds a user to a guild on an invite of type other than party', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -636,7 +638,8 @@ describe('POST /user/auth/local/register', () => { }); context('successful login via api', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { api = requester(); @@ -646,7 +649,7 @@ describe('POST /user/auth/local/register', () => { }); it('sets all site tour values to -2 (already seen)', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -655,13 +658,13 @@ describe('POST /user/auth/local/register', () => { expect(user.flags.tour).to.not.be.empty; - each(user.flags.tour, (value) => { + each(user.flags.tour, value => { expect(value).to.eql(-2); }); }); it('populates user with default todos, not no other task types', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -675,7 +678,7 @@ describe('POST /user/auth/local/register', () => { }); it('populates user with default tags', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -687,17 +690,18 @@ describe('POST /user/auth/local/register', () => { }); context('successful login with habitica-web header', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { - api = requester({}, {'x-client': 'habitica-web'}); + api = requester({}, { 'x-client': 'habitica-web' }); username = generateRandomUserName(); email = `${username}@example.com`; password = 'password'; }); it('sets all common tutorial flags to true', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -706,13 +710,13 @@ describe('POST /user/auth/local/register', () => { expect(user.flags.tour).to.not.be.empty; - each(user.flags.tutorial.common, (value) => { + each(user.flags.tutorial.common, value => { expect(value).to.eql(true); }); }); it('populates user with default todos, habits, and rewards', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -726,7 +730,7 @@ describe('POST /user/auth/local/register', () => { }); it('populates user with default tags', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -737,17 +741,17 @@ describe('POST /user/auth/local/register', () => { }); it('adds the correct tags to the correct tasks', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let todos = await requests.get('/tasks/user?type=todos'); + const habits = await requests.get('/tasks/user?type=habits'); + const todos = await requests.get('/tasks/user?type=todos'); expect(habits).to.have.a.lengthOf(0); expect(todos).to.have.a.lengthOf(0); diff --git a/test/api/v3/integration/user/auth/POST-user_auth_social.test.js b/test/api/v3/integration/user/auth/POST-user_auth_social.test.js index 65aeb7985d..a934f3b8ed 100644 --- a/test/api/v3/integration/user/auth/POST-user_auth_social.test.js +++ b/test/api/v3/integration/user/auth/POST-user_auth_social.test.js @@ -1,18 +1,18 @@ +import passport from 'passport'; import { generateUser, requester, translate as t, getProperty, } from '../../../../../helpers/api-integration/v3'; -import passport from 'passport'; describe('POST /user/auth/social', () => { let api; let user; - let endpoint = '/user/auth/social'; - let randomAccessToken = '123456'; - let facebookId = 'facebookId'; - let googleId = 'googleId'; + const endpoint = '/user/auth/social'; + const randomAccessToken = '123456'; + const facebookId = 'facebookId'; + const googleId = 'googleId'; let network = 'NoNetwork'; beforeEach(async () => { @@ -22,7 +22,7 @@ describe('POST /user/auth/social', () => { it('fails if network is not supported', async () => { await expect(api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, })).to.eventually.be.rejected.and.eql({ code: 400, @@ -33,14 +33,14 @@ describe('POST /user/auth/social', () => { describe('facebook', () => { before(async () => { - let expectedResult = {id: facebookId, displayName: 'a facebook user'}; + const expectedResult = { id: facebookId, displayName: 'a facebook user' }; sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult); network = 'facebook'; }); it('registers a new user', async () => { const response = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -54,13 +54,13 @@ describe('POST /user/auth/social', () => { }); it('logs an existing user in', async () => { - let registerResponse = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const registerResponse = await api.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); - let response = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const response = await api.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -70,8 +70,8 @@ describe('POST /user/auth/social', () => { }); it('add social auth to an existing user', async () => { - let response = await user.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const response = await user.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -82,7 +82,7 @@ describe('POST /user/auth/social', () => { xit('enrolls a new user in an A/B test', async () => { await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -92,14 +92,14 @@ describe('POST /user/auth/social', () => { describe('google', () => { before(async () => { - let expectedResult = {id: googleId, displayName: 'a google user'}; + const expectedResult = { id: googleId, displayName: 'a google user' }; sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult); network = 'google'; }); it('registers a new user', async () => { - let response = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const response = await api.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -110,13 +110,13 @@ describe('POST /user/auth/social', () => { }); it('logs an existing user in', async () => { - let registerResponse = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const registerResponse = await api.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); - let response = await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const response = await api.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -126,8 +126,8 @@ describe('POST /user/auth/social', () => { }); it('add social auth to an existing user', async () => { - let response = await user.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + const response = await user.post(endpoint, { + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); @@ -138,7 +138,7 @@ describe('POST /user/auth/social', () => { xit('enrolls a new user in an A/B test', async () => { await api.post(endpoint, { - authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase + authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase network, }); diff --git a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js index ab86bdcb90..8603fa7cb3 100644 --- a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js +++ b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js @@ -1,14 +1,14 @@ +import moment from 'moment'; import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; -import moment from 'moment'; import { decrypt, } from '../../../../../../website/server/libs/encryption'; describe('POST /user/reset-password', async () => { - let endpoint = '/user/reset-password'; + const endpoint = '/user/reset-password'; let user; beforeEach(async () => { @@ -16,8 +16,8 @@ describe('POST /user/reset-password', async () => { }); it('resets password', async () => { - let previousPassword = user.auth.local.hashed_password; - let response = await user.post(endpoint, { + const previousPassword = user.auth.local.hashed_password; + const response = await user.post(endpoint, { email: user.auth.local.email, }); expect(response).to.eql({ data: {}, message: t('passwordReset') }); @@ -26,7 +26,7 @@ describe('POST /user/reset-password', async () => { }); it('same message on error as on success', async () => { - let response = await user.post(endpoint, { + const response = await user.post(endpoint, { email: 'nonExistent@email.com', }); expect(response).to.eql({ data: {}, message: t('passwordReset') }); @@ -50,8 +50,8 @@ describe('POST /user/reset-password', async () => { await user.sync(); expect(user.auth.local.passwordResetCode).to.be.a.string; - let decryptedCode = JSON.parse(decrypt(user.auth.local.passwordResetCode)); + const decryptedCode = JSON.parse(decrypt(user.auth.local.passwordResetCode)); expect(decryptedCode.userId).to.equal(user._id); - expect(moment(decryptedCode.expiresAt).isAfter(moment().add({hours: 23}))).to.equal(true); + expect(moment(decryptedCode.expiresAt).isAfter(moment().add({ hours: 23 }))).to.equal(true); }); }); diff --git a/test/api/v3/integration/user/auth/PUT-user_update_email.test.js b/test/api/v3/integration/user/auth/PUT-user_update_email.test.js index d540dbd27b..d924a99ebf 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_email.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_email.test.js @@ -1,3 +1,4 @@ +import nconf from 'nconf'; import { generateUser, translate as t, @@ -8,13 +9,12 @@ import { sha1Encrypt as sha1EncryptPassword, } from '../../../../../../website/server/libs/password'; -import nconf from 'nconf'; const ENDPOINT = '/user/auth/update-email'; describe('PUT /user/auth/update-email', () => { - let newEmail = 'SOmE-nEw-emAIl_2@example.net'; - let oldPassword = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js + const newEmail = 'SOmE-nEw-emAIl_2@example.net'; + const oldPassword = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js context('Local Authenticaion User', async () => { let user; @@ -53,8 +53,8 @@ describe('PUT /user/auth/update-email', () => { }); it('changes email if new email and existing password are provided', async () => { - let lowerCaseNewEmail = newEmail.toLowerCase(); - let response = await user.put(ENDPOINT, { + const lowerCaseNewEmail = newEmail.toLowerCase(); + const response = await user.put(ENDPOINT, { newEmail, password: oldPassword, }); @@ -76,10 +76,10 @@ describe('PUT /user/auth/update-email', () => { }); it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); - let myNewEmail = 'my-new-random-email@example.net'; + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const myNewEmail = 'my-new-random-email@example.net'; await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -93,7 +93,7 @@ describe('PUT /user/auth/update-email', () => { expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); // update email - let response = await user.put(ENDPOINT, { + const response = await user.put(ENDPOINT, { newEmail: myNewEmail, password: textPassword, }); @@ -106,7 +106,7 @@ describe('PUT /user/auth/update-email', () => { expect(user.auth.local.salt).to.be.undefined; expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); - let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + const isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); expect(isValidPassword).to.equal(true); }); }); diff --git a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js index 81d03047b0..a46eb0f916 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js @@ -12,17 +12,17 @@ const ENDPOINT = '/user/auth/update-password'; describe('PUT /user/auth/update-password', async () => { let user; - let password = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js - let wrongPassword = 'wrong-password'; - let newPassword = 'new-password'; + const password = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js + const wrongPassword = 'wrong-password'; + const newPassword = 'new-password'; beforeEach(async () => { user = await generateUser(); }); it('successfully changes the password', async () => { - let previousHashedPassword = user.auth.local.hashed_password; - let response = await user.put(ENDPOINT, { + const previousHashedPassword = user.auth.local.hashed_password; + const response = await user.put(ENDPOINT, { password, newPassword, confirmPassword: newPassword, @@ -57,7 +57,7 @@ describe('PUT /user/auth/update-password', async () => { }); it('returns an error when password is missing', async () => { - let body = { + const body = { newPassword, confirmPassword: newPassword, }; @@ -70,7 +70,7 @@ describe('PUT /user/auth/update-password', async () => { }); it('returns an error when newPassword is missing', async () => { - let body = { + const body = { password, confirmPassword: newPassword, }; @@ -83,7 +83,7 @@ describe('PUT /user/auth/update-password', async () => { }); it('returns an error when confirmPassword is missing', async () => { - let body = { + const body = { password, newPassword, }; @@ -96,9 +96,9 @@ describe('PUT /user/auth/update-password', async () => { }); it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -123,7 +123,7 @@ describe('PUT /user/auth/update-password', async () => { expect(user.auth.local.salt).to.be.undefined; expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); - let isValidPassword = await bcryptCompare(newPassword, user.auth.local.hashed_password); + const isValidPassword = await bcryptCompare(newPassword, user.auth.local.hashed_password); expect(isValidPassword).to.equal(true); }); }); diff --git a/test/api/v3/integration/user/auth/PUT-user_update_username.test.js b/test/api/v3/integration/user/auth/PUT-user_update_username.test.js index 987f7bd556..7e2da12bc0 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_username.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_username.test.js @@ -12,15 +12,15 @@ const ENDPOINT = '/user/auth/update-username'; describe('PUT /user/auth/update-username', async () => { let user; - let password = 'password'; // from habitrpg/test/helpers/api-integration/v4/object-generators.js + const password = 'password'; // from habitrpg/test/helpers/api-integration/v4/object-generators.js beforeEach(async () => { user = await generateUser(); }); it('successfully changes username with password', async () => { - let newUsername = 'new-username'; - let response = await user.put(ENDPOINT, { + const newUsername = 'new-username'; + const response = await user.put(ENDPOINT, { username: newUsername, password, }); @@ -30,8 +30,8 @@ describe('PUT /user/auth/update-username', async () => { }); it('successfully changes username without password', async () => { - let newUsername = 'new-username-nopw'; - let response = await user.put(ENDPOINT, { + const newUsername = 'new-username-nopw'; + const response = await user.put(ENDPOINT, { username: newUsername, }); expect(response).to.eql({ username: newUsername }); @@ -40,8 +40,8 @@ describe('PUT /user/auth/update-username', async () => { }); it('successfully changes username containing number and underscore', async () => { - let newUsername = 'new_username9'; - let response = await user.put(ENDPOINT, { + const newUsername = 'new_username9'; + const response = await user.put(ENDPOINT, { username: newUsername, }); expect(response).to.eql({ username: newUsername }); @@ -52,8 +52,8 @@ describe('PUT /user/auth/update-username', async () => { it('sets verifiedUsername when changing username', async () => { user.flags.verifiedUsername = false; await user.sync(); - let newUsername = 'new-username-verify'; - let response = await user.put(ENDPOINT, { + const newUsername = 'new-username-verify'; + const response = await user.put(ENDPOINT, { username: newUsername, }); expect(response).to.eql({ username: newUsername }); @@ -62,10 +62,10 @@ describe('PUT /user/auth/update-username', async () => { }); it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { - let myNewUsername = 'my-new-username'; - let textPassword = 'mySecretPassword'; - let salt = sha1MakeSalt(); - let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + const myNewUsername = 'my-new-username'; + const textPassword = 'mySecretPassword'; + const salt = sha1MakeSalt(); + const sha1HashedPassword = sha1EncryptPassword(textPassword, salt); await user.update({ 'auth.local.hashed_password': sha1HashedPassword, @@ -79,7 +79,7 @@ describe('PUT /user/auth/update-username', async () => { expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); // update email - let response = await user.put(ENDPOINT, { + const response = await user.put(ENDPOINT, { username: myNewUsername, password: textPassword, }); @@ -92,14 +92,14 @@ describe('PUT /user/auth/update-username', async () => { expect(user.auth.local.salt).to.be.undefined; expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); - let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + const isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); expect(isValidPassword).to.equal(true); }); context('errors', async () => { it('prevents username update if new username is already taken', async () => { - let existingUsername = 'existing-username'; - await generateUser({'auth.local.username': existingUsername, 'auth.local.lowerCaseUsername': existingUsername }); + const existingUsername = 'existing-username'; + await generateUser({ 'auth.local.username': existingUsername, 'auth.local.lowerCaseUsername': existingUsername }); await expect(user.put(ENDPOINT, { username: existingUsername, @@ -112,7 +112,7 @@ describe('PUT /user/auth/update-username', async () => { }); it('errors if password is wrong', async () => { - let newUsername = 'new-username'; + const newUsername = 'new-username'; await expect(user.put(ENDPOINT, { username: newUsername, password: 'wrong-password', diff --git a/test/api/v3/integration/user/buy/POST-user_buy.test.js b/test/api/v3/integration/user/buy/POST-user_buy.test.js index fddd08802a..4b39704500 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy.test.js @@ -7,7 +7,7 @@ import { import shared from '../../../../../../website/common/script'; import apiError from '../../../../../../website/server/libs/apiError'; -let content = shared.content; +const { content } = shared; describe('POST /user/buy/:key', () => { let user; @@ -25,7 +25,7 @@ describe('POST /user/buy/:key', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('itemNotFound', {key: 'notExisting'}), + message: apiError('itemNotFound', { key: 'notExisting' }), }); }); @@ -35,13 +35,13 @@ describe('POST /user/buy/:key', () => { 'stats.hp': 40, }); - let potion = content.potion; - let res = await user.post('/user/buy/potion'); + const { potion } = content; + const res = await user.post('/user/buy/potion'); await user.sync(); expect(user.stats.hp).to.equal(50); expect(res.data).to.eql(user.stats); - expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); + expect(res.message).to.equal(t('messageBought', { itemText: potion.text() })); }); it('returns an error if user tries to buy a potion with full health', async () => { @@ -59,7 +59,7 @@ describe('POST /user/buy/:key', () => { }); it('buys a piece of gear', async () => { - let key = 'armor_warrior_1'; + const key = 'armor_warrior_1'; await user.post(`/user/buy/${key}`); await user.sync(); @@ -68,11 +68,11 @@ describe('POST /user/buy/:key', () => { }); it('buys a special spell', async () => { - let key = 'spookySparkles'; - let item = content.special[key]; + const key = 'spookySparkles'; + const item = content.special[key]; - await user.update({'stats.gp': 250}); - let res = await user.post(`/user/buy/${key}`); + await user.update({ 'stats.gp': 250 }); + const res = await user.post(`/user/buy/${key}`); await user.sync(); expect(res.data).to.eql({ @@ -90,12 +90,12 @@ describe('POST /user/buy/:key', () => { 'stats.hp': 20, }); - let potion = content.potion; - let res = await user.post('/user/buy/potion', {quantity: 2}); + const { potion } = content; + const res = await user.post('/user/buy/potion', { quantity: 2 }); await user.sync(); expect(user.stats.hp).to.equal(50); expect(res.data).to.eql(user.stats); - expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); + expect(res.message).to.equal(t('messageBought', { itemText: potion.text() })); }); }); diff --git a/test/api/v3/integration/user/buy/POST-user_buy_gear.test.js b/test/api/v3/integration/user/buy/POST-user_buy_gear.test.js index f60cbe793a..9e3120b8c7 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy_gear.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy_gear.test.js @@ -21,12 +21,12 @@ describe('POST /user/buy-gear/:key', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('itemNotFound', {key: 'notExisting'}), + message: apiError('itemNotFound', { key: 'notExisting' }), }); }); it('buys the first level weapon gear', async () => { - let key = 'weapon_warrior_0'; + const key = 'weapon_warrior_0'; await user.post(`/user/buy-gear/${key}`); await user.sync(); @@ -35,7 +35,7 @@ describe('POST /user/buy-gear/:key', () => { }); it('buys the first level armor gear', async () => { - let key = 'armor_warrior_1'; + const key = 'armor_warrior_1'; await user.post(`/user/buy-gear/${key}`); await user.sync(); @@ -44,7 +44,7 @@ describe('POST /user/buy-gear/:key', () => { }); it('tries to buy subsequent, level gear', async () => { - let key = 'armor_warrior_2'; + const key = 'armor_warrior_2'; return expect(user.post(`/user/buy-gear/${key}`)) .to.eventually.be.rejected.and.eql({ @@ -55,7 +55,7 @@ describe('POST /user/buy-gear/:key', () => { }); it('returns an error if tries to buy gear from a different class', async () => { - let key = 'armor_rogue_1'; + const key = 'armor_rogue_1'; return expect(user.post(`/user/buy-gear/${key}`)) .to.eventually.be.rejected.and.eql({ diff --git a/test/api/v3/integration/user/buy/POST-user_buy_health_potion.test.js b/test/api/v3/integration/user/buy/POST-user_buy_health_potion.test.js index 437d0e6a39..e79132fa5e 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy_health_potion.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy_health_potion.test.js @@ -4,7 +4,7 @@ import { } from '../../../../../helpers/api-integration/v3'; import shared from '../../../../../../website/common/script'; -let content = shared.content; +const { content } = shared; describe('POST /user/buy-health-potion', () => { let user; @@ -31,12 +31,12 @@ describe('POST /user/buy-health-potion', () => { 'stats.gp': 400, }); - let potion = content.potion; - let res = await user.post('/user/buy-health-potion'); + const { potion } = content; + const res = await user.post('/user/buy-health-potion'); await user.sync(); expect(user.stats.hp).to.equal(50); expect(res.data).to.eql(user.stats); - expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); + expect(res.message).to.equal(t('messageBought', { itemText: potion.text() })); }); }); diff --git a/test/api/v3/integration/user/buy/POST-user_buy_mystery_set.test.js b/test/api/v3/integration/user/buy/POST-user_buy_mystery_set.test.js index bd49fae5a5..d4df2c93b3 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy_mystery_set.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy_mystery_set.test.js @@ -24,9 +24,9 @@ describe('POST /user/buy-mystery-set/:key', () => { }); it('buys a mystery set', async () => { - let key = 301404; + const key = 301404; - let res = await user.post(`/user/buy-mystery-set/${key}`); + const res = await user.post(`/user/buy-mystery-set/${key}`); await user.sync(); expect(res.data).to.eql({ diff --git a/test/api/v3/integration/user/buy/POST-user_buy_quest.test.js b/test/api/v3/integration/user/buy/POST-user_buy_quest.test.js index 8f1e6bf896..025f8dd3bd 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy_quest.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy_quest.test.js @@ -5,7 +5,7 @@ import { import shared from '../../../../../../website/common/script'; import apiError from '../../../../../../website/server/libs/apiError'; -let content = shared.content; +const { content } = shared; describe('POST /user/buy-quest/:key', () => { let user; @@ -21,16 +21,16 @@ describe('POST /user/buy-quest/:key', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('questNotFound', {key: 'notExisting'}), + message: apiError('questNotFound', { key: 'notExisting' }), }); }); it('buys a quest', async () => { - let key = 'dilatoryDistress1'; - let item = content.quests[key]; + const key = 'dilatoryDistress1'; + const item = content.quests[key]; - await user.update({'stats.gp': 250}); - let res = await user.post(`/user/buy-quest/${key}`); + await user.update({ 'stats.gp': 250 }); + const res = await user.post(`/user/buy-quest/${key}`); await user.sync(); expect(res.data).to.eql(user.items.quests); @@ -40,13 +40,13 @@ describe('POST /user/buy-quest/:key', () => { }); it('returns an error if quest prerequisites are not met', async () => { - let key = 'dilatoryDistress2'; + const key = 'dilatoryDistress2'; await expect(user.post(`/user/buy-quest/${key}`)) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('mustComplete', {quest: 'dilatoryDistress1'}), + message: t('mustComplete', { quest: 'dilatoryDistress1' }), }); }); @@ -57,8 +57,8 @@ describe('POST /user/buy-quest/:key', () => { const achievementName = `achievements.quests.${prerequisite}`; - await user.update({[achievementName]: true, 'stats.gp': 9999}); - let res = await user.post(`/user/buy-quest/${key}`); + await user.update({ [achievementName]: true, 'stats.gp': 9999 }); + const res = await user.post(`/user/buy-quest/${key}`); await user.sync(); expect(res.data).to.eql(user.items.quests); diff --git a/test/api/v3/integration/user/buy/POST-user_buy_special_spell.test.js b/test/api/v3/integration/user/buy/POST-user_buy_special_spell.test.js index 20a73fb173..266661c421 100644 --- a/test/api/v3/integration/user/buy/POST-user_buy_special_spell.test.js +++ b/test/api/v3/integration/user/buy/POST-user_buy_special_spell.test.js @@ -5,7 +5,7 @@ import { import shared from '../../../../../../website/common/script'; import apiError from '../../../../../../website/server/libs/apiError'; -let content = shared.content; +const { content } = shared; describe('POST /user/buy-special-spell/:key', () => { let user; @@ -21,16 +21,16 @@ describe('POST /user/buy-special-spell/:key', () => { .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('spellNotFound', {spellId: 'notExisting'}), + message: apiError('spellNotFound', { spellId: 'notExisting' }), }); }); it('buys a special spell', async () => { - let key = 'thankyou'; - let item = content.special[key]; + const key = 'thankyou'; + const item = content.special[key]; - await user.update({'stats.gp': 250}); - let res = await user.post(`/user/buy-special-spell/${key}`); + await user.update({ 'stats.gp': 250 }); + const res = await user.post(`/user/buy-special-spell/${key}`); await user.sync(); expect(res.data).to.eql({ @@ -43,7 +43,7 @@ describe('POST /user/buy-special-spell/:key', () => { }); it('returns an error if user does not have enough gold', async () => { - let key = 'thankyou'; + const key = 'thankyou'; await user.update({ 'stats.gp': 5, diff --git a/test/api/v3/integration/user/stats/POST-user_allocate.test.js b/test/api/v3/integration/user/stats/POST-user_allocate.test.js index 6ace8731db..c7c7f18204 100644 --- a/test/api/v3/integration/user/stats/POST-user_allocate.test.js +++ b/test/api/v3/integration/user/stats/POST-user_allocate.test.js @@ -22,7 +22,7 @@ describe('POST /user/allocate', () => { .to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', - message: apiError('invalidAttribute', {attr: 'invalid'}), + message: apiError('invalidAttribute', { attr: 'invalid' }), }); }); @@ -36,7 +36,7 @@ describe('POST /user/allocate', () => { }); it('returns an error if the user hasn\'t selected class', async () => { - await user.update({'flags.classSelected': false}); + await user.update({ 'flags.classSelected': false }); await expect(user.post('/user/allocate')) .to.eventually.be.rejected.and.eql({ code: 401, @@ -46,8 +46,8 @@ describe('POST /user/allocate', () => { }); it('allocates attribute points', async () => { - await user.update({'stats.points': 1}); - let res = await user.post('/user/allocate?stat=con'); + await user.update({ 'stats.points': 1 }); + const res = await user.post('/user/allocate?stat=con'); await user.sync(); expect(user.stats.con).to.equal(1); expect(user.stats.points).to.equal(0); diff --git a/test/api/v3/integration/user/stats/POST-user_allocate_bulk.test.js b/test/api/v3/integration/user/stats/POST-user_allocate_bulk.test.js index a665521d0d..fb60c80c49 100644 --- a/test/api/v3/integration/user/stats/POST-user_allocate_bulk.test.js +++ b/test/api/v3/integration/user/stats/POST-user_allocate_bulk.test.js @@ -32,7 +32,7 @@ describe('POST /user/allocate-bulk', () => { }); it('returns an error if user has not selected class', async () => { - await user.update({'flags.classSelected': false}); + await user.update({ 'flags.classSelected': false }); await expect(user.post('/user/allocate-bulk', statsUpdate)) .to.eventually.be.rejected.and.eql({ code: 401, @@ -42,7 +42,7 @@ describe('POST /user/allocate-bulk', () => { }); it('allocates attribute points', async () => { - await user.update({'stats.points': 3}); + await user.update({ 'stats.points': 3 }); await user.post('/user/allocate-bulk', statsUpdate); await user.sync(); diff --git a/test/api/v3/integration/user/stats/POST-user_allocate_now.test.js b/test/api/v3/integration/user/stats/POST-user_allocate_now.test.js index b8f3ee5603..a0f1cf57ac 100644 --- a/test/api/v3/integration/user/stats/POST-user_allocate_now.test.js +++ b/test/api/v3/integration/user/stats/POST-user_allocate_now.test.js @@ -6,7 +6,7 @@ describe('POST /user/allocate-now', () => { // More tests in common code unit tests it('auto allocates all points', async () => { - let user = await generateUser({ + const user = await generateUser({ 'stats.points': 5, 'stats.int': 3, 'stats.con': 9, @@ -15,7 +15,7 @@ describe('POST /user/allocate-now', () => { 'preferences.allocationMode': 'flat', }); - let res = await user.post('/user/allocate-now'); + const res = await user.post('/user/allocate-now'); await user.sync(); expect(res).to.eql(user.stats); diff --git a/test/api/v3/integration/webhook/DELETE-user_delete_webhook.test.js b/test/api/v3/integration/webhook/DELETE-user_delete_webhook.test.js index 3126cd2b5a..b6a2d5a53d 100644 --- a/test/api/v3/integration/webhook/DELETE-user_delete_webhook.test.js +++ b/test/api/v3/integration/webhook/DELETE-user_delete_webhook.test.js @@ -3,8 +3,9 @@ import { translate as t, } from '../../../../helpers/api-integration/v3'; -let user, webhookToDelete; -let endpoint = '/user/webhook'; +let user; let + webhookToDelete; +const endpoint = '/user/webhook'; describe('DELETE /user/webhook', () => { beforeEach(async () => { @@ -32,11 +33,11 @@ describe('DELETE /user/webhook', () => { }); it('returns the remaining webhooks', async () => { - let [remainingWebhook] = await user.del(`${endpoint}/${webhookToDelete.id}`); + const [remainingWebhook] = await user.del(`${endpoint}/${webhookToDelete.id}`); await user.sync(); - let webhook = user.webhooks[0]; + const webhook = user.webhooks[0]; expect(remainingWebhook.id).to.eql(webhook.id); expect(remainingWebhook.url).to.eql(webhook.url); @@ -48,7 +49,7 @@ describe('DELETE /user/webhook', () => { await expect(user.del(`${endpoint}/id-that-does-not-exist`)).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('noWebhookWithId', {id: 'id-that-does-not-exist'}), + message: t('noWebhookWithId', { id: 'id-that-does-not-exist' }), }); }); }); diff --git a/test/api/v3/integration/webhook/GET-user-webhook.test.js b/test/api/v3/integration/webhook/GET-user-webhook.test.js index 138aad902a..d1ea6939f4 100644 --- a/test/api/v3/integration/webhook/GET-user-webhook.test.js +++ b/test/api/v3/integration/webhook/GET-user-webhook.test.js @@ -22,7 +22,7 @@ describe('GET /user/webhook', () => { }); it('returns users webhooks', async () => { - let response = await user.get('/user/webhook'); + const response = await user.get('/user/webhook'); expect(response).to.eql(user.webhooks.map(w => { w.createdAt = w.createdAt.toISOString(); diff --git a/test/api/v3/integration/webhook/POST-user_add_webhook.test.js b/test/api/v3/integration/webhook/POST-user_add_webhook.test.js index cbed7e56af..306ba771c0 100644 --- a/test/api/v3/integration/webhook/POST-user_add_webhook.test.js +++ b/test/api/v3/integration/webhook/POST-user_add_webhook.test.js @@ -1,12 +1,13 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID } from 'uuid'; import apiError from '../../../../../website/server/libs/apiError'; describe('POST /user/webhook', () => { - let user, body; + let user; let + body; beforeEach(async () => { user = await generateUser(); @@ -41,7 +42,7 @@ describe('POST /user/webhook', () => { it('defaults id to a uuid', async () => { delete body.id; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.id).to.exist; }); @@ -59,7 +60,7 @@ describe('POST /user/webhook', () => { it('defaults enabled to true', async () => { delete body.enabled; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.enabled).to.be.true; }); @@ -67,7 +68,7 @@ describe('POST /user/webhook', () => { it('can pass a label', async () => { body.label = 'Custom Label'; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.label).to.equal('Custom Label'); }); @@ -75,7 +76,7 @@ describe('POST /user/webhook', () => { it('defaults type to taskActivity', async () => { delete body.type; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.type).to.eql('taskActivity'); }); @@ -83,7 +84,7 @@ describe('POST /user/webhook', () => { it('successfully adds the webhook', async () => { expect(user.webhooks).to.eql([]); - let response = await user.post('/user/webhook', body); + const response = await user.post('/user/webhook', body); expect(response.id).to.eql(body.id); expect(response.type).to.eql(body.type); @@ -94,7 +95,7 @@ describe('POST /user/webhook', () => { expect(user.webhooks).to.not.eql([]); - let webhook = user.webhooks[0]; + const webhook = user.webhooks[0]; expect(webhook.enabled).to.be.false; expect(webhook.type).to.eql('taskActivity'); @@ -114,7 +115,7 @@ describe('POST /user/webhook', () => { it('defaults taskActivity options', async () => { body.type = 'taskActivity'; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options).to.eql({ checklistScored: false, @@ -135,7 +136,7 @@ describe('POST /user/webhook', () => { scored: false, }; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options).to.eql({ checklistScored: true, @@ -157,7 +158,7 @@ describe('POST /user/webhook', () => { foo: 'bar', }; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options.foo).to.not.exist; expect(webhook.options).to.eql({ @@ -169,7 +170,7 @@ describe('POST /user/webhook', () => { }); }); - ['created', 'updated', 'deleted', 'scored'].forEach((option) => { + ['created', 'updated', 'deleted', 'scored'].forEach(option => { it(`requires taskActivity option ${option} to be a boolean`, async () => { body.type = 'taskActivity'; body.options = { @@ -190,7 +191,7 @@ describe('POST /user/webhook', () => { groupId: generateUUID(), }; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options).to.eql({ groupId: body.options.groupId, @@ -217,7 +218,7 @@ describe('POST /user/webhook', () => { foo: 'bar', }; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options.foo).to.not.exist; expect(webhook.options).to.eql({ @@ -231,7 +232,7 @@ describe('POST /user/webhook', () => { foo: 'bar', }; - let webhook = await user.post('/user/webhook', body); + const webhook = await user.post('/user/webhook', body); expect(webhook.options.foo).to.not.exist; expect(webhook.options).to.eql({}); diff --git a/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js b/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js index abebc4aff3..0f00e238e9 100644 --- a/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js +++ b/test/api/v3/integration/webhook/PUT-user_update_webhook.test.js @@ -1,12 +1,13 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; -import { v4 as generateUUID} from 'uuid'; import apiError from '../../../../../website/server/libs/apiError'; describe('PUT /user/webhook/:id', () => { - let user, webhookToUpdate; + let user; let + webhookToUpdate; beforeEach(async () => { user = await generateUser(); @@ -30,7 +31,7 @@ describe('PUT /user/webhook/:id', () => { await expect(user.put('/user/webhook/id-that-does-not-exist')).to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('noWebhookWithId', {id: 'id-that-does-not-exist'}), + message: t('noWebhookWithId', { id: 'id-that-does-not-exist' }), }); }); @@ -43,16 +44,18 @@ describe('PUT /user/webhook/:id', () => { }); it('updates a webhook', async () => { - let url = 'http://a-new-url.com'; - let type = 'groupChatReceived'; - let label = 'New Label'; - let options = { groupId: generateUUID() }; + const url = 'http://a-new-url.com'; + const type = 'groupChatReceived'; + const label = 'New Label'; + const options = { groupId: generateUUID() }; - await user.put(`/user/webhook/${webhookToUpdate.id}`, {url, type, options, label}); + await user.put(`/user/webhook/${webhookToUpdate.id}`, { + url, type, options, label, + }); await user.sync(); - let webhook = user.webhooks.find(hook => webhookToUpdate.id === hook.id); + const webhook = user.webhooks.find(hook => webhookToUpdate.id === hook.id); expect(webhook.url).to.equal(url); expect(webhook.label).to.equal(label); @@ -61,11 +64,11 @@ describe('PUT /user/webhook/:id', () => { }); it('returns the updated webhook', async () => { - let url = 'http://a-new-url.com'; - let type = 'groupChatReceived'; - let options = { groupId: generateUUID() }; + const url = 'http://a-new-url.com'; + const type = 'groupChatReceived'; + const options = { groupId: generateUUID() }; - let response = await user.put(`/user/webhook/${webhookToUpdate.id}`, {url, type, options}); + const response = await user.put(`/user/webhook/${webhookToUpdate.id}`, { url, type, options }); expect(response.url).to.eql(url); expect(response.type).to.eql(type); @@ -73,27 +76,27 @@ describe('PUT /user/webhook/:id', () => { }); it('cannot update the id', async () => { - let id = generateUUID(); - let url = 'http://a-new-url.com'; + const id = generateUUID(); + const url = 'http://a-new-url.com'; - await user.put(`/user/webhook/${webhookToUpdate.id}`, {url, id}); + await user.put(`/user/webhook/${webhookToUpdate.id}`, { url, id }); await user.sync(); - let webhook = user.webhooks.find(hook => webhookToUpdate.id === hook.id); + const webhook = user.webhooks.find(hook => webhookToUpdate.id === hook.id); expect(webhook.id).to.eql(webhookToUpdate.id); expect(webhook.url).to.eql(url); }); it('can update taskActivity options', async () => { - let type = 'taskActivity'; - let options = { + const type = 'taskActivity'; + const options = { updated: false, deleted: true, }; - let webhook = await user.put(`/user/webhook/${webhookToUpdate.id}`, {type, options}); + const webhook = await user.put(`/user/webhook/${webhookToUpdate.id}`, { type, options }); expect(webhook.options).to.eql({ checklistScored: false, // starting value @@ -105,14 +108,14 @@ describe('PUT /user/webhook/:id', () => { }); it('errors if taskActivity option is not a boolean', async () => { - let type = 'taskActivity'; - let options = { + const type = 'taskActivity'; + const options = { created: 'not a boolean', updated: false, deleted: true, }; - await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, {type, options})).to.eventually.be.rejected.and.eql({ + await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, { type, options })).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: t('webhookBooleanOption', { option: 'created' }), @@ -120,12 +123,12 @@ describe('PUT /user/webhook/:id', () => { }); it('errors if groupChatRecieved groupId option is not a uuid', async () => { - let type = 'groupChatReceived'; - let options = { + const type = 'groupChatReceived'; + const options = { groupId: 'not-a-uuid', }; - await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, {type, options})).to.eventually.be.rejected.and.eql({ + await expect(user.put(`/user/webhook/${webhookToUpdate.id}`, { type, options })).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: apiError('groupIdRequired'), diff --git a/test/api/v3/integration/world-state/GET-world-state.test.js b/test/api/v3/integration/world-state/GET-world-state.test.js index 4d8e7fbbbd..2b8f9cdfbd 100644 --- a/test/api/v3/integration/world-state/GET-world-state.test.js +++ b/test/api/v3/integration/world-state/GET-world-state.test.js @@ -16,7 +16,7 @@ describe('GET /world-state', () => { }); it('returns Tavern quest data when world boss is active', async () => { - await updateDocument('groups', {_id: TAVERN_ID}, {quest: {active: true, key: 'dysheartener', progress: {hp: 50000, rage: 9999}}}); + await updateDocument('groups', { _id: TAVERN_ID }, { quest: { active: true, key: 'dysheartener', progress: { hp: 50000, rage: 9999 } } }); const res = await requester().get('/world-state'); expect(res).to.have.nested.property('worldBoss'); diff --git a/test/api/v4/coupon/POST-coupons_enter_code.test.js b/test/api/v4/coupon/POST-coupons_enter_code.test.js index 01fe5fd0b6..71e4c05719 100644 --- a/test/api/v4/coupon/POST-coupons_enter_code.test.js +++ b/test/api/v4/coupon/POST-coupons_enter_code.test.js @@ -36,7 +36,7 @@ describe('POST /coupons/enter/:code', () => { }); it('returns an error if coupon has been used', async () => { - let [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); + const [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); await user.post(`/coupons/enter/${coupon._id}`); // use coupon await expect(user.post(`/coupons/enter/${coupon._id}`)).to.eventually.be.rejected.and.eql({ @@ -47,8 +47,8 @@ describe('POST /coupons/enter/:code', () => { }); it('should apply the coupon to the user', async () => { - let [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); - let userRes = await user.post(`/coupons/enter/${coupon._id}`); + const [coupon] = await sudoUser.post('/coupons/generate/wondercon?count=1'); + const userRes = await user.post(`/coupons/enter/${coupon._id}`); expect(userRes._id).to.equal(user._id); expect(userRes.items.gear.owned.eyewear_special_wondercon_red).to.be.true; expect(userRes.items.gear.owned.eyewear_special_wondercon_black).to.be.true; @@ -57,6 +57,6 @@ describe('POST /coupons/enter/:code', () => { expect(userRes.items.gear.owned.body_special_wondercon_red).to.be.true; expect(userRes.items.gear.owned.body_special_wondercon_black).to.be.true; expect(userRes.items.gear.owned.body_special_wondercon_gold).to.be.true; - expect(userRes.extra).to.eql({signupEvent: 'wondercon'}); + expect(userRes.extra).to.eql({ signupEvent: 'wondercon' }); }); }); diff --git a/test/api/v4/inbox/DELETE-inbox_clear.test.js b/test/api/v4/inbox/DELETE-inbox_clear.test.js index ff0af5cceb..e351b764a7 100644 --- a/test/api/v4/inbox/DELETE-inbox_clear.test.js +++ b/test/api/v4/inbox/DELETE-inbox_clear.test.js @@ -27,4 +27,4 @@ describe('DELETE /inbox/clear', () => { messages = await user.get('/inbox/messages'); expect(messages.length).to.equal(0); }); -}); \ No newline at end of file +}); diff --git a/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js b/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js index 99365daf8f..1ea160a5da 100644 --- a/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js +++ b/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js @@ -1,8 +1,8 @@ +import { v4 as generateUUID } from 'uuid'; import { generateUser, translate as t, } from '../../../helpers/api-integration/v4'; -import { v4 as generateUUID } from 'uuid'; describe('DELETE /inbox/messages/:messageId', () => { let user; diff --git a/test/api/v4/inbox/GET-inbox-conversations.test.js b/test/api/v4/inbox/GET-inbox-conversations.test.js index ce94e919d5..d2317a3f65 100644 --- a/test/api/v4/inbox/GET-inbox-conversations.test.js +++ b/test/api/v4/inbox/GET-inbox-conversations.test.js @@ -8,7 +8,11 @@ describe('GET /inbox/conversations', () => { let thirdUser; beforeEach(async () => { - [user, otherUser, thirdUser] = await Promise.all([generateUser(), generateUser(), generateUser()]); + [user, otherUser, thirdUser] = await Promise.all([ + generateUser(), + generateUser(), + generateUser(), + ]); await otherUser.post('/members/send-private-message', { toUserId: user.id, @@ -62,7 +66,7 @@ describe('GET /inbox/conversations', () => { it('returns four messages when using page-query ', async () => { const promises = []; - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 10; i += 1) { promises.push(user.post('/members/send-private-message', { toUserId: user.id, message: 'fourth', diff --git a/test/api/v4/members/POST-flag_private_message.test.js b/test/api/v4/members/POST-flag_private_message.test.js index de9a75b9da..e4af36e302 100644 --- a/test/api/v4/members/POST-flag_private_message.test.js +++ b/test/api/v4/members/POST-flag_private_message.test.js @@ -5,61 +5,64 @@ import { describe('POST /members/flag-private-message/:messageId', () => { let userToSendMessage; - let messageToSend = 'Test Private Message'; + const messageToSend = 'Test Private Message'; beforeEach(async () => { userToSendMessage = await generateUser(); }); it('Allows players to flag their own private message', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); await userToSendMessage.post('/members/send-private-message', { message: messageToSend, toUserId: receiver._id, }); - let senderMessages = await userToSendMessage.get('/inbox/paged-messages'); + const senderMessages = await userToSendMessage.get('/inbox/paged-messages'); - let sendersMessageInSendersInbox = _.find(senderMessages, (message) => { - return message.toUUID === receiver._id && message.text === messageToSend; - }); + const sendersMessageInSendersInbox = _.find( + senderMessages, + message => message.toUUID === receiver._id && message.text === messageToSend, + ); expect(sendersMessageInSendersInbox).to.exist; await expect(userToSendMessage.post(`/members/flag-private-message/${sendersMessageInSendersInbox.id}`)).to.eventually.be.ok; }); it('Flags a private message', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); await userToSendMessage.post('/members/send-private-message', { message: messageToSend, toUserId: receiver._id, }); - let receiversMessages = await receiver.get('/inbox/paged-messages'); + const receiversMessages = await receiver.get('/inbox/paged-messages'); - let sendersMessageInReceiversInbox = _.find(receiversMessages, (message) => { - return message.uuid === userToSendMessage._id && message.text === messageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + receiversMessages, + message => message.uuid === userToSendMessage._id && message.text === messageToSend, + ); expect(sendersMessageInReceiversInbox).to.exist; await expect(receiver.post(`/members/flag-private-message/${sendersMessageInReceiversInbox.id}`)).to.eventually.be.ok; }); it('Returns an error when user tries to flag a private message that is already flagged', async () => { - let receiver = await generateUser(); + const receiver = await generateUser(); await userToSendMessage.post('/members/send-private-message', { message: messageToSend, toUserId: receiver._id, }); - let receiversMessages = await receiver.get('/inbox/paged-messages'); + const receiversMessages = await receiver.get('/inbox/paged-messages'); - let sendersMessageInReceiversInbox = _.find(receiversMessages, (message) => { - return message.uuid === userToSendMessage._id && message.text === messageToSend; - }); + const sendersMessageInReceiversInbox = _.find( + receiversMessages, + message => message.uuid === userToSendMessage._id && message.text === messageToSend, + ); expect(sendersMessageInReceiversInbox).to.exist; await expect(receiver.post(`/members/flag-private-message/${sendersMessageInReceiversInbox.id}`)).to.eventually.be.ok; diff --git a/test/api/v4/user/GET-user.test.js b/test/api/v4/user/GET-user.test.js index 4b1bad4054..fd05479560 100644 --- a/test/api/v4/user/GET-user.test.js +++ b/test/api/v4/user/GET-user.test.js @@ -11,7 +11,7 @@ describe('GET /user', () => { }); it('returns the authenticated user with computed stats', async () => { - let returnedUser = await user.get('/user'); + const returnedUser = await user.get('/user'); expect(returnedUser._id).to.equal(user._id); expect(returnedUser.stats.maxMP).to.exist; @@ -20,7 +20,7 @@ describe('GET /user', () => { }); it('does not return private paths (and apiToken)', async () => { - let returnedUser = await user.get('/user'); + const returnedUser = await user.get('/user'); expect(returnedUser.auth.local.hashed_password).to.not.exist; expect(returnedUser.auth.local.passwordHashMethod).to.not.exist; @@ -29,7 +29,7 @@ describe('GET /user', () => { }); it('returns only user properties requested', async () => { - let returnedUser = await user.get('/user?userFields=achievements,items.mounts'); + const returnedUser = await user.get('/user?userFields=achievements,items.mounts'); expect(returnedUser._id).to.equal(user._id); expect(returnedUser.achievements).to.exist; @@ -50,7 +50,7 @@ describe('GET /user', () => { toUserId: user.id, message: 'second', }); - let returnedUser = await user.get('/user'); + const returnedUser = await user.get('/user'); expect(returnedUser._id).to.equal(user._id); expect(returnedUser.inbox.messages).to.be.undefined; diff --git a/test/api/v4/user/POST-user_class_cast_spellId.test.js b/test/api/v4/user/POST-user_class_cast_spellId.test.js index 90c2eae1db..6e46b92931 100644 --- a/test/api/v4/user/POST-user_class_cast_spellId.test.js +++ b/test/api/v4/user/POST-user_class_cast_spellId.test.js @@ -1,3 +1,6 @@ + +import { v4 as generateUUID } from 'uuid'; +import { find } from 'lodash'; import { generateUser, translate as t, @@ -6,9 +9,6 @@ import { generateChallenge, sleep, } from '../../../helpers/api-integration/v4'; - -import { v4 as generateUUID } from 'uuid'; -import { find } from 'lodash'; import apiError from '../../../../website/server/libs/apiError'; describe('POST /user/class/cast/:spellId', () => { @@ -19,28 +19,28 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if spell does not exist', async () => { - await user.update({'stats.class': 'rogue'}); - let spellId = 'invalidSpell'; + await user.update({ 'stats.class': 'rogue' }); + const spellId = 'invalidSpell'; await expect(user.post(`/user/class/cast/${spellId}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('spellNotFound', {spellId}), + message: apiError('spellNotFound', { spellId }), }); }); it('returns an error if spell does not exist in user\'s class', async () => { - let spellId = 'pickPocket'; + const spellId = 'pickPocket'; await expect(user.post(`/user/class/cast/${spellId}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: apiError('spellNotFound', {spellId}), + message: apiError('spellNotFound', { spellId }), }); }); it('returns an error if spell.mana > user.mana', async () => { - await user.update({'stats.class': 'rogue'}); + await user.update({ 'stats.class': 'rogue' }); await expect(user.post('/user/class/cast/backStab')) .to.eventually.be.rejected.and.eql({ code: 401, @@ -59,12 +59,12 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if spell.lvl > user.level', async () => { - await user.update({'stats.mp': 200, 'stats.class': 'wizard'}); + await user.update({ 'stats.mp': 200, 'stats.class': 'wizard' }); await expect(user.post('/user/class/cast/earth')) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('spellLevelTooHigh', {level: 13}), + message: t('spellLevelTooHigh', { level: 13 }), }); }); @@ -87,7 +87,7 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targetId is required but missing', async () => { - await user.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await expect(user.post('/user/class/cast/pickPocket')) .to.eventually.be.rejected.and.eql({ code: 400, @@ -97,7 +97,7 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targeted task doesn\'t exist', async () => { - await user.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await expect(user.post(`/user/class/cast/pickPocket?targetId=${generateUUID()}`)) .to.eventually.be.rejected.and.eql({ code: 404, @@ -107,13 +107,13 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if a challenge task was targeted', async () => { - let {group, groupLeader} = await createAndPopulateGroup(); - let challenge = await generateChallenge(groupLeader, group); + const { group, groupLeader } = await createAndPopulateGroup(); + const challenge = await generateChallenge(groupLeader, group); await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ - {type: 'habit', text: 'task text'}, + { type: 'habit', text: 'task text' }, ]); - await groupLeader.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await groupLeader.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await sleep(0.5); await groupLeader.sync(); await expect(groupLeader.post(`/user/class/cast/pickPocket?targetId=${groupLeader.tasksOrder.habits[0]}`)) @@ -125,19 +125,17 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if a group task was targeted', async () => { - let {group, groupLeader} = await createAndPopulateGroup(); + const { group, groupLeader } = await createAndPopulateGroup(); - let groupTask = await groupLeader.post(`/tasks/group/${group._id}`, { + const groupTask = await groupLeader.post(`/tasks/group/${group._id}`, { text: 'todo group', type: 'todo', }); await groupLeader.post(`/tasks/${groupTask._id}/assign/${groupLeader._id}`); - let memberTasks = await groupLeader.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === group._id; - }); + const memberTasks = await groupLeader.get('/tasks/user'); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === group._id); - await groupLeader.update({'stats.class': 'rogue', 'stats.lvl': 11}); + await groupLeader.update({ 'stats.class': 'rogue', 'stats.lvl': 11 }); await sleep(0.5); await groupLeader.sync(); @@ -150,23 +148,23 @@ describe('POST /user/class/cast/:spellId', () => { }); it('returns an error if targeted party member doesn\'t exist', async () => { - let {groupLeader} = await createAndPopulateGroup({ + const { groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'items.special.snowball': 3}); + await groupLeader.update({ 'items.special.snowball': 3 }); - let target = generateUUID(); + const target = generateUUID(); await expect(groupLeader.post(`/user/class/cast/snowball?targetId=${target}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', - message: t('userWithIDNotFound', {userId: target}), + message: t('userWithIDNotFound', { userId: target }), }); }); it('returns an error if party does not exists', async () => { - await user.update({'items.special.snowball': 3}); + await user.update({ 'items.special.snowball': 3 }); await expect(user.post(`/user/class/cast/snowball?targetId=${generateUUID()}`)) .to.eventually.be.rejected.and.eql({ @@ -177,11 +175,11 @@ describe('POST /user/class/cast/:spellId', () => { }); it('send message in party chat if party && !spell.silent', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13}); + await groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13 }); await groupLeader.post('/user/class/cast/earth'); await sleep(1); @@ -192,17 +190,17 @@ describe('POST /user/class/cast/:spellId', () => { }); it('Ethereal Surge does not recover mp of other mages', async () => { - let group = await createAndPopulateGroup({ + const group = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 4, }); let promises = []; - promises.push(group.groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 20})); - promises.push(group.members[0].update({'stats.mp': 0, 'stats.class': 'warrior', 'stats.lvl': 20})); - promises.push(group.members[1].update({'stats.mp': 0, 'stats.class': 'wizard', 'stats.lvl': 20})); - promises.push(group.members[2].update({'stats.mp': 0, 'stats.class': 'rogue', 'stats.lvl': 20})); - promises.push(group.members[3].update({'stats.mp': 0, 'stats.class': 'healer', 'stats.lvl': 20})); + promises.push(group.groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 20 })); + promises.push(group.members[0].update({ 'stats.mp': 0, 'stats.class': 'warrior', 'stats.lvl': 20 })); + promises.push(group.members[1].update({ 'stats.mp': 0, 'stats.class': 'wizard', 'stats.lvl': 20 })); + promises.push(group.members[2].update({ 'stats.mp': 0, 'stats.class': 'rogue', 'stats.lvl': 20 })); + promises.push(group.members[3].update({ 'stats.mp': 0, 'stats.class': 'healer', 'stats.lvl': 20 })); await Promise.all(promises); await group.groupLeader.post('/user/class/cast/mpheal'); @@ -221,13 +219,13 @@ describe('POST /user/class/cast/:spellId', () => { }); it('cast bulk', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + let { group, groupLeader } = await createAndPopulateGroup({ // eslint-disable-line prefer-const groupDetails: { type: 'party', privacy: 'private' }, members: 1, }); - await groupLeader.update({'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13}); - await groupLeader.post('/user/class/cast/earth', {quantity: 2}); + await groupLeader.update({ 'stats.mp': 200, 'stats.class': 'wizard', 'stats.lvl': 13 }); + await groupLeader.post('/user/class/cast/earth', { quantity: 2 }); await sleep(1); group = await groupLeader.get(`/groups/${group._id}`); @@ -237,33 +235,32 @@ describe('POST /user/class/cast/:spellId', () => { }); it('searing brightness does not affect challenge or group tasks', async () => { - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', }); - let groupTask = await user.post(`/tasks/group/${guild._id}`, { + const groupTask = await user.post(`/tasks/group/${guild._id}`, { text: 'todo group', type: 'todo', }); - await user.update({'stats.class': 'healer', 'stats.mp': 200, 'stats.lvl': 15}); + await user.update({ 'stats.class': 'healer', 'stats.mp': 200, 'stats.lvl': 15 }); await user.post(`/tasks/${groupTask._id}/assign/${user._id}`); await user.post('/user/class/cast/brightness'); await user.sync(); - let memberTasks = await user.get('/tasks/user'); + const memberTasks = await user.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === guild._id; - }); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === guild._id); - let userChallengeTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.challenge.id === challenge._id; - }); + const userChallengeTask = find( + memberTasks, + memberTask => memberTask.challenge.id === challenge._id, + ); expect(userChallengeTask).to.exist; expect(syncedGroupTask).to.exist; @@ -272,12 +269,12 @@ describe('POST /user/class/cast/:spellId', () => { }); it('increases both user\'s achievement values', async () => { - let party = await createAndPopulateGroup({ + const party = await createAndPopulateGroup({ members: 1, }); - let leader = party.groupLeader; - let recipient = party.members[0]; - await leader.update({'stats.gp': 10}); + const leader = party.groupLeader; + const recipient = party.members[0]; + await leader.update({ 'stats.gp': 10 }); await leader.post(`/user/class/cast/birthday?targetId=${recipient._id}`); await leader.sync(); await recipient.sync(); @@ -286,29 +283,29 @@ describe('POST /user/class/cast/:spellId', () => { }); it('only increases user\'s achievement one if target == caster', async () => { - await user.update({'stats.gp': 10}); + await user.update({ 'stats.gp': 10 }); await user.post(`/user/class/cast/birthday?targetId=${user._id}`); await user.sync(); expect(user.achievements.birthday).to.equal(1); }); it('passes correct target to spell when targetType === \'task\'', async () => { - await user.update({'stats.class': 'wizard', 'stats.lvl': 11}); + await user.update({ 'stats.class': 'wizard', 'stats.lvl': 11 }); - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); - let result = await user.post(`/user/class/cast/fireball?targetId=${task._id}`); + const result = await user.post(`/user/class/cast/fireball?targetId=${task._id}`); expect(result.task._id).to.equal(task._id); }); it('passes correct target to spell when targetType === \'self\'', async () => { - await user.update({'stats.class': 'wizard', 'stats.lvl': 14, 'stats.mp': 50}); + await user.update({ 'stats.class': 'wizard', 'stats.lvl': 14, 'stats.mp': 50 }); - let result = await user.post('/user/class/cast/frost'); + const result = await user.post('/user/class/cast/frost'); expect(result.user.stats.mp).to.equal(10); }); diff --git a/test/api/v4/user/POST-user_rebirth.test.js b/test/api/v4/user/POST-user_rebirth.test.js index 94b91ddf6b..b4781c6bc6 100644 --- a/test/api/v4/user/POST-user_rebirth.test.js +++ b/test/api/v4/user/POST-user_rebirth.test.js @@ -28,7 +28,7 @@ describe('POST /user/rebirth', () => { balance: 1.5, }); - let daily = await generateDaily({ + const daily = await generateDaily({ text: 'test habit', type: 'daily', value: 1, @@ -36,21 +36,21 @@ describe('POST /user/rebirth', () => { userId: user._id, }); - let reward = await generateReward({ + const reward = await generateReward({ text: 'test reward', type: 'reward', value: 1, userId: user._id, }); - let response = await user.post('/user/rebirth'); + const response = await user.post('/user/rebirth'); await user.sync(); expect(user.notifications.length).to.equal(1); expect(user.notifications[0].type).to.equal('REBIRTH_ACHIEVEMENT'); - let updatedDaily = await user.get(`/tasks/${daily._id}`); - let updatedReward = await user.get(`/tasks/${reward._id}`); + const updatedDaily = await user.get(`/tasks/${daily._id}`); + const updatedReward = await user.get(`/tasks/${reward._id}`); expect(response.message).to.equal(t('rebirthComplete')); expect(updatedDaily.streak).to.equal(0); diff --git a/test/api/v4/user/POST-user_reroll.test.js b/test/api/v4/user/POST-user_reroll.test.js index 10ac0c2843..18d1aaad79 100644 --- a/test/api/v4/user/POST-user_reroll.test.js +++ b/test/api/v4/user/POST-user_reroll.test.js @@ -28,24 +28,24 @@ describe('POST /user/reroll', () => { balance: 2, }); - let daily = await generateDaily({ + const daily = await generateDaily({ text: 'test habit', type: 'daily', userId: user._id, }); - let reward = await generateReward({ + const reward = await generateReward({ text: 'test reward', type: 'reward', value: 1, userId: user._id, }); - let response = await user.post('/user/reroll'); + const response = await user.post('/user/reroll'); await user.sync(); - let updatedDaily = await user.get(`/tasks/${daily._id}`); - let updatedReward = await user.get(`/tasks/${reward._id}`); + const updatedDaily = await user.get(`/tasks/${daily._id}`); + const updatedReward = await user.get(`/tasks/${reward._id}`); expect(response.message).to.equal(t('fortifyComplete')); expect(updatedDaily.value).to.equal(0); diff --git a/test/api/v4/user/POST-user_reset.test.js b/test/api/v4/user/POST-user_reset.test.js index c8cf7b9f6b..a664ba31ea 100644 --- a/test/api/v4/user/POST-user_reset.test.js +++ b/test/api/v4/user/POST-user_reset.test.js @@ -1,10 +1,10 @@ +import { find } from 'lodash'; import { generateUser, generateGroup, generateChallenge, translate as t, } from '../../../helpers/api-integration/v4'; -import { find } from 'lodash'; describe('POST /user/reset', () => { let user; @@ -16,7 +16,7 @@ describe('POST /user/reset', () => { // More tests in common code unit tests it('resets user\'s habits', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test habit', type: 'habit', }); @@ -34,7 +34,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s dailys', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test daily', type: 'daily', }); @@ -52,7 +52,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s todos', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test todo', type: 'todo', }); @@ -70,7 +70,7 @@ describe('POST /user/reset', () => { }); it('resets user\'s rewards', async () => { - let task = await user.post('/tasks/user', { + const task = await user.post('/tasks/user', { text: 'test reward', type: 'reward', }); @@ -88,15 +88,15 @@ describe('POST /user/reset', () => { }); it('does not delete challenge or group tasks', async () => { - let guild = await generateGroup(user); - let challenge = await generateChallenge(user, guild); + const guild = await generateGroup(user); + const challenge = await generateChallenge(user, guild); await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', }); - let groupTask = await user.post(`/tasks/group/${guild._id}`, { + const groupTask = await user.post(`/tasks/group/${guild._id}`, { text: 'todo group', type: 'todo', }); @@ -105,15 +105,14 @@ describe('POST /user/reset', () => { await user.post('/user/reset'); await user.sync(); - let memberTasks = await user.get('/tasks/user'); + const memberTasks = await user.get('/tasks/user'); - let syncedGroupTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.group.id === guild._id; - }); + const syncedGroupTask = find(memberTasks, memberTask => memberTask.group.id === guild._id); - let userChallengeTask = find(memberTasks, function findAssignedTask (memberTask) { - return memberTask.challenge.id === challenge._id; - }); + const userChallengeTask = find( + memberTasks, + memberTask => memberTask.challenge.id === challenge._id, + ); expect(userChallengeTask).to.exist; expect(syncedGroupTask).to.exist; diff --git a/test/api/v4/user/PUT-user.test.js b/test/api/v4/user/PUT-user.test.js index 9ea1c145dd..0830b6f139 100644 --- a/test/api/v4/user/PUT-user.test.js +++ b/test/api/v4/user/PUT-user.test.js @@ -1,9 +1,9 @@ +import { each, get } from 'lodash'; import { generateUser, translate as t, } from '../../../helpers/api-integration/v4'; -import { each, get } from 'lodash'; describe('PUT /user', () => { let user; @@ -40,7 +40,7 @@ describe('PUT /user', () => { }); it('update tags', async () => { - let userTags = user.tags; + const userTags = user.tags; await user.put('/user', { tags: [...user.tags, { @@ -82,20 +82,20 @@ describe('PUT /user', () => { }); context('Top Level Protected Operations', () => { - let protectedOperations = { - 'gem balance': {balance: 100}, - auth: {'auth.blocked': true, 'auth.timestamps.created': new Date()}, - contributor: {'contributor.level': 9, 'contributor.admin': true, 'contributor.text': 'some text'}, - backer: {'backer.tier': 10, 'backer.npc': 'Bilbo'}, - subscriptions: {'purchased.plan.extraMonths': 500, 'purchased.plan.consecutive.trinkets': 1000}, - 'customization gem purchases': {'purchased.background.tavern': true, 'purchased.skin.bear': true}, - notifications: [{type: 123}], - webhooks: {webhooks: [{url: 'https://foobar.com'}]}, + const protectedOperations = { + 'gem balance': { balance: 100 }, + auth: { 'auth.blocked': true, 'auth.timestamps.created': new Date() }, + contributor: { 'contributor.level': 9, 'contributor.admin': true, 'contributor.text': 'some text' }, + backer: { 'backer.tier': 10, 'backer.npc': 'Bilbo' }, + subscriptions: { 'purchased.plan.extraMonths': 500, 'purchased.plan.consecutive.trinkets': 1000 }, + 'customization gem purchases': { 'purchased.background.tavern': true, 'purchased.skin.bear': true }, + notifications: [{ type: 123 }], + webhooks: { webhooks: [{ url: 'https://foobar.com' }] }, }; each(protectedOperations, (data, testName) => { it(`does not allow updating ${testName}`, async () => { - let errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); + const errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); await expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({ code: 401, @@ -107,17 +107,17 @@ describe('PUT /user', () => { }); context('Sub-Level Protected Operations', () => { - let protectedOperations = { - 'class stat': {'stats.class': 'wizard'}, - 'flags unless whitelisted': {'flags.dropsEnabled': true}, - webhooks: {'preferences.webhooks': [1, 2, 3]}, - sleep: {'preferences.sleep': true}, - 'disable classes': {'preferences.disableClasses': true}, + const protectedOperations = { + 'class stat': { 'stats.class': 'wizard' }, + 'flags unless whitelisted': { 'flags.dropsEnabled': true }, + webhooks: { 'preferences.webhooks': [1, 2, 3] }, + sleep: { 'preferences.sleep': true }, + 'disable classes': { 'preferences.disableClasses': true }, }; each(protectedOperations, (data, testName) => { it(`does not allow updating ${testName}`, async () => { - let errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); + const errorText = t('messageUserOperationProtected', { operation: Object.keys(data)[0] }); await expect(user.put('/user', data)).to.eventually.be.rejected.and.eql({ code: 401, @@ -129,7 +129,7 @@ describe('PUT /user', () => { }); context('Default Appearance Preferences', () => { - let testCases = { + const testCases = { shirt: 'yellow', skin: 'ddc994', 'hair.color': 'blond', @@ -144,14 +144,14 @@ describe('PUT /user', () => { update[`preferences.${type}`] = item; it(`updates user with ${type} that is a default`, async () => { - let dbUpdate = {}; + const dbUpdate = {}; dbUpdate[`purchased.${type}.${item}`] = true; await user.update(dbUpdate); // Sanity checks to make sure user is not already equipped with item expect(get(user.preferences, type)).to.not.eql(item); - let updatedUser = await user.put('/user', update); + const updatedUser = await user.put('/user', update); expect(get(updatedUser.preferences, type)).to.eql(item); }); @@ -173,7 +173,7 @@ describe('PUT /user', () => { 'preferences.hair.beard': 3, }); - let updatedUser = await user.put('/user', { + const updatedUser = await user.put('/user', { 'preferences.hair.beard': 0, }); @@ -186,7 +186,7 @@ describe('PUT /user', () => { 'preferences.hair.mustache': 2, }); - let updatedUser = await user.put('/user', { + const updatedUser = await user.put('/user', { 'preferences.hair.mustache': 0, }); @@ -195,7 +195,7 @@ describe('PUT /user', () => { }); context('Purchasable Appearance Preferences', () => { - let testCases = { + const testCases = { background: 'volcano', shirt: 'convict', skin: 'cactus', @@ -213,19 +213,19 @@ describe('PUT /user', () => { await expect(user.put('/user', update)).to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', - message: t('mustPurchaseToSet', {val: item, key: `preferences.${type}`}), + message: t('mustPurchaseToSet', { val: item, key: `preferences.${type}` }), }); }); it(`updates user with ${type} user does own`, async () => { - let dbUpdate = {}; + const dbUpdate = {}; dbUpdate[`purchased.${type}.${item}`] = true; await user.update(dbUpdate); // Sanity check to make sure user is not already equipped with item expect(get(user.preferences, type)).to.not.eql(item); - let updatedUser = await user.put('/user', update); + const updatedUser = await user.put('/user', update); expect(get(updatedUser.preferences, type)).to.eql(item); }); diff --git a/test/api/v4/user/auth/POST-register_local.test.js b/test/api/v4/user/auth/POST-register_local.test.js index 62df06f307..5d5b3abdbb 100644 --- a/test/api/v4/user/auth/POST-register_local.test.js +++ b/test/api/v4/user/auth/POST-register_local.test.js @@ -1,3 +1,5 @@ +import { v4 as uuid } from 'uuid'; +import { each } from 'lodash'; import { generateUser, requester, @@ -6,8 +8,6 @@ import { getProperty, } from '../../../../helpers/api-integration/v4'; import { ApiUser } from '../../../../helpers/api-integration/api-classes'; -import { v4 as uuid } from 'uuid'; -import { each } from 'lodash'; import { encrypt } from '../../../../../website/server/libs/encryption'; function generateRandomUserName () { @@ -23,11 +23,11 @@ describe('POST /user/auth/local/register', () => { }); it('registers a new user', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -43,11 +43,11 @@ describe('POST /user/auth/local/register', () => { xit('remove spaces from username', async () => { // TODO can probably delete this test now - let username = ' usernamewithspaces '; - let email = 'test@example.com'; - let password = 'password'; + const username = ' usernamewithspaces '; + const email = 'test@example.com'; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -108,24 +108,24 @@ describe('POST /user/auth/local/register', () => { context('provides default tags and tasks', async () => { it('for a generic API consumer', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -145,26 +145,26 @@ describe('POST /user/auth/local/register', () => { xit('for Web', async () => { api = requester( null, - {'x-client': 'habitica-web'}, + { 'x-client': 'habitica-web' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(3); expect(habits[0].text).to.eql(t('defaultHabit1Text')); @@ -199,26 +199,26 @@ describe('POST /user/auth/local/register', () => { it('for Android', async () => { api = requester( null, - {'x-client': 'habitica-android'}, + { 'x-client': 'habitica-android' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -230,26 +230,26 @@ describe('POST /user/auth/local/register', () => { it('for iOS', async () => { api = requester( null, - {'x-client': 'habitica-ios'}, + { 'x-client': 'habitica-ios' }, ); - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let dailys = await requests.get('/tasks/user?type=dailys'); - let todos = await requests.get('/tasks/user?type=todos'); - let rewards = await requests.get('/tasks/user?type=rewards'); - let tags = await requests.get('/tags'); + const habits = await requests.get('/tasks/user?type=habits'); + const dailys = await requests.get('/tasks/user?type=dailys'); + const todos = await requests.get('/tasks/user?type=todos'); + const rewards = await requests.get('/tasks/user?type=rewards'); + const tags = await requests.get('/tags'); expect(habits).to.have.a.lengthOf(0); expect(dailys).to.have.a.lengthOf(0); @@ -260,11 +260,11 @@ describe('POST /user/auth/local/register', () => { }); it('enrolls new users in an A/B test', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -275,11 +275,11 @@ describe('POST /user/auth/local/register', () => { }); it('includes items awarded by default when creating a new user', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -292,10 +292,10 @@ describe('POST /user/auth/local/register', () => { }); it('requires password and confirmPassword to match', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let password = 'password'; - let confirmPassword = 'not password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = 'password'; + const confirmPassword = 'not password'; await expect(api.post('/user/auth/local/register', { username, @@ -310,9 +310,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a username', async () => { - let email = `${generateRandomUserName()}@example.com`; - let password = 'password'; - let confirmPassword = 'password'; + const email = `${generateRandomUserName()}@example.com`; + const password = 'password'; + const confirmPassword = 'password'; await expect(api.post('/user/auth/local/register', { email, @@ -326,8 +326,8 @@ describe('POST /user/auth/local/register', () => { }); it('requires an email', async () => { - let username = generateRandomUserName(); - let password = 'password'; + const username = generateRandomUserName(); + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -341,9 +341,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a valid email', async () => { - let username = generateRandomUserName(); - let email = 'notanemail@sdf'; - let password = 'password'; + const username = generateRandomUserName(); + const email = 'notanemail@sdf'; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -358,11 +358,11 @@ describe('POST /user/auth/local/register', () => { }); it('sanitizes email params to a lowercase string before creating the user', async () => { - let username = generateRandomUserName(); - let email = 'ISANEmAiL@ExAmPle.coM'; - let password = 'password'; + const username = generateRandomUserName(); + const email = 'ISANEmAiL@ExAmPle.coM'; + const password = 'password'; - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -373,9 +373,9 @@ describe('POST /user/auth/local/register', () => { }); it('fails on a habitica.com email', async () => { - let username = generateRandomUserName(); - let email = `${username}@habitica.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@habitica.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -390,9 +390,9 @@ describe('POST /user/auth/local/register', () => { }); it('fails on a habitrpg.com email', async () => { - let username = generateRandomUserName(); - let email = `${username}@habitrpg.com`; - let password = 'password'; + const username = generateRandomUserName(); + const email = `${username}@habitrpg.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -407,9 +407,9 @@ describe('POST /user/auth/local/register', () => { }); it('requires a password', async () => { - let username = generateRandomUserName(); - let email = `${username}@example.com`; - let confirmPassword = 'password'; + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const confirmPassword = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -425,9 +425,9 @@ describe('POST /user/auth/local/register', () => { context('attach to facebook user', () => { let user; - let email = 'some@email.net'; - let username = 'some-username'; - let password = 'some-password'; + const email = 'some@email.net'; + const username = 'some-username'; + const password = 'some-password'; beforeEach(async () => { user = await generateUser(); }); @@ -458,7 +458,8 @@ describe('POST /user/auth/local/register', () => { }); context('login is already taken', () => { - let username, email, api; + let username; let email; let + api; beforeEach(async () => { api = requester(); @@ -473,8 +474,8 @@ describe('POST /user/auth/local/register', () => { }); it('rejects if username is already taken', async () => { - let uniqueEmail = `${generateRandomUserName()}@example.com`; - let password = 'password'; + const uniqueEmail = `${generateRandomUserName()}@example.com`; + const password = 'password'; await expect(api.post('/user/auth/local/register', { username, @@ -489,8 +490,8 @@ describe('POST /user/auth/local/register', () => { }); it('rejects if email is already taken', async () => { - let uniqueUsername = generateRandomUserName(); - let password = 'password'; + const uniqueUsername = generateRandomUserName(); + const password = 'password'; await expect(api.post('/user/auth/local/register', { username: uniqueUsername, @@ -506,7 +507,8 @@ describe('POST /user/auth/local/register', () => { }); context('req.query.groupInvite', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { api = requester(); @@ -516,7 +518,7 @@ describe('POST /user/auth/local/register', () => { }); it('does not crash the signup process when it\'s invalid', async () => { - let user = await api.post('/user/auth/local/register?groupInvite=aaaaInvalid', { + const user = await api.post('/user/auth/local/register?groupInvite=aaaaInvalid', { username, email, password, @@ -527,17 +529,17 @@ describe('POST /user/auth/local/register', () => { }); it('supports invite using req.query.groupInvite', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), // so we can let it expire })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -550,11 +552,11 @@ describe('POST /user/auth/local/register', () => { }); it('awards achievement to inviter', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), @@ -572,17 +574,17 @@ describe('POST /user/auth/local/register', () => { }); it('user not added to a party on expired invite', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now() - 6.912e8, // 8 days old })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -593,17 +595,17 @@ describe('POST /user/auth/local/register', () => { }); it('adds a user to a guild on an invite of type other than party', async () => { - let { group, groupLeader } = await createAndPopulateGroup({ + const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); - let invite = encrypt(JSON.stringify({ + const invite = encrypt(JSON.stringify({ id: group._id, inviter: groupLeader._id, sentAt: Date.now(), })); - let user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { + const user = await api.post(`/user/auth/local/register?groupInvite=${invite}`, { username, email, password, @@ -619,7 +621,8 @@ describe('POST /user/auth/local/register', () => { }); context('successful login via api', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { api = requester(); @@ -629,7 +632,7 @@ describe('POST /user/auth/local/register', () => { }); it('sets all site tour values to -2 (already seen)', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -638,13 +641,13 @@ describe('POST /user/auth/local/register', () => { expect(user.flags.tour).to.not.be.empty; - each(user.flags.tour, (value) => { + each(user.flags.tour, value => { expect(value).to.eql(-2); }); }); it('populates user with default todos, not no other task types', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -658,7 +661,7 @@ describe('POST /user/auth/local/register', () => { }); it('populates user with default tags', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -670,17 +673,18 @@ describe('POST /user/auth/local/register', () => { }); context('successful login with habitica-web header', () => { - let api, username, email, password; + let api; let username; let email; let + password; beforeEach(() => { - api = requester({}, {'x-client': 'habitica-web'}); + api = requester({}, { 'x-client': 'habitica-web' }); username = generateRandomUserName(); email = `${username}@example.com`; password = 'password'; }); it('sets all common tutorial flags to true', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -689,13 +693,13 @@ describe('POST /user/auth/local/register', () => { expect(user.flags.tour).to.not.be.empty; - each(user.flags.tutorial.common, (value) => { + each(user.flags.tutorial.common, value => { expect(value).to.eql(true); }); }); it('populates user with default todos, habits, and rewards', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -709,7 +713,7 @@ describe('POST /user/auth/local/register', () => { }); it('populates user with default tags', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, @@ -720,17 +724,17 @@ describe('POST /user/auth/local/register', () => { }); it('adds the correct tags to the correct tasks', async () => { - let user = await api.post('/user/auth/local/register', { + const user = await api.post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let requests = new ApiUser(user); + const requests = new ApiUser(user); - let habits = await requests.get('/tasks/user?type=habits'); - let todos = await requests.get('/tasks/user?type=todos'); + const habits = await requests.get('/tasks/user?type=habits'); + const todos = await requests.get('/tasks/user?type=todos'); expect(habits).to.have.a.lengthOf(0); expect(todos).to.have.a.lengthOf(0); diff --git a/test/api/v4/user/auth/POST-user_verify_display_name.test.js b/test/api/v4/user/auth/POST-user_verify_display_name.test.js index 8fa1b9d5b9..77f30f6a4f 100644 --- a/test/api/v4/user/auth/POST-user_verify_display_name.test.js +++ b/test/api/v4/user/auth/POST-user_verify_display_name.test.js @@ -13,8 +13,8 @@ describe('POST /user/auth/verify-display-name', async () => { }); it('successfully verifies display name including funky characters', async () => { - let newDisplayName = 'Sabé 🤬'; - let response = await user.post(ENDPOINT, { + const newDisplayName = 'Sabé 🤬'; + const response = await user.post(ENDPOINT, { displayName: newDisplayName, }); expect(response).to.eql({ isUsable: true }); diff --git a/test/api/v4/user/auth/POST-user_verify_username.test.js b/test/api/v4/user/auth/POST-user_verify_username.test.js index c17b789a41..2ae95b1c52 100644 --- a/test/api/v4/user/auth/POST-user_verify_username.test.js +++ b/test/api/v4/user/auth/POST-user_verify_username.test.js @@ -13,16 +13,16 @@ describe('POST /user/auth/verify-username', async () => { }); it('successfully verifies username', async () => { - let newUsername = 'new-username'; - let response = await user.post(ENDPOINT, { + const newUsername = 'new-username'; + const response = await user.post(ENDPOINT, { username: newUsername, }); expect(response).to.eql({ isUsable: true }); }); it('successfully verifies username with allowed characters', async () => { - let newUsername = 'new-username_123'; - let response = await user.post(ENDPOINT, { + const newUsername = 'new-username_123'; + const response = await user.post(ENDPOINT, { username: newUsername, }); expect(response).to.eql({ isUsable: true }); diff --git a/test/client/.eslintrc b/test/client/.eslintrc deleted file mode 100644 index e2df933c00..0000000000 --- a/test/client/.eslintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "env": { - "node": true, - "browser": true, - }, - "extends": [ - "habitrpg/browser", - "habitrpg/mocha", - "habitrpg/esnext", - ], -} diff --git a/test/client/e2e/custom-assertions/elementCount.js b/test/client/e2e/custom-assertions/elementCount.js deleted file mode 100644 index b2f5755f0f..0000000000 --- a/test/client/e2e/custom-assertions/elementCount.js +++ /dev/null @@ -1,25 +0,0 @@ -// A custom Nightwatch assertion. -// the name of the method is the filename. -// can be used in tests like this: -// -// browser.assert.elementCount(selector, count) -// -// for how to write custom assertions see -// http://nightwatchjs.org/guide#writing-custom-assertions -exports.assertion = function (selector, count) { - this.message = `Testing if element <${selector}> has count: ${count}`; - this.expected = count; - this.pass = function (val) { - return val === this.expected; - }; - this.value = function (res) { - return res.value; - }; - this.command = function (cb) { - return this.api.execute((el) => { - return document.querySelectorAll(el).length; - }, [selector], (res) => { - cb.call(this, res); - }); - }; -}; diff --git a/test/client/e2e/nightwatch.conf.js b/test/client/e2e/nightwatch.conf.js deleted file mode 100644 index 251dd8bbc4..0000000000 --- a/test/client/e2e/nightwatch.conf.js +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable camelcase */ - -require('babel-register'); -const config = require('../../../webpack/config'); -const chromeDriverPath = require('chromedriver').path; -const seleniumServerPath = require('selenium-server').path; - -// http://nightwatchjs.org/guide#settings-file -module.exports = { - src_folders: ['test/client/e2e/specs'], - output_folder: 'test/client/e2e/reports', - custom_assertions_path: ['test/client/e2e/custom-assertions'], - - selenium: { - start_process: true, - server_path: seleniumServerPath, - host: '127.0.0.1', - port: 4444, - cli_args: { - 'webdriver.chrome.driver': chromeDriverPath, - }, - }, - - test_settings: { - default: { - selenium_port: 4444, - selenium_host: 'localhost', - silent: true, - globals: { - devServerURL: `http://localhost:${process.env.PORT || config.dev.port}`, // eslint-disable-line no-process-env - }, - }, - - chrome: { - desiredCapabilities: { - browserName: 'chrome', - javascriptEnabled: true, - acceptSslCerts: true, - }, - }, - - firefox: { - desiredCapabilities: { - browserName: 'firefox', - javascriptEnabled: true, - acceptSslCerts: true, - }, - }, - }, -}; diff --git a/test/client/e2e/runner.js b/test/client/e2e/runner.js deleted file mode 100644 index 4c3829f785..0000000000 --- a/test/client/e2e/runner.js +++ /dev/null @@ -1,31 +0,0 @@ -// 1. start the dev server using production config -process.env.NODE_ENV = 'testing'; // eslint-disable-line no-process-env -const server = require('../../../webpack/dev-server.js'); - -// 2. run the nightwatch test suite against it -// to run in additional browsers: -// 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings" -// 2. add it to the --env flag below -// or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` -// For more information on Nightwatch's config file, see -// http://nightwatchjs.org/guide#settings-file -let opts = process.argv.slice(2); -if (opts.indexOf('--config') === -1) { - opts = opts.concat(['--config', 'test/client/e2e/nightwatch.conf.js']); -} -if (opts.indexOf('--env') === -1) { - opts = opts.concat(['--env', 'chrome']); -} - -const spawn = require('cross-spawn'); -const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }); - -runner.on('exit', function (code) { - server.close(); - process.exit(code); -}); - -runner.on('error', function (err) { - server.close(); - throw err; -}); diff --git a/test/client/e2e/specs/test.js b/test/client/e2e/specs/test.js deleted file mode 100644 index da58561b29..0000000000 --- a/test/client/e2e/specs/test.js +++ /dev/null @@ -1,19 +0,0 @@ -// For authoring Nightwatch tests, see -// http://nightwatchjs.org/guide#usage - -module.exports = { - 'default e2e tests' (browser) { - // automatically uses dev Server port from /config.index.js - // default: http://localhost:8080 - // see nightwatch.conf.js - const devServer = browser.globals.devServerURL; - - browser - .url(devServer) - .waitForElementVisible('#app', 5000) - .assert.elementPresent('.logo') - .assert.containsText('h1', 'Hello Vue!') - .assert.elementCount('p', 3) - .end(); - }, -}; diff --git a/test/client/unit/index.js b/test/client/unit/index.js index f56cc96744..9a3f4b6f9a 100644 --- a/test/client/unit/index.js +++ b/test/client/unit/index.js @@ -1,3 +1,4 @@ +/* eslint-disable */ // TODO verify if it's needed, added because Axios require Promise in the global scope // and babel-runtime doesn't affect external libraries require('babel-polyfill'); @@ -12,9 +13,9 @@ afterEach(() => { }); // require all test files -let testsContext = require.context('./specs', true, /\.js$/); +const testsContext = require.context('./specs', true, /\.js$/); testsContext.keys().forEach(testsContext); // require all .vue and .js files except main.js for coverage. -let srcContext = require.context('../../../website/client', true, /^\.\/(?=(?!main(\.js)?$))(?=(.*\.(vue|js)$))/); -srcContext.keys().forEach(srcContext); \ No newline at end of file +const srcContext = require.context('../../../website/client', true, /^\.\/(?=(?!main(\.js)?$))(?=(.*\.(vue|js)$))/); +srcContext.keys().forEach(srcContext); diff --git a/test/client/unit/karma.conf.js b/test/client/unit/karma.conf.js index 7bc7b3800e..b12c5aac67 100644 --- a/test/client/unit/karma.conf.js +++ b/test/client/unit/karma.conf.js @@ -1,3 +1,4 @@ +/* eslint-disable */ // This is a karma config file. For more details see // http://karma-runner.github.io/0.13/config/configuration-file.html // we are also using it with karma-webpack @@ -6,7 +7,8 @@ // Necessary for babel to respect the env version of .babelrc which is necessary // Because inject-loader does not work with ["es2015", { modules: false }] that we use // in order to let webpack2 handle the imports -process.env.CHROME_BIN = require('puppeteer').executablePath(); // eslint-disable-line no-process-env +process.env.CHROME_BIN = require('puppeteer').executablePath(); +// eslint-disable-line no-process-env process.env.BABEL_ENV = process.env.NODE_ENV; // eslint-disable-line no-process-env const webpackConfig = require('../../../webpack/webpack.test.conf'); diff --git a/test/common/count.js b/test/common/count.js index fd44d04b7d..e834d03cb1 100644 --- a/test/common/count.js +++ b/test/common/count.js @@ -1,64 +1,64 @@ /* eslint-disable camelcase */ -let count = require('../../website/common/script/count'); +import * as count from '../../website/common/script/count'; describe('count', () => { describe('beastMasterProgress', () => { it('returns 0 if no pets', () => { - let pets = {}; - let beastMasterTotal = count.beastMasterProgress(pets); + const pets = {}; + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(0); }); it('counts drop pets', () => { - let pets = { 'Dragon-Red': 1, 'Wolf-Base': 2 }; - let beastMasterTotal = count.beastMasterProgress(pets); + const pets = { 'Dragon-Red': 1, 'Wolf-Base': 2 }; + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(2); }); it('does not count quest pets', () => { - let pets = { 'Dragon-Red': 1, 'Gryphon-Base': 1 }; - let beastMasterTotal = count.beastMasterProgress(pets); + const pets = { 'Dragon-Red': 1, 'Gryphon-Base': 1 }; + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(1); }); it('does not count pets hatched with premium potions', () => { - let pets = { + const pets = { 'Wolf-Spooky': 5, 'Dragon-Spooky': 5, 'FlyingPig-Base': 5, }; - let beastMasterTotal = count.beastMasterProgress(pets); + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(1); }); it('does not count special pets', () => { - let pets = { + const pets = { 'Wolf-Base': 2, 'Wolf-Veteran': 1, 'Wolf-Cerberus': 1, 'Dragon-Hydra': 1, }; - let beastMasterTotal = count.beastMasterProgress(pets); + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(1); }); it('counts drop pets that have been raised to a mount', () => { - let raisedToMount = -1; - let pets = { 'Dragon-Red': 1, 'Wolf-Base': raisedToMount }; - let beastMasterTotal = count.beastMasterProgress(pets); + const raisedToMount = -1; + const pets = { 'Dragon-Red': 1, 'Wolf-Base': raisedToMount }; + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(2); }); it('does not counts drop pets that have been released', () => { - let releasedPet = 0; - let pets = { 'Dragon-Red': 1, 'Wolf-Base': releasedPet }; - let beastMasterTotal = count.beastMasterProgress(pets); + const releasedPet = 0; + const pets = { 'Dragon-Red': 1, 'Wolf-Base': releasedPet }; + const beastMasterTotal = count.beastMasterProgress(pets); expect(beastMasterTotal).to.eql(1); }); @@ -66,47 +66,47 @@ describe('count', () => { describe('mountMasterProgress', () => { it('returns 0 if no mounts', () => { - let mounts = {}; - let mountMasterTotal = count.mountMasterProgress(mounts); + const mounts = {}; + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(0); }); it('counts drop mounts', () => { - let mounts = { 'Dragon-Red': true, 'Wolf-Base': true }; - let mountMasterTotal = count.mountMasterProgress(mounts); + const mounts = { 'Dragon-Red': true, 'Wolf-Base': true }; + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(2); }); it('does not count premium mounts', () => { - let mounts = { + const mounts = { 'Dragon-Red': true, 'FlyingPig-Spooky': true, }; - let mountMasterTotal = count.mountMasterProgress(mounts); + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(1); }); it('does not count quest mounts', () => { - let mounts = { 'Dragon-Red': true, 'Gryphon-Base': true }; - let mountMasterTotal = count.mountMasterProgress(mounts); + const mounts = { 'Dragon-Red': true, 'Gryphon-Base': true }; + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(1); }); it('does not count special mounts', () => { - let mounts = { 'Wolf-Base': true, 'BearCub-Polar': true}; - let mountMasterTotal = count.mountMasterProgress(mounts); + const mounts = { 'Wolf-Base': true, 'BearCub-Polar': true }; + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(1); }); it('only counts drop mounts that are currently owned', () => { - let notCurrentlyOwned = false; - let mounts = { 'Dragon-Red': true, 'Wolf-Base': notCurrentlyOwned }; - let mountMasterTotal = count.mountMasterProgress(mounts); + const notCurrentlyOwned = false; + const mounts = { 'Dragon-Red': true, 'Wolf-Base': notCurrentlyOwned }; + const mountMasterTotal = count.mountMasterProgress(mounts); expect(mountMasterTotal).to.eql(1); }); @@ -114,7 +114,7 @@ describe('count', () => { describe('remainingGearInSet', () => { it('counts remaining gear based on set', () => { - let gear = { + const gear = { weapon_wizard_0: true, weapon_wizard_1: true, weapon_warrior_0: true, @@ -123,20 +123,20 @@ describe('count', () => { weapon_armor_1: true, }; - let armoireCount = count.remainingGearInSet(gear, 'warrior'); + const armoireCount = count.remainingGearInSet(gear, 'warrior'); expect(armoireCount).to.eql(20); }); it.skip('includes previously owned items in count (https: //github.com/HabitRPG/habitrpg/issues/5624#issuecomment-124018717)', () => { - let gear = { + const gear = { weapon_warrior_0: false, weapon_warrior_1: false, weapon_armor_0: true, weapon_armor_1: true, }; - let armoireCount = count.remainingGearInSet(gear, 'warrior'); + const armoireCount = count.remainingGearInSet(gear, 'warrior'); expect(armoireCount).to.eql(20); }); @@ -144,45 +144,45 @@ describe('count', () => { describe('dropPetsCurrentlyOwned', () => { it('counts drop pets owned', () => { - let pets = { + const pets = { 'Wolf-Base': 2, 'Wolf-Red': 4, }; - let dropPets = count.dropPetsCurrentlyOwned(pets); + const dropPets = count.dropPetsCurrentlyOwned(pets); expect(dropPets).to.eql(2); }); it('does not count pets that have been raised to mounts', () => { - let pets = { + const pets = { 'Wolf-Base': -1, 'Wolf-Red': 4, 'Wolf-Veteran': 1, 'Gryphon-Base': 1, }; - let dropPets = count.dropPetsCurrentlyOwned(pets); + const dropPets = count.dropPetsCurrentlyOwned(pets); expect(dropPets).to.eql(1); }); it('does not count quest pets', () => { - let pets = { + const pets = { 'Wolf-Base': 2, 'Wolf-Red': 4, 'Gryphon-Base': 1, }; - let dropPets = count.dropPetsCurrentlyOwned(pets); + const dropPets = count.dropPetsCurrentlyOwned(pets); expect(dropPets).to.eql(2); }); it('does not count special pets', () => { - let pets = { + const pets = { 'Wolf-Base': 2, 'Wolf-Red': 4, 'Wolf-Veteran': 1, }; - let dropPets = count.dropPetsCurrentlyOwned(pets); + const dropPets = count.dropPetsCurrentlyOwned(pets); expect(dropPets).to.eql(2); }); @@ -190,16 +190,16 @@ describe('count', () => { describe('questsOfCategory', () => { it('counts user quest scrolls of a particular category', () => { - let quests = { + const quests = { atom1: 2, whale: 4, kraken: 2, sheep: 1, goldenknight2: 1, }; - let petQuestCount = count.questsOfCategory(quests, 'pet'); - let unlockableQuestCount = count.questsOfCategory(quests, 'unlockable'); - let goldQuestCount = count.questsOfCategory(quests, 'gold'); + const petQuestCount = count.questsOfCategory(quests, 'pet'); + const unlockableQuestCount = count.questsOfCategory(quests, 'unlockable'); + const goldQuestCount = count.questsOfCategory(quests, 'gold'); expect(petQuestCount).to.eql(3); expect(unlockableQuestCount).to.eql(2); diff --git a/test/common/fns/autoAllocate.test.js b/test/common/fns/autoAllocate.test.js index 7db6f0d371..89d2859c1d 100644 --- a/test/common/fns/autoAllocate.test.js +++ b/test/common/fns/autoAllocate.test.js @@ -9,8 +9,8 @@ describe('shared.fns.autoAllocate', () => { beforeEach(() => { user = generateUser(); // necessary to test task training reset behavior - user.stats.toObject = function () { - let obj = JSON.parse(JSON.stringify(this)); + user.stats.toObject = function toObject () { + const obj = JSON.parse(JSON.stringify(this)); return obj; }; diff --git a/test/common/fns/crit.test.js b/test/common/fns/crit.test.js index c4925c48c8..70261ebdef 100644 --- a/test/common/fns/crit.test.js +++ b/test/common/fns/crit.test.js @@ -11,7 +11,7 @@ describe('crit', () => { }); it('computes', () => { - let result = crit.crit(user); + const result = crit.crit(user); expect(result).to.eql(1); }); }); diff --git a/test/common/fns/handleTwoHanded.js b/test/common/fns/handleTwoHanded.js index b45594fd12..03ae38f3de 100644 --- a/test/common/fns/handleTwoHanded.js +++ b/test/common/fns/handleTwoHanded.js @@ -13,11 +13,11 @@ describe('shared.fns.handleTwoHanded', () => { }); it('uses "messageTwoHandedUnequip" message if item is a shield and current weapon is two handed (and sets the user\'s weapon to the base one)', () => { - let item = content.gear.tree.shield.warrior['2']; - let currentWeapon = content.gear.tree.weapon.armoire.rancherLasso; + const item = content.gear.tree.shield.warrior['2']; + const currentWeapon = content.gear.tree.weapon.armoire.rancherLasso; user.items.gear.equipped.weapon = 'weapon_armoire_rancherLasso'; - let message = handleTwoHanded(user, item); + const message = handleTwoHanded(user, item); expect(message).to.equal(i18n.t('messageTwoHandedUnequip', { twoHandedText: currentWeapon.text(), offHandedText: item.text(), })); @@ -25,11 +25,11 @@ describe('shared.fns.handleTwoHanded', () => { }); it('uses "messageTwoHandedEquip" message if item is two handed and currentShield exists but is not "shield_base_0" (and sets the user\'s shield to the base one)', () => { - let item = content.gear.tree.weapon.armoire.rancherLasso; - let currentShield = content.gear.tree.shield.armoire.gladiatorShield; + const item = content.gear.tree.weapon.armoire.rancherLasso; + const currentShield = content.gear.tree.shield.armoire.gladiatorShield; user.items.gear.equipped.shield = 'shield_armoire_gladiatorShield'; - let message = handleTwoHanded(user, item); + const message = handleTwoHanded(user, item); expect(message).to.equal(i18n.t('messageTwoHandedEquip', { twoHandedText: item.text(), offHandedText: currentShield.text(), })); diff --git a/test/common/fns/predictableRandom.test.js b/test/common/fns/predictableRandom.test.js index a4c726699e..5a4eeb9a05 100644 --- a/test/common/fns/predictableRandom.test.js +++ b/test/common/fns/predictableRandom.test.js @@ -18,8 +18,8 @@ describe('shared.fns.predictableRandom', () => { user.stats.hp = 43; user.stats.gp = 34; - let val1 = predictableRandom(user); - let val2 = predictableRandom(user); + const val1 = predictableRandom(user); + const val2 = predictableRandom(user); expect(val2).to.equal(val1); }); @@ -27,24 +27,24 @@ describe('shared.fns.predictableRandom', () => { it('returns a different value when user.stats is not the same and no seed is passed', () => { user.stats.hp = 43; user.stats.gp = 34; - let val1 = predictableRandom(user); + const val1 = predictableRandom(user); user.stats.gp = 35; - let val2 = predictableRandom(user); + const val2 = predictableRandom(user); expect(val2).to.not.equal(val1); }); it('returns the same value when the same seed is passed', () => { - let val1 = predictableRandom(user, 4452673762); - let val2 = predictableRandom(user, 4452673762); + const val1 = predictableRandom(user, 4452673762); + const val2 = predictableRandom(user, 4452673762); expect(val2).to.equal(val1); }); it('returns a different value when a different seed is passed', () => { - let val1 = predictableRandom(user, 4452673761); - let val2 = predictableRandom(user, 4452673762); + const val1 = predictableRandom(user, 4452673761); + const val2 = predictableRandom(user, 4452673762); expect(val2).to.not.equal(val1); }); diff --git a/test/common/fns/randomDrop.test.js b/test/common/fns/randomDrop.test.js index c04bddacb7..6ebc31d2df 100644 --- a/test/common/fns/randomDrop.test.js +++ b/test/common/fns/randomDrop.test.js @@ -113,8 +113,9 @@ describe('common.fns.randomDrop', () => { randomDrop(user, { task, predictableRandom }); expect(user._tmp.drop.type).to.eql('HatchingPotion'); expect(user._tmp.drop.value).to.eql(4); - let acceptableDrops = ['Zombie', 'CottonCandyPink', 'CottonCandyBlue']; - expect(acceptableDrops).to.contain(user._tmp.drop.key); // deterministically 'CottonCandyBlue' + const acceptableDrops = ['Zombie', 'CottonCandyPink', 'CottonCandyBlue']; + // deterministically 'CottonCandyBlue' + expect(acceptableDrops).to.contain(user._tmp.drop.key); }); it('drops an uncommon potion', () => { @@ -123,7 +124,7 @@ describe('common.fns.randomDrop', () => { randomDrop(user, { task, predictableRandom }); expect(user._tmp.drop.type).to.eql('HatchingPotion'); expect(user._tmp.drop.value).to.eql(3); - let acceptableDrops = ['Red', 'Shade', 'Skeleton']; + const acceptableDrops = ['Red', 'Shade', 'Skeleton']; expect(acceptableDrops).to.contain(user._tmp.drop.key); // always skeleton }); @@ -133,7 +134,7 @@ describe('common.fns.randomDrop', () => { randomDrop(user, { task, predictableRandom }); expect(user._tmp.drop.type).to.eql('HatchingPotion'); expect(user._tmp.drop.value).to.eql(2); - let acceptableDrops = ['Base', 'White', 'Desert']; + const acceptableDrops = ['Base', 'White', 'Desert']; expect(acceptableDrops).to.contain(user._tmp.drop.key); // always Desert }); }); diff --git a/test/common/fns/statsComputed.test.js b/test/common/fns/statsComputed.test.js index 2fad55b349..2dce64dfd6 100644 --- a/test/common/fns/statsComputed.test.js +++ b/test/common/fns/statsComputed.test.js @@ -11,7 +11,7 @@ describe('common.fns.statsComputed', () => { }); it('returns default values', () => { - let result = statsComputed(user); + const result = statsComputed(user); expect(result.per).to.eql(0); expect(result.con).to.eql(0); expect(result.str).to.eql(0); @@ -20,7 +20,7 @@ describe('common.fns.statsComputed', () => { it('calculates stat bonuses for equipment', () => { user.items.gear.equipped.weapon = 'weapon_rogue_1'; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(2); expect(result.gearBonus.str).to.eql(2); @@ -28,7 +28,7 @@ describe('common.fns.statsComputed', () => { it('calculates stat bonuses for class', () => { user.items.gear.equipped.weapon = 'weapon_warrior_1'; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(4.5); expect(result.gearBonus.str).to.eql(3); @@ -37,7 +37,7 @@ describe('common.fns.statsComputed', () => { it('calculates stat bonuses for level', () => { user.stats.lvl = 25; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(12); expect(result.levelBonus.str).to.eql(12); @@ -45,7 +45,7 @@ describe('common.fns.statsComputed', () => { it('correctly caps level stat bonuses', () => { user.stats.lvl = 150; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(50); expect(result.levelBonus.str).to.eql(50); @@ -53,7 +53,7 @@ describe('common.fns.statsComputed', () => { it('sets baseStat field', () => { user.stats.str = 20; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(20); expect(result.baseStat.str).to.eql(20); @@ -61,7 +61,7 @@ describe('common.fns.statsComputed', () => { it('sets buffs field', () => { user.stats.buffs.str = 150; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.str).to.eql(150); expect(result.buff.str).to.eql(150); @@ -70,14 +70,14 @@ describe('common.fns.statsComputed', () => { it('calculates mp from intelligence', () => { user.stats.int = 150; user.stats.buffs.int = 50; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.maxMP).to.eql(430); }); it('calculates stat bonuses for back equipment', () => { user.items.gear.equipped.back = 'back_special_takeThis'; - let result = statsComputed(user); + const result = statsComputed(user); expect(result.int).to.eql(1); expect(result.per).to.eql(1); diff --git a/test/common/fns/ultimateGear.js b/test/common/fns/ultimateGear.js index 06530dd938..e5d35f4cba 100644 --- a/test/common/fns/ultimateGear.js +++ b/test/common/fns/ultimateGear.js @@ -8,24 +8,22 @@ describe('shared.fns.ultimateGear', () => { beforeEach(() => { user = generateUser(); - user.achievements.ultimateGearSets.toObject = function () { + user.achievements.ultimateGearSets.toObject = function toIbject () { return this; }; user.addNotification = sinon.spy(); }); it('sets armoirEnabled when partial achievement already achieved', () => { - let items = { + const items = { gear: { owned: { - toObject: () => { - return { - armor_warrior_5: true, // eslint-disable-line camelcase - shield_warrior_5: true, // eslint-disable-line camelcase - head_warrior_5: true, // eslint-disable-line camelcase - weapon_warrior_6: true, // eslint-disable-line camelcase - }; - }, + toObject: () => ({ + armor_warrior_5: true, // eslint-disable-line camelcase + shield_warrior_5: true, // eslint-disable-line camelcase + head_warrior_5: true, // eslint-disable-line camelcase + weapon_warrior_6: true, // eslint-disable-line camelcase + }), }, }, }; @@ -40,17 +38,15 @@ describe('shared.fns.ultimateGear', () => { it('does not set armoireEnabled when gear is not owned', () => { user.flags.armoireEnabled = false; - let items = { + const items = { gear: { owned: { - toObject: () => { - return { - armor_warrior_5: true, // eslint-disable-line camelcase - shield_warrior_5: true, // eslint-disable-line camelcase - head_warrior_5: true, // eslint-disable-line camelcase - weapon_warrior_6: false, // eslint-disable-line camelcase - }; - }, + toObject: () => ({ + armor_warrior_5: true, // eslint-disable-line camelcase + shield_warrior_5: true, // eslint-disable-line camelcase + head_warrior_5: true, // eslint-disable-line camelcase + weapon_warrior_6: false, // eslint-disable-line camelcase + }), }, }, }; diff --git a/test/common/fns/updateStats.test.js b/test/common/fns/updateStats.test.js index de14a8ffff..d98f23341d 100644 --- a/test/common/fns/updateStats.test.js +++ b/test/common/fns/updateStats.test.js @@ -12,8 +12,8 @@ describe('common.fns.updateStats', () => { }); context('No Hp', () => { - it('updates user\s hp', () => { - let stats = { hp: 0 }; + it('updates user\'s hp', () => { + const stats = { hp: 0 }; expect(user.stats.hp).to.not.eql(0); updateStats(user, stats); expect(user.stats.hp).to.eql(0); @@ -22,7 +22,7 @@ describe('common.fns.updateStats', () => { }); it('does not lower hp below 0', () => { - let stats = { + const stats = { hp: -5, }; updateStats(user, stats); @@ -32,7 +32,7 @@ describe('common.fns.updateStats', () => { context('Stat Allocation', () => { it('adds only attribute points up to user\'s level', () => { - let stats = { + const stats = { exp: 261, }; expect(user.stats.points).to.eql(0); @@ -45,7 +45,7 @@ describe('common.fns.updateStats', () => { }); it('adds an attibute point when user\'s stat points are less than max level', () => { - let stats = { + const stats = { exp: 3581, }; @@ -61,7 +61,7 @@ describe('common.fns.updateStats', () => { }); it('does not add an attibute point when user\'s stat points are equal to max level', () => { - let stats = { + const stats = { exp: 3581, }; @@ -77,7 +77,7 @@ describe('common.fns.updateStats', () => { }); it('does not add an attibute point when user\'s stat points + unallocated points are equal to max level', () => { - let stats = { + const stats = { exp: 3581, }; @@ -94,7 +94,7 @@ describe('common.fns.updateStats', () => { }); it('only awards stat points up to level 100 if user is missing unallocated stat points and is over level 100', () => { - let stats = { + const stats = { exp: 5581, }; @@ -182,7 +182,7 @@ describe('common.fns.updateStats', () => { xit('auto allocates stats if automaticAllocation is turned on', () => { sandbox.stub(user.fns, 'autoAllocate'); - let stats = { + const stats = { exp: 261, }; diff --git a/test/common/libs/achievements.test.js b/test/common/libs/achievements.test.js index 784e27b993..e3e356ff1b 100644 --- a/test/common/libs/achievements.test.js +++ b/test/common/libs/achievements.test.js @@ -5,11 +5,11 @@ import { describe('achievements', () => { describe('general well-formedness', () => { - let user = generateUser(); - let achievements = shared.achievements.getAchievementsForProfile(user); + const user = generateUser(); + const achievements = shared.achievements.getAchievementsForProfile(user); it('each category has \'label\' and \'achievements\' fields', () => { - _.each(achievements, (category) => { + _.each(achievements, category => { expect(category).to.have.property('label') .that.is.a('string'); expect(category).to.have.property('achievements') @@ -18,8 +18,8 @@ describe('achievements', () => { }); it('each achievement has all required fields of correct types', () => { - _.each(achievements, (category) => { - _.each(category.achievements, (achiev) => { + _.each(achievements, category => { + _.each(category.achievements, achiev => { // May have additional fields (such as 'value' and 'optionalCount'). expect(achiev).to.contain.all.keys(['title', 'text', 'icon', 'earned', 'index']); expect(achiev.title).to.be.a('string'); @@ -32,18 +32,18 @@ describe('achievements', () => { }); it('categories have unique labels', () => { - let achievementsArray = _.values(achievements).map(cat => cat.label); - let labels = _.uniq(achievementsArray); + const achievementsArray = _.values(achievements).map(cat => cat.label); + const labels = _.uniq(achievementsArray); expect(labels.length).to.be.greaterThan(0); expect(labels.length).to.eql(_.size(achievements)); }); it('achievements have unique keys', () => { - let keysSoFar = {}; + const keysSoFar = {}; - _.each(achievements, (category) => { - _.keys(category.achievements).forEach((key) => { + _.each(achievements, category => { + _.keys(category.achievements).forEach(key => { expect(keysSoFar[key]).to.be.undefined; keysSoFar[key] = key; }); @@ -51,11 +51,11 @@ describe('achievements', () => { }); it('achievements have unique indices', () => { - let indicesSoFar = {}; + const indicesSoFar = {}; - _.each(achievements, (category) => { - _.each(category.achievements, (achiev) => { - let i = achiev.index; + _.each(achievements, category => { + _.each(category.achievements, achiev => { + const i = achiev.index; expect(indicesSoFar[i]).to.be.undefined; indicesSoFar[i] = i; }); @@ -63,19 +63,19 @@ describe('achievements', () => { }); it('all categories have at least 1 achievement', () => { - _.each(achievements, (category) => { + _.each(achievements, category => { expect(_.size(category.achievements)).to.be.greaterThan(0); }); }); }); describe('unearned basic achievements', () => { - let user = generateUser(); - let basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; + const user = generateUser(); + const basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; it('streak and perfect day achievements exist with counts', () => { - let streak = basicAchievs.streak; - let perfect = basicAchievs.perfect; + const { streak } = basicAchievs; + const { perfect } = basicAchievs; expect(streak).to.exist; expect(streak).to.have.property('optionalCount') @@ -86,8 +86,8 @@ describe('achievements', () => { }); it('party up/on achievements exist with no counts', () => { - let partyUp = basicAchievs.partyUp; - let partyOn = basicAchievs.partyOn; + const { partyUp } = basicAchievs; + const { partyOn } = basicAchievs; expect(partyUp).to.exist; expect(partyUp.optionalCount).to.be.undefined; @@ -96,9 +96,9 @@ describe('achievements', () => { }); it('pet/mount master and triad bingo achievements exist with counts', () => { - let beastMaster = basicAchievs.beastMaster; - let mountMaster = basicAchievs.mountMaster; - let triadBingo = basicAchievs.triadBingo; + const { beastMaster } = basicAchievs; + const { mountMaster } = basicAchievs; + const { triadBingo } = basicAchievs; expect(beastMaster).to.exist; expect(beastMaster).to.have.property('optionalCount') @@ -112,9 +112,9 @@ describe('achievements', () => { }); it('ultimate gear achievements exist with no counts', () => { - let gearTypes = ['healer', 'rogue', 'warrior', 'mage']; - gearTypes.forEach((gear) => { - let gearAchiev = basicAchievs[`${gear}UltimateGear`]; + const gearTypes = ['healer', 'rogue', 'warrior', 'mage']; + gearTypes.forEach(gear => { + const gearAchiev = basicAchievs[`${gear}UltimateGear`]; expect(gearAchiev).to.exist; expect(gearAchiev.optionalCount).to.be.undefined; @@ -122,9 +122,9 @@ describe('achievements', () => { }); it('card achievements exist with counts', () => { - let cardTypes = ['greeting', 'thankyou', 'birthday', 'congrats', 'getwell', 'goodluck']; - cardTypes.forEach((card) => { - let cardAchiev = basicAchievs[`${card}Cards`]; + const cardTypes = ['greeting', 'thankyou', 'birthday', 'congrats', 'getwell', 'goodluck']; + cardTypes.forEach(card => { + const cardAchiev = basicAchievs[`${card}Cards`]; expect(cardAchiev).to.exist; expect(cardAchiev).to.have.property('optionalCount') @@ -133,7 +133,7 @@ describe('achievements', () => { }); it('rebirth achievement exists with no count', () => { - let rebirth = basicAchievs.rebirth; + const { rebirth } = basicAchievs; expect(rebirth).to.exist; expect(rebirth.optionalCount).to.be.undefined; @@ -141,12 +141,13 @@ describe('achievements', () => { }); describe('unearned seasonal achievements', () => { - let user = generateUser(); - let seasonalAchievs = shared.achievements.getAchievementsForProfile(user).seasonal.achievements; + const user = generateUser(); + const userAchievements = shared.achievements.getAchievementsForProfile(user); + const seasonalAchievs = userAchievements.seasonal.achievements; it('habiticaDays and habitBirthdays achievements exist with counts', () => { - let habiticaDays = seasonalAchievs.habiticaDays; - let habitBirthdays = seasonalAchievs.habitBirthdays; + const { habiticaDays } = seasonalAchievs; + const { habitBirthdays } = seasonalAchievs; expect(habiticaDays).to.exist; expect(habiticaDays).to.have.property('optionalCount') @@ -157,9 +158,9 @@ describe('achievements', () => { }); it('spell achievements exist with counts', () => { - let spellTypes = ['snowball', 'spookySparkles', 'shinySeed', 'seafoam']; - spellTypes.forEach((spell) => { - let spellAchiev = seasonalAchievs[spell]; + const spellTypes = ['snowball', 'spookySparkles', 'shinySeed', 'seafoam']; + spellTypes.forEach(spell => { + const spellAchiev = seasonalAchievs[spell]; expect(spellAchiev).to.exist; expect(spellAchiev).to.have.property('optionalCount') @@ -168,16 +169,16 @@ describe('achievements', () => { }); it('quest achievements do not exist', () => { - let quests = ['dilatory', 'stressbeast', 'burnout', 'bewilder']; - quests.forEach((quest) => { - let questAchiev = seasonalAchievs[`${quest}Quest`]; + const quests = ['dilatory', 'stressbeast', 'burnout', 'bewilder']; + quests.forEach(quest => { + const questAchiev = seasonalAchievs[`${quest}Quest`]; expect(questAchiev).to.not.exist; }); }); it('costumeContests achievement exists with count', () => { - let costumeContests = seasonalAchievs.costumeContests; + const { costumeContests } = seasonalAchievs; expect(costumeContests).to.exist; expect(costumeContests).to.have.property('optionalCount') @@ -185,9 +186,9 @@ describe('achievements', () => { }); it('card achievements exist with counts', () => { - let cardTypes = ['nye', 'valentine']; - cardTypes.forEach((card) => { - let cardAchiev = seasonalAchievs[`${card}Cards`]; + const cardTypes = ['nye', 'valentine']; + cardTypes.forEach(card => { + const cardAchiev = seasonalAchievs[`${card}Cards`]; expect(cardAchiev).to.exist; expect(cardAchiev).to.have.property('optionalCount') @@ -197,11 +198,11 @@ describe('achievements', () => { }); describe('unearned special achievements', () => { - let user = generateUser(); - let specialAchievs = shared.achievements.getAchievementsForProfile(user).special.achievements; + const user = generateUser(); + const specialAchievs = shared.achievements.getAchievementsForProfile(user).special.achievements; it('habitSurveys achievement exists with count', () => { - let habitSurveys = specialAchievs.habitSurveys; + const { habitSurveys } = specialAchievs; expect(habitSurveys).to.exist; expect(habitSurveys).to.have.property('optionalCount') @@ -209,7 +210,7 @@ describe('achievements', () => { }); it('contributor achievement exists with value and no count', () => { - let contributor = specialAchievs.contributor; + const { contributor } = specialAchievs; expect(contributor).to.exist; expect(contributor).to.have.property('value') @@ -218,37 +219,38 @@ describe('achievements', () => { }); it('npc achievement is hidden if unachieved', () => { - let npc = specialAchievs.npc; + const { npc } = specialAchievs; expect(npc).to.not.exist; }); it('kickstarter achievement is hidden if unachieved', () => { - let kickstarter = specialAchievs.kickstarter; + const { kickstarter } = specialAchievs; expect(kickstarter).to.not.exist; }); it('veteran achievement is hidden if unachieved', () => { - let veteran = specialAchievs.veteran; + const { veteran } = specialAchievs; expect(veteran).to.not.exist; }); it('originalUser achievement is hidden if unachieved', () => { - let originalUser = specialAchievs.originalUser; + const { originalUser } = specialAchievs; expect(originalUser).to.not.exist; }); }); describe('earned seasonal achievements', () => { - let user = generateUser(); - let quests = ['dilatory', 'stressbeast', 'burnout', 'bewilder']; - quests.forEach((quest) => { + const user = generateUser(); + const quests = ['dilatory', 'stressbeast', 'burnout', 'bewilder']; + quests.forEach(quest => { user.achievements.quests[quest] = 1; }); - let seasonalAchievs = shared.achievements.getAchievementsForProfile(user).seasonal.achievements; + const userAchievements = shared.achievements.getAchievementsForProfile(user); + const seasonalAchievs = userAchievements.seasonal.achievements; it('quest achievements exist', () => { - quests.forEach((quest) => { - let questAchiev = seasonalAchievs[`${quest}Quest`]; + quests.forEach(quest => { + const questAchiev = seasonalAchievs[`${quest}Quest`]; expect(questAchiev).to.exist; expect(questAchiev.optionalCount).to.be.undefined; @@ -257,19 +259,19 @@ describe('achievements', () => { }); describe('earned special achievements', () => { - let user = generateUser({ + const user = generateUser({ achievements: { habitSurveys: 2, veteran: true, originalUser: true, }, - backer: {tier: 3}, - contributor: {level: 1}, + backer: { tier: 3 }, + contributor: { level: 1 }, }); - let specialAchievs = shared.achievements.getAchievementsForProfile(user).special.achievements; + const specialAchievs = shared.achievements.getAchievementsForProfile(user).special.achievements; it('habitSurveys achievement is earned with correct value', () => { - let habitSurveys = specialAchievs.habitSurveys; + const { habitSurveys } = specialAchievs; expect(habitSurveys).to.exist; expect(habitSurveys.earned).to.eql(true); @@ -277,7 +279,7 @@ describe('achievements', () => { }); it('contributor achievement is earned with correct value', () => { - let contributor = specialAchievs.contributor; + const { contributor } = specialAchievs; expect(contributor).to.exist; expect(contributor.earned).to.eql(true); @@ -285,10 +287,10 @@ describe('achievements', () => { }); it('npc achievement is earned with correct value', () => { - let npcUser = generateUser({ - backer: {npc: 'test'}, + const npcUser = generateUser({ + backer: { npc: 'test' }, }); - let npc = shared.achievements.getAchievementsForProfile(npcUser).special.achievements.npc; + const { npc } = shared.achievements.getAchievementsForProfile(npcUser).special.achievements; expect(npc).to.exist; expect(npc.earned).to.eql(true); @@ -296,7 +298,7 @@ describe('achievements', () => { }); it('kickstarter achievement is earned with correct value', () => { - let kickstarter = specialAchievs.kickstarter; + const { kickstarter } = specialAchievs; expect(kickstarter).to.exist; expect(kickstarter.earned).to.eql(true); @@ -304,14 +306,14 @@ describe('achievements', () => { }); it('veteran achievement is earned', () => { - let veteran = specialAchievs.veteran; + const { veteran } = specialAchievs; expect(veteran).to.exist; expect(veteran.earned).to.eql(true); }); it('originalUser achievement is earned', () => { - let originalUser = specialAchievs.originalUser; + const { originalUser } = specialAchievs; expect(originalUser).to.exist; expect(originalUser.earned).to.eql(true); @@ -320,12 +322,12 @@ describe('achievements', () => { describe('mountMaster, beastMaster, and triadBingo achievements', () => { it('master and triad bingo achievements do not include *Text2 strings if no keys have been used', () => { - let user = generateUser(); - let basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; + const user = generateUser(); + const basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; - let beastMaster = basicAchievs.beastMaster; - let mountMaster = basicAchievs.mountMaster; - let triadBingo = basicAchievs.triadBingo; + const { beastMaster } = basicAchievs; + const { mountMaster } = basicAchievs; + const { triadBingo } = basicAchievs; expect(beastMaster.text).to.not.match(/released/); expect(beastMaster.text).to.not.match(/0 time\(s\)/); @@ -336,18 +338,18 @@ describe('achievements', () => { }); it('master and triad bingo achievements includes *Text2 strings if keys have been used', () => { - let user = generateUser({ + const user = generateUser({ achievements: { beastMasterCount: 1, mountMasterCount: 2, triadBingoCount: 3, }, }); - let basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; + const basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; - let beastMaster = basicAchievs.beastMaster; - let mountMaster = basicAchievs.mountMaster; - let triadBingo = basicAchievs.triadBingo; + const { beastMaster } = basicAchievs; + const { mountMaster } = basicAchievs; + const { triadBingo } = basicAchievs; expect(beastMaster.text).to.match(/released/); expect(beastMaster.text).to.match(/1 time\(s\)/); @@ -360,13 +362,13 @@ describe('achievements', () => { describe('ultimateGear achievements', () => { it('title and text contain localized class info', () => { - let user = generateUser(); - let basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; - let gearTypes = ['healer', 'rogue', 'warrior', 'mage']; + const user = generateUser(); + const basicAchievs = shared.achievements.getAchievementsForProfile(user).basic.achievements; + const gearTypes = ['healer', 'rogue', 'warrior', 'mage']; - gearTypes.forEach((gear) => { - let gearAchiev = basicAchievs[`${gear}UltimateGear`]; - let classNameRegex = new RegExp(gear.charAt(0).toUpperCase() + gear.slice(1)); + gearTypes.forEach(gear => { + const gearAchiev = basicAchievs[`${gear}UltimateGear`]; + const classNameRegex = new RegExp(gear.charAt(0).toUpperCase() + gear.slice(1)); expect(gearAchiev.title).to.match(classNameRegex); expect(gearAchiev.text).to.match(classNameRegex); diff --git a/test/common/libs/appliedTags.test.js b/test/common/libs/appliedTags.test.js index b40b0ed232..313e89e6e3 100644 --- a/test/common/libs/appliedTags.test.js +++ b/test/common/libs/appliedTags.test.js @@ -2,9 +2,9 @@ import appliedTags from '../../../website/common/script/libs/appliedTags'; describe('appliedTags', () => { it('returns the tasks', () => { - let userTags = [{ id: 'tag1', name: 'tag 1' }, { id: 'tag2', name: 'tag 2' }, { id: 'tag3', name: 'tag 3' }]; - let taskTags = ['tag2', 'tag3']; - let result = appliedTags(userTags, taskTags); + const userTags = [{ id: 'tag1', name: 'tag 1' }, { id: 'tag2', name: 'tag 2' }, { id: 'tag3', name: 'tag 3' }]; + const taskTags = ['tag2', 'tag3']; + const result = appliedTags(userTags, taskTags); expect(result).to.eql('tag 2, tag 3'); }); }); diff --git a/test/common/libs/hasClass.test.js b/test/common/libs/hasClass.test.js index 1b7f9cc6c2..42f17653a6 100644 --- a/test/common/libs/hasClass.test.js +++ b/test/common/libs/hasClass.test.js @@ -3,49 +3,49 @@ import { generateUser } from '../../helpers/common.helper'; describe('hasClass', () => { it('returns false for user with level below 10', () => { - let userLvl9 = generateUser({ + const userLvl9 = generateUser({ 'stats.lvl': 9, 'flags.classSelected': true, 'preferences.disableClasses': false, }); - let result = hasClass(userLvl9); + const result = hasClass(userLvl9); expect(result).to.eql(false); }); it('returns false for user with class not selected', () => { - let userClassNotSelected = generateUser({ + const userClassNotSelected = generateUser({ 'stats.lvl': 10, 'flags.classSelected': false, 'preferences.disableClasses': false, }); - let result = hasClass(userClassNotSelected); + const result = hasClass(userClassNotSelected); expect(result).to.eql(false); }); it('returns false for user with classes disabled', () => { - let userClassesDisabled = generateUser({ + const userClassesDisabled = generateUser({ 'stats.lvl': 10, 'flags.classSelected': true, 'preferences.disableClasses': true, }); - let result = hasClass(userClassesDisabled); + const result = hasClass(userClassesDisabled); expect(result).to.eql(false); }); it('returns true for user with class', () => { - let userClassSelected = generateUser({ + const userClassSelected = generateUser({ 'stats.lvl': 10, 'flags.classSelected': true, 'preferences.disableClasses': false, }); - let result = hasClass(userClassSelected); + const result = hasClass(userClassSelected); expect(result).to.eql(true); }); diff --git a/test/common/libs/inAppRewards.js b/test/common/libs/inAppRewards.js index 43369f4307..a6093a63e8 100644 --- a/test/common/libs/inAppRewards.js +++ b/test/common/libs/inAppRewards.js @@ -1,7 +1,7 @@ import { generateUser, } from '../../helpers/common.helper'; -import getOfficialPinnedItems from '../../../website/common/script/libs/getOfficialPinnedItems.js'; +import getOfficialPinnedItems from '../../../website/common/script/libs/getOfficialPinnedItems'; import inAppRewards from '../../../website/common/script/libs/inAppRewards'; describe('inAppRewards', () => { @@ -16,7 +16,8 @@ describe('inAppRewards', () => { officialPinnedItems = getOfficialPinnedItems(user); officialPinnedItemPaths = []; - // officialPinnedItems are returned in { type: ..., path:... } format but we just need the paths for testPinnedItemsOrder + // officialPinnedItems are returned in { type: ..., path:... } format + // but we just need the paths for testPinnedItemsOrder if (officialPinnedItems.length > 0) { officialPinnedItemPaths = officialPinnedItems.map(item => item.path); } @@ -56,7 +57,7 @@ describe('inAppRewards', () => { user.pinnedItems = testPinnedItems; user.pinnedItemsOrder = testPinnedItemsOrder; - let result = inAppRewards(user); + const result = inAppRewards(user); expect(result[2].path).to.eql('armoire'); expect(result[9].path).to.eql('potion'); @@ -68,7 +69,7 @@ describe('inAppRewards', () => { user.pinnedItems.push(undefined); user.pinnedItemsOrder = testPinnedItemsOrder; - let result = inAppRewards(user); + const result = inAppRewards(user); expect(result[2].path).to.eql('armoire'); expect(result[9].path).to.eql('potion'); @@ -79,18 +80,18 @@ describe('inAppRewards', () => { return; // if no seasonal items, this test is not applicable } - let testUnpinnedItem = officialPinnedItems[0]; - let testUnpinnedPath = testUnpinnedItem.path; - let testUnpinnedItems = [ - { type: testUnpinnedItem.type, path: testUnpinnedPath}, + const testUnpinnedItem = officialPinnedItems[0]; + const testUnpinnedPath = testUnpinnedItem.path; + const testUnpinnedItems = [ + { type: testUnpinnedItem.type, path: testUnpinnedPath }, ]; user.pinnedItems = testPinnedItems; user.pinnedItemsOrder = testPinnedItemsOrder; user.unpinnedItems = testUnpinnedItems; - let result = inAppRewards(user); - let itemPaths = result.map(item => item.path); + const result = inAppRewards(user); + const itemPaths = result.map(item => item.path); expect(itemPaths).to.not.include(testUnpinnedPath); }); }); diff --git a/test/common/libs/noTags.test.js b/test/common/libs/noTags.test.js index 6c50108e04..ebd24579f1 100644 --- a/test/common/libs/noTags.test.js +++ b/test/common/libs/noTags.test.js @@ -2,12 +2,12 @@ import noTags from '../../../website/common/script/libs/noTags'; describe('noTags', () => { it('returns true for no tags', () => { - let result = noTags([]); + const result = noTags([]); expect(result).to.eql(true); }); it('returns false for some tags', () => { - let result = noTags(['a', 'b', 'c']); + const result = noTags(['a', 'b', 'c']); expect(result).to.eql(false); }); }); diff --git a/test/common/libs/pickDeep.js b/test/common/libs/pickDeep.js index 70fc1904b9..0601a5120a 100644 --- a/test/common/libs/pickDeep.js +++ b/test/common/libs/pickDeep.js @@ -6,7 +6,7 @@ describe('pickDeep', () => { }); it('returns an object of properties taken from the input object', () => { - let obj = { + const obj = { a: true, b: [1, 2, 3], c: { @@ -19,7 +19,7 @@ describe('pickDeep', () => { d: false, }; - let res = pickDeep(obj, ['a', 'b[0]', 'c.nested.two.times']); + const res = pickDeep(obj, ['a', 'b[0]', 'c.nested.two.times']); expect(res.a).to.be.true; expect(res.b).to.eql([1]); expect(res.c).to.eql({ diff --git a/test/common/libs/randomVal.js b/test/common/libs/randomVal.js index 3a46938f76..4cbaceb820 100644 --- a/test/common/libs/randomVal.js +++ b/test/common/libs/randomVal.js @@ -1,5 +1,5 @@ +import { times } from 'lodash'; import randomVal from '../../../website/common/script/libs/randomVal'; -import {times} from 'lodash'; describe('randomVal', () => { let obj; @@ -18,7 +18,7 @@ describe('randomVal', () => { }); it('returns a random value from an object', () => { - let result = randomVal(obj); + const result = randomVal(obj); expect(result).to.be.oneOf([1, 2, 3, 4]); }); @@ -31,7 +31,7 @@ describe('randomVal', () => { }); it('returns a random key when the key option is passed in', () => { - let result = randomVal(obj, { key: true }); + const result = randomVal(obj, { key: true }); expect(result).to.be.oneOf(['a', 'b', 'c', 'd']); }); }); diff --git a/test/common/libs/refPush.js b/test/common/libs/refPush.js index f4470fccb6..4212a36b17 100644 --- a/test/common/libs/refPush.js +++ b/test/common/libs/refPush.js @@ -1,10 +1,10 @@ -import shared from '../../../website/common'; import { v4 as generateUUID } from 'uuid'; +import shared from '../../../website/common'; describe('refPush', () => { it('it hashes one object into another by its id', () => { - let referenceObject = {}; - let objectToHash = { + const referenceObject = {}; + const objectToHash = { a: 1, id: generateUUID(), }; @@ -17,16 +17,14 @@ describe('refPush', () => { }); it('it hashes one object into another by a uuid when object does not have an id', () => { - let referenceObject = {}; - let objectToHash = { + const referenceObject = {}; + const objectToHash = { a: 1, }; shared.refPush(referenceObject, objectToHash); - let hashedObject = _.find(referenceObject, (hashedItem) => { - return objectToHash.a === hashedItem.a; - }); + const hashedObject = _.find(referenceObject, hashedItem => objectToHash.a === hashedItem.a); expect(hashedObject.a).to.equal(objectToHash.a); expect(hashedObject.id).to.equal(objectToHash.id); @@ -34,17 +32,15 @@ describe('refPush', () => { }); it('it hashes one object into another by a id and gives it the highest sort value', () => { - let referenceObject = {}; + const referenceObject = {}; referenceObject[generateUUID()] = { b: 2, sort: 1 }; - let objectToHash = { + const objectToHash = { a: 1, }; shared.refPush(referenceObject, objectToHash); - let hashedObject = _.find(referenceObject, (hashedItem) => { - return objectToHash.a === hashedItem.a; - }); + const hashedObject = _.find(referenceObject, hashedItem => objectToHash.a === hashedItem.a); expect(hashedObject.a).to.equal(objectToHash.a); expect(hashedObject.id).to.equal(objectToHash.id); diff --git a/test/common/libs/shops.js b/test/common/libs/shops.js index 1da334dae0..b46f32f366 100644 --- a/test/common/libs/shops.js +++ b/test/common/libs/shops.js @@ -4,31 +4,31 @@ import { } from '../../helpers/common.helper'; describe('shops', () => { - let user = generateUser(); + const user = generateUser(); describe('market', () => { - let shopCategories = shared.shops.getMarketCategories(user); + const shopCategories = shared.shops.getMarketCategories(user); it('contains at least the 3 default categories', () => { expect(shopCategories.length).to.be.greaterThan(2); }); it('does not contain an empty category', () => { - _.each(shopCategories, (category) => { + _.each(shopCategories, category => { expect(category.items.length).to.be.greaterThan(0); }); }); it('does not duplicate identifiers', () => { - let identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); + const identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); expect(identifiers.length).to.eql(shopCategories.length); }); it('items contain required fields', () => { - _.each(shopCategories, (category) => { - _.each(category.items, (item) => { - _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'class'], (key) => { + _.each(shopCategories, category => { + _.each(category.items, item => { + _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'class'], key => { expect(_.has(item, key)).to.eql(true); }); }); @@ -36,7 +36,7 @@ describe('shops', () => { }); it('shows relevant non class gear in special category', () => { - let contributor = generateUser({ + const contributor = generateUser({ contributor: { level: 7, critical: true, @@ -50,18 +50,18 @@ describe('shops', () => { }, }); - let gearCategories = shared.shops.getMarketGearCategories(contributor); - let specialCategory = gearCategories.find(o => o.identifier === 'none'); - expect(specialCategory.items.find((item) => item.key === 'weapon_special_1')); - expect(specialCategory.items.find((item) => item.key === 'armor_special_1')); - expect(specialCategory.items.find((item) => item.key === 'head_special_1')); - expect(specialCategory.items.find((item) => item.key === 'shield_special_1')); - expect(specialCategory.items.find((item) => item.key === 'weapon_special_critical')); - expect(specialCategory.items.find((item) => item.key === 'weapon_armoire_basicCrossbow'));// eslint-disable-line camelcase + const gearCategories = shared.shops.getMarketGearCategories(contributor); + const specialCategory = gearCategories.find(o => o.identifier === 'none'); + expect(specialCategory.items.find(item => item.key === 'weapon_special_1')); + expect(specialCategory.items.find(item => item.key === 'armor_special_1')); + expect(specialCategory.items.find(item => item.key === 'head_special_1')); + expect(specialCategory.items.find(item => item.key === 'shield_special_1')); + expect(specialCategory.items.find(item => item.key === 'weapon_special_critical')); + expect(specialCategory.items.find(item => item.key === 'weapon_armoire_basicCrossbow'));// eslint-disable-line camelcase }); it('does not show gear when it is all owned', () => { - let userWithItems = generateUser({ + const userWithItems = generateUser({ stats: { class: 'wizard', }, @@ -91,12 +91,12 @@ describe('shops', () => { }); - let shopWizardItems = shared.shops.getMarketGearCategories(userWithItems).find(x => x.identifier === 'wizard').items.filter(x => x.klass === 'wizard' && (x.owned === false || x.owned === undefined)); + const shopWizardItems = shared.shops.getMarketGearCategories(userWithItems).find(x => x.identifier === 'wizard').items.filter(x => x.klass === 'wizard' && (x.owned === false || x.owned === undefined)); expect(shopWizardItems.length).to.eql(0); }); it('shows available gear not yet purchased and previously owned', () => { - let userWithItems = generateUser({ + const userWithItems = generateUser({ stats: { class: 'wizard', }, @@ -123,7 +123,7 @@ describe('shops', () => { }); - let shopWizardItems = shared.shops.getMarketGearCategories(userWithItems).find(x => x.identifier === 'wizard').items.filter(x => x.klass === 'wizard' && (x.owned === false || x.owned === undefined)); + const shopWizardItems = shared.shops.getMarketGearCategories(userWithItems).find(x => x.identifier === 'wizard').items.filter(x => x.klass === 'wizard' && (x.owned === false || x.owned === undefined)); expect(shopWizardItems.find(item => item.key === 'weapon_wizard_5').locked).to.eql(false); expect(shopWizardItems.find(item => item.key === 'weapon_wizard_6').locked).to.eql(true); expect(shopWizardItems.find(item => item.key === 'armor_wizard_3').locked).to.eql(false); @@ -134,31 +134,31 @@ describe('shops', () => { }); describe('questShop', () => { - let shopCategories = shared.shops.getQuestShopCategories(user); + const shopCategories = shared.shops.getQuestShopCategories(user); it('does not contain an empty category', () => { - _.each(shopCategories, (category) => { + _.each(shopCategories, category => { expect(category.items.length).to.be.greaterThan(0); }); }); it('does not duplicate identifiers', () => { - let identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); + const identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); expect(identifiers.length).to.eql(shopCategories.length); }); it('items contain required fields', () => { - _.each(shopCategories, (category) => { + _.each(shopCategories, category => { if (category.identifier === 'bundle') { - _.each(category.items, (item) => { - _.each(['key', 'text', 'notes', 'value', 'currency', 'purchaseType', 'class'], (key) => { + _.each(category.items, item => { + _.each(['key', 'text', 'notes', 'value', 'currency', 'purchaseType', 'class'], key => { expect(_.has(item, key)).to.eql(true); }); }); } else { - _.each(category.items, (item) => { - _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'boss', 'class', 'collect', 'drop', 'unlockCondition', 'lvl'], (key) => { + _.each(category.items, item => { + _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'boss', 'class', 'collect', 'drop', 'unlockCondition', 'lvl'], key => { expect(_.has(item, key)).to.eql(true); }); }); @@ -168,24 +168,24 @@ describe('shops', () => { }); describe('timeTravelers', () => { - let shopCategories = shared.shops.getTimeTravelersCategories(user); + const shopCategories = shared.shops.getTimeTravelersCategories(user); it('does not contain an empty category', () => { - _.each(shopCategories, (category) => { + _.each(shopCategories, category => { expect(category.items.length).to.be.greaterThan(0); }); }); it('does not duplicate identifiers', () => { - let identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); + const identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); expect(identifiers.length).to.eql(shopCategories.length); }); it('items contain required fields', () => { - _.each(shopCategories, (category) => { - _.each(category.items, (item) => { - _.each(['key', 'text', 'value', 'currency', 'locked', 'purchaseType', 'class', 'notes', 'class'], (key) => { + _.each(shopCategories, category => { + _.each(category.items, item => { + _.each(['key', 'text', 'value', 'currency', 'locked', 'purchaseType', 'class', 'notes', 'class'], key => { expect(_.has(item, key)).to.eql(true); }); }); @@ -194,24 +194,24 @@ describe('shops', () => { }); describe('seasonalShop', () => { - let shopCategories = shared.shops.getSeasonalShopCategories(user); + const shopCategories = shared.shops.getSeasonalShopCategories(user); it('does not contain an empty category', () => { - _.each(shopCategories, (category) => { + _.each(shopCategories, category => { expect(category.items.length).to.be.greaterThan(0); }); }); it('does not duplicate identifiers', () => { - let identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); + const identifiers = Array.from(new Set(shopCategories.map(cat => cat.identifier))); expect(identifiers.length).to.eql(shopCategories.length); }); it('items contain required fields', () => { - _.each(shopCategories, (category) => { - _.each(category.items, (item) => { - _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'type'], (key) => { + _.each(shopCategories, category => { + _.each(category.items, item => { + _.each(['key', 'text', 'notes', 'value', 'currency', 'locked', 'purchaseType', 'type'], key => { expect(_.has(item, key)).to.eql(true); }); }); diff --git a/test/common/libs/taskDefaults.test.js b/test/common/libs/taskDefaults.test.js index 1ec59b562c..e69bafa45d 100644 --- a/test/common/libs/taskDefaults.test.js +++ b/test/common/libs/taskDefaults.test.js @@ -5,7 +5,7 @@ import { generateUser } from '../../helpers/common.helper'; describe('taskDefaults', () => { it('applies defaults to undefined type or habit', () => { - let task = taskDefaults({}, generateUser()); + const task = taskDefaults({}, generateUser()); expect(task.type).to.eql('habit'); expect(task._id).to.exist; expect(task.text).to.eql(task._id); @@ -21,7 +21,7 @@ describe('taskDefaults', () => { }); it('applies defaults to a daily', () => { - let task = taskDefaults({ type: 'daily' }, generateUser()); + const task = taskDefaults({ type: 'daily' }, generateUser()); expect(task.type).to.eql('daily'); expect(task._id).to.exist; expect(task.text).to.eql(task._id); @@ -45,7 +45,7 @@ describe('taskDefaults', () => { }); it('applies defaults a reward', () => { - let task = taskDefaults({ type: 'reward' }, generateUser()); + const task = taskDefaults({ type: 'reward' }, generateUser()); expect(task.type).to.eql('reward'); expect(task._id).to.exist; expect(task.text).to.eql(task._id); @@ -55,7 +55,7 @@ describe('taskDefaults', () => { }); it('applies defaults a todo', () => { - let task = taskDefaults({ type: 'todo' }, generateUser()); + const task = taskDefaults({ type: 'todo' }, generateUser()); expect(task.type).to.eql('todo'); expect(task._id).to.exist; expect(task.text).to.eql(task._id); @@ -67,15 +67,15 @@ describe('taskDefaults', () => { it('starts a task yesterday if user cron is later today', () => { // Configure to have a day start that's *always* tomorrow. - let user = generateUser({'preferences.dayStart': 25}); - let task = taskDefaults({ type: 'daily' }, user); + const user = generateUser({ 'preferences.dayStart': 25 }); + const task = taskDefaults({ type: 'daily' }, user); expect(task.startDate).to.eql( moment() .zone(user.preferences.timezoneOffset, 'hour') .startOf('day') .subtract(1, 'day') - .toDate() + .toDate(), ); }); }); diff --git a/test/common/libs/updateStore.js b/test/common/libs/updateStore.js index e0e856adca..bc096fc21b 100644 --- a/test/common/libs/updateStore.js +++ b/test/common/libs/updateStore.js @@ -6,52 +6,36 @@ import i18n from '../../../website/common/script/i18n'; describe('updateStore', () => { context('returns a list of gear items available for purchase', () => { - let user = generateUser(); + const user = generateUser(); user.items.gear.owned.armor_armoire_lunarArmor = false; // eslint-disable-line camelcase user.contributor.level = 2; user.purchased.plan.mysteryItems = ['armor_mystery_201402']; user.items.gear.owned.armor_mystery_201402 = false; // eslint-disable-line camelcase - let list = shared.updateStore(user); + const list = shared.updateStore(user); it('contains the first item not purchased for each gear type', () => { - expect(_.find(list, item => { - return item.text() === i18n.t('armorWarrior1Text'); - })).to.exist; + expect(_.find(list, item => item.text() === i18n.t('armorWarrior1Text'))).to.exist; - expect(_.find(list, item => { - return item.text() === i18n.t('armorWarrior2Text'); - })).to.not.exist; + expect(_.find(list, item => item.text() === i18n.t('armorWarrior2Text'))).to.not.exist; }); it('contains mystery items the user can own', () => { - expect(_.find(list, item => { - return item.text() === i18n.t('armorMystery201402Text'); - })).to.exist; + expect(_.find(list, item => item.text() === i18n.t('armorMystery201402Text'))).to.exist; - expect(_.find(list, item => { - return item.text() === i18n.t('armorMystery201403Text'); - })).to.not.exist; + expect(_.find(list, item => item.text() === i18n.t('armorMystery201403Text'))).to.not.exist; }); it('contains special items the user can own', () => { - expect(_.find(list, item => { - return item.text() === i18n.t('armorSpecial1Text'); - })).to.exist; + expect(_.find(list, item => item.text() === i18n.t('armorSpecial1Text'))).to.exist; - expect(_.find(list, item => { - return item.text() === i18n.t('headSpecial1Text'); - })).to.not.exist; + expect(_.find(list, item => item.text() === i18n.t('headSpecial1Text'))).to.not.exist; }); it('contains armoire items the user can own', () => { - expect(_.find(list, item => { - return item.text() === i18n.t('armorArmoireLunarArmorText'); - })).to.exist; + expect(_.find(list, item => item.text() === i18n.t('armorArmoireLunarArmorText'))).to.exist; - expect(_.find(list, item => { - return item.text() === i18n.t('armorArmoireGladiatorArmorText'); - })).to.not.exist; + expect(_.find(list, item => item.text() === i18n.t('armorArmoireGladiatorArmorText'))).to.not.exist; }); }); }); diff --git a/test/common/ops/addTask.js b/test/common/ops/addTask.js index 9d5e1d7a8e..6f02f47fdc 100644 --- a/test/common/ops/addTask.js +++ b/test/common/ops/addTask.js @@ -15,7 +15,7 @@ describe('shared.ops.addTask', () => { }); it('adds an habit', () => { - let habit = addTask(user, { + const habit = addTask(user, { body: { type: 'habit', text: 'habit', @@ -39,7 +39,7 @@ describe('shared.ops.addTask', () => { }); it('adds a habit when type is invalid', () => { - let habit = addTask(user, { + const habit = addTask(user, { body: { type: 'invalid', text: 'habit', @@ -60,7 +60,7 @@ describe('shared.ops.addTask', () => { }); it('adds a daily', () => { - let daily = addTask(user, { + const daily = addTask(user, { body: { type: 'daily', text: 'daily', @@ -80,7 +80,7 @@ describe('shared.ops.addTask', () => { }); it('adds a todo', () => { - let todo = addTask(user, { + const todo = addTask(user, { body: { type: 'todo', text: 'todo', @@ -99,7 +99,7 @@ describe('shared.ops.addTask', () => { }); it('adds a reward', () => { - let reward = addTask(user, { + const reward = addTask(user, { body: { type: 'reward', text: 'reward', diff --git a/test/common/ops/armoireCanOwn.js b/test/common/ops/armoireCanOwn.js index 7511fdb4b3..a0dd802aa0 100644 --- a/test/common/ops/armoireCanOwn.js +++ b/test/common/ops/armoireCanOwn.js @@ -1,9 +1,9 @@ -import armoireSet from '../../../website/common/script/content/gear/sets/armoire'; +import * as armoireSet from '../../../website/common/script/content/gear/sets/armoire'; describe('armoireSet items', () => { it('checks if canOwn has the same id', () => { - for (const type of Object.keys(armoireSet)) { - for (const itemKey of Object.keys(armoireSet[type])) { + Object.keys(armoireSet).forEach(type => { + Object.keys(armoireSet[type]).forEach(itemKey => { const ownedKey = `${type}_armoire_${itemKey}`; expect(armoireSet[type][itemKey].canOwn({ @@ -15,7 +15,7 @@ describe('armoireSet items', () => { }, }, }), `${ownedKey} canOwn is broken`).to.eq(true); - } - } + }); + }); }); }); diff --git a/test/common/ops/blockUser.test.js b/test/common/ops/blockUser.test.js index 16c439c94d..7c871f5b62 100644 --- a/test/common/ops/blockUser.test.js +++ b/test/common/ops/blockUser.test.js @@ -16,7 +16,7 @@ describe('shared.ops.blockUser', () => { expect(user.inbox.blocks).to.eql([]); }); - it('validates uuid', (done) => { + it('validates uuid', done => { try { blockUser(user, { params: { uuid: '1' } }); } catch (error) { @@ -25,7 +25,7 @@ describe('shared.ops.blockUser', () => { } }); - it('validates user can\'t block himself', (done) => { + it('validates user can\'t block himself', done => { try { blockUser(user, { params: { uuid: user._id } }); } catch (error) { @@ -46,7 +46,7 @@ describe('shared.ops.blockUser', () => { it('blocks, then unblocks user', () => { blockUser(user, { params: { uuid: blockedUser._id } }); expect(user.inbox.blocks).to.eql([blockedUser._id]); - let [result] = blockUser(user, { params: { uuid: blockedUser._id } }); + const [result] = blockUser(user, { params: { uuid: blockedUser._id } }); expect(user.inbox.blocks).to.eql([]); expect(result).to.eql([]); }); diff --git a/test/common/ops/buy/buy.js b/test/common/ops/buy/buy.js index 582166e9a9..eed601e10a 100644 --- a/test/common/ops/buy/buy.js +++ b/test/common/ops/buy/buy.js @@ -1,4 +1,5 @@ /* eslint-disable camelcase */ +import { defaultsDeep } from 'lodash'; import { generateUser, } from '../../../helpers/common.helper'; @@ -9,11 +10,10 @@ import { import i18n from '../../../../website/common/script/i18n'; import content from '../../../../website/common/script/content/index'; import errorMessage from '../../../../website/common/script/libs/errorMessage'; -import { defaultsDeep } from 'lodash'; describe('shared.ops.buy', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; beforeEach(() => { user = generateUser({ @@ -40,7 +40,7 @@ describe('shared.ops.buy', () => { analytics.track.restore(); }); - it('returns error when key is not provided', (done) => { + it('returns error when key is not provided', done => { try { buy(user); } catch (err) { @@ -52,7 +52,7 @@ describe('shared.ops.buy', () => { it('recovers 15 hp', () => { user.stats.hp = 30; - buy(user, {params: {key: 'potion'}}, analytics); + buy(user, { params: { key: 'potion' } }, analytics); expect(user.stats.hp).to.eql(45); expect(analytics.track).to.be.calledOnce; @@ -61,7 +61,7 @@ describe('shared.ops.buy', () => { it('adds equipment to inventory', () => { user.stats.gp = 31; - buy(user, {params: {key: 'armor_warrior_1'}}); + buy(user, { params: { key: 'armor_warrior_1' } }); expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, @@ -118,15 +118,15 @@ describe('shared.ops.buy', () => { type: 'quest', }); - expect(user.items.quests).to.eql({dilatoryDistress1: 1}); + expect(user.items.quests).to.eql({ dilatoryDistress1: 1 }); expect(user.stats.gp).to.equal(5); }); it('buys a special item', () => { user.stats.gp = 11; - let item = content.special.thankyou; + const item = content.special.thankyou; - let [data, message] = buy(user, { + const [data, message] = buy(user, { params: { key: 'thankyou', }, @@ -146,11 +146,11 @@ describe('shared.ops.buy', () => { it('allows for bulk purchases', () => { user.stats.hp = 30; - buy(user, {params: {key: 'potion'}, quantity: 2}); + buy(user, { params: { key: 'potion' }, quantity: 2 }); expect(user.stats.hp).to.eql(50); }); - it('errors if user supplies a non-numeric quantity', (done) => { + it('errors if user supplies a non-numeric quantity', done => { try { buy(user, { params: { @@ -166,7 +166,7 @@ describe('shared.ops.buy', () => { } }); - it('errors if user supplies a negative quantity', (done) => { + it('errors if user supplies a negative quantity', done => { try { buy(user, { params: { @@ -182,7 +182,7 @@ describe('shared.ops.buy', () => { } }); - it('errors if user supplies a decimal quantity', (done) => { + it('errors if user supplies a decimal quantity', done => { try { buy(user, { params: { diff --git a/test/common/ops/buy/buyArmoire.js b/test/common/ops/buy/buyArmoire.js index 3c58585022..a3a79d8341 100644 --- a/test/common/ops/buy/buyArmoire.js +++ b/test/common/ops/buy/buyArmoire.js @@ -3,9 +3,9 @@ import { generateUser, } from '../../../helpers/common.helper'; -import count from '../../../../website/common/script/count'; -import {BuyArmoireOperation} from '../../../../website/common/script/ops/buy/buyArmoire'; -import randomVal from '../../../../website/common/script/libs/randomVal'; +import * as count from '../../../../website/common/script/count'; +import { BuyArmoireOperation } from '../../../../website/common/script/ops/buy/buyArmoire'; +import * as randomValFns from '../../../../website/common/script/libs/randomVal'; import content from '../../../../website/common/script/content/index'; import { NotAuthorized, @@ -13,11 +13,11 @@ import { import i18n from '../../../../website/common/script/i18n'; function getFullArmoire () { - let fullArmoire = {}; + const fullArmoire = {}; - _.each(content.gearTypes, (type) => { - _.each(content.gear.tree[type].armoire, (gearObject) => { - let armoireKey = gearObject.key; + _.each(content.gearTypes, type => { + _.each(content.gear.tree[type].armoire, gearObject => { + const armoireKey = gearObject.key; fullArmoire[armoireKey] = true; }); @@ -28,10 +28,10 @@ function getFullArmoire () { describe('shared.ops.buyArmoire', () => { let user; - let YIELD_EQUIPMENT = 0.5; - let YIELD_FOOD = 0.7; - let YIELD_EXP = 0.9; - let analytics = {track () {}}; + const YIELD_EQUIPMENT = 0.5; + const YIELD_FOOD = 0.7; + const YIELD_EXP = 0.9; + const analytics = { track () {} }; function buyArmoire (_user, _req, _analytics) { const buyOp = new BuyArmoireOperation(_user, _req, _analytics); @@ -51,17 +51,17 @@ describe('shared.ops.buyArmoire', () => { user.stats.exp = 0; user.items.food = {}; - sandbox.stub(randomVal, 'trueRandom'); + sandbox.stub(randomValFns, 'trueRandom'); sinon.stub(analytics, 'track'); }); afterEach(() => { - randomVal.trueRandom.restore(); + randomValFns.trueRandom.restore(); analytics.track.restore(); }); context('failure conditions', () => { - it('does not open if user does not have enough gold', (done) => { + it('does not open if user does not have enough gold', done => { user.stats.gp = 50; try { @@ -81,39 +81,39 @@ describe('shared.ops.buyArmoire', () => { context('non-gear awards', () => { it('gives Experience', () => { - let previousExp = user.stats.exp; - randomVal.trueRandom.returns(YIELD_EXP); + const previousExp = user.stats.exp; + randomValFns.trueRandom.returns(YIELD_EXP); buyArmoire(user); - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true }); expect(user.items.food).to.be.empty; expect(user.stats.exp).to.be.greaterThan(previousExp); expect(user.stats.gp).to.equal(100); }); it('gives food', () => { - let previousExp = user.stats.exp; + const previousExp = user.stats.exp; - randomVal.trueRandom.returns(YIELD_FOOD); + randomValFns.trueRandom.returns(YIELD_FOOD); buyArmoire(user); - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true }); expect(user.items.food).to.not.be.empty; expect(user.stats.exp).to.equal(previousExp); expect(user.stats.gp).to.equal(100); }); it('does not give equipment if all equipment has been found', () => { - randomVal.trueRandom.returns(YIELD_EQUIPMENT); + randomValFns.trueRandom.returns(YIELD_EQUIPMENT); user.items.gear.owned = getFullArmoire(); user.stats.gp = 150; buyArmoire(user); expect(user.items.gear.owned).to.eql(getFullArmoire()); - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + const armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(0); @@ -124,7 +124,7 @@ describe('shared.ops.buyArmoire', () => { context('gear awards', () => { it('always drops equipment the first time', () => { delete user.flags.armoireOpened; - randomVal.trueRandom.returns(YIELD_EXP); + randomValFns.trueRandom.returns(YIELD_EXP); expect(_.size(user.items.gear.owned)).to.equal(1); @@ -132,7 +132,7 @@ describe('shared.ops.buyArmoire', () => { expect(_.size(user.items.gear.owned)).to.equal(2); - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + const armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(_.size(getFullArmoire()) - 1); expect(user.items.food).to.be.empty; @@ -141,7 +141,7 @@ describe('shared.ops.buyArmoire', () => { }); it('gives more equipment', () => { - randomVal.trueRandom.returns(YIELD_EQUIPMENT); + randomValFns.trueRandom.returns(YIELD_EQUIPMENT); user.items.gear.owned = { weapon_warrior_0: true, head_armoire_hornedIronHelm: true, @@ -154,7 +154,7 @@ describe('shared.ops.buyArmoire', () => { expect(_.size(user.items.gear.owned)).to.equal(3); - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + const armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(_.size(getFullArmoire()) - 2); expect(user.stats.gp).to.eql(100); diff --git a/test/common/ops/buy/buyGem.js b/test/common/ops/buy/buyGem.js index fc3d00f708..d0a726a86d 100644 --- a/test/common/ops/buy/buyGem.js +++ b/test/common/ops/buy/buyGem.js @@ -8,21 +8,21 @@ import { BadRequest, NotAuthorized, } from '../../../../website/common/script/libs/errors'; import i18n from '../../../../website/common/script/i18n'; -import {BuyGemOperation} from '../../../../website/common/script/ops/buy/buyGem'; +import { BuyGemOperation } from '../../../../website/common/script/ops/buy/buyGem'; import planGemLimits from '../../../../website/common/script/libs/planGemLimits'; function buyGem (user, req, analytics) { - let buyOp = new BuyGemOperation(user, req, analytics); + const buyOp = new BuyGemOperation(user, req, analytics); return buyOp.purchase(); } describe('shared.ops.buyGem', () => { let user; - let analytics = {track () {}}; - let goldPoints = 40; - let gemsBought = 40; - let userGemAmount = 10; + const analytics = { track () {} }; + const goldPoints = 40; + const gemsBought = 40; + const userGemAmount = 10; beforeEach(() => { user = generateUser({ @@ -45,9 +45,9 @@ describe('shared.ops.buyGem', () => { context('Gems', () => { it('purchases gems', () => { - let [, message] = buyGem(user, {params: {type: 'gems', key: 'gem'}}, analytics); + const [, message] = buyGem(user, { params: { type: 'gems', key: 'gem' } }, analytics); - expect(message).to.equal(i18n.t('plusGem', {count: 1})); + expect(message).to.equal(i18n.t('plusGem', { count: 1 })); expect(user.balance).to.equal(userGemAmount + 0.25); expect(user.purchased.plan.gemsBought).to.equal(1); expect(user.stats.gp).to.equal(goldPoints - planGemLimits.convRate); @@ -55,21 +55,21 @@ describe('shared.ops.buyGem', () => { }); it('purchases gems with a different language than the default', () => { - let [, message] = buyGem(user, {params: {type: 'gems', key: 'gem'}, language: 'de'}); + const [, message] = buyGem(user, { params: { type: 'gems', key: 'gem' }, language: 'de' }); - expect(message).to.equal(i18n.t('plusGem', {count: 1}, 'de')); + expect(message).to.equal(i18n.t('plusGem', { count: 1 }, 'de')); expect(user.balance).to.equal(userGemAmount + 0.25); expect(user.purchased.plan.gemsBought).to.equal(1); expect(user.stats.gp).to.equal(goldPoints - planGemLimits.convRate); }); it('makes bulk purchases of gems', () => { - let [, message] = buyGem(user, { - params: {type: 'gems', key: 'gem'}, + const [, message] = buyGem(user, { + params: { type: 'gems', key: 'gem' }, quantity: 2, }); - expect(message).to.equal(i18n.t('plusGem', {count: 2})); + expect(message).to.equal(i18n.t('plusGem', { count: 2 })); expect(user.balance).to.equal(userGemAmount + 0.50); expect(user.purchased.plan.gemsBought).to.equal(2); expect(user.stats.gp).to.equal(goldPoints - planGemLimits.convRate * 2); @@ -77,9 +77,9 @@ describe('shared.ops.buyGem', () => { context('Failure conditions', () => { - it('returns an error when key is not provided', (done) => { + it('returns an error when key is not provided', done => { try { - buyGem(user, {params: {type: 'gems'}}); + buyGem(user, { params: { type: 'gems' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('missingKeyParam')); @@ -87,11 +87,11 @@ describe('shared.ops.buyGem', () => { } }); - it('prevents unsubscribed user from buying gems', (done) => { + it('prevents unsubscribed user from buying gems', done => { delete user.purchased.plan.customerId; try { - buyGem(user, {params: {type: 'gems', key: 'gem'}}); + buyGem(user, { params: { type: 'gems', key: 'gem' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('mustSubscribeToPurchaseGems')); @@ -99,11 +99,11 @@ describe('shared.ops.buyGem', () => { } }); - it('prevents user with not enough gold from buying gems', (done) => { + it('prevents user with not enough gold from buying gems', done => { user.stats.gp = 15; try { - buyGem(user, {params: {type: 'gems', key: 'gem'}}); + buyGem(user, { params: { type: 'gems', key: 'gem' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); @@ -111,25 +111,25 @@ describe('shared.ops.buyGem', () => { } }); - it('prevents user that have reached the conversion cap from buying gems', (done) => { + it('prevents user that have reached the conversion cap from buying gems', done => { user.stats.gp = goldPoints; user.purchased.plan.gemsBought = gemsBought; try { - buyGem(user, {params: {type: 'gems', key: 'gem'}}); + buyGem(user, { params: { type: 'gems', key: 'gem' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('reachedGoldToGemCap', {convCap: planGemLimits.convCap})); + expect(err.message).to.equal(i18n.t('reachedGoldToGemCap', { convCap: planGemLimits.convCap })); done(); } }); - it('prevents user from buying an invalid quantity', (done) => { + it('prevents user from buying an invalid quantity', done => { user.stats.gp = goldPoints; user.purchased.plan.gemsBought = gemsBought; try { - buyGem(user, {params: {type: 'gems', key: 'gem'}, quantity: 'a'}); + buyGem(user, { params: { type: 'gems', key: 'gem' }, quantity: 'a' }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('invalidQuantity')); diff --git a/test/common/ops/buy/buyHealthPotion.js b/test/common/ops/buy/buyHealthPotion.js index 9f04c4d6bb..5ed2df7e19 100644 --- a/test/common/ops/buy/buyHealthPotion.js +++ b/test/common/ops/buy/buyHealthPotion.js @@ -10,7 +10,7 @@ import i18n from '../../../../website/common/script/i18n'; describe('shared.ops.buyHealthPotion', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; function buyHealthPotion (_user, _req, _analytics) { const buyOp = new BuyHealthPotionOperation(_user, _req, _analytics); @@ -60,7 +60,7 @@ describe('shared.ops.buyHealthPotion', () => { expect(user.stats.gp).to.eql(175); }); - it('does not purchase if not enough gp', (done) => { + it('does not purchase if not enough gp', done => { user.stats.hp = 45; user.stats.gp = 5; try { @@ -75,7 +75,7 @@ describe('shared.ops.buyHealthPotion', () => { } }); - it('does not purchase if hp is full', (done) => { + it('does not purchase if hp is full', done => { user.stats.hp = 50; user.stats.gp = 40; try { @@ -90,7 +90,7 @@ describe('shared.ops.buyHealthPotion', () => { } }); - it('does not allow potion purchases when hp is zero', (done) => { + it('does not allow potion purchases when hp is zero', done => { user.stats.hp = 0; user.stats.gp = 40; try { @@ -105,7 +105,7 @@ describe('shared.ops.buyHealthPotion', () => { } }); - it('does not allow potion purchases when hp is negative', (done) => { + it('does not allow potion purchases when hp is negative', done => { user.stats.hp = -8; user.stats.gp = 40; try { diff --git a/test/common/ops/buy/buyMarketGear.js b/test/common/ops/buy/buyMarketGear.js index a732afa4e0..3b123d5a6c 100644 --- a/test/common/ops/buy/buyMarketGear.js +++ b/test/common/ops/buy/buyMarketGear.js @@ -1,27 +1,27 @@ /* eslint-disable camelcase */ import sinon from 'sinon'; // eslint-disable-line no-shadow +import { defaultsDeep } from 'lodash'; import { generateUser, } from '../../../helpers/common.helper'; -import {BuyMarketGearOperation} from '../../../../website/common/script/ops/buy/buyMarketGear'; +import { BuyMarketGearOperation } from '../../../../website/common/script/ops/buy/buyMarketGear'; import shared from '../../../../website/common/script'; import { BadRequest, NotAuthorized, NotFound, } from '../../../../website/common/script/libs/errors'; import i18n from '../../../../website/common/script/i18n'; import errorMessage from '../../../../website/common/script/libs/errorMessage'; -import { defaultsDeep } from 'lodash'; function buyGear (user, req, analytics) { - let buyOp = new BuyMarketGearOperation(user, req, analytics); + const buyOp = new BuyMarketGearOperation(user, req, analytics); return buyOp.purchase(); } describe('shared.ops.buyMarketGear', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; beforeEach(() => { user = generateUser({ @@ -56,7 +56,7 @@ describe('shared.ops.buyMarketGear', () => { it('adds equipment to inventory', () => { user.stats.gp = 31; - buyGear(user, {params: {key: 'armor_warrior_1'}}, analytics); + buyGear(user, { params: { key: 'armor_warrior_1' } }, analytics); expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, @@ -89,7 +89,7 @@ describe('shared.ops.buyMarketGear', () => { it('deducts gold from user', () => { user.stats.gp = 31; - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); expect(user.stats.gp).to.eql(1); }); @@ -98,7 +98,7 @@ describe('shared.ops.buyMarketGear', () => { user.stats.gp = 31; user.preferences.autoEquip = true; - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); expect(user.items.gear.equipped).to.have.property('armor', 'armor_warrior_1'); }); @@ -106,7 +106,7 @@ describe('shared.ops.buyMarketGear', () => { it('updates the pinnedItems to the next item in the set if one exists', () => { user.stats.gp = 31; - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); expect(user.pinnedItems).to.deep.include({ type: 'marketGear', @@ -118,17 +118,17 @@ describe('shared.ops.buyMarketGear', () => { user.stats.gp = 31; user.preferences.autoEquip = false; - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); expect(user.items.gear.equipped.property).to.not.equal('armor_warrior_1'); }); - it('does not buyGear equipment twice', (done) => { + it('does not buyGear equipment twice', done => { user.stats.gp = 62; - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); try { - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('equipmentAlreadyOwned')); @@ -136,12 +136,12 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('does not buy equipment of different class', (done) => { + it('does not buy equipment of different class', done => { user.stats.gp = 82; user.stats.class = 'warrior'; try { - buyGear(user, {params: {key: 'weapon_special_winter2018Rogue'}}); + buyGear(user, { params: { key: 'weapon_special_winter2018Rogue' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('cannotBuyItem')); @@ -149,11 +149,11 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('does not buy equipment in bulk', (done) => { + it('does not buy equipment in bulk', done => { user.stats.gp = 82; try { - buyGear(user, {params: {key: 'armor_warrior_1'}, quantity: 3}); + buyGear(user, { params: { key: 'armor_warrior_1' }, quantity: 3 }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageNotAbleToBuyInBulk')); @@ -165,12 +165,12 @@ describe('shared.ops.buyMarketGear', () => { xit('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { user.stats.gp = 100; user.preferences.autoEquip = true; - buyGear(user, {params: {key: 'shield_warrior_1'}}); - user.ops.equip({params: {key: 'shield_warrior_1'}}); - buyGear(user, {params: {key: 'weapon_warrior_1'}}); - user.ops.equip({params: {key: 'weapon_warrior_1'}}); + buyGear(user, { params: { key: 'shield_warrior_1' } }); + user.ops.equip({ params: { key: 'shield_warrior_1' } }); + buyGear(user, { params: { key: 'weapon_warrior_1' } }); + user.ops.equip({ params: { key: 'weapon_warrior_1' } }); - buyGear(user, {params: {key: 'weapon_wizard_1'}}); + buyGear(user, { params: { key: 'weapon_wizard_1' } }); expect(user.items.gear.equipped).to.have.property('shield', 'shield_base_0'); expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_1'); @@ -180,22 +180,22 @@ describe('shared.ops.buyMarketGear', () => { xit('buyGears two-handed equipment but does not automatically remove sword or shield', () => { user.stats.gp = 100; user.preferences.autoEquip = false; - buyGear(user, {params: {key: 'shield_warrior_1'}}); - user.ops.equip({params: {key: 'shield_warrior_1'}}); - buyGear(user, {params: {key: 'weapon_warrior_1'}}); - user.ops.equip({params: {key: 'weapon_warrior_1'}}); + buyGear(user, { params: { key: 'shield_warrior_1' } }); + user.ops.equip({ params: { key: 'shield_warrior_1' } }); + buyGear(user, { params: { key: 'weapon_warrior_1' } }); + user.ops.equip({ params: { key: 'weapon_warrior_1' } }); - buyGear(user, {params: {key: 'weapon_wizard_1'}}); + buyGear(user, { params: { key: 'weapon_wizard_1' } }); expect(user.items.gear.equipped).to.have.property('shield', 'shield_warrior_1'); expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_warrior_1'); }); - it('does not buyGear equipment without enough Gold', (done) => { + it('does not buyGear equipment without enough Gold', done => { user.stats.gp = 20; try { - buyGear(user, {params: {key: 'armor_warrior_1'}}); + buyGear(user, { params: { key: 'armor_warrior_1' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); @@ -204,7 +204,7 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('returns error when key is not provided', (done) => { + it('returns error when key is not provided', done => { try { buyGear(user); } catch (err) { @@ -214,11 +214,11 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('returns error when item is not found', (done) => { - let params = {key: 'armor_warrior_notExisting'}; + it('returns error when item is not found', done => { + const params = { key: 'armor_warrior_notExisting' }; try { - buyGear(user, {params}); + buyGear(user, { params }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(errorMessage('itemNotFound', params)); @@ -226,9 +226,9 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('does not buyGear equipment without the previous equipment', (done) => { + it('does not buyGear equipment without the previous equipment', done => { try { - buyGear(user, {params: {key: 'armor_warrior_2'}}); + buyGear(user, { params: { key: 'armor_warrior_2' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('previousGearNotOwned')); @@ -236,11 +236,11 @@ describe('shared.ops.buyMarketGear', () => { } }); - it('does not buyGear equipment if user does not own prior item in sequence', (done) => { + it('does not buyGear equipment if user does not own prior item in sequence', done => { user.stats.gp = 200; try { - buyGear(user, {params: {key: 'armor_warrior_2'}}); + buyGear(user, { params: { key: 'armor_warrior_2' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('previousGearNotOwned')); @@ -253,7 +253,7 @@ describe('shared.ops.buyMarketGear', () => { user.stats.gp = 200; user.items.gear.owned.head_special_2 = false; - buyGear(user, {params: {key: 'head_special_2'}}); + buyGear(user, { params: { key: 'head_special_2' } }); expect(user.items.gear.owned).to.have.property('head_special_2', true); }); @@ -262,7 +262,7 @@ describe('shared.ops.buyMarketGear', () => { user.stats.gp = 200; user.items.gear.owned.shield_armoire_ramHornShield = false; - buyGear(user, {params: {key: 'shield_armoire_ramHornShield'}}); + buyGear(user, { params: { key: 'shield_armoire_ramHornShield' } }); expect(user.items.gear.owned).to.have.property('shield_armoire_ramHornShield', true); }); diff --git a/test/common/ops/buy/buyMysterySet.js b/test/common/ops/buy/buyMysterySet.js index dca60d7489..6db89cf998 100644 --- a/test/common/ops/buy/buyMysterySet.js +++ b/test/common/ops/buy/buyMysterySet.js @@ -14,7 +14,7 @@ import errorMessage from '../../../../website/common/script/libs/errorMessage'; describe('shared.ops.buyMysterySet', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; beforeEach(() => { user = generateUser({ @@ -35,9 +35,9 @@ describe('shared.ops.buyMysterySet', () => { context('Mystery Sets', () => { context('failure conditions', () => { - it('does not grant mystery sets without Mystic Hourglasses', (done) => { + it('does not grant mystery sets without Mystic Hourglasses', done => { try { - buyMysterySet(user, {params: {key: '201501'}}); + buyMysterySet(user, { params: { key: '201501' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notEnoughHourglasses')); @@ -46,7 +46,7 @@ describe('shared.ops.buyMysterySet', () => { } }); - it('does not grant mystery set that has already been purchased', (done) => { + it('does not grant mystery set that has already been purchased', done => { user.purchased.plan.consecutive.trinkets = 1; user.items.gear.owned = { weapon_warrior_0: true, @@ -57,7 +57,7 @@ describe('shared.ops.buyMysterySet', () => { }; try { - buyMysterySet(user, {params: {key: '301404'}}); + buyMysterySet(user, { params: { key: '301404' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.eql(i18n.t('mysterySetNotFound')); @@ -66,7 +66,7 @@ describe('shared.ops.buyMysterySet', () => { } }); - it('returns error when key is not provided', (done) => { + it('returns error when key is not provided', done => { try { buyMysterySet(user); } catch (err) { @@ -80,7 +80,7 @@ describe('shared.ops.buyMysterySet', () => { context('successful purchases', () => { it('buys Steampunk Accessories Set', () => { user.purchased.plan.consecutive.trinkets = 1; - buyMysterySet(user, {params: {key: '301404'}}, analytics); + buyMysterySet(user, { params: { key: '301404' } }, analytics); expect(user.purchased.plan.consecutive.trinkets).to.eql(0); expect(user.items.gear.owned).to.have.property('weapon_warrior_0', true); diff --git a/test/common/ops/buy/buyQuestGems.js b/test/common/ops/buy/buyQuestGems.js index 8e98e1b94d..d1c25b0832 100644 --- a/test/common/ops/buy/buyQuestGems.js +++ b/test/common/ops/buy/buyQuestGems.js @@ -1,4 +1,4 @@ -import pinnedGearUtils from '../../../../website/common/script/ops/pinnedGearUtils'; +import * as pinnedGearUtils from '../../../../website/common/script/ops/pinnedGearUtils'; import { NotAuthorized, } from '../../../../website/common/script/libs/errors'; @@ -6,12 +6,12 @@ import i18n from '../../../../website/common/script/i18n'; import { generateUser, } from '../../../helpers/common.helper'; -import {BuyQuestWithGemOperation} from '../../../../website/common/script/ops/buy/buyQuestGem'; +import { BuyQuestWithGemOperation } from '../../../../website/common/script/ops/buy/buyQuestGem'; describe('shared.ops.buyQuestGems', () => { let user; - let goldPoints = 40; - let analytics = {track () {}}; + const goldPoints = 40; + const analytics = { track () {} }; function buyQuest (_user, _req, _analytics) { const buyOp = new BuyQuestWithGemOperation(_user, _req, _analytics); @@ -20,7 +20,7 @@ describe('shared.ops.buyQuestGems', () => { } before(() => { - user = generateUser({'stats.class': 'rogue'}); + user = generateUser({ 'stats.class': 'rogue' }); }); beforeEach(() => { @@ -34,29 +34,29 @@ describe('shared.ops.buyQuestGems', () => { }); context('successful purchase', () => { - let userGemAmount = 10; + const userGemAmount = 10; before(() => { user.balance = userGemAmount; user.stats.gp = goldPoints; user.purchased.plan.gemsBought = 0; user.purchased.plan.customerId = 'customer-id'; - user.pinnedItems.push({type: 'quests', key: 'gryphon'}); + user.pinnedItems.push({ type: 'quests', key: 'gryphon' }); }); it('purchases quests', () => { - let key = 'gryphon'; + const key = 'gryphon'; - buyQuest(user, {params: {key}}); + buyQuest(user, { params: { key } }); expect(user.items.quests[key]).to.equal(1); expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true); }); it('if a user\'s count of a quest scroll is negative, it will be reset to 0 before incrementing when they buy a new one.', () => { - let key = 'dustbunnies'; + const key = 'dustbunnies'; user.items.quests[key] = -1; - buyQuest(user, {params: {key}}); + buyQuest(user, { params: { key } }); expect(user.items.quests[key]).to.equal(1); expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true); @@ -64,7 +64,7 @@ describe('shared.ops.buyQuestGems', () => { }); context('bulk purchase', () => { - let userGemAmount = 10; + const userGemAmount = 10; beforeEach(() => { user.balance = userGemAmount; @@ -73,13 +73,13 @@ describe('shared.ops.buyQuestGems', () => { user.purchased.plan.customerId = 'customer-id'; }); - it('errors when user does not have enough gems', (done) => { + it('errors when user does not have enough gems', done => { user.balance = 1; - let key = 'gryphon'; + const key = 'gryphon'; try { buyQuest(user, { - params: {key}, + params: { key }, quantity: 2, }); } catch (err) { @@ -90,10 +90,10 @@ describe('shared.ops.buyQuestGems', () => { }); it('makes bulk purchases of quests', () => { - let key = 'gryphon'; + const key = 'gryphon'; buyQuest(user, { - params: {key}, + params: { key }, quantity: 3, }); diff --git a/test/common/ops/buy/buyQuestGold.js b/test/common/ops/buy/buyQuestGold.js index dec213aa54..f2be81495d 100644 --- a/test/common/ops/buy/buyQuestGold.js +++ b/test/common/ops/buy/buyQuestGold.js @@ -1,7 +1,7 @@ import { generateUser, } from '../../../helpers/common.helper'; -import {BuyQuestWithGoldOperation} from '../../../../website/common/script/ops/buy/buyQuestGold'; +import { BuyQuestWithGoldOperation } from '../../../../website/common/script/ops/buy/buyQuestGold'; import { BadRequest, NotAuthorized, @@ -12,7 +12,7 @@ import errorMessage from '../../../../website/common/script/libs/errorMessage'; describe('shared.ops.buyQuest', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; function buyQuest (_user, _req, _analytics) { const buyOp = new BuyQuestWithGoldOperation(_user, _req, _analytics); @@ -45,10 +45,10 @@ describe('shared.ops.buyQuest', () => { it('if a user\'s count of a quest scroll is negative, it will be reset to 0 before incrementing when they buy a new one.', () => { user.stats.gp = 205; - let key = 'dilatoryDistress1'; + const key = 'dilatoryDistress1'; user.items.quests[key] = -1; buyQuest(user, { - params: {key}, + params: { key }, }, analytics); expect(user.items.quests[key]).to.equal(1); expect(user.stats.gp).to.equal(5); @@ -74,7 +74,7 @@ describe('shared.ops.buyQuest', () => { }); }); - it('does not buy a Quest scroll when an invalid quantity is passed', (done) => { + it('does not buy a Quest scroll when an invalid quantity is passed', done => { user.stats.gp = 1000; try { buyQuest(user, { @@ -92,7 +92,7 @@ describe('shared.ops.buyQuest', () => { } }); - it('does not buy Quests without enough Gold', (done) => { + it('does not buy Quests without enough Gold', done => { user.stats.gp = 1; try { buyQuest(user, { @@ -109,7 +109,7 @@ describe('shared.ops.buyQuest', () => { } }); - it('does not buy nonexistent Quests', (done) => { + it('does not buy nonexistent Quests', done => { user.stats.gp = 9999; try { buyQuest(user, { @@ -119,14 +119,14 @@ describe('shared.ops.buyQuest', () => { }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); - expect(err.message).to.equal(errorMessage('questNotFound', {key: 'snarfblatter'})); + expect(err.message).to.equal(errorMessage('questNotFound', { key: 'snarfblatter' })); expect(user.items.quests).to.eql({}); expect(user.stats.gp).to.equal(9999); done(); } }); - it('does not buy the Mystery of the Masterclassers', (done) => { + it('does not buy the Mystery of the Masterclassers', done => { try { buyQuest(user, { params: { @@ -142,7 +142,7 @@ describe('shared.ops.buyQuest', () => { }); - it('does not buy Gem-premium Quests', (done) => { + it('does not buy Gem-premium Quests', done => { user.stats.gp = 9999; try { buyQuest(user, { @@ -152,14 +152,14 @@ describe('shared.ops.buyQuest', () => { }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('questNotGoldPurchasable', {key: 'kraken'})); + expect(err.message).to.equal(i18n.t('questNotGoldPurchasable', { key: 'kraken' })); expect(user.items.quests).to.eql({}); expect(user.stats.gp).to.equal(9999); done(); } }); - it('returns error when key is not provided', (done) => { + it('returns error when key is not provided', done => { try { buyQuest(user); } catch (err) { @@ -169,7 +169,7 @@ describe('shared.ops.buyQuest', () => { } }); - it('does not buy a quest without completing previous quests', (done) => { + it('does not buy a quest without completing previous quests', done => { try { buyQuest(user, { params: { @@ -178,7 +178,7 @@ describe('shared.ops.buyQuest', () => { }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('mustComplete', {quest: 'dilatoryDistress2'})); + expect(err.message).to.equal(i18n.t('mustComplete', { quest: 'dilatoryDistress2' })); expect(user.items.quests).to.eql({}); done(); } diff --git a/test/common/ops/buy/buySpell.js b/test/common/ops/buy/buySpell.js index 02d0bda6a4..83b8008756 100644 --- a/test/common/ops/buy/buySpell.js +++ b/test/common/ops/buy/buySpell.js @@ -1,4 +1,4 @@ -import {BuySpellOperation} from '../../../../website/common/script/ops/buy/buySpell'; +import { BuySpellOperation } from '../../../../website/common/script/ops/buy/buySpell'; import { BadRequest, NotFound, @@ -13,7 +13,7 @@ import errorMessage from '../../../../website/common/script/libs/errorMessage'; describe('shared.ops.buySpecialSpell', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; function buySpecialSpell (_user, _req, _analytics) { const buyOp = new BuySpellOperation(_user, _req, _analytics); @@ -29,7 +29,7 @@ describe('shared.ops.buySpecialSpell', () => { analytics.track.restore(); }); - it('throws an error if params.key is missing', (done) => { + it('throws an error if params.key is missing', done => { try { buySpecialSpell(user); } catch (err) { @@ -39,7 +39,7 @@ describe('shared.ops.buySpecialSpell', () => { } }); - it('throws an error if the spell doesn\'t exists', (done) => { + it('throws an error if the spell doesn\'t exists', done => { try { buySpecialSpell(user, { params: { @@ -48,12 +48,12 @@ describe('shared.ops.buySpecialSpell', () => { }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); - expect(err.message).to.equal(errorMessage('spellNotFound', {spellId: 'notExisting'})); + expect(err.message).to.equal(errorMessage('spellNotFound', { spellId: 'notExisting' })); done(); } }); - it('throws an error if the user doesn\'t have enough gold', (done) => { + it('throws an error if the user doesn\'t have enough gold', done => { user.stats.gp = 1; try { buySpecialSpell(user, { @@ -70,9 +70,9 @@ describe('shared.ops.buySpecialSpell', () => { it('buys an item', () => { user.stats.gp = 11; - let item = content.special.thankyou; + const item = content.special.thankyou; - let [data, message] = buySpecialSpell(user, { + const [data, message] = buySpecialSpell(user, { params: { key: 'thankyou', }, diff --git a/test/common/ops/buy/hourglassPurchase.js b/test/common/ops/buy/hourglassPurchase.js index 6f9bf50808..a04ad429a3 100644 --- a/test/common/ops/buy/hourglassPurchase.js +++ b/test/common/ops/buy/hourglassPurchase.js @@ -9,11 +9,11 @@ import { generateUser, } from '../../../helpers/common.helper'; import errorMessage from '../../../../website/common/script/libs/errorMessage'; -import {BuyHourglassMountOperation} from '../../../../website/common/script/ops/buy/buyMount'; +import { BuyHourglassMountOperation } from '../../../../website/common/script/ops/buy/buyMount'; describe('common.ops.hourglassPurchase', () => { let user; - let analytics = {track () {}}; + const analytics = { track () {} }; function buyMount (_user, _req, _analytics) { const buyOp = new BuyHourglassMountOperation(_user, _req, _analytics); @@ -31,9 +31,9 @@ describe('common.ops.hourglassPurchase', () => { }); context('failure conditions', () => { - it('return error when key is not provided', (done) => { + it('return error when key is not provided', done => { try { - hourglassPurchase(user, {params: {}}); + hourglassPurchase(user, { params: {} }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.eql(errorMessage('missingKeyParam')); @@ -41,9 +41,9 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('returns error when type is not provided', (done) => { + it('returns error when type is not provided', done => { try { - hourglassPurchase(user, {params: {key: 'Base'}}); + hourglassPurchase(user, { params: { key: 'Base' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.eql(errorMessage('missingTypeParam')); @@ -51,19 +51,19 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('returns error when inccorect type is provided', (done) => { + it('returns error when inccorect type is provided', done => { try { - hourglassPurchase(user, {params: {type: 'notAType', key: 'MantisShrimp-Base'}}); + hourglassPurchase(user, { params: { type: 'notAType', key: 'MantisShrimp-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.eql(i18n.t('typeNotAllowedHourglass', {allowedTypes: _.keys(content.timeTravelStable).toString()})); + expect(err.message).to.eql(i18n.t('typeNotAllowedHourglass', { allowedTypes: _.keys(content.timeTravelStable).toString() })); done(); } }); - it('does not grant to pets without Mystic Hourglasses', (done) => { + it('does not grant to pets without Mystic Hourglasses', done => { try { - hourglassPurchase(user, {params: {type: 'pets', key: 'MantisShrimp-Base'}}); + hourglassPurchase(user, { params: { type: 'pets', key: 'MantisShrimp-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notEnoughHourglasses')); @@ -71,9 +71,9 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('does not grant to mounts without Mystic Hourglasses', (done) => { + it('does not grant to mounts without Mystic Hourglasses', done => { try { - buyMount(user, {params: {key: 'MantisShrimp-Base'}}); + buyMount(user, { params: { key: 'MantisShrimp-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notEnoughHourglasses')); @@ -81,11 +81,11 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('does not grant pet that is not part of the Time Travel Stable', (done) => { + it('does not grant pet that is not part of the Time Travel Stable', done => { user.purchased.plan.consecutive.trinkets = 1; try { - hourglassPurchase(user, {params: {type: 'pets', key: 'Wolf-Veteran'}}); + hourglassPurchase(user, { params: { type: 'pets', key: 'Wolf-Veteran' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notAllowedHourglass')); @@ -93,11 +93,11 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('does not grant mount that is not part of the Time Travel Stable', (done) => { + it('does not grant mount that is not part of the Time Travel Stable', done => { user.purchased.plan.consecutive.trinkets = 1; try { - buyMount(user, {params: {key: 'Orca-Base'}}); + buyMount(user, { params: { key: 'Orca-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notAllowedHourglass')); @@ -105,14 +105,14 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('does not grant pet that has already been purchased', (done) => { + it('does not grant pet that has already been purchased', done => { user.purchased.plan.consecutive.trinkets = 1; user.items.pets = { 'MantisShrimp-Base': true, }; try { - hourglassPurchase(user, {params: {type: 'pets', key: 'MantisShrimp-Base'}}); + hourglassPurchase(user, { params: { type: 'pets', key: 'MantisShrimp-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('petsAlreadyOwned')); @@ -120,14 +120,14 @@ describe('common.ops.hourglassPurchase', () => { } }); - it('does not grant mount that has already been purchased', (done) => { + it('does not grant mount that has already been purchased', done => { user.purchased.plan.consecutive.trinkets = 1; user.items.mounts = { 'MantisShrimp-Base': true, }; try { - buyMount(user, {params: {key: 'MantisShrimp-Base'}}); + buyMount(user, { params: { key: 'MantisShrimp-Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('mountsAlreadyOwned')); @@ -140,21 +140,21 @@ describe('common.ops.hourglassPurchase', () => { it('buys a pet', () => { user.purchased.plan.consecutive.trinkets = 2; - let [, message] = hourglassPurchase(user, {params: {type: 'pets', key: 'MantisShrimp-Base'}}, analytics); + const [, message] = hourglassPurchase(user, { params: { type: 'pets', key: 'MantisShrimp-Base' } }, analytics); expect(message).to.eql(i18n.t('hourglassPurchase')); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); - expect(user.items.pets).to.eql({'MantisShrimp-Base': 5}); + expect(user.items.pets).to.eql({ 'MantisShrimp-Base': 5 }); expect(analytics.track).to.be.calledOnce; }); it('buys a mount', () => { user.purchased.plan.consecutive.trinkets = 2; - let [, message] = buyMount(user, {params: {key: 'MantisShrimp-Base'}}); + const [, message] = buyMount(user, { params: { key: 'MantisShrimp-Base' } }); expect(message).to.eql(i18n.t('hourglassPurchase')); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); - expect(user.items.mounts).to.eql({'MantisShrimp-Base': true}); + expect(user.items.mounts).to.eql({ 'MantisShrimp-Base': true }); }); }); }); diff --git a/test/common/ops/buy/purchase.js b/test/common/ops/buy/purchase.js index 5266f46c7b..c97a8761eb 100644 --- a/test/common/ops/buy/purchase.js +++ b/test/common/ops/buy/purchase.js @@ -1,5 +1,7 @@ +import forEach from 'lodash/forEach'; +import moment from 'moment'; import purchase from '../../../../website/common/script/ops/buy/purchase'; -import pinnedGearUtils from '../../../../website/common/script/ops/pinnedGearUtils'; +import * as pinnedGearUtils from '../../../../website/common/script/ops/pinnedGearUtils'; import { BadRequest, NotAuthorized, @@ -9,17 +11,15 @@ import i18n from '../../../../website/common/script/i18n'; import { generateUser, } from '../../../helpers/common.helper'; -import forEach from 'lodash/forEach'; -import moment from 'moment'; describe('shared.ops.purchase', () => { const SEASONAL_FOOD = 'Meat'; let user; - let goldPoints = 40; - let analytics = {track () {}}; + const goldPoints = 40; + const analytics = { track () {} }; before(() => { - user = generateUser({'stats.class': 'rogue'}); + user = generateUser({ 'stats.class': 'rogue' }); }); beforeEach(() => { @@ -33,9 +33,9 @@ describe('shared.ops.purchase', () => { }); context('failure conditions', () => { - it('returns an error when type is not provided', (done) => { + it('returns an error when type is not provided', done => { try { - purchase(user, {params: {}}); + purchase(user, { params: {} }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('typeRequired')); @@ -44,9 +44,9 @@ describe('shared.ops.purchase', () => { }); - it('returns error when unknown type is provided', (done) => { + it('returns error when unknown type is provided', done => { try { - purchase(user, {params: {type: 'randomType', key: 'gem'}}); + purchase(user, { params: { type: 'randomType', key: 'gem' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('notAccteptedType')); @@ -54,11 +54,11 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when user attempts to purchase a piece of gear they own', (done) => { + it('returns error when user attempts to purchase a piece of gear they own', done => { user.items.gear.owned['shield_rogue_1'] = true; // eslint-disable-line dot-notation try { - purchase(user, {params: {type: 'gear', key: 'shield_rogue_1'}}); + purchase(user, { params: { type: 'gear', key: 'shield_rogue_1' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('alreadyHave')); @@ -66,19 +66,19 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when unknown item is requested', (done) => { + it('returns error when unknown item is requested', done => { try { - purchase(user, {params: {type: 'gear', key: 'randomKey'}}); + purchase(user, { params: { type: 'gear', key: 'randomKey' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); - expect(err.message).to.equal(i18n.t('contentKeyNotFound', {type: 'gear'})); + expect(err.message).to.equal(i18n.t('contentKeyNotFound', { type: 'gear' })); done(); } }); - it('returns error when user does not have permission to buy an item', (done) => { + it('returns error when user does not have permission to buy an item', done => { try { - purchase(user, {params: {type: 'gear', key: 'eyewear_mystery_301405'}}); + purchase(user, { params: { type: 'gear', key: 'eyewear_mystery_301405' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageNotAvailable')); @@ -86,9 +86,9 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when user does not have enough gems to buy an item', (done) => { + it('returns error when user does not have enough gems to buy an item', done => { try { - purchase(user, {params: {type: 'gear', key: 'headAccessory_special_wolfEars'}}); + purchase(user, { params: { type: 'gear', key: 'headAccessory_special_wolfEars' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('notEnoughGems')); @@ -97,11 +97,11 @@ describe('shared.ops.purchase', () => { }); - it('returns error when item is not found', (done) => { - let params = {key: 'notExisting', type: 'food'}; + it('returns error when item is not found', done => { + const params = { key: 'notExisting', type: 'food' }; try { - purchase(user, {params}); + purchase(user, { params }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('contentKeyNotFound', params)); @@ -109,12 +109,12 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when user supplies a non-numeric quantity', (done) => { - let type = 'eggs'; - let key = 'Wolf'; + it('returns error when user supplies a non-numeric quantity', done => { + const type = 'eggs'; + const key = 'Wolf'; try { - purchase(user, {params: {type, key}, quantity: 'jamboree'}, analytics); + purchase(user, { params: { type, key }, quantity: 'jamboree' }, analytics); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('invalidQuantity')); @@ -122,13 +122,13 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when user supplies a negative quantity', (done) => { - let type = 'eggs'; - let key = 'Wolf'; + it('returns error when user supplies a negative quantity', done => { + const type = 'eggs'; + const key = 'Wolf'; user.balance = 10; try { - purchase(user, {params: {type, key}, quantity: -2}, analytics); + purchase(user, { params: { type, key }, quantity: -2 }, analytics); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('invalidQuantity')); @@ -136,13 +136,13 @@ describe('shared.ops.purchase', () => { } }); - it('returns error when user supplies a decimal quantity', (done) => { - let type = 'eggs'; - let key = 'Wolf'; + it('returns error when user supplies a decimal quantity', done => { + const type = 'eggs'; + const key = 'Wolf'; user.balance = 10; try { - purchase(user, {params: {type, key}, quantity: 2.9}, analytics); + purchase(user, { params: { type, key }, quantity: 2.9 }, analytics); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('invalidQuantity')); @@ -152,25 +152,25 @@ describe('shared.ops.purchase', () => { }); context('successful purchase', () => { - let userGemAmount = 10; + const userGemAmount = 10; before(() => { user.balance = userGemAmount; user.stats.gp = goldPoints; user.purchased.plan.gemsBought = 0; user.purchased.plan.customerId = 'customer-id'; - user.pinnedItems.push({type: 'eggs', key: 'Wolf'}); - user.pinnedItems.push({type: 'hatchingPotions', key: 'Base'}); - user.pinnedItems.push({type: 'food', key: SEASONAL_FOOD}); - user.pinnedItems.push({type: 'gear', key: 'headAccessory_special_tigerEars'}); - user.pinnedItems.push({type: 'bundles', key: 'featheredFriends'}); + user.pinnedItems.push({ type: 'eggs', key: 'Wolf' }); + user.pinnedItems.push({ type: 'hatchingPotions', key: 'Base' }); + user.pinnedItems.push({ type: 'food', key: SEASONAL_FOOD }); + user.pinnedItems.push({ type: 'gear', key: 'headAccessory_special_tigerEars' }); + user.pinnedItems.push({ type: 'bundles', key: 'featheredFriends' }); }); it('purchases eggs', () => { - let type = 'eggs'; - let key = 'Wolf'; + const type = 'eggs'; + const key = 'Wolf'; - purchase(user, {params: {type, key}}, analytics); + purchase(user, { params: { type, key } }, analytics); expect(user.items[type][key]).to.equal(1); expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true); @@ -178,50 +178,50 @@ describe('shared.ops.purchase', () => { }); it('purchases hatchingPotions', () => { - let type = 'hatchingPotions'; - let key = 'Base'; + const type = 'hatchingPotions'; + const key = 'Base'; - purchase(user, {params: {type, key}}); + purchase(user, { params: { type, key } }); expect(user.items[type][key]).to.equal(1); expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true); }); it('purchases food', () => { - let type = 'food'; - let key = SEASONAL_FOOD; + const type = 'food'; + const key = SEASONAL_FOOD; - purchase(user, {params: {type, key}}); + purchase(user, { params: { type, key } }); expect(user.items[type][key]).to.equal(1); expect(pinnedGearUtils.removeItemByPath.notCalled).to.equal(true); }); it('purchases gear', () => { - let type = 'gear'; - let key = 'headAccessory_special_tigerEars'; + const type = 'gear'; + const key = 'headAccessory_special_tigerEars'; - purchase(user, {params: {type, key}}); + purchase(user, { params: { type, key } }); expect(user.items.gear.owned[key]).to.be.true; expect(pinnedGearUtils.removeItemByPath.calledOnce).to.equal(true); }); it('purchases quest bundles', () => { - let startingBalance = user.balance; - let clock = sandbox.useFakeTimers(moment('2019-05-20').valueOf()); - let type = 'bundles'; - let key = 'featheredFriends'; - let price = 1.75; - let questList = [ + const startingBalance = user.balance; + const clock = sandbox.useFakeTimers(moment('2019-05-20').valueOf()); + const type = 'bundles'; + const key = 'featheredFriends'; + const price = 1.75; + const questList = [ 'falcon', 'harpy', 'owl', ]; - purchase(user, {params: {type, key}}); + purchase(user, { params: { type, key } }); - forEach(questList, (bundledKey) => { + forEach(questList, bundledKey => { expect(user.items.quests[bundledKey]).to.equal(1); }); @@ -233,7 +233,7 @@ describe('shared.ops.purchase', () => { }); context('bulk purchase', () => { - let userGemAmount = 10; + const userGemAmount = 10; beforeEach(() => { user.balance = userGemAmount; @@ -242,14 +242,14 @@ describe('shared.ops.purchase', () => { user.purchased.plan.customerId = 'customer-id'; }); - it('errors when user does not have enough gems', (done) => { + it('errors when user does not have enough gems', done => { user.balance = 1; - let type = 'eggs'; - let key = 'TigerCub'; + const type = 'eggs'; + const key = 'TigerCub'; try { purchase(user, { - params: {type, key}, + params: { type, key }, quantity: 2, }); } catch (err) { @@ -260,11 +260,11 @@ describe('shared.ops.purchase', () => { }); it('makes bulk purchases of eggs', () => { - let type = 'eggs'; - let key = 'TigerCub'; + const type = 'eggs'; + const key = 'TigerCub'; purchase(user, { - params: {type, key}, + params: { type, key }, quantity: 2, }); diff --git a/test/common/ops/changeClass.js b/test/common/ops/changeClass.js index f4a4f9c451..4b1d31ffd7 100644 --- a/test/common/ops/changeClass.js +++ b/test/common/ops/changeClass.js @@ -19,10 +19,10 @@ describe('shared.ops.changeClass', () => { user.stats.flagSelected = false; }); - it('user is not level 10', (done) => { + it('user is not level 10', done => { user.stats.lvl = 9; try { - changeClass(user, {query: {class: 'rogue'}}); + changeClass(user, { query: { class: 'rogue' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('lvl10ChangeClass')); @@ -30,12 +30,12 @@ describe('shared.ops.changeClass', () => { } }); - it('req.query.class is an invalid class', (done) => { + it('req.query.class is an invalid class', done => { user.flags.classSelected = false; user.preferences.disableClasses = false; try { - changeClass(user, {query: {class: 'cellist'}}); + changeClass(user, { query: { class: 'cellist' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('invalidClass')); @@ -44,13 +44,13 @@ describe('shared.ops.changeClass', () => { }); context('req.query.class is a valid class', () => { - it('errors if user.stats.flagSelected is true and user.balance < 0.75', (done) => { + it('errors if user.stats.flagSelected is true and user.balance < 0.75', done => { user.flags.classSelected = true; user.preferences.disableClasses = false; user.balance = 0; try { - changeClass(user, {query: {class: 'rogue'}}); + changeClass(user, { query: { class: 'rogue' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('notEnoughGems')); @@ -63,7 +63,7 @@ describe('shared.ops.changeClass', () => { user.items.gear.owned.weapon_healer_3 = true; user.items.gear.equipped.weapon = 'weapon_healer_3'; - let [data] = changeClass(user, {query: {class: 'rogue'}}); + const [data] = changeClass(user, { query: { class: 'rogue' } }); expect(data).to.eql({ preferences: user.preferences, stats: user.stats, @@ -92,7 +92,7 @@ describe('shared.ops.changeClass', () => { user.stats.int = 4; user.flags.classSelected = true; - let [data] = changeClass(user); + const [data] = changeClass(user); expect(data).to.eql({ preferences: user.preferences, stats: user.stats, @@ -112,7 +112,7 @@ describe('shared.ops.changeClass', () => { }); context('has user.preferences.disableClasses !== true', () => { - it('and less than 3 gems', (done) => { + it('and less than 3 gems', done => { user.balance = 0.5; try { changeClass(user); @@ -132,7 +132,7 @@ describe('shared.ops.changeClass', () => { user.stats.int = 4; user.flags.classSelected = true; - let [data] = changeClass(user); + const [data] = changeClass(user); expect(data).to.eql({ preferences: user.preferences, stats: user.stats, diff --git a/test/common/ops/disableClasses.js b/test/common/ops/disableClasses.js index 60bd3998ab..0f7f6dc5bd 100644 --- a/test/common/ops/disableClasses.js +++ b/test/common/ops/disableClasses.js @@ -18,7 +18,7 @@ describe('shared.ops.disableClasses', () => { user.preferences.autoAllocate = false; user.stats.points = 2; - let [data] = disableClasses(user); + const [data] = disableClasses(user); expect(data).to.eql({ preferences: user.preferences, stats: user.stats, diff --git a/test/common/ops/equip.js b/test/common/ops/equip.js index f983891306..c9ac38f15e 100644 --- a/test/common/ops/equip.js +++ b/test/common/ops/equip.js @@ -28,58 +28,58 @@ describe('shared.ops.equip', () => { }, }, }, - stats: {gp: 200}, + stats: { gp: 200 }, }); }); context('Gear', () => { it('should not send a message if a weapon is equipped while only having zero or one weapons equipped', () => { - equip(user, {params: {key: 'weapon_warrior_1'}}); + equip(user, { params: { key: 'weapon_warrior_1' } }); // one-handed to one-handed - let [, message] = equip(user, {params: {key: 'weapon_warrior_2'}}); + let [, message] = equip(user, { params: { key: 'weapon_warrior_2' } }); expect(message).to.not.exist; // one-handed to two-handed - [, message] = equip(user, {params: {key: 'weapon_wizard_1'}}); + [, message] = equip(user, { params: { key: 'weapon_wizard_1' } }); expect(message).to.not.exist; // two-handed to two-handed - [, message] = equip(user, {params: {key: 'weapon_wizard_2'}}); + [, message] = equip(user, { params: { key: 'weapon_wizard_2' } }); expect(message).to.not.exist; // two-handed to one-handed - [, message] = equip(user, {params: {key: 'weapon_warrior_2'}}); + [, message] = equip(user, { params: { key: 'weapon_warrior_2' } }); expect(message).to.not.exist; }); it('should send messages if equipping a two-hander causes the off-hander to be unequipped', () => { - equip(user, {params: {key: 'weapon_warrior_1'}}); - equip(user, {params: {key: 'shield_warrior_1'}}); + equip(user, { params: { key: 'weapon_warrior_1' } }); + equip(user, { params: { key: 'shield_warrior_1' } }); // equipping two-hander - let [data, message] = equip(user, {params: {key: 'weapon_wizard_1'}}); - let weapon = content.gear.flat.weapon_wizard_1; - let item = content.gear.flat.shield_warrior_1; + const [data, message] = equip(user, { params: { key: 'weapon_wizard_1' } }); + const weapon = content.gear.flat.weapon_wizard_1; + const item = content.gear.flat.shield_warrior_1; - let res = {data, message}; + const res = { data, message }; expect(res).to.eql({ - message: i18n.t('messageTwoHandedEquip', {twoHandedText: weapon.text(), offHandedText: item.text()}), + message: i18n.t('messageTwoHandedEquip', { twoHandedText: weapon.text(), offHandedText: item.text() }), data: user.items, }); }); it('should send messages if equipping an off-hand item causes a two-handed weapon to be unequipped', () => { // equipping two-hander - equip(user, {params: {key: 'weapon_wizard_1'}}); - let weapon = content.gear.flat.weapon_wizard_1; - let shield = content.gear.flat.shield_warrior_1; + equip(user, { params: { key: 'weapon_wizard_1' } }); + const weapon = content.gear.flat.weapon_wizard_1; + const shield = content.gear.flat.shield_warrior_1; - let [data, message] = equip(user, {params: {key: 'shield_warrior_1'}}); + const [data, message] = equip(user, { params: { key: 'shield_warrior_1' } }); - let res = {data, message}; + const res = { data, message }; expect(res).to.eql({ - message: i18n.t('messageTwoHandedUnequip', {twoHandedText: weapon.text(), offHandedText: shield.text()}), + message: i18n.t('messageTwoHandedUnequip', { twoHandedText: weapon.text(), offHandedText: shield.text() }), data: user.items, }); }); diff --git a/test/common/ops/feed.js b/test/common/ops/feed.js index 241fe0fbbc..b00e9bdcd7 100644 --- a/test/common/ops/feed.js +++ b/test/common/ops/feed.js @@ -19,7 +19,7 @@ describe('shared.ops.feed', () => { }); context('failure conditions', () => { - it('does not allow feeding without specifying pet and food', (done) => { + it('does not allow feeding without specifying pet and food', done => { try { feed(user); } catch (err) { @@ -29,9 +29,9 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding if pet name format is invalid', (done) => { + it('does not allow feeding if pet name format is invalid', done => { try { - feed(user, {params: {pet: 'invalid', food: 'food'}}); + feed(user, { params: { pet: 'invalid', food: 'food' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(errorMessage('invalidPetName')); @@ -39,9 +39,9 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding if food does not exist', (done) => { + it('does not allow feeding if food does not exist', done => { try { - feed(user, {params: {pet: 'Wolf-Red', food: 'invalid food name'}}); + feed(user, { params: { pet: 'Wolf-Red', food: 'invalid food name' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(errorMessage('invalidFoodName')); @@ -49,9 +49,9 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding if pet is not owned', (done) => { + it('does not allow feeding if pet is not owned', done => { try { - feed(user, {params: {pet: 'Wolf-Red', food: 'Meat'}}); + feed(user, { params: { pet: 'Wolf-Red', food: 'Meat' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messagePetNotFound')); @@ -59,10 +59,10 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding if food is not owned', (done) => { + it('does not allow feeding if food is not owned', done => { user.items.pets['Wolf-Base'] = 5; try { - feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); + feed(user, { params: { pet: 'Wolf-Base', food: 'Meat' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messageFoodNotFound')); @@ -70,11 +70,11 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding of special pets', (done) => { + it('does not allow feeding of special pets', done => { user.items.pets['Wolf-Veteran'] = 5; user.items.food.Meat = 1; try { - feed(user, {params: {pet: 'Wolf-Veteran', food: 'Meat'}}); + feed(user, { params: { pet: 'Wolf-Veteran', food: 'Meat' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageCannotFeedPet')); @@ -82,12 +82,12 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding of mounts', (done) => { + it('does not allow feeding of mounts', done => { user.items.pets['Wolf-Base'] = -1; user.items.mounts['Wolf-Base'] = true; user.items.food.Meat = 1; try { - feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); + feed(user, { params: { pet: 'Wolf-Base', food: 'Meat' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageAlreadyMount')); @@ -101,9 +101,9 @@ describe('shared.ops.feed', () => { user.items.pets['Wolf-Base'] = 5; user.items.food.Saddle = 2; user.items.currentPet = 'Wolf-Base'; - let pet = content.petInfo['Wolf-Base']; + const pet = content.petInfo['Wolf-Base']; - let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Saddle'}}); + const [data, message] = feed(user, { params: { pet: 'Wolf-Base', food: 'Saddle' } }); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageEvolve', { egg: pet.text(), @@ -119,10 +119,10 @@ describe('shared.ops.feed', () => { user.items.pets['Wolf-Base'] = 5; user.items.food.Meat = 2; - let food = content.food.Meat; - let pet = content.petInfo['Wolf-Base']; + const food = content.food.Meat; + const pet = content.petInfo['Wolf-Base']; - let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); + const [data, message] = feed(user, { params: { pet: 'Wolf-Base', food: 'Meat' } }); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageLikesFood', { egg: pet.text(), @@ -137,10 +137,10 @@ describe('shared.ops.feed', () => { user.items.pets['Wolf-Spooky'] = 5; user.items.food.Milk = 2; - let food = content.food.Milk; - let pet = content.petInfo['Wolf-Spooky']; + const food = content.food.Milk; + const pet = content.petInfo['Wolf-Spooky']; - let [data, message] = feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); + const [data, message] = feed(user, { params: { pet: 'Wolf-Spooky', food: 'Milk' } }); expect(data).to.eql(user.items.pets['Wolf-Spooky']); expect(message).to.eql(i18n.t('messageLikesFood', { egg: pet.text(), @@ -155,10 +155,10 @@ describe('shared.ops.feed', () => { user.items.pets['Wolf-Base'] = 5; user.items.food.Milk = 2; - let food = content.food.Milk; - let pet = content.petInfo['Wolf-Base']; + const food = content.food.Milk; + const pet = content.petInfo['Wolf-Base']; - let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); + const [data, message] = feed(user, { params: { pet: 'Wolf-Base', food: 'Milk' } }); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageDontEnjoyFood', { egg: pet.text(), @@ -183,7 +183,7 @@ describe('shared.ops.feed', () => { 'Cactus-Base': true, 'BearCub-Base': true, }; - feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); + feed(user, { params: { pet: 'Wolf-Spooky', food: 'Milk' } }); expect(user.achievements.allYourBase).to.eql(true); }); @@ -201,7 +201,7 @@ describe('shared.ops.feed', () => { 'Cactus-Desert': true, 'BearCub-Desert': true, }; - feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); + feed(user, { params: { pet: 'Wolf-Spooky', food: 'Milk' } }); expect(user.achievements.aridAuthority).to.eql(true); }); @@ -210,9 +210,9 @@ describe('shared.ops.feed', () => { user.items.food.Milk = 2; user.items.currentPet = 'Wolf-Base'; - let pet = content.petInfo['Wolf-Base']; + const pet = content.petInfo['Wolf-Base']; - let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); + const [data, message] = feed(user, { params: { pet: 'Wolf-Base', food: 'Milk' } }); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageEvolve', { egg: pet.text(), diff --git a/test/common/ops/hatch.js b/test/common/ops/hatch.js index b1459ba9d9..ba57f7e194 100644 --- a/test/common/ops/hatch.js +++ b/test/common/ops/hatch.js @@ -30,12 +30,12 @@ describe('shared.ops.hatch', () => { } }); - it('does not allow hatching if user lacks specified egg', (done) => { + it('does not allow hatching if user lacks specified egg', done => { user.items.eggs.Wolf = 1; user.items.hatchingPotions.Base = 1; user.items.pets = {}; try { - hatch(user, {params: {egg: 'Dragon', hatchingPotion: 'Base'}}); + hatch(user, { params: { egg: 'Dragon', hatchingPotion: 'Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messageMissingEggPotion')); @@ -46,12 +46,12 @@ describe('shared.ops.hatch', () => { } }); - it('does not allow hatching if user lacks specified hatching potion', (done) => { + it('does not allow hatching if user lacks specified hatching potion', done => { user.items.eggs.Wolf = 1; user.items.hatchingPotions.Base = 1; user.items.pets = {}; try { - hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Golden'}}); + hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Golden' } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messageMissingEggPotion')); @@ -62,50 +62,50 @@ describe('shared.ops.hatch', () => { } }); - it('does not allow hatching if user already owns target pet', (done) => { - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Base: 1}; - user.items.pets = {'Wolf-Base': 10}; + it('does not allow hatching if user already owns target pet', done => { + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Base: 1 }; + user.items.pets = { 'Wolf-Base': 10 }; try { - hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); + hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Base' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('messageAlreadyPet')); - expect(user.items.pets).to.eql({'Wolf-Base': 10}); - expect(user.items.eggs).to.eql({Wolf: 1}); - expect(user.items.hatchingPotions).to.eql({Base: 1}); + expect(user.items.pets).to.eql({ 'Wolf-Base': 10 }); + expect(user.items.eggs).to.eql({ Wolf: 1 }); + expect(user.items.hatchingPotions).to.eql({ Base: 1 }); done(); } }); - it('does not allow hatching quest pet egg using premium potion', (done) => { - user.items.eggs = {Cheetah: 1}; - user.items.hatchingPotions = {Spooky: 1}; + it('does not allow hatching quest pet egg using premium potion', done => { + user.items.eggs = { Cheetah: 1 }; + user.items.hatchingPotions = { Spooky: 1 }; user.items.pets = {}; try { - hatch(user, {params: {egg: 'Cheetah', hatchingPotion: 'Spooky'}}); + hatch(user, { params: { egg: 'Cheetah', hatchingPotion: 'Spooky' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('messageInvalidEggPotionCombo')); expect(user.items.pets).to.be.empty; - expect(user.items.eggs).to.eql({Cheetah: 1}); - expect(user.items.hatchingPotions).to.eql({Spooky: 1}); + expect(user.items.eggs).to.eql({ Cheetah: 1 }); + expect(user.items.hatchingPotions).to.eql({ Spooky: 1 }); done(); } }); - it('does not allow hatching quest pet egg using wacky potion', (done) => { - user.items.eggs = {Bunny: 1}; - user.items.hatchingPotions = {Veggie: 1}; + it('does not allow hatching quest pet egg using wacky potion', done => { + user.items.eggs = { Bunny: 1 }; + user.items.hatchingPotions = { Veggie: 1 }; user.items.pets = {}; try { - hatch(user, {params: {egg: 'Bunny', hatchingPotion: 'Veggie'}}); + hatch(user, { params: { egg: 'Bunny', hatchingPotion: 'Veggie' } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('messageInvalidEggPotionCombo')); expect(user.items.pets).to.be.empty; - expect(user.items.eggs).to.eql({Bunny: 1}); - expect(user.items.hatchingPotions).to.eql({Veggie: 1}); + expect(user.items.eggs).to.eql({ Bunny: 1 }); + expect(user.items.hatchingPotions).to.eql({ Veggie: 1 }); done(); } }); @@ -113,51 +113,51 @@ describe('shared.ops.hatch', () => { context('successful hatching', () => { it('hatches a basic pet', () => { - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Base: 1}; + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Base: 1 }; user.items.pets = {}; - let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); + const [data, message] = hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Base' } }); expect(message).to.equal(i18n.t('messageHatched')); expect(data).to.eql(user.items); - expect(user.items.pets).to.eql({'Wolf-Base': 5}); - expect(user.items.eggs).to.eql({Wolf: 0}); - expect(user.items.hatchingPotions).to.eql({Base: 0}); + expect(user.items.pets).to.eql({ 'Wolf-Base': 5 }); + expect(user.items.eggs).to.eql({ Wolf: 0 }); + expect(user.items.hatchingPotions).to.eql({ Base: 0 }); }); it('hatches a quest pet', () => { - user.items.eggs = {Cheetah: 1}; - user.items.hatchingPotions = {Base: 1}; + user.items.eggs = { Cheetah: 1 }; + user.items.hatchingPotions = { Base: 1 }; user.items.pets = {}; - let [data, message] = hatch(user, {params: {egg: 'Cheetah', hatchingPotion: 'Base'}}); + const [data, message] = hatch(user, { params: { egg: 'Cheetah', hatchingPotion: 'Base' } }); expect(message).to.equal(i18n.t('messageHatched')); expect(data).to.eql(user.items); - expect(user.items.pets).to.eql({'Cheetah-Base': 5}); - expect(user.items.eggs).to.eql({Cheetah: 0}); - expect(user.items.hatchingPotions).to.eql({Base: 0}); + expect(user.items.pets).to.eql({ 'Cheetah-Base': 5 }); + expect(user.items.eggs).to.eql({ Cheetah: 0 }); + expect(user.items.hatchingPotions).to.eql({ Base: 0 }); }); it('hatches a premium pet', () => { - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Spooky: 1}; + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Spooky: 1 }; user.items.pets = {}; - let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Spooky'}}); + const [data, message] = hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Spooky' } }); expect(message).to.equal(i18n.t('messageHatched')); expect(data).to.eql(user.items); - expect(user.items.pets).to.eql({'Wolf-Spooky': 5}); - expect(user.items.eggs).to.eql({Wolf: 0}); - expect(user.items.hatchingPotions).to.eql({Spooky: 0}); + expect(user.items.pets).to.eql({ 'Wolf-Spooky': 5 }); + expect(user.items.eggs).to.eql({ Wolf: 0 }); + expect(user.items.hatchingPotions).to.eql({ Spooky: 0 }); }); it('hatches a pet previously raised to a mount', () => { - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Base: 1}; - user.items.pets = {'Wolf-Base': -1}; - let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Base: 1 }; + user.items.pets = { 'Wolf-Base': -1 }; + const [data, message] = hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Base' } }); expect(message).to.eql(i18n.t('messageHatched')); expect(data).to.eql(user.items); - expect(user.items.pets).to.eql({'Wolf-Base': 5}); - expect(user.items.eggs).to.eql({Wolf: 0}); - expect(user.items.hatchingPotions).to.eql({Base: 0}); + expect(user.items.pets).to.eql({ 'Wolf-Base': 5 }); + expect(user.items.eggs).to.eql({ Wolf: 0 }); + expect(user.items.hatchingPotions).to.eql({ Base: 0 }); }); it('awards Back to Basics achievement', () => { @@ -172,9 +172,9 @@ describe('shared.ops.hatch', () => { 'Cactus-Base': 15, 'BearCub-Base': 5, }; - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Spooky: 1}; - hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Spooky'}}); + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Spooky: 1 }; + hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Spooky' } }); expect(user.achievements.backToBasics).to.eql(true); }); @@ -190,9 +190,9 @@ describe('shared.ops.hatch', () => { 'Cactus-Desert': 15, 'BearCub-Desert': 5, }; - user.items.eggs = {Wolf: 1}; - user.items.hatchingPotions = {Spooky: 1}; - hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Spooky'}}); + user.items.eggs = { Wolf: 1 }; + user.items.hatchingPotions = { Spooky: 1 }; + hatch(user, { params: { egg: 'Wolf', hatchingPotion: 'Spooky' } }); expect(user.achievements.dustDevil).to.eql(true); }); }); diff --git a/test/common/ops/openMysteryItem.js b/test/common/ops/openMysteryItem.js index e828129457..511c2e52b8 100644 --- a/test/common/ops/openMysteryItem.js +++ b/test/common/ops/openMysteryItem.js @@ -15,7 +15,7 @@ describe('shared.ops.openMysteryItem', () => { user = generateUser(); }); - it('returns error when item key is empty', (done) => { + it('returns error when item key is empty', done => { try { openMysteryItem(user); } catch (err) { @@ -26,17 +26,17 @@ describe('shared.ops.openMysteryItem', () => { }); it('opens mystery item', () => { - let mysteryItemKey = 'eyewear_special_summerRogue'; + const mysteryItemKey = 'eyewear_special_summerRogue'; user.purchased.plan.mysteryItems = [mysteryItemKey]; - user.notifications.push({type: 'NEW_MYSTERY_ITEMS', data: {items: [mysteryItemKey]}}); + user.notifications.push({ type: 'NEW_MYSTERY_ITEMS', data: { items: [mysteryItemKey] } }); expect(user.notifications.length).to.equal(1); - let [data, message] = openMysteryItem(user); + const [data, message] = openMysteryItem(user); expect(user.items.gear.owned[mysteryItemKey]).to.be.true; expect(message).to.equal(i18n.t('mysteryItemOpened')); - let item = _.cloneDeep(content.gear.flat[mysteryItemKey]); + const item = _.cloneDeep(content.gear.flat[mysteryItemKey]); item.text = content.gear.flat[mysteryItemKey].text(); expect(data).to.eql(item); expect(user.notifications.length).to.equal(0); diff --git a/test/common/ops/pinnedGearUtils.js b/test/common/ops/pinnedGearUtils.js index e45e60a729..b6ea4e0758 100644 --- a/test/common/ops/pinnedGearUtils.js +++ b/test/common/ops/pinnedGearUtils.js @@ -1,7 +1,7 @@ import { generateUser, } from '../../helpers/common.helper'; -import {addPinnedGear} from '../../../website/common/script/ops/pinnedGearUtils'; +import { addPinnedGear } from '../../../website/common/script/ops/pinnedGearUtils'; describe('shared.ops.pinnedGearUtils.addPinnedGear', () => { let user; diff --git a/test/common/ops/readCard.js b/test/common/ops/readCard.js index d6d249e1f4..261708c2cb 100644 --- a/test/common/ops/readCard.js +++ b/test/common/ops/readCard.js @@ -10,7 +10,7 @@ import { describe('shared.ops.readCard', () => { let user; - let cardType = 'greeting'; + const cardType = 'greeting'; beforeEach(() => { user = generateUser(); @@ -18,7 +18,7 @@ describe('shared.ops.readCard', () => { user.flags.cardReceived = true; }); - it('returns an error when cardType is not provided', (done) => { + it('returns an error when cardType is not provided', done => { try { readCard(user); } catch (err) { @@ -28,9 +28,9 @@ describe('shared.ops.readCard', () => { } }); - it('returns an error when unknown cardType is provided', (done) => { + it('returns an error when unknown cardType is provided', done => { try { - readCard(user, {params: {cardType: 'randomCardType'}}); + readCard(user, { params: { cardType: 'randomCardType' } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('cardTypeNotAllowed')); @@ -41,13 +41,13 @@ describe('shared.ops.readCard', () => { it('reads a card', () => { user.notifications.push({ type: 'CARD_RECEIVED', - data: {card: cardType}, + data: { card: cardType }, }); const initialNotificationNuber = user.notifications.length; - let [, message] = readCard(user, {params: {cardType: 'greeting'}}); + const [, message] = readCard(user, { params: { cardType: 'greeting' } }); - expect(message).to.equal(i18n.t('readCard', {cardType})); + expect(message).to.equal(i18n.t('readCard', { cardType })); expect(user.items.special[`${cardType}Received`]).to.be.empty; expect(user.flags.cardReceived).to.be.false; expect(user.notifications.length).to.equal(initialNotificationNuber - 1); diff --git a/test/common/ops/rebirth.js b/test/common/ops/rebirth.js index 65014e3cb4..0cc9218daa 100644 --- a/test/common/ops/rebirth.js +++ b/test/common/ops/rebirth.js @@ -14,8 +14,8 @@ import { describe('shared.ops.rebirth', () => { let user; - let animal = 'Wolf-Base'; - let userStats = ['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp']; + const animal = 'Wolf-Base'; + const userStats = ['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp']; let tasks = []; beforeEach(() => { @@ -24,7 +24,7 @@ describe('shared.ops.rebirth', () => { tasks = [generateHabit(), generateDaily(), generateTodo(), generateReward()]; }); - it('returns an error when user balance is too low and user is less than max level', (done) => { + it('returns an error when user balance is too low and user is less than max level', done => { user.balance = 0; try { @@ -37,7 +37,7 @@ describe('shared.ops.rebirth', () => { }); it('rebirths a user with enough gems', () => { - let [, message] = rebirth(user); + const [, message] = rebirth(user); expect(message).to.equal(i18n.t('rebirthComplete')); }); @@ -46,7 +46,7 @@ describe('shared.ops.rebirth', () => { user.balance = 0; user.stats.lvl = MAX_LEVEL; - let [, message] = rebirth(user); + const [, message] = rebirth(user); expect(message).to.equal(i18n.t('rebirthComplete')); expect(user.flags.lastFreeRebirth).to.exist; @@ -56,7 +56,7 @@ describe('shared.ops.rebirth', () => { user.balance = 0; user.stats.lvl = MAX_LEVEL + 1; - let [, message] = rebirth(user); + const [, message] = rebirth(user); expect(message).to.equal(i18n.t('rebirthComplete')); }); @@ -65,7 +65,7 @@ describe('shared.ops.rebirth', () => { user.stats.lvl = MAX_LEVEL + 1; user.flags.lastFreeRebirth = new Date(); - let [, message] = rebirth(user); + const [, message] = rebirth(user); expect(message).to.equal(i18n.t('rebirthComplete')); expect(user.balance).to.equal(0); @@ -98,7 +98,7 @@ describe('shared.ops.rebirth', () => { }); it('resets a user\'s buffs', () => { - user.stats.buffs = {test: 'test'}; + user.stats.buffs = { test: 'test' }; rebirth(user); @@ -123,21 +123,21 @@ describe('shared.ops.rebirth', () => { it('resets a user\'s stats', () => { user.stats.class = 'rouge'; - _.each(userStats, function setUsersStats (value) { + _.each(userStats, value => { user.stats[value] = 10; }); rebirth(user); - _.each(userStats, function resetUserStats (value) { + _.each(userStats, value => { user.stats[value] = 0; }); }); it('retains a user\'s gear', () => { - let prevGearEquipped = user.items.gear.equipped; - let prevGearCostume = user.items.gear.costume; - let prevPrefCostume = user.preferences.costume; + const prevGearEquipped = user.items.gear.equipped; + const prevGearCostume = user.items.gear.costume; + const prevPrefCostume = user.preferences.costume; rebirth(user); @@ -148,7 +148,7 @@ describe('shared.ops.rebirth', () => { it('retains a user\'s gear owned', () => { user.items.gear.owned.weapon_warrior_1 = true; // eslint-disable-line camelcase - let prevGearOwned = user.items.gear.owned; + const prevGearOwned = user.items.gear.owned; rebirth(user); @@ -176,7 +176,7 @@ describe('shared.ops.rebirth', () => { user.flags.dropsEnabled = true; user.flags.classSelected = true; user.flags.rebirthEnabled = true; - user.flags.levelDrops = {test: 'test'}; + user.flags.levelDrops = { test: 'test' }; rebirth(user); @@ -228,7 +228,8 @@ describe('shared.ops.rebirth', () => { it('always increments rebirth achievements when level is MAX_LEVEL', () => { user.stats.lvl = MAX_LEVEL; user.achievements.rebirths = 1; - user.achievements.rebirthLevel = MAX_LEVEL + 1; // this value is not actually possible (actually capped at MAX_LEVEL) but makes a good test + // this value is not actually possible (actually capped at MAX_LEVEL) but makes a good test + user.achievements.rebirthLevel = MAX_LEVEL + 1; rebirth(user); @@ -239,7 +240,8 @@ describe('shared.ops.rebirth', () => { it('always increments rebirth achievements when level is greater than MAX_LEVEL', () => { user.stats.lvl = MAX_LEVEL + 1; user.achievements.rebirths = 1; - user.achievements.rebirthLevel = MAX_LEVEL + 2; // this value is not actually possible (actually capped at MAX_LEVEL) but makes a good test + // this value is not actually possible (actually capped at MAX_LEVEL) but makes a good test + user.achievements.rebirthLevel = MAX_LEVEL + 2; rebirth(user); diff --git a/test/common/ops/releaseBoth.js b/test/common/ops/releaseBoth.js index 3d2c910075..006a467b3d 100644 --- a/test/common/ops/releaseBoth.js +++ b/test/common/ops/releaseBoth.js @@ -10,19 +10,19 @@ import { describe('shared.ops.releaseBoth', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; beforeEach(() => { user = generateUser(); - for (let p in content.pets) { + Object.keys(content.pets).forEach(p => { user.items.pets[p] = content.pets[p]; user.items.pets[p] = 5; - } + }); - for (let m in content.pets) { + Object.keys(content.pets).forEach(m => { user.items.mounts[m] = content.pets[m]; user.items.mounts[m] = true; - } + }); user.items.currentMount = animal; user.items.currentPet = animal; @@ -30,7 +30,7 @@ describe('shared.ops.releaseBoth', () => { user.achievements.triadBingo = true; }); - xit('returns an error when user balance is too low and user does not have triadBingo', (done) => { + xit('returns an error when user balance is too low and user does not have triadBingo', done => { user.balance = 0; try { @@ -42,7 +42,7 @@ describe('shared.ops.releaseBoth', () => { } }); - it('returns an error when user does not have all pets', (done) => { + it('returns an error when user does not have all pets', done => { const petKeys = Object.keys(user.items.pets); delete user.items.pets[petKeys[0]]; @@ -59,7 +59,7 @@ describe('shared.ops.releaseBoth', () => { }); it('grants triad bingo with gems', () => { - let message = releaseBoth(user)[1]; + const message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(1); @@ -70,23 +70,23 @@ describe('shared.ops.releaseBoth', () => { user.achievements.triadBingo = 1; user.achievements.triadBingoCount = 1; - let message = releaseBoth(user)[1]; + const message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(2); }); it('does not grant triad bingo if any pet has not been previously found', () => { - let triadBingoCountBeforeRelease = user.achievements.triadBingoCount; + const triadBingoCountBeforeRelease = user.achievements.triadBingoCount; user.items.pets[animal] = -1; - let message = releaseBoth(user)[1]; + const message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(triadBingoCountBeforeRelease); }); it('releases pets', () => { - let message = releaseBoth(user)[1]; + const message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.pets[animal]).to.equal(0); @@ -94,7 +94,7 @@ describe('shared.ops.releaseBoth', () => { }); it('does not increment beastMasterCount if any pet is level 0 (released)', () => { - let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + const beastMasterCountBeforeRelease = user.achievements.beastMasterCount; user.items.pets[animal] = 0; try { releaseBoth(user); @@ -104,7 +104,7 @@ describe('shared.ops.releaseBoth', () => { }); it('does not increment beastMasterCount if any pet is missing (null)', () => { - let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + const beastMasterCountBeforeRelease = user.achievements.beastMasterCount; user.items.pets[animal] = null; try { @@ -115,7 +115,7 @@ describe('shared.ops.releaseBoth', () => { }); it('does not increment beastMasterCount if any pet is missing (undefined)', () => { - let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + const beastMasterCountBeforeRelease = user.achievements.beastMasterCount; delete user.items.pets[animal]; try { @@ -126,14 +126,14 @@ describe('shared.ops.releaseBoth', () => { }); it('releases mounts', () => { - let message = releaseBoth(user)[1]; + const message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.mounts[animal]).to.equal(null); }); it('does not increase mountMasterCount achievement if mount is missing (null)', () => { - let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + const mountMasterCountBeforeRelease = user.achievements.mountMasterCount; user.items.mounts[animal] = null; try { @@ -144,7 +144,7 @@ describe('shared.ops.releaseBoth', () => { }); it('does not increase mountMasterCount achievement if mount is missing (undefined)', () => { - let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + const mountMasterCountBeforeRelease = user.achievements.mountMasterCount; delete user.items.mounts[animal]; try { @@ -155,7 +155,7 @@ describe('shared.ops.releaseBoth', () => { }); it('removes drop currentPet', () => { - let petInfo = content.petInfo[user.items.currentPet]; + const petInfo = content.petInfo[user.items.currentPet]; expect(petInfo.type).to.equal('drop'); releaseBoth(user); @@ -164,7 +164,7 @@ describe('shared.ops.releaseBoth', () => { }); it('removes drop currentMount', () => { - let mountInfo = content.mountInfo[user.items.currentMount]; + const mountInfo = content.mountInfo[user.items.currentMount]; expect(mountInfo.type).to.equal('drop'); releaseBoth(user); @@ -172,15 +172,15 @@ describe('shared.ops.releaseBoth', () => { }); it('leaves non-drop pets and mounts equipped', () => { - let questAnimal = 'Gryphon-Base'; + const questAnimal = 'Gryphon-Base'; user.items.currentMount = questAnimal; user.items.currentPet = questAnimal; user.items.pets[questAnimal] = 5; user.items.mounts[questAnimal] = true; - let petInfo = content.petInfo[user.items.currentPet]; + const petInfo = content.petInfo[user.items.currentPet]; expect(petInfo.type).to.not.equal('drop'); - let mountInfo = content.mountInfo[user.items.currentMount]; + const mountInfo = content.mountInfo[user.items.currentMount]; expect(mountInfo.type).to.not.equal('drop'); releaseBoth(user); diff --git a/test/common/ops/releaseMounts.js b/test/common/ops/releaseMounts.js index 816d5f035d..10ec71f23b 100644 --- a/test/common/ops/releaseMounts.js +++ b/test/common/ops/releaseMounts.js @@ -10,20 +10,20 @@ import { describe('shared.ops.releaseMounts', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; beforeEach(() => { user = generateUser(); - for (let k in content.pets) { + Object.keys(content.pets).forEach(k => { user.items.mounts[k] = content.pets[k]; user.items.mounts[k] = true; - } + }); user.items.currentMount = animal; user.balance = 1; }); - it('returns an error when user balance is too low', (done) => { + it('returns an error when user balance is too low', done => { user.balance = 0; try { @@ -35,7 +35,7 @@ describe('shared.ops.releaseMounts', () => { } }); - it('returns an error when user does not have all pets', (done) => { + it('returns an error when user does not have all pets', done => { const mountsKeys = Object.keys(user.items.mounts); delete user.items.mounts[mountsKeys[0]]; @@ -49,14 +49,14 @@ describe('shared.ops.releaseMounts', () => { }); it('releases mounts', () => { - let message = releaseMounts(user)[1]; + const message = releaseMounts(user)[1]; expect(message).to.equal(i18n.t('mountsReleased')); expect(user.items.mounts[animal]).to.equal(null); }); it('removes drop currentMount', () => { - let mountInfo = content.mountInfo[user.items.currentMount]; + const mountInfo = content.mountInfo[user.items.currentMount]; expect(mountInfo.type).to.equal('drop'); releaseMounts(user); @@ -64,11 +64,11 @@ describe('shared.ops.releaseMounts', () => { }); it('leaves non-drop mount equipped', () => { - let questAnimal = 'Gryphon-Base'; + const questAnimal = 'Gryphon-Base'; user.items.currentMount = questAnimal; user.items.mounts[questAnimal] = true; - let mountInfo = content.mountInfo[user.items.currentMount]; + const mountInfo = content.mountInfo[user.items.currentMount]; expect(mountInfo.type).to.not.equal('drop'); releaseMounts(user); @@ -81,7 +81,7 @@ describe('shared.ops.releaseMounts', () => { }); it('does not increase mountMasterCount achievement if mount is missing (null)', () => { - let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + const mountMasterCountBeforeRelease = user.achievements.mountMasterCount; user.items.mounts[animal] = null; try { @@ -92,7 +92,7 @@ describe('shared.ops.releaseMounts', () => { }); it('does not increase mountMasterCount achievement if mount is missing (undefined)', () => { - let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + const mountMasterCountBeforeRelease = user.achievements.mountMasterCount; delete user.items.mounts[animal]; try { diff --git a/test/common/ops/releasePets.js b/test/common/ops/releasePets.js index 97089607d3..a333fc41ab 100644 --- a/test/common/ops/releasePets.js +++ b/test/common/ops/releasePets.js @@ -10,20 +10,20 @@ import { describe('shared.ops.releasePets', () => { let user; - let animal = 'Wolf-Base'; + const animal = 'Wolf-Base'; beforeEach(() => { user = generateUser(); - for (let k in content.pets) { + Object.keys(content.pets).forEach(k => { user.items.pets[k] = content.pets[k]; user.items.pets[k] = 5; - } + }); user.items.currentPet = animal; user.balance = 1; }); - it('returns an error when user balance is too low', (done) => { + it('returns an error when user balance is too low', done => { user.balance = 0; try { @@ -35,7 +35,7 @@ describe('shared.ops.releasePets', () => { } }); - it('returns an error when user does not have all pets', (done) => { + it('returns an error when user does not have all pets', done => { const petKeys = Object.keys(user.items.pets); delete user.items.pets[petKeys[0]]; @@ -49,14 +49,14 @@ describe('shared.ops.releasePets', () => { }); it('releases pets', () => { - let message = releasePets(user)[1]; + const message = releasePets(user)[1]; expect(message).to.equal(i18n.t('petsReleased')); expect(user.items.pets[animal]).to.equal(0); }); it('removes drop currentPet', () => { - let petInfo = content.petInfo[user.items.currentPet]; + const petInfo = content.petInfo[user.items.currentPet]; expect(petInfo.type).to.equal('drop'); releasePets(user); @@ -64,11 +64,11 @@ describe('shared.ops.releasePets', () => { }); it('leaves non-drop pets equipped', () => { - let questAnimal = 'Gryphon-Base'; + const questAnimal = 'Gryphon-Base'; user.items.currentPet = questAnimal; user.items.pets[questAnimal] = 5; - let petInfo = content.petInfo[user.items.currentPet]; + const petInfo = content.petInfo[user.items.currentPet]; expect(petInfo.type).to.not.equal('drop'); releasePets(user); @@ -99,7 +99,7 @@ describe('shared.ops.releasePets', () => { }); it('does not increment beastMasterCount if any pet is missing (null)', () => { - let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + const beastMasterCountBeforeRelease = user.achievements.beastMasterCount; user.items.pets[animal] = null; try { @@ -110,7 +110,7 @@ describe('shared.ops.releasePets', () => { }); it('does not increment beastMasterCount if any pet is missing (undefined)', () => { - let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + const beastMasterCountBeforeRelease = user.achievements.beastMasterCount; delete user.items.pets[animal]; try { diff --git a/test/common/ops/reroll.js b/test/common/ops/reroll.js index 8cf7123d11..15020c8aa4 100644 --- a/test/common/ops/reroll.js +++ b/test/common/ops/reroll.js @@ -19,7 +19,7 @@ describe('shared.ops.reroll', () => { tasks = [generateDaily(), generateReward()]; }); - it('returns an error when user balance is too low', (done) => { + it('returns an error when user balance is too low', done => { user.balance = 0; try { @@ -32,7 +32,7 @@ describe('shared.ops.reroll', () => { }); it('rerolls a user with enough gems', () => { - let [, message] = reroll(user); + const [, message] = reroll(user); expect(message).to.equal(i18n.t('fortifyComplete')); }); diff --git a/test/common/ops/reset.js b/test/common/ops/reset.js index 17dea701c2..7ba6c117c4 100644 --- a/test/common/ops/reset.js +++ b/test/common/ops/reset.js @@ -16,10 +16,10 @@ describe('shared.ops.reset', () => { user = generateUser(); user.balance = 2; - let habit = generateHabit(); - let todo = generateTodo(); - let daily = generateDaily(); - let reward = generateReward(); + const habit = generateHabit(); + const todo = generateTodo(); + const daily = generateDaily(); + const reward = generateReward(); user.tasksOrder.habits = [habit._id]; user.tasksOrder.todos = [todo._id]; @@ -31,7 +31,7 @@ describe('shared.ops.reset', () => { it('resets a user', () => { - let [, message] = reset(user); + const [, message] = reset(user); expect(message).to.equal(i18n.t('resetComplete')); }); diff --git a/test/common/ops/revive.js b/test/common/ops/revive.js index b4e0ce2846..5000687076 100644 --- a/test/common/ops/revive.js +++ b/test/common/ops/revive.js @@ -18,7 +18,7 @@ describe('shared.ops.revive', () => { user.stats.hp = 0; }); - it('returns an error when user is not dead', (done) => { + it('returns an error when user is not dead', done => { user.stats.hp = 10; try { @@ -56,28 +56,26 @@ describe('shared.ops.revive', () => { }); it('it decreases a random stat from str, con, per, int by one', () => { - let stats = ['str', 'con', 'per', 'int']; + const stats = ['str', 'con', 'per', 'int']; - _.each(stats, (s) => { + _.each(stats, s => { user.stats[s] = 1; }); revive(user); - let statSum = _.reduce(stats, (m, k) => { - return m + user.stats[k]; - }, 0); + const statSum = _.reduce(stats, (m, k) => m + user.stats[k], 0); expect(statSum).to.equal(3); }); it('removes a random item from user gear owned', () => { - let weaponKey = 'weapon_warrior_0'; + const weaponKey = 'weapon_warrior_0'; user.items.gear.owned[weaponKey] = true; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text() })); expect(user.items.gear.owned[weaponKey]).to.be.false; }); @@ -96,67 +94,67 @@ describe('shared.ops.revive', () => { weapon_warrior_0: true, }; - let weaponKey = 'weapon_warrior_0'; + const weaponKey = 'weapon_warrior_0'; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text() })); expect(user.items.gear.owned[weaponKey]).to.be.false; }); it('does not remove items of a different class', () => { - let weaponKey = 'weapon_wizard_1'; + const weaponKey = 'weapon_wizard_1'; user.items.gear.owned[weaponKey] = true; - let [, message] = revive(user); + const [, message] = revive(user); expect(message).to.equal(''); expect(user.items.gear.owned[weaponKey]).to.be.true; }); it('removes "special" items', () => { - let weaponKey = 'weapon_special_1'; + const weaponKey = 'weapon_special_1'; user.items.gear.owned[weaponKey] = true; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text() })); expect(user.items.gear.owned[weaponKey]).to.be.false; }); it('removes "armoire" items', () => { - let weaponKey = 'armor_armoire_goldenToga'; + const weaponKey = 'armor_armoire_goldenToga'; user.items.gear.owned[weaponKey] = true; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text() })); expect(user.items.gear.owned[weaponKey]).to.be.false; }); it('dequips lost item from user if user had it equipped', () => { - let weaponKey = 'weapon_warrior_0'; - let itemToLose = content.gear.flat[weaponKey]; + const weaponKey = 'weapon_warrior_0'; + const itemToLose = content.gear.flat[weaponKey]; user.items.gear.owned[weaponKey] = true; user.items.gear.equipped[itemToLose.type] = itemToLose.key; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text() })); expect(user.items.gear.equipped[itemToLose.type]).to.equal(`${itemToLose.type}_base_0`); }); it('dequips lost item from user costume if user was using it in costume', () => { - let weaponKey = 'weapon_warrior_0'; - let itemToLose = content.gear.flat[weaponKey]; + const weaponKey = 'weapon_warrior_0'; + const itemToLose = content.gear.flat[weaponKey]; user.items.gear.owned[weaponKey] = true; user.items.gear.costume[itemToLose.type] = itemToLose.key; - let [, message] = revive(user); + const [, message] = revive(user); - expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text() })); expect(user.items.gear.costume[itemToLose.type]).to.equal(`${itemToLose.type}_base_0`); }); }); diff --git a/test/common/ops/scoreTask.test.js b/test/common/ops/scoreTask.test.js index c157a929e1..2526a57fc9 100644 --- a/test/common/ops/scoreTask.test.js +++ b/test/common/ops/scoreTask.test.js @@ -13,11 +13,11 @@ import { } from '../../../website/common/script/libs/errors'; import crit from '../../../website/common/script/fns/crit'; -let EPSILON = 0.0001; // negligible distance between datapoints +const EPSILON = 0.0001; // negligible distance between datapoints -let beforeAfter = () => { - let beforeUser = generateUser(); - let afterUser = _.cloneDeep(beforeUser); +const beforeAfter = () => { + const beforeUser = generateUser(); + const afterUser = _.cloneDeep(beforeUser); return { beforeUser, @@ -25,7 +25,7 @@ let beforeAfter = () => { }; }; -let expectGainedPoints = (beforeUser, afterUser, beforeTask, afterTask) => { +const expectGainedPoints = (beforeUser, afterUser, beforeTask, afterTask) => { expect(afterUser.stats.hp).to.eql(50); expect(afterUser.stats.exp).to.be.greaterThan(beforeUser.stats.exp); expect(afterUser.stats.gp).to.be.greaterThan(beforeUser.stats.gp); @@ -35,15 +35,15 @@ let expectGainedPoints = (beforeUser, afterUser, beforeTask, afterTask) => { } }; -let expectClosePoints = (beforeUser, afterUser, beforeTask, task) => { +const expectClosePoints = (beforeUser, afterUser, beforeTask, task) => { expect(Math.abs(afterUser.stats.exp - beforeUser.stats.exp)).to.be.lessThan(EPSILON); expect(Math.abs(afterUser.stats.gp - beforeUser.stats.gp)).to.be.lessThan(EPSILON); expect(Math.abs(task.value - beforeTask.value)).to.be.lessThan(EPSILON); }; function expectRoughlyEqualDates (date1, date2) { - date1 = date1.valueOf(); - date2 = date2.valueOf(); + date1 = date1.valueOf(); // eslint-disable-line no-param-reassign + date2 = date2.valueOf(); // eslint-disable-line no-param-reassign expect(date1).to.be.within(date2 - 100, date2 + 100); } @@ -54,8 +54,8 @@ describe('shared.ops.scoreTask', () => { ref = beforeAfter(); }); - it('throws an error when scoring a reward if user does not have enough gold', (done) => { - let reward = generateReward({ userId: ref.afterUser._id, text: 'some reward', value: 100 }); + it('throws an error when scoring a reward if user does not have enough gold', done => { + const reward = generateReward({ userId: ref.afterUser._id, text: 'some reward', value: 100 }); try { scoreTask({ user: ref.afterUser, task: reward }); } catch (err) { @@ -66,14 +66,14 @@ describe('shared.ops.scoreTask', () => { }); it('completes when the task direction is up', () => { - let task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false }); + const task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false }); scoreTask({ user: ref.afterUser, task, direction: 'up' }); expect(task.completed).to.eql(true); expectRoughlyEqualDates(task.dateCompleted, new Date()); }); it('uncompletes when the task direction is down', () => { - let task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false }); + const task = generateTodo({ userId: ref.afterUser._id, text: 'todo to complete', cron: false }); scoreTask({ user: ref.afterUser, task, direction: 'down' }); expect(task.completed).to.eql(false); expect(task.dateCompleted).to.not.exist; @@ -88,19 +88,23 @@ describe('shared.ops.scoreTask', () => { }); it('works', () => { - let delta1, delta2, delta3; - - delta1 = scoreTask({ user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false }); + const delta1 = scoreTask({ + user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false, + }); ref = beforeAfter(); habit = generateHabit({ userId: ref.afterUser._id, text: 'some habit' }); - delta2 = scoreTask({ user: ref.afterUser, task: habit, direction: 'up', times: 4, cron: false }); + const delta2 = scoreTask({ + user: ref.afterUser, task: habit, direction: 'up', times: 4, cron: false, + }); ref = beforeAfter(); habit = generateHabit({ userId: ref.afterUser._id, text: 'some habit' }); - delta3 = scoreTask({ user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false }); + const delta3 = scoreTask({ + user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false, + }); expect(Math.abs(delta1 - delta2)).to.be.greaterThan(EPSILON); expect(Math.abs(delta1 - delta3)).to.be.lessThan(EPSILON); @@ -108,58 +112,62 @@ describe('shared.ops.scoreTask', () => { }); it('checks that the streak parameters affects the score', () => { - let task = generateDaily({ userId: ref.afterUser._id, text: 'task to check streak' }); - scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); - scoreTask({ user: ref.afterUser, task, direction: 'up', cron: false }); + const task = generateDaily({ userId: ref.afterUser._id, text: 'task to check streak' }); + scoreTask({ + user: ref.afterUser, task, direction: 'up', cron: false, + }); + scoreTask({ + user: ref.afterUser, task, direction: 'up', cron: false, + }); expect(task.streak).to.eql(2); }); describe('verifies that 21-day streak achievements are given/removed correctly', () => { - let initialStreakCount = 20; // 1 before the streak achievement is awarded + const initialStreakCount = 20; // 1 before the streak achievement is awarded beforeEach(() => { ref = beforeAfter(); }); it('awards the first streak achievement', () => { - let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); + const task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task, direction: 'up' }); expect(ref.afterUser.achievements.streak).to.equal(1); }); it('increments the streak achievement for a second streak', () => { - let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + const task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); - let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); + const task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task: task2, direction: 'up' }); expect(ref.afterUser.achievements.streak).to.equal(2); }); it('removes the first streak achievement when unticking a Daily', () => { - let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); + const task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task, direction: 'up' }); scoreTask({ user: ref.afterUser, task, direction: 'down' }); expect(ref.afterUser.achievements.streak).to.equal(0); }); it('decrements a multiple streak achievement when unticking a Daily', () => { - let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + const task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); - let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); + const task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task: task2, direction: 'up' }); scoreTask({ user: ref.afterUser, task: task2, direction: 'down' }); expect(ref.afterUser.achievements.streak).to.equal(1); }); it('does not give a streak achievement for a streak of zero', () => { - let task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: -1 }); + const task = generateDaily({ userId: ref.afterUser._id, text: 'some daily', streak: -1 }); scoreTask({ user: ref.afterUser, task, direction: 'up' }); expect(ref.afterUser.achievements.streak).to.equal(0); }); it('does not remove a streak achievement when unticking a Daily gives a streak of zero', () => { - let task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); + const task1 = generateDaily({ userId: ref.afterUser._id, text: 'first daily', streak: initialStreakCount }); scoreTask({ user: ref.afterUser, task: task1, direction: 'up' }); - let task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: 1 }); + const task2 = generateDaily({ userId: ref.afterUser._id, text: 'second daily', streak: 1 }); scoreTask({ user: ref.afterUser, task: task2, direction: 'down' }); expect(ref.afterUser.achievements.streak).to.equal(1); }); @@ -168,8 +176,10 @@ describe('shared.ops.scoreTask', () => { describe('scores', () => { let options = {}; let habit; - let freshDaily, daily; - let freshTodo, todo; + let freshDaily; let + daily; + let freshTodo; let + todo; beforeEach(() => { ref = beforeAfter(options); @@ -190,21 +200,25 @@ describe('shared.ops.scoreTask', () => { }); it('critical hits', () => { - let normalUser = ref.beforeUser; + const normalUser = ref.beforeUser; expect(normalUser.party.quest.progress.up).to.eql(0); normalUser.party.quest.key = 'gryphon'; - let critUser = ref.afterUser; + const critUser = ref.afterUser; expect(critUser.party.quest.progress.up).to.eql(0); critUser.party.quest.key = 'gryphon'; - let normalTask = todo; - let critTask = freshTodo; + const normalTask = todo; + const critTask = freshTodo; - scoreTask({ user: normalUser, task: normalTask, direction: 'up', cron: false }); - let normalTaskDelta = normalUser.party.quest.progress.up; + scoreTask({ + user: normalUser, task: normalTask, direction: 'up', cron: false, + }); + const normalTaskDelta = normalUser.party.quest.progress.up; sandbox.stub(crit, 'crit').returns(1.5); - scoreTask({ user: critUser, task: critTask, direction: 'up', cron: false }); - let critTaskDelta = critUser.party.quest.progress.up; + scoreTask({ + user: critUser, task: critTask, direction: 'up', cron: false, + }); + const critTaskDelta = critUser.party.quest.progress.up; crit.crit.restore(); expect(critUser.stats.hp).to.eql(normalUser.stats.hp); @@ -219,20 +233,26 @@ describe('shared.ops.scoreTask', () => { expect(ref.afterUser.party.quest.progress.up).to.eql(0); ref.afterUser.party.quest.key = 'gryphon'; - scoreTask({ user: ref.afterUser, task: habit, direction: 'up', cron: false }); - let firstTaskDelta = ref.afterUser.party.quest.progress.up; + scoreTask({ + user: ref.afterUser, task: habit, direction: 'up', cron: false, + }); + const firstTaskDelta = ref.afterUser.party.quest.progress.up; expect(firstTaskDelta).to.be.greaterThan(0); expect(ref.afterUser._tmp.quest.progressDelta).to.eql(firstTaskDelta); - scoreTask({ user: ref.afterUser, task: habit, direction: 'up', cron: false }); - let secondTaskDelta = ref.afterUser.party.quest.progress.up - firstTaskDelta; + scoreTask({ + user: ref.afterUser, task: habit, direction: 'up', cron: false, + }); + const secondTaskDelta = ref.afterUser.party.quest.progress.up - firstTaskDelta; expect(secondTaskDelta).to.be.greaterThan(0); expect(ref.afterUser._tmp.quest.progressDelta).to.eql(secondTaskDelta); }); it('does not modify stats when task need approval', () => { todo.group.approval.required = true; - options = { user: ref.afterUser, task: todo, direction: 'up', times: 5, cron: false }; + options = { + user: ref.afterUser, task: todo, direction: 'up', times: 5, cron: false, + }; scoreTask(options); expect(ref.afterUser.stats.hp).to.eql(50); @@ -242,7 +262,9 @@ describe('shared.ops.scoreTask', () => { context('habits', () => { it('up', () => { - options = { user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false }; + options = { + user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false, + }; scoreTask(options); expect(habit.history.length).to.eql(1); @@ -256,16 +278,20 @@ describe('shared.ops.scoreTask', () => { // not supported anymore it('does not add score notes to task', () => { - let scoreNotesString = 'scoreNotes'; + const scoreNotesString = 'scoreNotes'; habit.scoreNotes = scoreNotesString; - options = { user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false }; + options = { + user: ref.afterUser, task: habit, direction: 'up', times: 5, cron: false, + }; scoreTask(options); expect(habit.history[0].scoreNotes).to.eql(undefined); }); it('down', () => { - scoreTask({user: ref.afterUser, task: habit, direction: 'down', times: 5, cron: false}, {}); + scoreTask({ + user: ref.afterUser, task: habit, direction: 'down', times: 5, cron: false, + }, {}); expect(habit.history.length).to.eql(1); expect(habit.value).to.be.lessThan(0); @@ -280,16 +306,16 @@ describe('shared.ops.scoreTask', () => { context('dailys', () => { it('up', () => { expect(daily.completed).to.not.eql(true); - scoreTask({user: ref.afterUser, task: daily, direction: 'up'}); + scoreTask({ user: ref.afterUser, task: daily, direction: 'up' }); expectGainedPoints(ref.beforeUser, ref.afterUser, freshDaily, daily); expect(daily.completed).to.eql(true); expect(daily.history.length).to.eql(1); }); it('up, down', () => { - scoreTask({user: ref.afterUser, task: daily, direction: 'up'}); + scoreTask({ user: ref.afterUser, task: daily, direction: 'up' }); expect(daily.history.length).to.eql(1); - scoreTask({user: ref.afterUser, task: daily, direction: 'down'}); + scoreTask({ user: ref.afterUser, task: daily, direction: 'down' }); expect(daily.history.length).to.eql(0); expectClosePoints(ref.beforeUser, ref.afterUser, freshDaily, daily); }); @@ -297,20 +323,20 @@ describe('shared.ops.scoreTask', () => { it('sets completed = false on direction = down', () => { daily.completed = true; expect(daily.completed).to.not.eql(false); - scoreTask({user: ref.afterUser, task: daily, direction: 'down'}); + scoreTask({ user: ref.afterUser, task: daily, direction: 'down' }); expect(daily.completed).to.eql(false); }); }); context('todos', () => { it('up', () => { - scoreTask({user: ref.afterUser, task: todo, direction: 'up'}); + scoreTask({ user: ref.afterUser, task: todo, direction: 'up' }); expectGainedPoints(ref.beforeUser, ref.afterUser, freshTodo, todo); }); it('up, down', () => { - scoreTask({user: ref.afterUser, task: todo, direction: 'up'}); - scoreTask({user: ref.afterUser, task: todo, direction: 'down'}); + scoreTask({ user: ref.afterUser, task: todo, direction: 'up' }); + scoreTask({ user: ref.afterUser, task: todo, direction: 'down' }); expectClosePoints(ref.beforeUser, ref.afterUser, freshTodo, todo); }); }); diff --git a/test/common/ops/sell.js b/test/common/ops/sell.js index 2f1d9b86d1..fbba69dd48 100644 --- a/test/common/ops/sell.js +++ b/test/common/ops/sell.js @@ -12,16 +12,16 @@ import content from '../../../website/common/script/content/index'; describe('shared.ops.sell', () => { let user; - let type = 'eggs'; - let key = 'Wolf'; - let acceptedTypes = ['eggs', 'hatchingPotions', 'food']; + const type = 'eggs'; + const key = 'Wolf'; + const acceptedTypes = ['eggs', 'hatchingPotions', 'food']; beforeEach(() => { user = generateUser(); user.items[type][key] = 1; }); - it('returns an error when type is not provided', (done) => { + it('returns an error when type is not provided', done => { try { sell(user); } catch (err) { @@ -31,9 +31,9 @@ describe('shared.ops.sell', () => { } }); - it('returns an error when key is not provided', (done) => { + it('returns an error when key is not provided', done => { try { - sell(user, {params: { type } }); + sell(user, { params: { type } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); expect(err.message).to.equal(i18n.t('missingKeyParam')); @@ -41,56 +41,56 @@ describe('shared.ops.sell', () => { } }); - it('returns an error when non-sellable type is provided', (done) => { - let nonSellableType = 'nonSellableType'; + it('returns an error when non-sellable type is provided', done => { + const nonSellableType = 'nonSellableType'; try { - sell(user, {params: { type: nonSellableType, key } }); + sell(user, { params: { type: nonSellableType, key } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('typeNotSellable', {acceptedTypes: acceptedTypes.join(', ')})); + expect(err.message).to.equal(i18n.t('typeNotSellable', { acceptedTypes: acceptedTypes.join(', ') })); done(); } }); - it('returns an error when key is not found with type provided', (done) => { - let fakeKey = 'fakeKey'; + it('returns an error when key is not found with type provided', done => { + const fakeKey = 'fakeKey'; try { - sell(user, {params: { type, key: fakeKey } }); + sell(user, { params: { type, key: fakeKey } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); - expect(err.message).to.equal(i18n.t('userItemsKeyNotFound', {type})); + expect(err.message).to.equal(i18n.t('userItemsKeyNotFound', { type })); done(); } }); - it('returns an error when the requested amount is above the available amount', (done) => { + it('returns an error when the requested amount is above the available amount', done => { try { - sell(user, {params: { type, key }, query: {amount: 2} }); + sell(user, { params: { type, key }, query: { amount: 2 } }); } catch (err) { expect(err).to.be.an.instanceof(NotFound); - expect(err.message).to.equal(i18n.t('userItemsNotEnough', {type})); + expect(err.message).to.equal(i18n.t('userItemsNotEnough', { type })); done(); } }); - it('returns an error when the requested amount is negative', (done) => { + it('returns an error when the requested amount is negative', done => { try { - sell(user, {params: { type, key }, query: {amount: -42} }); + sell(user, { params: { type, key }, query: { amount: -42 } }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); - expect(err.message).to.equal(i18n.t('positiveAmountRequired', {type})); + expect(err.message).to.equal(i18n.t('positiveAmountRequired', { type })); done(); } }); - it('returns error when trying to sell Saddle', (done) => { + it('returns error when trying to sell Saddle', done => { const foodType = 'food'; const saddleKey = 'Saddle'; user.items[foodType][saddleKey] = 1; try { - sell(user, {params: {type: foodType, key: saddleKey}}); + sell(user, { params: { type: foodType, key: saddleKey } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('foodSaddleSellWarningNote')); @@ -99,13 +99,13 @@ describe('shared.ops.sell', () => { }); it('reduces item count from user', () => { - sell(user, {params: { type, key } }); + sell(user, { params: { type, key } }); expect(user.items[type][key]).to.equal(0); }); it('increases user\'s gold', () => { - sell(user, {params: { type, key } }); + sell(user, { params: { type, key } }); expect(user.stats.gp).to.equal(content[type][key].value); }); diff --git a/test/common/ops/sleep.js b/test/common/ops/sleep.js index 0a0ef835f7..9926a6ea4e 100644 --- a/test/common/ops/sleep.js +++ b/test/common/ops/sleep.js @@ -5,13 +5,13 @@ import { describe('shared.ops.sleep', () => { it('toggles user.preferences.sleep', () => { - let user = generateUser(); + const user = generateUser(); - let [res] = sleep(user); + const [res] = sleep(user); expect(res).to.eql(true); expect(user.preferences.sleep).to.equal(true); - let [res2] = sleep(user); + const [res2] = sleep(user); expect(res2).to.eql(false); expect(user.preferences.sleep).to.equal(false); }); diff --git a/test/common/ops/spells.js b/test/common/ops/spells.js index 58d3965a7f..939b7caab5 100644 --- a/test/common/ops/spells.js +++ b/test/common/ops/spells.js @@ -16,13 +16,13 @@ describe('shared.ops.spells', () => { user = generateUser(); }); - it('returns an error when healer tries to cast Healing Light with full health', (done) => { + it('returns an error when healer tries to cast Healing Light with full health', done => { user.stats.class = 'healer'; user.stats.lvl = 11; user.stats.hp = 50; user.stats.mp = 200; - let spell = spells.healer.heal; + const spell = spells.healer.heal; try { spell.cast(user); @@ -35,4 +35,4 @@ describe('shared.ops.spells', () => { done(); } }); -}); \ No newline at end of file +}); diff --git a/test/common/ops/stats/allocate.js b/test/common/ops/stats/allocate.js index 62e162f55a..568b0500ce 100644 --- a/test/common/ops/stats/allocate.js +++ b/test/common/ops/stats/allocate.js @@ -20,19 +20,19 @@ describe('shared.ops.allocate', () => { }); }); - it('throws an error if an invalid attribute is supplied', (done) => { + it('throws an error if an invalid attribute is supplied', done => { try { allocate(user, { - query: {stat: 'notValid'}, + query: { stat: 'notValid' }, }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); - expect(err.message).to.equal(errorMessage('invalidAttribute', {attr: 'notValid'})); + expect(err.message).to.equal(errorMessage('invalidAttribute', { attr: 'notValid' })); done(); } }); - it('throws an error if the user is below lvl 10', (done) => { + it('throws an error if the user is below lvl 10', done => { user.stats.lvl = 9; try { allocate(user); @@ -43,7 +43,7 @@ describe('shared.ops.allocate', () => { } }); - it('throws an error if the user hasn\'t selected class', (done) => { + it('throws an error if the user hasn\'t selected class', done => { user.flags.classSelected = false; try { allocate(user); @@ -54,7 +54,7 @@ describe('shared.ops.allocate', () => { } }); - it('throws an error if the user has disabled classes', (done) => { + it('throws an error if the user has disabled classes', done => { user.preferences.disableClasses = true; try { allocate(user); @@ -65,7 +65,7 @@ describe('shared.ops.allocate', () => { } }); - it('throws an error if the user doesn\'t have attribute points', (done) => { + it('throws an error if the user doesn\'t have attribute points', done => { try { allocate(user); } catch (err) { @@ -85,7 +85,7 @@ describe('shared.ops.allocate', () => { it('allocates attribute points', () => { expect(user.stats.con).to.equal(0); user.stats.points = 1; - allocate(user, {query: {stat: 'con'}}); + allocate(user, { query: { stat: 'con' } }); expect(user.stats.con).to.equal(1); expect(user.stats.points).to.equal(0); }); @@ -94,7 +94,7 @@ describe('shared.ops.allocate', () => { expect(user.stats.int).to.equal(0); expect(user.stats.mp).to.equal(10); user.stats.points = 1; - allocate(user, {query: {stat: 'int'}}); + allocate(user, { query: { stat: 'int' } }); expect(user.stats.int).to.equal(1); expect(user.stats.mp).to.equal(11); }); diff --git a/test/common/ops/stats/allocateBulk.js b/test/common/ops/stats/allocateBulk.js index 1a46c82214..7a81d37ce1 100644 --- a/test/common/ops/stats/allocateBulk.js +++ b/test/common/ops/stats/allocateBulk.js @@ -20,7 +20,7 @@ describe('shared.ops.allocateBulk', () => { }); }); - it('throws an error if an invalid attribute is supplied', (done) => { + it('throws an error if an invalid attribute is supplied', done => { try { allocateBulk(user, { body: { @@ -32,12 +32,12 @@ describe('shared.ops.allocateBulk', () => { }); } catch (err) { expect(err).to.be.an.instanceof(BadRequest); - expect(err.message).to.equal(errorMessage('invalidAttribute', {attr: 'invalid'})); + expect(err.message).to.equal(errorMessage('invalidAttribute', { attr: 'invalid' })); done(); } }); - it('throws an error if the stats are not supplied', (done) => { + it('throws an error if the stats are not supplied', done => { try { allocateBulk(user); } catch (err) { @@ -47,7 +47,7 @@ describe('shared.ops.allocateBulk', () => { } }); - it('throws an error if the user is below lvl 10', (done) => { + it('throws an error if the user is below lvl 10', done => { user.stats.lvl = 9; try { allocateBulk(user, { @@ -65,7 +65,7 @@ describe('shared.ops.allocateBulk', () => { } }); - it('throws an error if the user hasn\'t selected class', (done) => { + it('throws an error if the user hasn\'t selected class', done => { user.flags.classSelected = false; try { allocateBulk(user, { @@ -83,7 +83,7 @@ describe('shared.ops.allocateBulk', () => { } }); - it('throws an error if the user has disabled classes', (done) => { + it('throws an error if the user has disabled classes', done => { user.preferences.disableClasses = true; try { allocateBulk(user, { @@ -101,7 +101,7 @@ describe('shared.ops.allocateBulk', () => { } }); - it('throws an error if the user doesn\'t have attribute points', (done) => { + it('throws an error if the user doesn\'t have attribute points', done => { try { allocateBulk(user, { body: { @@ -118,7 +118,7 @@ describe('shared.ops.allocateBulk', () => { } }); - it('throws an error if the user doesn\'t have enough attribute points', (done) => { + it('throws an error if the user doesn\'t have enough attribute points', done => { user.stats.points = 1; try { allocateBulk(user, { diff --git a/test/common/ops/stats/allocateNow.js b/test/common/ops/stats/allocateNow.js index d9f1baacb3..746646120e 100644 --- a/test/common/ops/stats/allocateNow.js +++ b/test/common/ops/stats/allocateNow.js @@ -18,7 +18,7 @@ describe('shared.ops.allocateNow', () => { user.stats.str = 9; user.preferences.allocationMode = 'flat'; - let [data] = allocateNow(user); + const [data] = allocateNow(user); expect(user.stats.points).to.equal(0); expect(user.stats.con).to.equal(9); diff --git a/test/common/ops/unlock.js b/test/common/ops/unlock.js index 0ea3cb9b8c..5087534b48 100644 --- a/test/common/ops/unlock.js +++ b/test/common/ops/unlock.js @@ -10,18 +10,18 @@ import { describe('shared.ops.unlock', () => { let user; - let unlockPath = 'shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie'; - let unlockGearSetPath = 'items.gear.owned.headAccessory_special_bearEars,items.gear.owned.headAccessory_special_cactusEars,items.gear.owned.headAccessory_special_foxEars,items.gear.owned.headAccessory_special_lionEars,items.gear.owned.headAccessory_special_pandaEars,items.gear.owned.headAccessory_special_pigEars,items.gear.owned.headAccessory_special_tigerEars,items.gear.owned.headAccessory_special_wolfEars'; - let backgroundUnlockPath = 'background.giant_florals'; - let unlockCost = 1.25; - let usersStartingGems = 5; + const unlockPath = 'shirt.convict,shirt.cross,shirt.fire,shirt.horizon,shirt.ocean,shirt.purple,shirt.rainbow,shirt.redblue,shirt.thunder,shirt.tropical,shirt.zombie'; + const unlockGearSetPath = 'items.gear.owned.headAccessory_special_bearEars,items.gear.owned.headAccessory_special_cactusEars,items.gear.owned.headAccessory_special_foxEars,items.gear.owned.headAccessory_special_lionEars,items.gear.owned.headAccessory_special_pandaEars,items.gear.owned.headAccessory_special_pigEars,items.gear.owned.headAccessory_special_tigerEars,items.gear.owned.headAccessory_special_wolfEars'; + const backgroundUnlockPath = 'background.giant_florals'; + const unlockCost = 1.25; + const usersStartingGems = 5; beforeEach(() => { user = generateUser(); user.balance = usersStartingGems; }); - it('returns an error when path is not provided', (done) => { + it('returns an error when path is not provided', done => { try { unlock(user); } catch (err) { @@ -31,11 +31,11 @@ describe('shared.ops.unlock', () => { } }); - it('returns an error when user balance is too low', (done) => { + it('returns an error when user balance is too low', done => { user.balance = 0; try { - unlock(user, {query: {path: unlockPath}}); + unlock(user, { query: { path: unlockPath } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('notEnoughGems')); @@ -43,10 +43,10 @@ describe('shared.ops.unlock', () => { } }); - it('returns an error when user already owns a full set', (done) => { + it('returns an error when user already owns a full set', done => { try { - unlock(user, {query: {path: unlockPath}}); - unlock(user, {query: {path: unlockPath}}); + unlock(user, { query: { path: unlockPath } }); + unlock(user, { query: { path: unlockPath } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('alreadyUnlocked')); @@ -55,10 +55,10 @@ describe('shared.ops.unlock', () => { }); // disabled untill fully implemente - xit('returns an error when user already owns items in a full set', (done) => { + xit('returns an error when user already owns items in a full set', done => { try { - unlock(user, {query: {path: unlockPath}}); - unlock(user, {query: {path: unlockPath}}); + unlock(user, { query: { path: unlockPath } }); + unlock(user, { query: { path: unlockPath } }); } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.equal(i18n.t('alreadyUnlocked')); @@ -69,9 +69,9 @@ describe('shared.ops.unlock', () => { it('equips an item already owned', () => { expect(user.purchased.background.giant_florals).to.not.exist; - unlock(user, {query: {path: backgroundUnlockPath}}); - let afterBalance = user.balance; - let response = unlock(user, {query: {path: backgroundUnlockPath}}); + unlock(user, { query: { path: backgroundUnlockPath } }); + const afterBalance = user.balance; + const response = unlock(user, { query: { path: backgroundUnlockPath } }); expect(user.balance).to.equal(afterBalance); // do not bill twice expect(response.message).to.not.exist; @@ -81,10 +81,10 @@ describe('shared.ops.unlock', () => { it('un-equips an item already equipped', () => { expect(user.purchased.background.giant_florals).to.not.exist; - unlock(user, {query: {path: backgroundUnlockPath}}); // unlock - let afterBalance = user.balance; - unlock(user, {query: {path: backgroundUnlockPath}}); // equip - let response = unlock(user, {query: {path: backgroundUnlockPath}}); + unlock(user, { query: { path: backgroundUnlockPath } }); // unlock + const afterBalance = user.balance; + unlock(user, { query: { path: backgroundUnlockPath } }); // equip + const response = unlock(user, { query: { path: backgroundUnlockPath } }); expect(user.balance).to.equal(afterBalance); // do not bill twice expect(response.message).to.not.exist; @@ -92,28 +92,28 @@ describe('shared.ops.unlock', () => { }); it('unlocks a full set', () => { - let [, message] = unlock(user, {query: {path: unlockPath}}); + const [, message] = unlock(user, { query: { path: unlockPath } }); expect(message).to.equal(i18n.t('unlocked')); expect(user.purchased.shirt.convict).to.be.true; }); it('unlocks a full set of gear', () => { - let [, message] = unlock(user, {query: {path: unlockGearSetPath}}); + const [, message] = unlock(user, { query: { path: unlockGearSetPath } }); expect(message).to.equal(i18n.t('unlocked')); expect(user.items.gear.owned.headAccessory_special_wolfEars).to.be.true; }); it('unlocks a an item', () => { - let [, message] = unlock(user, {query: {path: backgroundUnlockPath}}); + const [, message] = unlock(user, { query: { path: backgroundUnlockPath } }); expect(message).to.equal(i18n.t('unlocked')); expect(user.purchased.background.giant_florals).to.be.true; }); it('reduces a user\'s balance', () => { - let [, message] = unlock(user, {query: {path: unlockPath}}); + const [, message] = unlock(user, { query: { path: unlockPath } }); expect(message).to.equal(i18n.t('unlocked')); expect(user.balance).to.equal(usersStartingGems - unlockCost); diff --git a/test/common/ops/updateTask.js b/test/common/ops/updateTask.js index e9aa88f550..c1fbc7c8e2 100644 --- a/test/common/ops/updateTask.js +++ b/test/common/ops/updateTask.js @@ -5,8 +5,8 @@ import { describe('shared.ops.updateTask', () => { it('updates a task', () => { - let now = new Date(); - let habit = generateHabit({ + const now = new Date(); + const habit = generateHabit({ tags: [ '123', '456', @@ -19,7 +19,7 @@ describe('shared.ops.updateTask', () => { }], }); - let [res] = updateTask(habit, { + const [res] = updateTask(habit, { body: { text: 'updated', id: '123', diff --git a/test/common/shouldDo.test.js b/test/common/shouldDo.test.js index dedcaa4951..f7505d20f3 100644 --- a/test/common/shouldDo.test.js +++ b/test/common/shouldDo.test.js @@ -1,9 +1,10 @@ -import { shouldDo, DAY_MAPPING } from '../../website/common/script/cron'; import moment from 'moment'; +import { shouldDo, DAY_MAPPING } from '../../website/common/script/cron'; import 'moment-recur'; describe('shouldDo', () => { - let day, dailyTask; + let day; let + dailyTask; let options = {}; let nextDue = []; @@ -29,9 +30,9 @@ describe('shouldDo', () => { }); it('returns false if task type is not a daily', () => { - expect(shouldDo(day, {type: 'todo'})).to.equal(false); - expect(shouldDo(day, {type: 'habit'})).to.equal(false); - expect(shouldDo(day, {type: 'reward'})).to.equal(false); + expect(shouldDo(day, { type: 'todo' })).to.equal(false); + expect(shouldDo(day, { type: 'habit' })).to.equal(false); + expect(shouldDo(day, { type: 'reward' })).to.equal(false); }); it('returns false if startDate is in the future', () => { @@ -51,12 +52,12 @@ describe('shouldDo', () => { expect(shouldDo(day, dailyTask, options)).to.equal(true); }); - it('returns true if Start Date is today', () => { + it('returns true if Start Date is today', () => { dailyTask.startDate = moment().toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(true); }); - it('returns false if Start Date is after today', () => { + it('returns false if Start Date is after today', () => { dailyTask.startDate = moment().add(1, 'days').toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(false); }); @@ -79,14 +80,16 @@ describe('shouldDo', () => { it('returns true if the user\'s current time is after start date and Custom Day Start', () => { options.dayStart = 4; - day = moment().zone(options.timezoneOffset).startOf('day').add(6, 'hours').toDate(); + day = moment().zone(options.timezoneOffset).startOf('day').add(6, 'hours') + .toDate(); dailyTask.startDate = moment().zone(options.timezoneOffset).startOf('day').toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(true); }); it('returns false if the user\'s current time is before Custom Day Start', () => { options.dayStart = 8; - day = moment().zone(options.timezoneOffset).startOf('day').add(2, 'hours').toDate(); + day = moment().zone(options.timezoneOffset).startOf('day').add(2, 'hours') + .toDate(); dailyTask.startDate = moment().zone(options.timezoneOffset).startOf('day').toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(false); }); @@ -102,20 +105,22 @@ describe('shouldDo', () => { expect(shouldDo(day, dailyTask, options)).to.equal(true); }); - it('returns true if Start Date is today', () => { + it('returns true if Start Date is today', () => { dailyTask.startDate = moment().startOf('day').toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(true); }); it('returns true if the user\'s current time is after Custom Day Start', () => { options.dayStart = 4; - day = moment().zone(options.timezoneOffset).startOf('day').add(6, 'hours').toDate(); + day = moment().zone(options.timezoneOffset).startOf('day').add(6, 'hours') + .toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(true); }); it('returns false if the user\'s current time is before Custom Day Start', () => { options.dayStart = 8; - day = moment().zone(options.timezoneOffset).startOf('day').add(2, 'hours').toDate(); + day = moment().zone(options.timezoneOffset).startOf('day').add(2, 'hours') + .toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(false); }); }); @@ -335,11 +340,11 @@ describe('shouldDo', () => { m: false, }; - for (let weekday of [0, 1, 2, 3, 4, 5, 6]) { + [0, 1, 2, 3, 4, 5, 6].forEach(weekday => { day = moment().day(weekday).toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(false); - } + }); }); it('returns false and ignore malformed repeat object', () => { @@ -354,11 +359,11 @@ describe('shouldDo', () => { errors: 'errors', }; - for (let weekday of [0, 1, 2, 3, 4, 5, 6]) { + [0, 1, 2, 3, 4, 5, 6].forEach(weekday => { day = moment().day(weekday).toDate(); expect(shouldDo(day, dailyTask, options)).to.equal(false); - } + }); }); it('returns false if day of the week does not match and active on the day it matches', () => { @@ -372,7 +377,8 @@ describe('shouldDo', () => { m: false, }; - for (let weekday of [0, 1, 2, 3, 4, 5, 6]) { + + [0, 1, 2, 3, 4, 5, 6].forEach(weekday => { day = moment().add(1, 'weeks').day(weekday).toDate(); if (weekday === 4) { @@ -380,7 +386,7 @@ describe('shouldDo', () => { } else { expect(shouldDo(day, dailyTask, options)).to.equal(false); } - } + }); }); it('returns true if Daily on matching days of the week', () => { @@ -599,7 +605,7 @@ describe('shouldDo', () => { day = moment(); dailyTask.repeat[DAY_MAPPING[day.day()]] = true; dailyTask.everyX = 3; - let tomorrow = day.add(2, 'weeks').day(day.day()).toDate(); + const tomorrow = day.add(2, 'weeks').day(day.day()).toDate(); expect(shouldDo(tomorrow, dailyTask, options)).to.equal(false); }); @@ -618,14 +624,14 @@ describe('shouldDo', () => { day = moment(); dailyTask.repeat[DAY_MAPPING[day.day()]] = true; dailyTask.everyX = 3; - let threeWeeksFromTodayPlusOne = day.add(1, 'day').add(3, 'weeks').toDate(); + const threeWeeksFromTodayPlusOne = day.add(1, 'day').add(3, 'weeks').toDate(); expect(shouldDo(threeWeeksFromTodayPlusOne, dailyTask, options)).to.equal(false); }); it('activates Daily on matching week', () => { dailyTask.everyX = 3; - let threeWeeksFromToday = moment().add(3, 'weeks').toDate(); + const threeWeeksFromToday = moment().add(3, 'weeks').toDate(); expect(shouldDo(threeWeeksFromToday, dailyTask, options)).to.equal(true); }); @@ -733,9 +739,9 @@ describe('shouldDo', () => { it('leaves daily inactive if not day of the month', () => { dailyTask.everyX = 1; dailyTask.frequency = 'monthly'; - let today = moment(); + const today = moment(); dailyTask.daysOfMonth = [today.date()]; - let tomorrow = today.add(1, 'day').toDate(); + const tomorrow = today.add(1, 'day').toDate(); expect(shouldDo(tomorrow, dailyTask, options)).to.equal(false); }); @@ -753,9 +759,9 @@ describe('shouldDo', () => { it('leaves daily inactive if not on date of the x month', () => { dailyTask.everyX = 2; dailyTask.frequency = 'monthly'; - let today = moment(); + const today = moment(); dailyTask.daysOfMonth = [today.date()]; - let tomorrow = today.add(2, 'months').add(1, 'day').toDate(); + const tomorrow = today.add(2, 'months').add(1, 'day').toDate(); expect(shouldDo(tomorrow, dailyTask, options)).to.equal(false); }); @@ -920,9 +926,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-27'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-27'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; @@ -944,8 +950,8 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-05-27T17:34:40.000Z'); - let week = today.monthWeek(); + const today = moment('2017-05-27T17:34:40.000Z'); + const week = today.monthWeek(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.everyX = 1; @@ -966,9 +972,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-27:00:00.000-00:00'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-27:00:00.000-00:00'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; @@ -990,9 +996,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-26:00:00.000-00:00'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-26:00:00.000-00:00'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; @@ -1015,9 +1021,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-27:00:00.000-00:00'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-27:00:00.000-00:00'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; @@ -1040,9 +1046,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-27:00:00.000-00:00'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-27:00:00.000-00:00'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; @@ -1066,9 +1072,9 @@ describe('shouldDo', () => { m: false, }; - let today = moment('2017-01-27'); - let week = today.monthWeek(); - let dayOfWeek = today.day(); + const today = moment('2017-01-27'); + const week = today.monthWeek(); + const dayOfWeek = today.day(); dailyTask.startDate = today.toDate(); dailyTask.weeksOfMonth = [week]; dailyTask.repeat[DAY_MAPPING[dayOfWeek]] = true; diff --git a/test/common/statHelpers.test.js b/test/common/statHelpers.test.js index 7db2c6494f..0e8ee24a03 100644 --- a/test/common/statHelpers.test.js +++ b/test/common/statHelpers.test.js @@ -1,10 +1,12 @@ -import { +import api from '../../website/common/script/index'; + +const { maxHealth, maxLevel, capByLevel, tnl, diminishingReturns, -} from '../../website/common/script/index'; +} = api; describe('helper functions used in stat calculations', () => { describe('maxHealth', () => { @@ -40,7 +42,7 @@ describe('helper functions used in stat calculations', () => { describe('toNextLevel', () => { it('increases Experience target from one level to the next', () => { - _.times(110, (level) => { + _.times(110, level => { expect(tnl(level + 1)).to.be.greaterThan(tnl(level)); }); }); @@ -60,7 +62,8 @@ describe('helper functions used in stat calculations', () => { }); it('provides a different curve if a halfway point is defined', () => { - expect(diminishingReturns(BONUS, MAXIMUM, HALFWAY)).to.not.eql(diminishingReturns(BONUS, MAXIMUM)); + expect(diminishingReturns(BONUS, MAXIMUM, HALFWAY)) + .to.not.eql(diminishingReturns(BONUS, MAXIMUM)); }); }); }); diff --git a/test/common/test_helper.js b/test/common/test_helper.js index 7b9ba2beff..c04e76f478 100644 --- a/test/common/test_helper.js +++ b/test/common/test_helper.js @@ -1,59 +1,27 @@ -/* eslint-disable prefer-template, no-shadow, func-names */ +/* eslint-disable prefer-template, no-shadow, func-names, import/no-commonjs */ -let expect = require('expect.js'); +const expect = require('expect.js'); module.exports.addCustomMatchers = function () { - let Assertion; - - Assertion = expect.Assertion; + const { Assertion } = expect; Assertion.prototype.toHaveGP = function (gp) { - let actual; - - actual = this.obj.stats.gp; - return this.assert(actual === gp, () => { - return 'expected user to have ' + gp + ' gp, but got ' + actual; - }, () => { - return 'expected user to not have ' + gp + ' gp'; - }); + const actual = this.obj.stats.gp; + return this.assert(actual === gp, () => 'expected user to have ' + gp + ' gp, but got ' + actual, () => 'expected user to not have ' + gp + ' gp'); }; Assertion.prototype.toHaveHP = function (hp) { - let actual; - - actual = this.obj.stats.hp; - return this.assert(actual === hp, () => { - return 'expected user to have ' + hp + ' hp, but got ' + actual; - }, () => { - return 'expected user to not have ' + hp + ' hp'; - }); + const actual = this.obj.stats.hp; + return this.assert(actual === hp, () => 'expected user to have ' + hp + ' hp, but got ' + actual, () => 'expected user to not have ' + hp + ' hp'); }; Assertion.prototype.toHaveExp = function (exp) { - let actual; - - actual = this.obj.stats.exp; - return this.assert(actual === exp, () => { - return 'expected user to have ' + exp + ' experience points, but got ' + actual; - }, () => { - return 'expected user to not have ' + exp + ' experience points'; - }); + const actual = this.obj.stats.exp; + return this.assert(actual === exp, () => 'expected user to have ' + exp + ' experience points, but got ' + actual, () => 'expected user to not have ' + exp + ' experience points'); }; Assertion.prototype.toHaveLevel = function (lvl) { - let actual; - - actual = this.obj.stats.lvl; - return this.assert(actual === lvl, () => { - return 'expected user to be level ' + lvl + ', but got ' + actual; - }, () => { - return 'expected user to not be level ' + lvl; - }); + const actual = this.obj.stats.lvl; + return this.assert(actual === lvl, () => 'expected user to be level ' + lvl + ', but got ' + actual, () => 'expected user to not be level ' + lvl); }; Assertion.prototype.toHaveMaxMP = function (mp) { - let actual; - - actual = this.obj._statsComputed.maxMP; - return this.assert(actual === mp, () => { - return 'expected user to have ' + mp + ' max mp, but got ' + actual; - }, () => { - return 'expected user to not have ' + mp + ' max mp'; - }); + const actual = this.obj._statsComputed.maxMP; + return this.assert(actual === mp, () => 'expected user to have ' + mp + ' max mp, but got ' + actual, () => 'expected user to not have ' + mp + ' max mp'); }; }; diff --git a/test/content/eggs.test.js b/test/content/eggs.test.js index 374efab1fd..cb0e173579 100644 --- a/test/content/eggs.test.js +++ b/test/content/eggs.test.js @@ -5,14 +5,14 @@ import { expectValidTranslationString, } from '../helpers/content.helper'; -import eggs from '../../website/common/script/content/eggs'; +import * as eggs from '../../website/common/script/content/eggs'; -describe('eggs', () => { - describe('all', () => { +describe('eggs', () => { + describe('all', () => { it('is a combination of drop and quest eggs', () => { - let dropNumber = Object.keys(eggs.drops).length; - let questNumber = Object.keys(eggs.quests).length; - let allNumber = Object.keys(eggs.all).length; + const dropNumber = Object.keys(eggs.drops).length; + const questNumber = Object.keys(eggs.quests).length; + const allNumber = Object.keys(eggs.all).length; expect(allNumber).to.be.greaterThan(0); expect(allNumber).to.equal(dropNumber + questNumber); diff --git a/test/content/faq.js b/test/content/faq.js index 75e79a0dbe..96df559f55 100644 --- a/test/content/faq.js +++ b/test/content/faq.js @@ -3,24 +3,26 @@ import { expectValidTranslationString, } from '../helpers/content.helper'; -import {questions, stillNeedHelp} from '../../website/common/script/content/faq'; +import faq from '../../website/common/script/content/faq'; + +const { questions, stillNeedHelp } = faq; describe('FAQ Locales', () => { describe('Questions', () => { it('has a valid questions', () => { - each(questions, (question) => { + each(questions, question => { expectValidTranslationString(question.question); }); }); it('has a valid ios answers', () => { - each(questions, (question) => { + each(questions, question => { expectValidTranslationString(question.ios); }); }); it('has a valid web answers', () => { - each(questions, (question) => { + each(questions, question => { expectValidTranslationString(question.web); }); }); diff --git a/test/content/gear.js b/test/content/gear.js index 3b94d98053..49c6fe0e87 100644 --- a/test/content/gear.js +++ b/test/content/gear.js @@ -1,12 +1,14 @@ /* eslint-disable camelcase */ +import { each, camelCase } from 'lodash'; import { expectValidTranslationString, } from '../helpers/content.helper'; -import { each, camelCase } from 'lodash'; -import { tree as allGear } from '../../website/common/script/content/gear'; -import backerGear from '../../website/common/script/content/gear/sets/special/special-backer'; -import contributorGear from '../../website/common/script/content/gear/sets/special/special-contributor'; +import gearData from '../../website/common/script/content/gear'; +import * as backerGear from '../../website/common/script/content/gear/sets/special/special-backer'; +import * as contributorGear from '../../website/common/script/content/gear/sets/special/special-contributor'; + +const allGear = gearData.tree; describe('Gear', () => { each(allGear, (piece, gearType) => { @@ -14,7 +16,7 @@ describe('Gear', () => { each(piece, (items, klass) => { context(`${klass} ${gearType}s`, () => { it('have a value of at least 0 for each stat', () => { - each(items, (gear) => { + each(items, gear => { expect(gear.con).to.be.at.least(0); expect(gear.int).to.be.at.least(0); expect(gear.per).to.be.at.least(0); @@ -23,26 +25,26 @@ describe('Gear', () => { }); it('have a purchase value of at least 0', () => { - each(items, (gear) => { + each(items, gear => { expect(gear.value).to.be.at.least(0); }); }); it('has a canBuy function', () => { - each(items, (gear) => { + each(items, gear => { expect(gear.canBuy).to.be.a('function'); }); }); it('have valid translation strings for text and notes', () => { - each(items, (gear) => { + each(items, gear => { expectValidTranslationString(gear.text); expectValidTranslationString(gear.notes); }); }); it('has a set attribue', () => { - each(items, (gear) => { + each(items, gear => { expect(gear.set).to.exist; }); }); @@ -61,7 +63,7 @@ describe('Gear', () => { }; }); - let cases = { + const cases = { armor_special_0: 45, armor_special_2: 300, head_special_0: 45, @@ -73,7 +75,7 @@ describe('Gear', () => { each(cases, (tierRequirement, key) => { context(key, () => { - let camelCaseKey = camelCase(key); + const camelCaseKey = camelCase(key); it(`canOwn returns true if user has a backer tier of ${tierRequirement} or higher`, () => { user.backer.tier = tierRequirement; @@ -110,7 +112,7 @@ describe('Gear', () => { }; }); - let cases = { + const cases = { armor_special_1: 2, head_special_1: 3, shield_special_1: 5, @@ -119,7 +121,7 @@ describe('Gear', () => { each(cases, (tierRequirement, key) => { context(key, () => { - let camelCaseKey = camelCase(key); + const camelCaseKey = camelCase(key); it(`canOwn returns true if user has a contributor tier of ${tierRequirement} or higher`, () => { user.contributor.level = tierRequirement; diff --git a/test/content/hatching-potions.test.js b/test/content/hatching-potions.test.js index 918d88a67c..a4e31d7b91 100644 --- a/test/content/hatching-potions.test.js +++ b/test/content/hatching-potions.test.js @@ -5,15 +5,15 @@ import { expectValidTranslationString, } from '../helpers/content.helper'; -import hatchingPotions from '../../website/common/script/content/hatching-potions'; +import * as hatchingPotions from '../../website/common/script/content/hatching-potions'; -describe('hatchingPotions', () => { - describe('all', () => { +describe('hatchingPotions', () => { + describe('all', () => { it('is a combination of drop, premium, and wacky potions', () => { - let dropNumber = Object.keys(hatchingPotions.drops).length; - let premiumNumber = Object.keys(hatchingPotions.premium).length; - let wackyNumber = Object.keys(hatchingPotions.wacky).length; - let allNumber = Object.keys(hatchingPotions.all).length; + const dropNumber = Object.keys(hatchingPotions.drops).length; + const premiumNumber = Object.keys(hatchingPotions.premium).length; + const wackyNumber = Object.keys(hatchingPotions.wacky).length; + const allNumber = Object.keys(hatchingPotions.all).length; expect(allNumber).to.be.greaterThan(0); expect(allNumber).to.equal(dropNumber + premiumNumber + wackyNumber); diff --git a/test/content/mysterySets.test.js b/test/content/mysterySets.test.js index 97e9c31be8..777a6e2bbb 100644 --- a/test/content/mysterySets.test.js +++ b/test/content/mysterySets.test.js @@ -1,4 +1,4 @@ -import {each} from 'lodash'; +import { each } from 'lodash'; import { expectValidTranslationString, } from '../helpers/content.helper'; @@ -7,7 +7,7 @@ import mysterySets from '../../website/common/script/content/mystery-sets'; describe('Mystery Sets', () => { it('has a valid text string', () => { - each(mysterySets, (set) => { + each(mysterySets, set => { expectValidTranslationString(set.text); }); }); diff --git a/test/content/stable.test.js b/test/content/stable.test.js index 34802c31fc..3266cb7f47 100644 --- a/test/content/stable.test.js +++ b/test/content/stable.test.js @@ -6,17 +6,17 @@ import { } from '../helpers/content.helper'; import t from '../../website/common/script/content/translation'; -import stable from '../../website/common/script/content/stable'; -import eggs from '../../website/common/script/content/eggs'; -import potions from '../../website/common/script/content/hatching-potions'; +import * as stable from '../../website/common/script/content/stable'; +import * as eggs from '../../website/common/script/content/eggs'; +import * as potions from '../../website/common/script/content/hatching-potions'; -describe('stable', () => { +describe('stable', () => { describe('dropPets', () => { it('contains a pet for each drop potion * each drop egg', () => { - let numberOfDropPotions = Object.keys(potions.drops).length; - let numberOfDropEggs = Object.keys(eggs.drops).length; - let numberOfDropPets = Object.keys(stable.dropPets).length; - let expectedTotal = numberOfDropPotions * numberOfDropEggs; + const numberOfDropPotions = Object.keys(potions.drops).length; + const numberOfDropEggs = Object.keys(eggs.drops).length; + const numberOfDropPets = Object.keys(stable.dropPets).length; + const expectedTotal = numberOfDropPotions * numberOfDropEggs; expect(numberOfDropPets).to.be.greaterThan(0); expect(numberOfDropPets).to.equal(expectedTotal); @@ -25,10 +25,10 @@ describe('stable', () => { describe('questPets', () => { it('contains a pet for each drop potion * each quest egg', () => { - let numberOfDropPotions = Object.keys(potions.drops).length; - let numberOfQuestEggs = Object.keys(eggs.quests).length; - let numberOfQuestPets = Object.keys(stable.questPets).length; - let expectedTotal = numberOfDropPotions * numberOfQuestEggs; + const numberOfDropPotions = Object.keys(potions.drops).length; + const numberOfQuestEggs = Object.keys(eggs.quests).length; + const numberOfQuestPets = Object.keys(stable.questPets).length; + const expectedTotal = numberOfDropPotions * numberOfQuestEggs; expect(numberOfQuestPets).to.be.greaterThan(0); expect(numberOfQuestPets).to.equal(expectedTotal); @@ -37,10 +37,10 @@ describe('stable', () => { describe('premiumPets', () => { it('contains a pet for each premium potion * each drop egg', () => { - let numberOfPremiumPotions = Object.keys(potions.premium).length; - let numberOfDropEggs = Object.keys(eggs.drops).length; - let numberOfPremiumPets = Object.keys(stable.premiumPets).length; - let expectedTotal = numberOfPremiumPotions * numberOfDropEggs; + const numberOfPremiumPotions = Object.keys(potions.premium).length; + const numberOfDropEggs = Object.keys(eggs.drops).length; + const numberOfPremiumPets = Object.keys(stable.premiumPets).length; + const expectedTotal = numberOfPremiumPotions * numberOfDropEggs; expect(numberOfPremiumPets).to.be.greaterThan(0); expect(numberOfPremiumPets).to.equal(expectedTotal); @@ -49,10 +49,10 @@ describe('stable', () => { describe('wackyPets', () => { it('contains a pet for each wacky potion * each drop egg', () => { - let numberOfWackyPotions = Object.keys(potions.wacky).length; - let numberOfDropEggs = Object.keys(eggs.drops).length; - let numberOfWackyPets = Object.keys(stable.wackyPets).length; - let expectedTotal = numberOfWackyPotions * numberOfDropEggs; + const numberOfWackyPotions = Object.keys(potions.wacky).length; + const numberOfDropEggs = Object.keys(eggs.drops).length; + const numberOfWackyPets = Object.keys(stable.wackyPets).length; + const expectedTotal = numberOfWackyPotions * numberOfDropEggs; expect(numberOfWackyPets).to.be.greaterThan(0); expect(numberOfWackyPets).to.equal(expectedTotal); @@ -61,8 +61,8 @@ describe('stable', () => { describe('specialPets', () => { it('each value is a valid translation string', () => { - each(stable.specialPets, (pet) => { - let string = t(pet); + each(stable.specialPets, pet => { + const string = t(pet); expectValidTranslationString(string); }); }); @@ -70,10 +70,10 @@ describe('stable', () => { describe('dropMounts', () => { it('contains a mount for each drop potion * each drop egg', () => { - let numberOfDropPotions = Object.keys(potions.drops).length; - let numberOfDropEggs = Object.keys(eggs.drops).length; - let numberOfDropMounts = Object.keys(stable.dropMounts).length; - let expectedTotal = numberOfDropPotions * numberOfDropEggs; + const numberOfDropPotions = Object.keys(potions.drops).length; + const numberOfDropEggs = Object.keys(eggs.drops).length; + const numberOfDropMounts = Object.keys(stable.dropMounts).length; + const expectedTotal = numberOfDropPotions * numberOfDropEggs; expect(numberOfDropMounts).to.be.greaterThan(0); expect(numberOfDropMounts).to.equal(expectedTotal); @@ -82,10 +82,10 @@ describe('stable', () => { describe('questMounts', () => { it('contains a mount for each drop potion * each quest egg', () => { - let numberOfDropPotions = Object.keys(potions.drops).length; - let numberOfQuestEggs = Object.keys(eggs.quests).length; - let numberOfQuestMounts = Object.keys(stable.questMounts).length; - let expectedTotal = numberOfDropPotions * numberOfQuestEggs; + const numberOfDropPotions = Object.keys(potions.drops).length; + const numberOfQuestEggs = Object.keys(eggs.quests).length; + const numberOfQuestMounts = Object.keys(stable.questMounts).length; + const expectedTotal = numberOfDropPotions * numberOfQuestEggs; expect(numberOfQuestMounts).to.be.greaterThan(0); expect(numberOfQuestMounts).to.equal(expectedTotal); @@ -94,10 +94,10 @@ describe('stable', () => { describe('premiumMounts', () => { it('contains a mount for each premium potion * each drop egg', () => { - let numberOfPremiumPotions = Object.keys(potions.premium).length; - let numberOfDropEggs = Object.keys(eggs.drops).length; - let numberOfPremiumMounts = Object.keys(stable.premiumMounts).length; - let expectedTotal = numberOfPremiumPotions * numberOfDropEggs; + const numberOfPremiumPotions = Object.keys(potions.premium).length; + const numberOfDropEggs = Object.keys(eggs.drops).length; + const numberOfPremiumMounts = Object.keys(stable.premiumMounts).length; + const expectedTotal = numberOfPremiumPotions * numberOfDropEggs; expect(numberOfPremiumMounts).to.be.greaterThan(0); expect(numberOfPremiumMounts).to.equal(expectedTotal); @@ -106,24 +106,26 @@ describe('stable', () => { describe('specialMounts', () => { it('each value is a valid translation string', () => { - each(stable.specialMounts, (mount) => { - let string = t(mount); + each(stable.specialMounts, mount => { + const string = t(mount); expectValidTranslationString(string); }); }); }); - describe('petInfo', () => { + describe('petInfo', () => { it('contains an entry for all pets', () => { - let dropNumber = Object.keys(stable.dropPets).length; - let questNumber = Object.keys(stable.questPets).length; - let specialNumber = Object.keys(stable.specialPets).length; - let premiumNumber = Object.keys(stable.premiumPets).length; - let wackyNumber = Object.keys(stable.wackyPets).length; - let allNumber = Object.keys(stable.petInfo).length; + const dropNumber = Object.keys(stable.dropPets).length; + const questNumber = Object.keys(stable.questPets).length; + const specialNumber = Object.keys(stable.specialPets).length; + const premiumNumber = Object.keys(stable.premiumPets).length; + const wackyNumber = Object.keys(stable.wackyPets).length; + const allNumber = Object.keys(stable.petInfo).length; expect(allNumber).to.be.greaterThan(0); - expect(allNumber).to.equal(dropNumber + questNumber + specialNumber + premiumNumber + wackyNumber); + expect(allNumber).to.equal( + dropNumber + questNumber + specialNumber + premiumNumber + wackyNumber, + ); }); it('contains basic information about each pet', () => { @@ -135,13 +137,13 @@ describe('stable', () => { }); }); - describe('mountInfo', () => { + describe('mountInfo', () => { it('contains an entry for all mounts', () => { - let dropNumber = Object.keys(stable.dropMounts).length; - let questNumber = Object.keys(stable.questMounts).length; - let specialNumber = Object.keys(stable.specialMounts).length; - let premiumNumber = Object.keys(stable.premiumMounts).length; - let allNumber = Object.keys(stable.mountInfo).length; + const dropNumber = Object.keys(stable.dropMounts).length; + const questNumber = Object.keys(stable.questMounts).length; + const specialNumber = Object.keys(stable.specialMounts).length; + const premiumNumber = Object.keys(stable.premiumMounts).length; + const allNumber = Object.keys(stable.mountInfo).length; expect(allNumber).to.be.greaterThan(0); expect(allNumber).to.equal(dropNumber + questNumber + specialNumber + premiumNumber); diff --git a/test/content/translator.js b/test/content/translator.js index fee9d37672..9bb0e87ed3 100644 --- a/test/content/translator.js +++ b/test/content/translator.js @@ -1,14 +1,14 @@ -import {STRING_ERROR_MSG, STRING_DOES_NOT_EXIST_MSG} from '../helpers/content.helper'; +import { STRING_ERROR_MSG, STRING_DOES_NOT_EXIST_MSG } from '../helpers/content.helper'; import translator from '../../website/common/script/content/translation'; describe('Translator', () => { it('returns error message if string is not properly formatted', () => { - let improperlyFormattedString = translator('petName', {attr: 0})(); + const improperlyFormattedString = translator('petName', { attr: 0 })(); expect(improperlyFormattedString).to.match(STRING_ERROR_MSG); }); it('returns an error message if string does not exist', () => { - let stringDoesNotExist = translator('stringDoesNotExist')(); + const stringDoesNotExist = translator('stringDoesNotExist')(); expect(stringDoesNotExist).to.match(STRING_DOES_NOT_EXIST_MSG); }); }); diff --git a/test/helpers/api-integration/api-classes.js b/test/helpers/api-integration/api-classes.js index f914d0d3a5..83f458f23d 100644 --- a/test/helpers/api-integration/api-classes.js +++ b/test/helpers/api-integration/api-classes.js @@ -1,17 +1,18 @@ /* eslint-disable no-use-before-define */ +/* eslint-disable max-classes-per-file */ import moment from 'moment'; -import { requester } from './requester'; -import { - getDocument as getDocumentFromMongo, - updateDocument as updateDocumentInMongo, - unsetDocument as unsetDocumentInMongo, -} from '../mongo'; import { assign, each, isEmpty, set, } from 'lodash'; +import { requester } from './requester'; +import { + getDocument as getDocumentFromMongo, + updateDocument as updateDocumentInMongo, + unsetDocument as unsetDocumentInMongo, +} from '../mongo'; class ApiObject { constructor (options) { @@ -20,7 +21,7 @@ class ApiObject { async update (options) { if (isEmpty(options)) { - return; + return null; } await updateDocumentInMongo(this._docType, this, options); @@ -32,7 +33,7 @@ class ApiObject { async unset (options) { if (isEmpty(options)) { - return; + return null; } await unsetDocumentInMongo(this._docType, this, options); @@ -43,7 +44,7 @@ class ApiObject { } async sync () { - let updatedDoc = await getDocumentFromMongo(this._docType, this); + const updatedDoc = await getDocumentFromMongo(this._docType, this); assign(this, updatedDoc); @@ -57,7 +58,7 @@ export class ApiUser extends ApiObject { this._docType = 'users'; - let _requester = requester(this); + const _requester = requester(this); this.get = _requester.get; this.post = _requester.post; @@ -74,10 +75,10 @@ export class ApiGroup extends ApiObject { } async addChat (chat) { - let group = this; + const group = this; if (!chat) { - chat = { + chat = { // eslint-disable-line no-param-reassign id: 'Test_ID', text: 'Test message', flagCount: 0, @@ -91,13 +92,13 @@ export class ApiGroup extends ApiObject { }; } - let update = { chat }; + const update = { chat }; - return await this.update(update); + return this.update(update); } async createCancelledSubscription () { - let update = { + const update = { purchased: { plan: { customerId: 'example-customer', @@ -106,7 +107,7 @@ export class ApiGroup extends ApiObject { }, }; - return await this.update(update); + return this.update(update); } } diff --git a/test/helpers/api-integration/external-server.js b/test/helpers/api-integration/external-server.js index 33991240f8..4a84855301 100644 --- a/test/helpers/api-integration/external-server.js +++ b/test/helpers/api-integration/external-server.js @@ -1,22 +1,21 @@ -'use strict'; +import express from 'express'; +import uuid from 'uuid'; +import bodyParser from 'body-parser'; -let express = require('express'); -let uuid = require('uuid'); -let bodyParser = require('body-parser'); -let app = express(); -let server = require('http').createServer(app); +const app = express(); +const server = require('http').createServer(app); const PORT = process.env.TEST_WEBHOOK_APP_PORT || 3099; // eslint-disable-line no-process-env -let webhookData = {}; +const webhookData = {}; app.use(bodyParser.urlencoded({ extended: true, })); app.use(bodyParser.json()); -app.post('/webhooks/:id', function (req, res) { - let id = req.params.id; +app.post('/webhooks/:id', (req, res) => { + const { id } = req.params; if (!webhookData[id]) { webhookData[id] = []; @@ -29,9 +28,9 @@ app.post('/webhooks/:id', function (req, res) { // Helps close down server from within mocha test // See http://stackoverflow.com/a/37054753/2601552 -let sockets = {}; -server.on('connection', (socket) => { - let id = uuid.v4(); +const sockets = {}; +server.on('connection', socket => { + const id = uuid.v4(); sockets[id] = socket; socket.once('close', () => { @@ -40,16 +39,16 @@ server.on('connection', (socket) => { }); function start () { - return new Promise((resolve) => { + return new Promise(resolve => { server.listen(PORT, resolve); }); } function close () { - return new Promise((resolve) => { + return new Promise(resolve => { server.close(resolve); - Object.keys(sockets).forEach((socket) => { + Object.keys(sockets).forEach(socket => { sockets[socket].end(); }); }); @@ -62,7 +61,7 @@ function getWebhookData (id) { return webhookData[id].pop(); } -module.exports = { +export default { start, close, getWebhookData, diff --git a/test/helpers/api-integration/requester.js b/test/helpers/api-integration/requester.js index 2b18de8bac..a01aa1e227 100644 --- a/test/helpers/api-integration/requester.js +++ b/test/helpers/api-integration/requester.js @@ -10,8 +10,9 @@ let apiVersion; // Sets up an object that can make all REST requests // If a user is passed in, the uuid and api token of // the user are used to make the requests -export function requester (user = {}, additionalSets = {}) { - additionalSets = cloneDeep(additionalSets); // cloning because it could be modified later to set cookie +export function requester (user = {}, additionalSets = {}) { // eslint-disable-line import/prefer-default-export, max-len + // cloning because it could be modified later to set cookie + additionalSets = cloneDeep(additionalSets); // eslint-disable-line no-param-reassign return { get: _requestMaker(user, 'get', additionalSets), @@ -21,58 +22,64 @@ export function requester (user = {}, additionalSets = {}) { }; } -requester.setApiVersion = (version) => { +requester.setApiVersion = version => { apiVersion = version; }; function _requestMaker (user, method, additionalSets = {}) { if (!apiVersion) throw new Error('apiVersion not set'); - return (route, send, query) => { - return new Promise((resolve, reject) => { - let url = `http://localhost:${API_TEST_SERVER_PORT}`; + return (route, send, query) => new Promise((resolve, reject) => { + let url = `http://localhost:${API_TEST_SERVER_PORT}`; - // do not prefix with api/apiVersion requests to top level routes like dataexport, payments and emails - if (route.indexOf('/email') === 0 || route.indexOf('/export') === 0 || route.indexOf('/paypal') === 0 || route.indexOf('/amazon') === 0 || route.indexOf('/stripe') === 0 || route.indexOf('/qr-code') === 0) { - url += `${route}`; - } else { - url += `/api/${apiVersion}${route}`; - } + // do not prefix with api/apiVersion requests to top level routes + // like dataexport, payments and emails + if ( + route.indexOf('/email') === 0 + || route.indexOf('/export') === 0 + || route.indexOf('/paypal') === 0 + || route.indexOf('/amazon') === 0 + || route.indexOf('/stripe') === 0 + || route.indexOf('/qr-code') === 0 + ) { + url += `${route}`; + } else { + url += `/api/${apiVersion}${route}`; + } - let request = superagent[method](url) - .accept('application/json'); - - if (user && user._id && user.apiToken) { - request - .set('x-api-user', user._id) - .set('x-api-key', user.apiToken); - } - - if (!isEmpty(additionalSets)) { - request.set(additionalSets); - } + const request = superagent[method](url) + .accept('application/json'); + if (user && user._id && user.apiToken) { request - .query(query) - .send(send) - .end((err, response) => { - if (err) { - if (!err.response) return reject(err); + .set('x-api-user', user._id) + .set('x-api-key', user.apiToken); + } - let parsedError = _parseError(err); + if (!isEmpty(additionalSets)) { + request.set(additionalSets); + } - return reject(parsedError); - } + request + .query(query) + .send(send) + .end((err, response) => { + if (err) { + if (!err.response) return reject(err); - resolve(_parseRes(response)); - }); - }); - }; + const parsedError = _parseError(err); + + return reject(parsedError); + } + + return resolve(_parseRes(response)); + }); + }); } function _parseRes (res) { - let contentType = res.headers['content-type'] || ''; - let contentDisposition = res.headers['content-disposition'] || ''; + const contentType = res.headers['content-type'] || ''; + const contentDisposition = res.headers['content-disposition'] || ''; if (contentType.indexOf('json') === -1) { // not a json response return res.text; @@ -84,16 +91,17 @@ function _parseRes (res) { if (apiVersion === 'v2') { return res.body; - } else if (apiVersion === 'v3' || apiVersion === 'v4') { + } if (apiVersion === 'v3' || apiVersion === 'v4') { if (res.body.message) { return { data: res.body.data, message: res.body.message, }; - } else { - return res.body.data; } + return res.body.data; } + + return null; } function _parseError (err) { diff --git a/test/helpers/api-integration/v3/index.js b/test/helpers/api-integration/v3/index.js index 8ec89f9313..44f6dd179d 100644 --- a/test/helpers/api-integration/v3/index.js +++ b/test/helpers/api-integration/v3/index.js @@ -1,13 +1,14 @@ /* eslint-disable no-use-before-define */ // Import requester function, set it up for v3, export it import { requester } from '../requester'; -requester.setApiVersion('v3'); -export { requester }; import server from '../external-server'; + +requester.setApiVersion('v3'); +export { requester }; export { server }; export { translate } from '../../translate'; export { checkExistence, getProperty, resetHabiticaDB } from '../../mongo'; -export * from './object-generators'; +export * from './object-generators'; export { sleep } from '../../sleep'; diff --git a/test/helpers/api-integration/v3/object-generators.js b/test/helpers/api-integration/v3/object-generators.js index fc06344c9e..e713c1084c 100644 --- a/test/helpers/api-integration/v3/object-generators.js +++ b/test/helpers/api-integration/v3/object-generators.js @@ -20,18 +20,18 @@ import * as Tasks from '../../../../website/server/models/task'; // Example: generateUser({}, { username: 'TestName' }) adds user // with the 'TestName' username. export async function generateUser (update = {}, overrides = {}) { - let username = overrides.username || (Date.now() + generateUUID()).substring(0, 20); - let password = overrides.password || 'password'; - let email = overrides.email || `${username}@example.com`; + const username = overrides.username || (Date.now() + generateUUID()).substring(0, 20); + const password = overrides.password || 'password'; + const email = overrides.email || `${username}@example.com`; - let user = await requester().post('/user/auth/local/register', { + const user = await requester().post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let apiUser = new ApiUser(user); + const apiUser = new ApiUser(user); await apiUser.update(update); @@ -39,29 +39,29 @@ export async function generateUser (update = {}, overrides = {}) { } export async function generateHabit (update = {}) { - let type = 'habit'; - let task = new Tasks[type](update); + const type = 'habit'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateDaily (update = {}) { - let type = 'daily'; - let task = new Tasks[type](update); + const type = 'daily'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateReward (update = {}) { - let type = 'reward'; - let task = new Tasks[type](update); + const type = 'reward'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateTodo (update = {}) { - let type = 'todo'; - let task = new Tasks[type](update); + const type = 'todo'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } @@ -75,8 +75,8 @@ export async function generateGroup (leader, details = {}, update = {}) { details.privacy = details.privacy || 'private'; details.name = details.name || 'test group'; - let group = await leader.post('/groups', details); - let apiGroup = new ApiGroup(group); + const group = await leader.post('/groups', details); + const apiGroup = new ApiGroup(group); await apiGroup.update(update); @@ -86,7 +86,8 @@ export async function generateGroup (leader, details = {}, update = {}) { // This is generate group + the ability to create // real users to populate it. The settings object // takes in: -// members: Number - the number of group members to create. Defaults to 0. Does not include group leader. +// members: Number - the number of group members to create. +// Defaults to 0. Does not include group leader. // inivtes: Number - the number of users to create and invite to the group. Defaults to 0. // groupDetails: Object - how to initialize the group // leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user @@ -98,42 +99,36 @@ export async function generateGroup (leader, details = {}, update = {}) { // leader: the leader user object // group: the group object export async function createAndPopulateGroup (settings = {}) { - let numberOfMembers = settings.members || 0; - let numberOfInvites = settings.invites || 0; - let groupDetails = settings.groupDetails; - let leaderDetails = settings.leaderDetails || { balance: 10 }; + const numberOfMembers = settings.members || 0; + const numberOfInvites = settings.invites || 0; + const { groupDetails } = settings; + const leaderDetails = settings.leaderDetails || { balance: 10 }; - let groupLeader = await generateUser(leaderDetails); - let group = await generateGroup(groupLeader, groupDetails); + const groupLeader = await generateUser(leaderDetails); + const group = await generateGroup(groupLeader, groupDetails); const groupMembershipTypes = { - party: { 'party._id': group._id}, + party: { 'party._id': group._id }, guild: { guilds: [group._id] }, }; - let members = await Promise.all( - times(numberOfMembers, () => { - return generateUser(groupMembershipTypes[group.type]); - }) + const members = await Promise.all( + times(numberOfMembers, () => generateUser(groupMembershipTypes[group.type])), ); - await group.update({ memberCount: numberOfMembers + 1}); + await group.update({ memberCount: numberOfMembers + 1 }); - let invitees = await Promise.all( - times(numberOfInvites, () => { - return generateUser(); - }) + const invitees = await Promise.all( + times(numberOfInvites, () => generateUser()), ); - let invitationPromises = invitees.map((invitee) => { - return groupLeader.post(`/groups/${group._id}/invite`, { - uuids: [invitee._id], - }); - }); + const invitationPromises = invitees.map(invitee => groupLeader.post(`/groups/${group._id}/invite`, { + uuids: [invitee._id], + })); await Promise.all(invitationPromises); - await Promise.all(invitees.map((invitee) => invitee.sync())); + await Promise.all(invitees.map(invitee => invitee.sync())); return { groupLeader, @@ -155,8 +150,8 @@ export async function generateChallenge (challengeCreator, group, details = {}, details.prize = details.prize || 0; details.official = details.official || false; - let challenge = await challengeCreator.post('/challenges', details); - let apiChallenge = new ApiChallenge(challenge); + const challenge = await challengeCreator.post('/challenges', details); + const apiChallenge = new ApiChallenge(challenge); await apiChallenge.update(update); diff --git a/test/helpers/api-integration/v4/index.js b/test/helpers/api-integration/v4/index.js index ff8d48e5ec..fad9fe4556 100644 --- a/test/helpers/api-integration/v4/index.js +++ b/test/helpers/api-integration/v4/index.js @@ -1,13 +1,14 @@ /* eslint-disable no-use-before-define */ // Import requester function, set it up for v4, export it import { requester } from '../requester'; -requester.setApiVersion('v4'); -export { requester }; import server from '../external-server'; + +requester.setApiVersion('v4'); +export { requester }; export { server }; export { translate } from '../../translate'; export { checkExistence, getProperty, resetHabiticaDB } from '../../mongo'; -export * from './object-generators'; +export * from './object-generators'; export { sleep } from '../../sleep'; diff --git a/test/helpers/api-integration/v4/object-generators.js b/test/helpers/api-integration/v4/object-generators.js index 1c215de361..99030f834f 100644 --- a/test/helpers/api-integration/v4/object-generators.js +++ b/test/helpers/api-integration/v4/object-generators.js @@ -14,18 +14,18 @@ import * as Tasks from '../../../../website/server/models/task'; // , you can do so by passing in the full path as a string: // { 'items.eggs.Wolf': 10 } export async function generateUser (update = {}) { - let username = (Date.now() + generateUUID()).substring(0, 20); - let password = 'password'; - let email = `${username}@example.com`; + const username = (Date.now() + generateUUID()).substring(0, 20); + const password = 'password'; + const email = `${username}@example.com`; - let user = await requester().post('/user/auth/local/register', { + const user = await requester().post('/user/auth/local/register', { username, email, password, confirmPassword: password, }); - let apiUser = new ApiUser(user); + const apiUser = new ApiUser(user); await apiUser.update(update); @@ -33,29 +33,29 @@ export async function generateUser (update = {}) { } export async function generateHabit (update = {}) { - let type = 'habit'; - let task = new Tasks[type](update); + const type = 'habit'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateDaily (update = {}) { - let type = 'daily'; - let task = new Tasks[type](update); + const type = 'daily'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateReward (update = {}) { - let type = 'reward'; - let task = new Tasks[type](update); + const type = 'reward'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } export async function generateTodo (update = {}) { - let type = 'todo'; - let task = new Tasks[type](update); + const type = 'todo'; + const task = new Tasks[type](update); await task.save({ validateBeforeSave: false }); return task; } @@ -69,8 +69,8 @@ export async function generateGroup (leader, details = {}, update = {}) { details.privacy = details.privacy || 'private'; details.name = details.name || 'test group'; - let group = await leader.post('/groups', details); - let apiGroup = new ApiGroup(group); + const group = await leader.post('/groups', details); + const apiGroup = new ApiGroup(group); await apiGroup.update(update); @@ -80,7 +80,8 @@ export async function generateGroup (leader, details = {}, update = {}) { // This is generate group + the ability to create // real users to populate it. The settings object // takes in: -// members: Number - the number of group members to create. Defaults to 0. Does not include group leader. +// members: Number - the number of group members to create. +// Defaults to 0. Does not include group leader. // inivtes: Number - the number of users to create and invite to the group. Defaults to 0. // groupDetails: Object - how to initialize the group // leaderDetails: Object - defaults for the leader, defaults with a gem balance so the user @@ -92,42 +93,36 @@ export async function generateGroup (leader, details = {}, update = {}) { // leader: the leader user object // group: the group object export async function createAndPopulateGroup (settings = {}) { - let numberOfMembers = settings.members || 0; - let numberOfInvites = settings.invites || 0; - let groupDetails = settings.groupDetails; - let leaderDetails = settings.leaderDetails || { balance: 10 }; + const numberOfMembers = settings.members || 0; + const numberOfInvites = settings.invites || 0; + const { groupDetails } = settings; + const leaderDetails = settings.leaderDetails || { balance: 10 }; - let groupLeader = await generateUser(leaderDetails); - let group = await generateGroup(groupLeader, groupDetails); + const groupLeader = await generateUser(leaderDetails); + const group = await generateGroup(groupLeader, groupDetails); const groupMembershipTypes = { - party: { 'party._id': group._id}, + party: { 'party._id': group._id }, guild: { guilds: [group._id] }, }; - let members = await Promise.all( - times(numberOfMembers, () => { - return generateUser(groupMembershipTypes[group.type]); - }) + const members = await Promise.all( + times(numberOfMembers, () => generateUser(groupMembershipTypes[group.type])), ); - await group.update({ memberCount: numberOfMembers + 1}); + await group.update({ memberCount: numberOfMembers + 1 }); - let invitees = await Promise.all( - times(numberOfInvites, () => { - return generateUser(); - }) + const invitees = await Promise.all( + times(numberOfInvites, () => generateUser()), ); - let invitationPromises = invitees.map((invitee) => { - return groupLeader.post(`/groups/${group._id}/invite`, { - uuids: [invitee._id], - }); - }); + const invitationPromises = invitees.map(invitee => groupLeader.post(`/groups/${group._id}/invite`, { + uuids: [invitee._id], + })); await Promise.all(invitationPromises); - await Promise.all(invitees.map((invitee) => invitee.sync())); + await Promise.all(invitees.map(invitee => invitee.sync())); return { groupLeader, @@ -149,8 +144,8 @@ export async function generateChallenge (challengeCreator, group, details = {}, details.prize = details.prize || 0; details.official = details.official || false; - let challenge = await challengeCreator.post('/challenges', details); - let apiChallenge = new ApiChallenge(challenge); + const challenge = await challengeCreator.post('/challenges', details); + const apiChallenge = new ApiChallenge(challenge); await apiChallenge.update(update); diff --git a/test/helpers/api-unit.helper.js b/test/helpers/api-unit.helper.js index b43389bf21..6ca56abb5c 100644 --- a/test/helpers/api-unit.helper.js +++ b/test/helpers/api-unit.helper.js @@ -1,16 +1,17 @@ import '../../website/server/libs/i18n'; import mongoose from 'mongoose'; import defaultsDeep from 'lodash/defaultsDeep'; +import moment from 'moment'; import { model as User } from '../../website/server/models/user'; import { model as Group } from '../../website/server/models/group'; import { model as Challenge } from '../../website/server/models/challenge'; import mongo from './mongo'; // eslint-disable-line -import moment from 'moment'; import i18n from '../../website/common/script/i18n'; import * as Tasks from '../../website/server/models/task'; + export { translationCheck } from './translate'; -afterEach((done) => { +afterEach(done => { sandbox.restore(); mongoose.connection.dropDatabase(done); }); @@ -30,7 +31,7 @@ export function generateChallenge (options = {}) { } export function generateRes (options = {}) { - let defaultRes = { + const defaultRes = { json: sandbox.stub(), locals: { user: generateUser(options.localsUser), @@ -51,7 +52,7 @@ export function generateRes (options = {}) { } export function generateReq (options = {}) { - let defaultReq = { + const defaultReq = { body: {}, query: {}, headers: {}, @@ -71,43 +72,43 @@ export function generateNext (func) { } export function generateHistory (days) { - let history = []; - let now = Number(moment().toDate()); + const history = []; + const now = Number(moment().toDate()); while (days > 0) { history.push({ value: days, date: Number(moment(now).subtract(days, 'days').toDate()), }); - days--; + days -= 1; // eslint-disable-line no-param-reassign } return history; } export function generateTodo (user) { - let todo = { + const todo = { text: 'test todo', type: 'todo', value: 0, completed: false, }; - let task = new Tasks.todo(Tasks.Task.sanitize(todo)); // eslint-disable-line new-cap + const task = new Tasks.todo(Tasks.Task.sanitize(todo)); // eslint-disable-line new-cap task.userId = user._id; return task; } export function generateDaily (user) { - let daily = { + const daily = { text: 'test daily', type: 'daily', value: 0, completed: false, }; - let task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap + const task = new Tasks.daily(Tasks.Task.sanitize(daily)); // eslint-disable-line new-cap task.userId = user._id; return task; @@ -117,7 +118,7 @@ export function defer () { let resolve; let reject; - let promise = new Promise((resolveParam, rejectParam) => { + const promise = new Promise((resolveParam, rejectParam) => { resolve = resolveParam; reject = rejectParam; }); diff --git a/test/helpers/common.helper.js b/test/helpers/common.helper.js index f594e15cd0..4a079a5530 100644 --- a/test/helpers/common.helper.js +++ b/test/helpers/common.helper.js @@ -7,35 +7,36 @@ import { RewardSchema, TodoSchema, } from '../../website/server/models/task'; -export {translate} from './translate'; + +export { translate } from './translate'; export function generateUser (options = {}) { - let user = new User(options).toObject(); + const user = new User(options).toObject(); return user; } export function generateDaily (options = {}) { - let Daily = mongoose.model('Daily', DailySchema); + const Daily = mongoose.model('Daily', DailySchema); return new Daily(options).toObject(); } export function generateHabit (options = {}) { - let Habit = mongoose.model('Habit', HabitSchema); + const Habit = mongoose.model('Habit', HabitSchema); return new Habit(options).toObject(); } export function generateReward (options = {}) { - let Reward = mongoose.model('Reward', RewardSchema); + const Reward = mongoose.model('Reward', RewardSchema); return new Reward(options).toObject(); } export function generateTodo (options = {}) { - let Todo = mongoose.model('Todo', TodoSchema); + const Todo = mongoose.model('Todo', TodoSchema); return new Todo(options).toObject(); } diff --git a/test/helpers/content.helper.js b/test/helpers/content.helper.js index 0470f04114..93ceb51922 100644 --- a/test/helpers/content.helper.js +++ b/test/helpers/content.helper.js @@ -1,6 +1,8 @@ -require('./globals.helper'); import i18n from '../../website/common/script/i18n'; -i18n.translations = require('../../website/server/libs/i18n').translations; +import './globals.helper'; +import { translations } from '../../website/server/libs/i18n'; + +i18n.translations = translations; export const STRING_ERROR_MSG = /^Error processing the string ".*". Please see Help > Report a Bug.$/; export const STRING_DOES_NOT_EXIST_MSG = /^String '.*' not found.$/; @@ -8,7 +10,7 @@ export const STRING_DOES_NOT_EXIST_MSG = /^String '.*' not found.$/; export function expectValidTranslationString (attribute) { expect(attribute).to.be.a('function'); - let translatedString = attribute(); + const translatedString = attribute(); expect(translatedString.trim()).to.not.be.empty; expect(translatedString).to.not.contain('function func(lang)'); diff --git a/test/helpers/globals.helper.js b/test/helpers/globals.helper.js index 5dc151cb94..bca96eac2c 100644 --- a/test/helpers/globals.helper.js +++ b/test/helpers/globals.helper.js @@ -1,3 +1,4 @@ +/* eslint-disable import/no-commonjs */ /* eslint-disable no-undef */ /* eslint-disable global-require */ /* eslint-disable no-process-env */ @@ -9,11 +10,14 @@ global._ = require('lodash'); global.chai = require('chai'); chai.use(require('sinon-chai')); chai.use(require('chai-as-promised')); + global.expect = chai.expect; global.sinon = require('sinon'); -let sinonStubPromise = require('sinon-stub-promise'); +const sinonStubPromise = require('sinon-stub-promise'); + sinonStubPromise(global.sinon); global.sandbox = sinon.createSandbox(); -import setupNconf from '../../website/server/libs/setupNconf'; +const setupNconf = require('../../website/server/libs/setupNconf'); + setupNconf('./config.json.example'); diff --git a/test/helpers/mongo.js b/test/helpers/mongo.js index ca2af9ce45..701f553ece 100644 --- a/test/helpers/mongo.js +++ b/test/helpers/mongo.js @@ -1,20 +1,20 @@ import mongoose from 'mongoose'; -import { TAVERN_ID } from '../../website/server/models/group'; import { get } from 'lodash'; +import { TAVERN_ID } from '../../website/server/models/group'; // Useful for checking things that have been deleted, // but you no longer have access to, // like private parties or users export async function checkExistence (collectionName, id) { return new Promise((resolve, reject) => { - let collection = mongoose.connection.db.collection(collectionName); + const collection = mongoose.connection.db.collection(collectionName); - collection.find({_id: id}, {_id: 1}).limit(1).toArray((findError, docs) => { + collection.find({ _id: id }, { _id: 1 }).limit(1).toArray((findError, docs) => { if (findError) return reject(findError); - let exists = docs.length > 0; + const exists = docs.length > 0; - resolve(exists); + return resolve(exists); }); }); } @@ -23,12 +23,12 @@ export async function checkExistence (collectionName, id) { // and thus unavailable to the client export async function getProperty (collectionName, id, path) { return new Promise((resolve, reject) => { - let collection = mongoose.connection.db.collection(collectionName); + const collection = mongoose.connection.db.collection(collectionName); - collection.find({_id: id}, {[path]: 1}).limit(1).toArray((findError, docs) => { + collection.find({ _id: id }, { [path]: 1 }).limit(1).toArray((findError, docs) => { if (findError) return reject(findError); - resolve(get(docs[0], path)); + return resolve(get(docs[0], path)); }); }); } @@ -37,17 +37,17 @@ export async function getProperty (collectionName, id, path) { // resets the db to an empty state and creates a tavern document export async function resetHabiticaDB () { return new Promise((resolve, reject) => { - mongoose.connection.dropDatabase((dbErr) => { + mongoose.connection.dropDatabase(dbErr => { if (dbErr) return reject(dbErr); - let groups = mongoose.connection.db.collection('groups'); - let users = mongoose.connection.db.collection('users'); + const groups = mongoose.connection.db.collection('groups'); + const users = mongoose.connection.db.collection('users'); - users.count({_id: '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0'}, (err, count) => { + return users.count({ _id: '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0' }, (err, count) => { if (err) return reject(err); if (count > 0) return resolve(); // create the leader for the tavern - users.insertOne({ + return users.insertOne({ _id: '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0', apiToken: TAVERN_ID, auth: { @@ -59,15 +59,15 @@ export async function resetHabiticaDB () { passwordHashMethod: 'bcrypt', }, }, - }, (insertErr) => { + }, insertErr => { if (insertErr) return reject(insertErr); // For some mysterious reason after a dropDatabase there can still be a group... - groups.count({_id: TAVERN_ID}, (err2, count2) => { + return groups.count({ _id: TAVERN_ID }, (err2, count2) => { if (err2) return reject(err2); if (count2 > 0) return resolve(); - groups.insertOne({ + return groups.insertOne({ _id: TAVERN_ID, chat: [], leader: '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0', // Siena Leslie @@ -75,10 +75,10 @@ export async function resetHabiticaDB () { type: 'guild', privacy: 'public', memberCount: 0, - }, (insertErr2) => { + }, insertErr2 => { if (insertErr2) return reject(insertErr2); - resolve(); + return resolve(); }); }); }); @@ -88,10 +88,10 @@ export async function resetHabiticaDB () { } export async function updateDocument (collectionName, doc, update) { - let collection = mongoose.connection.db.collection(collectionName); + const collection = mongoose.connection.db.collection(collectionName); - return new Promise((resolve) => { - collection.updateOne({ _id: doc._id }, { $set: update }, (updateErr) => { + return new Promise(resolve => { + collection.updateOne({ _id: doc._id }, { $set: update }, updateErr => { if (updateErr) throw new Error(`Error updating ${collectionName}: ${updateErr}`); resolve(); }); @@ -101,10 +101,10 @@ export async function updateDocument (collectionName, doc, update) { // Unset a property in the database. // Useful for testing. export async function unsetDocument (collectionName, doc, update) { - let collection = mongoose.connection.db.collection(collectionName); + const collection = mongoose.connection.db.collection(collectionName); - return new Promise((resolve) => { - collection.updateOne({ _id: doc._id }, { $unset: update }, (updateErr) => { + return new Promise(resolve => { + collection.updateOne({ _id: doc._id }, { $unset: update }, updateErr => { if (updateErr) throw new Error(`Error updating ${collectionName}: ${updateErr}`); resolve(); }); @@ -112,9 +112,9 @@ export async function unsetDocument (collectionName, doc, update) { } export async function getDocument (collectionName, doc) { - let collection = mongoose.connection.db.collection(collectionName); + const collection = mongoose.connection.db.collection(collectionName); - return new Promise((resolve) => { + return new Promise(resolve => { collection.findOne({ _id: doc._id }, (lookupErr, found) => { if (lookupErr) throw new Error(`Error looking up ${collectionName}: ${lookupErr}`); resolve(found); @@ -122,18 +122,16 @@ export async function getDocument (collectionName, doc) { }); } -before((done) => { - mongoose.connection.on('open', (err) => { +before(done => { + mongoose.connection.on('open', err => { if (err) return done(err); - resetHabiticaDB() + return resetHabiticaDB() .then(() => done()) .catch(done); }); }); -after((done) => { - mongoose.connection.dropDatabase((err) => { - if (err) return done(err); - mongoose.connection.close(done); - }); -}); +after(done => mongoose.connection.dropDatabase(err => { + if (err) return done(err); + return mongoose.connection.close(done); +})); diff --git a/test/helpers/sleep.js b/test/helpers/sleep.js index 74acac27a9..deafe66fbb 100644 --- a/test/helpers/sleep.js +++ b/test/helpers/sleep.js @@ -1 +1 @@ -export { default as sleep } from '../../website/server/libs/sleep'; \ No newline at end of file +export { default as sleep } from '../../website/server/libs/sleep'; // eslint-disable-line import/prefer-default-export diff --git a/test/helpers/translate.js b/test/helpers/translate.js index c12e97c147..1e2eab2b99 100644 --- a/test/helpers/translate.js +++ b/test/helpers/translate.js @@ -1,4 +1,5 @@ import i18n from '../../website/common/script/i18n'; + i18n.translations = require('../../website/server/libs/i18n').translations; const STRING_ERROR_MSG = 'Error processing the string. Please see Help > Report a Bug.'; @@ -8,7 +9,7 @@ const STRING_DOES_NOT_EXIST_MSG = /^String '.*' not found.$/; // That way, if the translated string changes, the test // will not break. NOTE: it checks against errors with string as well. export function translate (key, variables, language) { - let translatedString = i18n.t(key, variables, language); + const translatedString = i18n.t(key, variables, language); expect(translatedString).to.not.be.empty; expect(translatedString).to.not.eql(STRING_ERROR_MSG); diff --git a/test/mocha.opts b/test/mocha.opts index 28345d5049..3f4155608a 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -2,7 +2,6 @@ --reporter spec --timeout 8000 --check-leaks ---globals io ---require babel-register +--require @babel/register --require ./test/helpers/globals.helper --exit diff --git a/test/sanity/no-duplicate-translation-keys.js b/test/sanity/no-duplicate-translation-keys.js index c5fff4ecff..eafa09db90 100644 --- a/test/sanity/no-duplicate-translation-keys.js +++ b/test/sanity/no-duplicate-translation-keys.js @@ -1,21 +1,20 @@ -'use strict'; -let glob = require('glob').sync; +const glob = require('glob').sync; describe('Locales files', () => { it('do not contain duplicates of any keys', () => { - let translationFiles = glob('./website/common/locales/en/*.json'); + const translationFiles = glob('./website/common/locales/en/*.json'); if (translationFiles.length === 0) { throw new Error('Could not find any files in ./website/common/locales/en/*.json'); } - let keys = {}; + const keys = {}; - translationFiles.forEach((file) => { - let json = require(`../.${file}`); // eslint-disable-line global-require + translationFiles.forEach(file => { + const json = require(`../.${file}`); // eslint-disable-line global-require, import/no-dynamic-require - Object.keys(json).forEach((key) => { + Object.keys(json).forEach(key => { if (keys[key]) { throw new Error(`${key} in ${file} already exists in ${keys[key]}.`); } diff --git a/test/sanity/use-proper-babel-path.js b/test/sanity/use-proper-babel-path.js index b70403bece..3388b0a528 100644 --- a/test/sanity/use-proper-babel-path.js +++ b/test/sanity/use-proper-babel-path.js @@ -1,20 +1,19 @@ -'use strict'; -let glob = require('glob').sync; -let readFile = require('fs').readFileSync; +const glob = require('glob').sync; +const readFile = require('fs').readFileSync; const IMPORT_REGEX = /(import|require).*common\/script/; describe('Use Proper Babel Paths', () => { it('uses proper babel files in website/server', () => { - let websiteServerPaths = glob('./website/server/**/*.js'); + const websiteServerPaths = glob('./website/server/**/*.js'); if (websiteServerPaths.length === 0) { throw new Error('Could not find any files in website/server/**/*.js'); } - websiteServerPaths.forEach((filePath) => { - let file = readFile(filePath, {encoding: 'utf8'}); + websiteServerPaths.forEach(filePath => { + const file = readFile(filePath, { encoding: 'utf8' }); try { expect(file).to.not.match(IMPORT_REGEX); diff --git a/vagrant_scripts/install_gcc.sh b/vagrant_scripts/install_gcc.sh deleted file mode 100755 index 1eba4372c7..0000000000 --- a/vagrant_scripts/install_gcc.sh +++ /dev/null @@ -1,13 +0,0 @@ -echo Adding PPA repository for gcc... -add-apt-repository ppa:ubuntu-toolchain-r/test -apt-get update -qq - -echo Installing gcc 4.8... -apt-get install -qq gcc-4.8 g++-4.8 - -update-alternatives --remove-all gcc -update-alternatives --remove-all g++ -update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20 -update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20 -update-alternatives --config gcc -update-alternatives --config g++ diff --git a/vagrant_scripts/install_mongo.sh b/vagrant_scripts/install_mongo.sh deleted file mode 100755 index 4b0e244c32..0000000000 --- a/vagrant_scripts/install_mongo.sh +++ /dev/null @@ -1,11 +0,0 @@ -# Import MongoDB public GPG key -# http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/ -apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 - -# Create a list file for MongoDB -echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list - -apt-get update -apt-get install mongodb-10gen -apt-get install -y mongodb-org=2.6.4 mongodb-org-server=2.6.4 mongodb-org-shell=2.6.4 mongodb-org-mongos=2.6.4 mongodb-org-tools=2.6.4 - diff --git a/vagrant_scripts/install_node.sh b/vagrant_scripts/install_node.sh deleted file mode 100755 index e27fa26e8d..0000000000 --- a/vagrant_scripts/install_node.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -echo Installing nvm... -curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | NVM_DIR="/home/vagrant/.nvm" PROFILE="/home/vagrant/.profile" bash -echo "source /home/vagrant/.nvm/nvm.sh" >> /home/vagrant/.profile -echo "nvm install" >> /home/vagrant/.profile - -chown -R vagrant:vagrant /home/vagrant/.nvm - -source /home/vagrant/.profile - -echo Setting up node... -cd /vagrant -nvm install 8 -nvm use 8 -nvm alias default current - -echo Update npm... -npm install -g npm@5 - -echo Installing global modules... -npm install -g gulp mocha node-pre-gyp diff --git a/vagrant_scripts/install_sprite_dependencies.sh b/vagrant_scripts/install_sprite_dependencies.sh deleted file mode 100755 index 181a0a203f..0000000000 --- a/vagrant_scripts/install_sprite_dependencies.sh +++ /dev/null @@ -1,8 +0,0 @@ -echo Installing GraphicsMagick - provides gm and convert... -apt-get install -qq graphicsmagick - -echo Installing phantomjs and dependency... -apt-get install -qq libicu48 - -echo Installing requirements for gulp.spritesmith... -apt-get install -qq pkg-config libcairo2-dev libjpeg-dev diff --git a/vagrant_scripts/install_test_dependencies.sh b/vagrant_scripts/install_test_dependencies.sh deleted file mode 100755 index f722397d64..0000000000 --- a/vagrant_scripts/install_test_dependencies.sh +++ /dev/null @@ -1,9 +0,0 @@ -echo Installing Xvfb... -apt-get install -qq xvfb -echo Installing Java7... -apt-get install -qq openjdk-7-jre -echo Downloading Firefox... -wget http://sourceforge.net/projects/ubuntuzilla/files/mozilla/apt/pool/main/f/firefox-mozilla-build/firefox-mozilla-build_40.0.3-0ubuntu1_amd64.deb/download -O firefox.deb >/dev/null 2>&1 -echo Installing Firefox... -dpkg -i firefox.deb -rm firefox.deb diff --git a/vagrant_scripts/vagrant.sh b/vagrant_scripts/vagrant.sh deleted file mode 100644 index 7f9f90d8c7..0000000000 --- a/vagrant_scripts/vagrant.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash -# -# Habitica provisioning script - -# function for autostart -function autostart_habitrpg { - update_config=$'Please update config.json with your values\nfor ADMIN_EMAIL, SMTP_USER, SMTP_PASS and SMTP_SERVICE,\nthen run "vagrant reload --provision"' - - # check if config.json exists, then check if the defaults are still in place - if [ -e config.json ]; - then - if grep -Fq 'ADMIN_EMAIL": "you@yours.com' config.json; - then - echo "$update_config"; - exit; - else - npm start - fi - else - cp config.json.example config.json; - echo "$update_config"; - exit; - fi -} - -# Main provisioning -echo Setting up Habitica... -echo cd /vagrant >> /home/vagrant/.bashrc -# Needed for running e2e tests -echo export DISPLAY=:99 >> /home/vagrant/.bashrc - -# Prevent warnings: "dpkg-preconfigure: unable to re-open stdin ..." -export DEBIAN_FRONTEND=noninteractive - -echo Updating repositories... -apt-get update -qq - -echo Installing Unix build tools - needed for node-gyp to use make... -apt-get install -qq build-essential - -echo Installing python software properties... -apt-get install -qq python-software-properties - -echo Installing sprite dependencies... -/vagrant/vagrant_scripts/install_sprite_dependencies.sh - -echo Installing Mongodb... -/vagrant/vagrant_scripts/install_mongo.sh - -echo Installing gcc... -/vagrant/vagrant_scripts/install_gcc.sh - -echo Installing Git... -apt-get install -qq git - -echo Installing curl... -apt-get install -qq curl - -echo Installing test dependencies... -/vagrant/vagrant_scripts/install_test_dependencies.sh - -echo Installing ntp... -apt-get install -qq ntp - -echo Installing nvm, node and global node modules... -/vagrant/vagrant_scripts/install_node.sh - -echo "'vagrant up' is finished. Continue with the instructions at http://habitica.fandom.com/wiki/Setting_up_Habitica_Locally" - -# Uncomment both lines to autostart the habitica server when provisioning -# echo Starting Habitica server... -# autostart_habitrpg - diff --git a/webpack/build.js b/webpack/build.js deleted file mode 100644 index 793784e55b..0000000000 --- a/webpack/build.js +++ /dev/null @@ -1,47 +0,0 @@ -/* global env:true, rm:true, mkdir:true, cp:true */ - -// https://github.com/shelljs/shelljs -require('shelljs/global'); - -const path = require('path'); -const config = require('./config'); -const ora = require('ora'); -const webpack = require('webpack'); -const webpackConfig = require('./webpack.prod.conf'); - -module.exports = function webpackProductionBuild (callback) { - env.NODE_ENV = 'production'; - - console.log( // eslint-disable-line no-console - ' Tip:\n' + - ' Built files are meant to be served over an HTTP server.\n' + - ' Opening index.html over file:// won\'t work.\n' - ); - - const spinner = ora('building for production...'); - spinner.start(); - - const assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory); - rm('-rf', assetsPath); - mkdir('-p', assetsPath); - cp('-R', config.build.staticAssetsDirectory, assetsPath); - - webpack(webpackConfig, (err, stats) => { - spinner.stop(); - - const output = `${stats.toString({ - colors: true, - modules: false, - children: false, - chunks: false, - chunkModules: false, - })}\n`; - - if (callback) { - return err ? callback(err) : callback(null, output); - } else { - if (err) throw err; - process.stdout.write(output); - } - }); -}; diff --git a/webpack/config/dev.env.js b/webpack/config/dev.env.js deleted file mode 100644 index 6c18ee1767..0000000000 --- a/webpack/config/dev.env.js +++ /dev/null @@ -1,6 +0,0 @@ -const merge = require('webpack-merge'); -const prodEnv = require('./prod.env'); - -module.exports = merge(prodEnv, { - NODE_ENV: '"development"', -}); diff --git a/webpack/config/index.js b/webpack/config/index.js deleted file mode 100644 index ca098d0a95..0000000000 --- a/webpack/config/index.js +++ /dev/null @@ -1,81 +0,0 @@ -// see http://vuejs-templates.github.io/webpack for documentation. -const path = require('path'); -const staticAssetsDirectory = './website/static/.'; // The folder where static files (not processed) live -const prodEnv = require('./prod.env'); -const devEnv = require('./dev.env'); -const nconf = require('nconf'); -const setupNconf = require('../../website/server/libs/setupNconf'); - -let configFile = path.join(path.resolve(__dirname, '../../config.json')); - -setupNconf(configFile); - -const DEV_BASE_URL = nconf.get('BASE_URL'); - -module.exports = { - build: { - env: prodEnv, - index: path.resolve(__dirname, '../../dist-client/index.html'), - assetsRoot: path.resolve(__dirname, '../../dist-client'), - assetsSubDirectory: 'static', - assetsPublicPath: '/', - staticAssetsDirectory, - productionSourceMap: true, - // Gzip off by default as many popular static hosts such as - // Surge or Netlify already gzip all static assets for you. - // Before setting to `true`, make sure to: - // npm install --save-dev compression-webpack-plugin - productionGzip: false, - productionGzipExtensions: ['js', 'css'], - // Run the build command with an extra argument to - // View the bundle analyzer report after build finishes: - // `npm run client:build --report` - // Set to `true` or `false` to always turn it on or off - bundleAnalyzerReport: process.env.npm_config_report, // eslint-disable-line no-process-env - }, - dev: { - env: devEnv, - port: 8080, - autoOpenBrowser: true, - assetsSubDirectory: 'static', - assetsPublicPath: '/', - staticAssetsDirectory, - proxyTable: { - // proxy all requests to the server at IP:PORT as specified in the top-level config - '/api/v3': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/api/v4': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/stripe': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/amazon': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/paypal': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/logout-server': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - '/export': { - target: DEV_BASE_URL, - changeOrigin: true, - }, - }, - // CSS Sourcemaps off by default because relative paths are "buggy" - // with this option, according to the CSS-Loader README - // (https://github.com/webpack/css-loader#sourcemaps) - // In our experience, they generally work as expected, - // just be aware of this issue when enabling this option. - cssSourceMap: false, - }, -}; diff --git a/webpack/config/prod.env.js b/webpack/config/prod.env.js deleted file mode 100644 index 7b89084678..0000000000 --- a/webpack/config/prod.env.js +++ /dev/null @@ -1,45 +0,0 @@ -const nconf = require('nconf'); -const { join, resolve } = require('path'); -const setupNconf = require('../../website/server/libs/setupNconf'); - -const PATH_TO_CONFIG = join(resolve(__dirname, '../../config.json')); -let configFile = PATH_TO_CONFIG; - -setupNconf(configFile); - -// @TODO: Check if we can import from client. Items like admin emails can be imported -// and that should be prefered - -// To avoid stringifying more data then we need, -// items from `env` used on the client will have to be specified in this array -// @TODO: Do we need? const CLIENT_VARS = ['language', 'isStaticPage', 'availableLanguages', 'translations', -// 'FACEBOOK_KEY', 'GOOGLE_CLIENT_ID', 'NODE_ENV', 'BASE_URL', 'GA_ID', -// 'AMAZON_PAYMENTS', 'STRIPE_PUB_KEY', 'AMPLITUDE_KEY', -// 'worldDmg', 'mods', 'IS_MOBILE']; - -const AMAZON_SELLER_ID = nconf.get('AMAZON_PAYMENTS_SELLER_ID'); -const AMAZON_CLIENT_ID = nconf.get('AMAZON_PAYMENTS_CLIENT_ID'); -const AMAZON_MODE = nconf.get('AMAZON_PAYMENTS_MODE'); - -let env = { - NODE_ENV: '"production"', - // clientVars: CLIENT_VARS, - AMAZON_PAYMENTS: { - SELLER_ID: `"${AMAZON_SELLER_ID}"`, - CLIENT_ID: `"${AMAZON_CLIENT_ID}"`, - MODE: `"${AMAZON_MODE}"`, - }, - EMAILS: { - COMMUNITY_MANAGER_EMAIL: `"${nconf.get('EMAILS_COMMUNITY_MANAGER_EMAIL')}"`, - TECH_ASSISTANCE_EMAIL: `"${nconf.get('EMAILS_TECH_ASSISTANCE_EMAIL')}"`, - PRESS_ENQUIRY_EMAIL: `"${nconf.get('EMAILS_PRESS_ENQUIRY_EMAIL')}"`, - }, -}; - -'NODE_ENV BASE_URL GA_ID STRIPE_PUB_KEY FACEBOOK_KEY GOOGLE_CLIENT_ID AMPLITUDE_KEY LOGGLY_CLIENT_TOKEN' - .split(' ') - .forEach(key => { - env[key] = `"${nconf.get(key)}"`; - }); - -module.exports = env; diff --git a/webpack/config/test.env.js b/webpack/config/test.env.js deleted file mode 100644 index 42e6329b71..0000000000 --- a/webpack/config/test.env.js +++ /dev/null @@ -1,6 +0,0 @@ -const merge = require('webpack-merge'); -const devEnv = require('./dev.env'); - -module.exports = merge(devEnv, { - NODE_ENV: '"test"', -}); diff --git a/webpack/dev-client.js b/webpack/dev-client.js deleted file mode 100644 index e81faee24c..0000000000 --- a/webpack/dev-client.js +++ /dev/null @@ -1,10 +0,0 @@ -/* global window:true */ - -require('eventsource-polyfill'); -const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true&overlay=false'); - -hotClient.subscribe(event => { - if (event.action === 'reload') { - window.location.reload(); - } -}); diff --git a/webpack/dev-server.js b/webpack/dev-server.js deleted file mode 100644 index aee1529044..0000000000 --- a/webpack/dev-server.js +++ /dev/null @@ -1,72 +0,0 @@ -/* eslint-disable no-process-env, no-console */ - -const path = require('path'); -const express = require('express'); -const webpack = require('webpack'); -const config = require('./config'); - -if (!process.env.NODE_ENV) { - process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV); -} - -const proxyMiddleware = require('http-proxy-middleware'); -const webpackConfig = process.env.NODE_ENV === 'test' ? - require('./webpack.prod.conf') : - require('./webpack.dev.conf'); - -// default port where dev server listens for incoming traffic -const port = process.env.PORT || config.dev.port; -// Define HTTP proxies to your custom API backend -// https://github.com/chimurai/http-proxy-middleware -const proxyTable = config.dev.proxyTable; - -const app = express(); -const compiler = webpack(webpackConfig); - -const devMiddleware = require('webpack-dev-middleware')(compiler, { - publicPath: webpackConfig.output.publicPath, - stats: { - colors: true, - chunks: false, - }, -}); - -const hotMiddleware = require('webpack-hot-middleware')(compiler); -// force page reload when html-webpack-plugin template changes -compiler.plugin('compilation', (compilation) => { - compilation.plugin('html-webpack-plugin-after-emit', (data, cb) => { - hotMiddleware.publish({ action: 'reload' }); - cb(); - }); -}); - -// proxy api requests -Object.keys(proxyTable).forEach((context) => { - let options = proxyTable[context]; - if (typeof options === 'string') { - options = { target: options }; - } - app.use(proxyMiddleware(options.filter || context, options)); -}); - -// handle fallback for HTML5 history API -app.use(require('connect-history-api-fallback')()); - -// serve webpack bundle output -app.use(devMiddleware); - -// enable hot-reload and state-preserving -// compilation error display -app.use(hotMiddleware); - -// serve pure static assets -const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory); -app.use(staticPath, express.static(config.dev.staticAssetsDirectory)); - -module.exports = app.listen(port, (err) => { - if (err) { - console.log(err); - return; - } - console.log(`Listening at http://localhost:${port}\n`); -}); diff --git a/webpack/utils.js b/webpack/utils.js deleted file mode 100644 index 5bf7fabe28..0000000000 --- a/webpack/utils.js +++ /dev/null @@ -1,66 +0,0 @@ -/* eslint-disable no-process-env, no-console */ - -const path = require('path'); -const config = require('./config'); -const ExtractTextPlugin = require('extract-text-webpack-plugin'); - -exports.assetsPath = (_path) => { - const assetsSubDirectory = process.env.NODE_ENV === 'production' ? - config.build.assetsSubDirectory : - config.dev.assetsSubDirectory; - return path.posix.join(assetsSubDirectory, _path); -}; - -exports.cssLoaders = function cssLoaders (options) { - options = options || {}; - // generate loader string to be used with extract text plugin - function generateLoaders (loaders) { - let sourceLoader = loaders.map((loader) => { - let extraParamChar; - if (/\?/.test(loader)) { - loader = loader.replace(/\?/, '-loader?'); - extraParamChar = '&'; - } else { - loader = `${loader}-loader`; - extraParamChar = '?'; - } - return loader + (options.sourceMap ? `${extraParamChar}sourceMap` : ''); - }).join('!'); - - // Extract CSS when that option is specified - // (which is the case during production build) - if (options.extract) { - return ExtractTextPlugin.extract({ - use: sourceLoader, - fallback: 'vue-style-loader', - }); - } else { - return ['vue-style-loader', sourceLoader].join('!'); - } - } - - // http://vuejs.github.io/vue-loader/en/configurations/extract-css.html - return { - css: generateLoaders(['css']), - postcss: generateLoaders(['css']), - less: generateLoaders(['css', 'less']), - sass: generateLoaders(['css', 'sass?indentedSyntax']), - scss: generateLoaders(['css', 'sass']), - stylus: generateLoaders(['css', 'stylus']), - styl: generateLoaders(['css', 'stylus']), - }; -}; - -// Generate loaders for standalone style files (outside of .vue) -exports.styleLoaders = (options) => { - const output = []; - const loaders = exports.cssLoaders(options); - for (let extension in loaders) { - const loader = loaders[extension]; - output.push({ - test: new RegExp(`\\.${extension}$`), - loader, - }); - } - return output; -}; diff --git a/webpack/webpack.base.conf.js b/webpack/webpack.base.conf.js deleted file mode 100644 index fcc86bc21b..0000000000 --- a/webpack/webpack.base.conf.js +++ /dev/null @@ -1,154 +0,0 @@ -/* eslint-disable no-process-env, no-console */ - -const path = require('path'); -const config = require('./config'); -const utils = require('./utils'); -const webpack = require('webpack'); -const projectRoot = path.resolve(__dirname, '../'); -const autoprefixer = require('autoprefixer'); -const postcssEasyImport = require('postcss-easy-import'); -const IS_PROD = process.env.NODE_ENV === 'production'; - -const baseConfig = { - entry: { - app: ['babel-polyfill', './website/client/main.js'], - }, - output: { - path: config.build.assetsRoot, - publicPath: IS_PROD ? config.build.assetsPublicPath : config.dev.assetsPublicPath, - filename: '[name].js', - devtoolModuleFilenameTemplate (info) { - // Fix source maps, code from - // https://github.com/Darkside73/bbsmile.com.ua/commit/3596d3c42ef91b69d8380359c3e8908edc08acdb - let filename = info.resourcePath; - if (info.resource.match(/\.vue$/) && !info.allLoaders.match(/type=script/)) { - filename = 'generated'; - } - - return filename; - }, - }, - resolve: { - extensions: ['*', '.js', '.vue', '.json'], - modules: [ - path.join(projectRoot, 'website'), - path.join(projectRoot, 'test/client/unit'), - path.join(projectRoot, 'node_modules'), - ], - alias: { - website: path.resolve(projectRoot, 'website'), - common: path.resolve(projectRoot, 'website/common'), - client: path.resolve(projectRoot, 'website/client'), - assets: path.resolve(projectRoot, 'website/client/assets'), - components: path.resolve(projectRoot, 'website/client/components'), - }, - }, - plugins: [ - new webpack.ContextReplacementPlugin(/moment[\\\/]locale$/, /^\.\/(NOT_EXISTING)$/), - ], - module: { - rules: [ - { - test: /\.vue$/, - loader: 'vue-loader', - options: { - loaders: utils.cssLoaders({ - sourceMap: IS_PROD ? - config.build.productionSourceMap : - config.dev.cssSourceMap, - extract: IS_PROD, - }), - postcss: [ - autoprefixer({ - overrideBrowserslist: ['last 2 versions'], - }), - postcssEasyImport(), - ], - }, - }, - { - test: /\.js$/, - loader: 'babel-loader', - include: [ - path.join(projectRoot, 'test'), - path.join(projectRoot, 'website'), - path.join(projectRoot, 'node_modules', 'bootstrap-vue'), - ], - options: { - cacheDirectory: true, - }, - }, - { - test: /\.(png|jpe?g|gif)(\?.*)?$/, - loader: 'url-loader', - query: { - limit: 10000, - name: utils.assetsPath('images/[name].[hash:7].[ext]'), - }, - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader', - query: { - limit: 10000, - name: utils.assetsPath('fonts/[name].[hash:7].[ext]'), - }, - }, - { - test: /\.svg$/, - use: [ - { loader: 'svg-inline-loader' }, - { - loader: 'svgo-loader', - options: { - plugins: [ - {removeViewBox: false}, - {convertPathData: {noSpaceAfterFlags: false}}, - ], - }, - }, - ], - exclude: [path.resolve(projectRoot, 'website/client/assets/svg/for-css')], - }, - { - test: /\.svg$/, - use: [ - { - loader: 'svg-url-loader', - options: { - limit: 10000, - name: utils.assetsPath('svg/[name].[hash:7].[ext]'), - }, - }, - { - loader: 'svgo-loader', - options: { - plugins: [ - {removeViewBox: false}, - {convertPathData: {noSpaceAfterFlags: false}}, - ], - }, - }, - ], - include: [path.resolve(projectRoot, 'website/client/assets/svg/for-css')], - }, - ], - }, -}; - -if (!IS_PROD) { - const eslintFriendlyFormatter = require('eslint-friendly-formatter'); // eslint-disable-line global-require - - baseConfig.module.rules.unshift({ - test: /\.(js|vue)$/, - loader: 'eslint-loader', - enforce: 'pre', - include: projectRoot, - options: { - formatter: eslintFriendlyFormatter, - emitWarning: true, - }, - exclude: /node_modules/, - }); -} -module.exports = baseConfig; \ No newline at end of file diff --git a/webpack/webpack.dev.conf.js b/webpack/webpack.dev.conf.js deleted file mode 100644 index 75d6741d08..0000000000 --- a/webpack/webpack.dev.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -const config = require('./config'); -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const utils = require('./utils'); -const baseWebpackConfig = require('./webpack.base.conf'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -// add hot-reload related code to entry chunks -Object.keys(baseWebpackConfig.entry).forEach((name) => { - baseWebpackConfig.entry[name] = baseWebpackConfig.entry[name].concat('./webpack/dev-client'); -}); - -module.exports = merge(baseWebpackConfig, { - module: { - rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }), - }, - // cheap-module-eval-source-map is faster for development - devtool: '#cheap-module-eval-source-map', - plugins: [ - new webpack.DefinePlugin({ - 'process.env': config.dev.env, - }), - // https://github.com/glenjamin/webpack-hot-middleware#installation--usage - new webpack.HotModuleReplacementPlugin(), - // https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: 'index.html', - template: './website/client/index.html', - inject: true, - }), - ], -}); diff --git a/webpack/webpack.prod.conf.js b/webpack/webpack.prod.conf.js deleted file mode 100644 index 5ee916508e..0000000000 --- a/webpack/webpack.prod.conf.js +++ /dev/null @@ -1,101 +0,0 @@ -/* eslint-disable no-process-env, no-console */ - -const path = require('path'); -const config = require('./config'); -const utils = require('./utils'); -const webpack = require('webpack'); -const merge = require('webpack-merge'); -const baseWebpackConfig = require('./webpack.base.conf'); -const ExtractTextPlugin = require('extract-text-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const env = process.env.NODE_ENV === 'test' ? - require('./config/test.env') : - config.build.env; - -const webpackConfig = merge(baseWebpackConfig, { - module: { - rules: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true }), - }, - devtool: config.build.productionSourceMap ? '#source-map' : false, - output: { - path: config.build.assetsRoot, - filename: utils.assetsPath('js/[name].[chunkhash].js'), - chunkFilename: utils.assetsPath('js/[id].[chunkhash].js'), - }, - plugins: [ - // http://vuejs.github.io/vue-loader/workflow/production.html - new webpack.DefinePlugin({ - 'process.env': env, - }), - new webpack.optimize.UglifyJsPlugin({ - compress: { - warnings: false, - }, - sourceMap: true, - }), - // extract css into its own file - new ExtractTextPlugin({ - filename: utils.assetsPath('css/[name].[contenthash].css'), - }), - // generate dist index.html with correct asset hash for caching. - // you can customize output by editing /index.html - // see https://github.com/ampedandwired/html-webpack-plugin - new HtmlWebpackPlugin({ - filename: process.env.NODE_ENV === 'test' ? - 'index.html' : - config.build.index, - template: './website/client/index.html', - inject: true, - minify: { - removeComments: true, - collapseWhitespace: true, - removeAttributeQuotes: true, - // more options: - // https://github.com/kangax/html-minifier#options-quick-reference - }, - // necessary to consistently work with multiple chunks via CommonsChunkPlugin - chunksSortMode: 'dependency', - }), - // split vendor js into its own file - new webpack.optimize.CommonsChunkPlugin({ - name: 'vendor', - minChunks (scriptModule) { - // any required modules inside node_modules are extracted to vendor - return ( - scriptModule.resource && - /\.js$/.test(scriptModule.resource) && - scriptModule.resource.indexOf( - path.join(__dirname, '../node_modules') - ) === 0 - ); - }, - }), - // extract webpack runtime and module manifest to its own file in order to - // prevent vendor hash from being updated whenever app bundle is updated - new webpack.optimize.CommonsChunkPlugin({ - name: 'manifest', - chunks: ['vendor'], - }), - ], -}); - -if (config.build.productionGzip) { - const CompressionWebpackPlugin = require('compression-webpack-plugin'); // eslint-disable-line global-require - - webpackConfig.plugins.push( - new CompressionWebpackPlugin({ - asset: '[path].gz[query]', - algorithm: 'gzip', - test: new RegExp(`\\.(${config.build.productionGzipExtensions.join('|')})$`), - threshold: 10240, - minRatio: 0.8, - }) - ); -} - -if (config.build.bundleAnalyzerReport) { - const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; // eslint-disable-line global-require - webpackConfig.plugins.push(new BundleAnalyzerPlugin()); -} - -module.exports = webpackConfig; diff --git a/webpack/webpack.test.conf.js b/webpack/webpack.test.conf.js deleted file mode 100644 index 16327ea609..0000000000 --- a/webpack/webpack.test.conf.js +++ /dev/null @@ -1,24 +0,0 @@ -// This is the webpack config used for unit tests. -const merge = require('webpack-merge'); -const baseConfig = require('./webpack.base.conf'); -const utils = require('./utils'); -const webpack = require('webpack'); -const testEnv = require('./config/test.env'); - -const webpackConfig = merge(baseConfig, { - // use inline sourcemap for karma-sourcemap-loader - module: { - rules: utils.styleLoaders(), - }, - devtool: '#inline-source-map', - plugins: [ - new webpack.DefinePlugin({ - 'process.env': testEnv, - }), - ], -}); - -// no need for app entry during tests -delete webpackConfig.entry; - -module.exports = webpackConfig; diff --git a/website/client/.babelrc b/website/client/.babelrc deleted file mode 100644 index 9f639b0b76..0000000000 --- a/website/client/.babelrc +++ /dev/null @@ -1,21 +0,0 @@ -{ - "env": { - "test": { - "presets": [ - ["es2015"], - ], - plugins: [ - ["istanbul"], - ], - }, - }, - "presets": [ - ["es2015", { modules: false }] - ], - "plugins": [ - "transform-object-rest-spread", - "syntax-async-functions", - "syntax-dynamic-import", - "transform-regenerator", - ], -} \ No newline at end of file diff --git a/website/client/.browserslistrc b/website/client/.browserslistrc new file mode 100644 index 0000000000..d6471a38cc --- /dev/null +++ b/website/client/.browserslistrc @@ -0,0 +1,2 @@ +> 1% +last 2 versions diff --git a/website/client/.eslintrc b/website/client/.eslintrc deleted file mode 100644 index 124afd6036..0000000000 --- a/website/client/.eslintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": [ - "habitrpg/browser", - "habitrpg/esnext" - ], - "plugins": [ - "html" - ], - "parser": "babel-eslint", - "rules": { - "strict": 0 - } -} \ No newline at end of file diff --git a/website/client/.eslintrc.js b/website/client/.eslintrc.js new file mode 100644 index 0000000000..c2c98055e6 --- /dev/null +++ b/website/client/.eslintrc.js @@ -0,0 +1,30 @@ +/* eslint-disable import/no-commonjs */ +module.exports = { + root: true, + env: { + node: true, + }, + extends: [ + 'habitrpg/lib/vue', + ], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', + // TODO find a way to let eslint understand webpack aliases + 'import/no-unresolved': 'off', + 'vue/no-v-html': 'off', + 'vue/html-self-closing': ['error', { + html: { + void: 'never', + // Otherwise it results in self closing span(s) and div(s) + normal: 'never', + component: 'always', + }, + svg: 'never', + math: 'never', + }], + }, + parserOptions: { + parser: 'babel-eslint', + }, +}; diff --git a/website/client/README.md b/website/client/README.md index 435b1f5c1e..ce696e5f20 100644 --- a/website/client/README.md +++ b/website/client/README.md @@ -1,21 +1,29 @@ -# Running -For information about installing and running Habitica locally, see [Setting up Habitica Locally](http://habitica.fandom.com/wiki/Setting_up_Habitica_Locally). +# new_client -# Preparation Reading -- Vue 2 (https://vuejs.org) +## Project setup +``` +npm install +``` -- Webpack (https://webpack.github.io/) is the build system and it includes plugins for code transformation, right now we have: BabelJS for ES6 transpilation, eslint for code style, less and postcss for css compilation. The code comes from https://github.com/vuejs-templates/webpack which is a Webpack template for Vue, with some small modifications to adapt it to our use case. Docs http://vuejs-templates.github.io/webpack/ +### Compiles and hot-reloads for development +``` +npm run serve +``` -- We're using `.vue` files that make it possible to have HTML, JS and CSS for each component together in a single location. They're implemented as a webpack plugin and the docs can be found here http://vue-loader.vuejs.org/en/ +### Compiles and minifies for production +``` +npm run build +``` -- SemanticUI is the UI framework http://semantic-ui.com/. So far I've only used the CSS part, it also has JS plugins but I've yet to use them. It supports theming so if it's not too difficult we'll want to customize the base theme with our own styles instead of writing CSS rules to override the original styling. +### Run your unit tests +``` +npm run test:unit +``` -The code is in `/website/client`. We're using something very similar to Vuex (equivalent of React's Redux) for state management http://vuex.vuejs.org/en/index.html +### Lints and fixes files +``` +npm run lint +``` -The API is almost the same except that we don't use mutations but only actions because it would make it difficult to work with common code - -The project is developed directly in the `develop` branch as long as we'll be able to avoid splitting it into a different branch. - -So far most of the work has been on the template, so there's no complex logic to understand. The only thing I would suggest you to read about is Vuex for data management: it's basically a Flux implementation: there's a central store that hold the data for the entire app, and every change to the data must happen through an action, the data cannot be mutated directly. - -For further resources, see [Guidance for Blacksmiths](http://habitica.fandom.com/wiki/Guidance_for_Blacksmiths), and in particular the ["Website Technology Stack" section](http://habitica.fandom.com/wiki/Guidance_for_Blacksmiths#Website_Technology_Stack). +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css deleted file mode 100644 index 2102e7541f..0000000000 --- a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css +++ /dev/null @@ -1,66 +0,0 @@ -.promo_armoire_backgrounds_201910 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -190px; - width: 423px; - height: 147px; -} -.promo_costume_achievement { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -734px 0px; - width: 144px; - height: 156px; -} -.promo_desert_pet_achievements { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -634px; - width: 204px; - height: 102px; -} -.promo_fall_festival_2018 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -361px 0px; - width: 372px; - height: 180px; -} -.promo_fall_festival_2019 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px 0px; - width: 360px; - height: 189px; -} -.promo_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -190px; - width: 282px; - height: 147px; -} -.promo_seasonal_shop_fall { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -486px; - width: 162px; - height: 138px; -} -.promo_shadow_spooky_potions { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -486px; - width: 423px; - height: 147px; -} -.promo_spooky_sparkles { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -338px; - width: 423px; - height: 147px; -} -.promo_take_this { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -734px -157px; - width: 96px; - height: 69px; -} -.scene_strength { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -338px; - width: 192px; - height: 129px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-10.css b/website/client/assets/css/sprites/spritesmith-main-10.css deleted file mode 100644 index 29a13cc081..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-10.css +++ /dev/null @@ -1,2232 +0,0 @@ -.broad_armor_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px 0px; - width: 116px; - height: 119px; -} -.broad_armor_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -230px -890px; - width: 114px; - height: 90px; -} -.broad_armor_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -234px -120px; - width: 116px; - height: 119px; -} -.broad_armor_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -575px -890px; - width: 114px; - height: 90px; -} -.broad_armor_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px 0px; - width: 90px; - height: 105px; -} -.broad_armor_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -212px; - width: 90px; - height: 105px; -} -.broad_armor_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -637px; - width: 111px; - height: 90px; -} -.broad_armor_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -273px; - width: 111px; - height: 90px; -} -.eyewear_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -708px; - width: 111px; - height: 90px; -} -.eyewear_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -546px; - width: 111px; - height: 90px; -} -.head_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -91px; - width: 90px; - height: 90px; -} -.head_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1274px -1251px; - width: 90px; - height: 90px; -} -.head_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -602px; - width: 102px; - height: 105px; -} -.head_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -318px; - width: 90px; - height: 105px; -} -.head_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -910px -1251px; - width: 90px; - height: 90px; -} -.head_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -728px -1251px; - width: 90px; - height: 90px; -} -.head_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -343px -240px; - width: 108px; - height: 108px; -} -.head_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -546px -1251px; - width: 90px; - height: 90px; -} -.head_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -481px; - width: 114px; - height: 102px; -} -.head_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -819px -1160px; - width: 90px; - height: 90px; -} -.head_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px -212px; - width: 105px; - height: 105px; -} -.head_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -575px -481px; - width: 114px; - height: 90px; -} -.head_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -583px 0px; - width: 114px; - height: 120px; -} -.head_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -583px -121px; - width: 114px; - height: 120px; -} -.head_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -890px; - width: 114px; - height: 90px; -} -.head_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -360px; - width: 114px; - height: 120px; -} -.head_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -117px 0px; - width: 116px; - height: 119px; -} -.head_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px 0px; - width: 114px; - height: 90px; -} -.head_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -351px 0px; - width: 116px; - height: 119px; -} -.head_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -799px; - width: 114px; - height: 90px; -} -.head_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -530px; - width: 90px; - height: 105px; -} -.head_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -424px; - width: 90px; - height: 105px; -} -.head_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -182px; - width: 111px; - height: 90px; -} -.head_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -805px -799px; - width: 111px; - height: 90px; -} -.shield_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -273px -1251px; - width: 90px; - height: 90px; -} -.shield_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -412px -602px; - width: 102px; - height: 105px; -} -.shield_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -318px; - width: 90px; - height: 105px; -} -.shield_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -455px -1251px; - width: 90px; - height: 90px; -} -.shield_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -234px -240px; - width: 108px; - height: 108px; -} -.shield_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px -424px; - width: 102px; - height: 105px; -} -.shield_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -481px; - width: 114px; - height: 102px; -} -.shield_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px -106px; - width: 105px; - height: 105px; -} -.shield_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -799px; - width: 114px; - height: 90px; -} -.shield_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -230px -360px; - width: 114px; - height: 120px; -} -.shield_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -637px; - width: 114px; - height: 90px; -} -.shield_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -583px -242px; - width: 114px; - height: 120px; -} -.shield_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -120px; - width: 116px; - height: 119px; -} -.shield_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -618px -602px; - width: 114px; - height: 90px; -} -.shield_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -117px -120px; - width: 116px; - height: 119px; -} -.shield_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -708px; - width: 114px; - height: 90px; -} -.shield_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -212px; - width: 90px; - height: 105px; -} -.shield_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -455px; - width: 111px; - height: 90px; -} -.shield_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -728px; - width: 111px; - height: 90px; -} -.shop_armor_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1173px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1104px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1035px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -966px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -897px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -828px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -759px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -1001px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -552px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -483px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -414px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -276px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -207px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -138px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -69px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1380px; - width: 68px; - height: 68px; -} -.shop_armor_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1311px; - width: 68px; - height: 68px; -} -.shop_armor_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1242px; - width: 68px; - height: 68px; -} -.shop_armor_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1173px; - width: 68px; - height: 68px; -} -.shop_armor_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1104px; - width: 68px; - height: 68px; -} -.shop_armor_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -1035px; - width: 68px; - height: 68px; -} -.shop_body_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -966px; - width: 68px; - height: 68px; -} -.shop_body_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -897px; - width: 68px; - height: 68px; -} -.shop_body_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -828px; - width: 68px; - height: 68px; -} -.shop_body_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -759px; - width: 68px; - height: 68px; -} -.shop_body_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -690px; - width: 68px; - height: 68px; -} -.shop_body_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -621px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -552px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -483px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -414px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -345px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -276px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -207px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -138px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px -69px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1510px 0px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1380px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1311px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1242px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1173px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1104px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1035px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -966px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -897px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -828px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -759px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -621px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -552px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -483px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -414px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -1411px; - width: 68px; - height: 68px; -} -.shop_head_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -276px -1411px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -207px -1411px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -138px -1411px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -69px -1411px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1411px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1380px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1311px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1242px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1173px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1104px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1035px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -966px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -897px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -828px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -759px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -621px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -552px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -483px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1342px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1157px -1069px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1012px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -943px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -874px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -805px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -736px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -667px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -598px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -529px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -391px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -322px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -253px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -184px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -981px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -733px -602px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px -530px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -728px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -819px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -1076px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -1208px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -1139px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -621px -1480px; - width: 68px; - height: 68px; -} -.shop_weapon_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -1070px; - width: 68px; - height: 68px; -} -.slim_armor_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -1001px; - width: 90px; - height: 90px; -} -.slim_armor_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -1092px; - width: 90px; - height: 90px; -} -.slim_armor_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -309px -602px; - width: 102px; - height: 105px; -} -.slim_armor_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -742px; - width: 90px; - height: 105px; -} -.slim_armor_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -848px; - width: 90px; - height: 105px; -} -.slim_armor_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -954px; - width: 90px; - height: 105px; -} -.slim_armor_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -819px; - width: 90px; - height: 105px; -} -.slim_armor_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -206px -602px; - width: 102px; - height: 105px; -} -.slim_armor_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -583px -363px; - width: 114px; - height: 105px; -} -.slim_armor_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -637px -1251px; - width: 90px; - height: 90px; -} -.slim_armor_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px 0px; - width: 105px; - height: 105px; -} -.slim_armor_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -455px; - width: 114px; - height: 90px; -} -.slim_armor_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -481px; - width: 114px; - height: 120px; -} -.slim_armor_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -468px -121px; - width: 114px; - height: 120px; -} -.slim_armor_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -364px; - width: 114px; - height: 90px; -} -.slim_armor_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -360px; - width: 114px; - height: 120px; -} -.slim_armor_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -240px; - width: 116px; - height: 119px; -} -.slim_armor_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -182px; - width: 114px; - height: 90px; -} -.slim_armor_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -351px -120px; - width: 116px; - height: 119px; -} -.slim_armor_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -708px; - width: 114px; - height: 90px; -} -.slim_armor_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -106px; - width: 90px; - height: 105px; -} -.slim_armor_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -636px; - width: 90px; - height: 105px; -} -.slim_armor_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -364px; - width: 111px; - height: 90px; -} -.slim_armor_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -920px -890px; - width: 111px; - height: 90px; -} -.weapon_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -637px; - width: 90px; - height: 90px; -} -.weapon_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -728px; - width: 90px; - height: 90px; -} -.weapon_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -103px -602px; - width: 102px; - height: 105px; -} -.weapon_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -424px; - width: 90px; - height: 105px; -} -.weapon_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -910px; - width: 90px; - height: 90px; -} -.weapon_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -819px; - width: 90px; - height: 90px; -} -.weapon_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -468px -242px; - width: 108px; - height: 108px; -} -.weapon_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -515px -602px; - width: 102px; - height: 105px; -} -.weapon_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -230px -481px; - width: 114px; - height: 102px; -} -.weapon_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1069px; - width: 105px; - height: 90px; -} -.weapon_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -698px -318px; - width: 105px; - height: 105px; -} -.weapon_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -890px; - width: 114px; - height: 90px; -} -.weapon_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -360px; - width: 114px; - height: 120px; -} -.weapon_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -360px; - width: 114px; - height: 120px; -} -.weapon_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -805px -890px; - width: 114px; - height: 90px; -} -.weapon_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -468px 0px; - width: 114px; - height: 120px; -} -.weapon_special_summer2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -234px 0px; - width: 116px; - height: 119px; -} -.weapon_special_summer2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -890px; - width: 114px; - height: 90px; -} -.weapon_special_summer2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -117px -240px; - width: 116px; - height: 119px; -} -.weapon_special_summer2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -890px; - width: 114px; - height: 90px; -} -.weapon_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px 0px; - width: 90px; - height: 105px; -} -.weapon_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1146px -106px; - width: 90px; - height: 105px; -} -.weapon_special_summerRogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px -91px; - width: 111px; - height: 90px; -} -.weapon_special_summerWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1034px 0px; - width: 111px; - height: 90px; -} -.back_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -981px; - width: 114px; - height: 87px; -} -.body_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -273px -1160px; - width: 90px; - height: 90px; -} -.broad_armor_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -819px; - width: 90px; - height: 90px; -} -.head_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -91px -1160px; - width: 90px; - height: 90px; -} -.shield_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -881px -1069px; - width: 93px; - height: 90px; -} -.shop_armor_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -69px -1342px; - width: 68px; - height: 68px; -} -.shop_back_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -138px -1342px; - width: 68px; - height: 68px; -} -.shop_body_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -207px -1342px; - width: 68px; - height: 68px; -} -.shop_head_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -276px -1342px; - width: 68px; - height: 68px; -} -.shop_shield_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -1342px; - width: 68px; - height: 68px; -} -.shop_weapon_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -414px -1342px; - width: 68px; - height: 68px; -} -.slim_armor_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1066px -1069px; - width: 90px; - height: 90px; -} -.weapon_special_takeThis { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -975px -1069px; - width: 90px; - height: 90px; -} -.broad_armor_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -894px; - width: 90px; - height: 90px; -} -.broad_armor_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -803px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -712px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -621px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -502px -1069px; - width: 96px; - height: 90px; -} -.broad_armor_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -910px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -787px -1069px; - width: 93px; - height: 90px; -} -.broad_armor_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -546px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -455px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -364px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -273px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px -182px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1419px 0px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1183px -1251px; - width: 90px; - height: 90px; -} -.broad_armor_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -890px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -728px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -273px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -546px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -455px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -364px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -273px; - width: 114px; - height: 90px; -} -.broad_armor_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -182px; - width: 114px; - height: 90px; -} -.broad_armor_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1251px; - width: 90px; - height: 90px; -} -.head_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -728px; - width: 90px; - height: 90px; -} -.head_special_nye { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -637px; - width: 90px; - height: 90px; -} -.head_special_nye2014 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -546px; - width: 90px; - height: 90px; -} -.head_special_nye2015 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -455px; - width: 90px; - height: 90px; -} -.head_special_nye2016 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -364px; - width: 90px; - height: 90px; -} -.head_special_nye2017 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -273px; - width: 90px; - height: 90px; -} -.head_special_nye2018 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -919px -91px; - width: 114px; - height: 90px; -} -.head_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -91px; - width: 90px; - height: 90px; -} -.head_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px 0px; - width: 90px; - height: 90px; -} -.head_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1183px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1092px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -405px -1069px; - width: 96px; - height: 90px; -} -.head_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -910px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -693px -1069px; - width: 93px; - height: 90px; -} -.head_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -728px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -637px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -546px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -455px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -364px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -182px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1160px; - width: 90px; - height: 90px; -} -.head_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -575px -799px; - width: 114px; - height: 90px; -} -.head_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -799px; - width: 114px; - height: 90px; -} -.head_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -799px; - width: 114px; - height: 90px; -} -.head_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -230px -799px; - width: 114px; - height: 90px; -} -.head_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -115px -799px; - width: 114px; - height: 90px; -} -.head_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -481px; - width: 114px; - height: 90px; -} -.head_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -637px; - width: 114px; - height: 90px; -} -.head_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -546px; - width: 114px; - height: 90px; -} -.head_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -182px -1251px; - width: 90px; - height: 90px; -} -.shield_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -106px -1069px; - width: 104px; - height: 90px; -} -.shield_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1328px -182px; - width: 90px; - height: 90px; -} -.shield_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1001px -1160px; - width: 90px; - height: 90px; -} -.shield_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -211px -1069px; - width: 96px; - height: 90px; -} -.shield_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1237px -530px; - width: 90px; - height: 90px; -} -.shield_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -599px -1069px; - width: 93px; - height: 90px; -} -.shield_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1092px -1251px; - width: 90px; - height: 90px; -} -.shield_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1001px -1251px; - width: 90px; - height: 90px; -} -.shield_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -819px -1251px; - width: 90px; - height: 90px; -} -.shield_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -308px -1069px; - width: 96px; - height: 90px; -} -.shield_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -364px -1251px; - width: 90px; - height: 90px; -} -.shield_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px -91px; - width: 114px; - height: 90px; -} -.shield_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -804px 0px; - width: 114px; - height: 90px; -} -.shield_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -575px -708px; - width: 114px; - height: 90px; -} -.shield_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -460px -708px; - width: 114px; - height: 90px; -} -.shield_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -708px; - width: 114px; - height: 90px; -} -.shield_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -230px -708px; - width: 114px; - height: 90px; -} -.shield_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -91px -1251px; - width: 90px; - height: 90px; -} -.shop_armor_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1242px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1311px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1380px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1449px -1480px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px 0px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -69px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -138px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -207px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -276px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -345px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -414px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -483px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -552px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -621px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -690px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -759px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -828px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -897px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -966px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1035px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1104px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1173px; - width: 68px; - height: 68px; -} -.shop_armor_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1242px; - width: 68px; - height: 68px; -} -.shop_armor_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1311px; - width: 68px; - height: 68px; -} -.shop_head_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1380px; - width: 68px; - height: 68px; -} -.shop_head_special_nye { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1579px -1449px; - width: 68px; - height: 68px; -} -.shop_head_special_nye2014 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_nye2015 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -69px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_nye2016 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -138px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_nye2017 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -207px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_nye2018 { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -276px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -414px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -483px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -552px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -621px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -759px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -828px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -897px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -966px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1035px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1104px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1173px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1242px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1311px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1380px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1449px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1518px -1549px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px 0px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -69px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -138px; - width: 68px; - height: 68px; -} -.shop_head_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -207px; - width: 68px; - height: 68px; -} -.shop_head_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -276px; - width: 68px; - height: 68px; -} -.shop_shield_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -345px; - width: 68px; - height: 68px; -} -.shop_shield_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -414px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -483px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -552px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -621px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -690px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -759px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -828px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -897px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -966px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1035px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1104px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1173px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1242px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1311px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1380px; - width: 68px; - height: 68px; -} -.shop_shield_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1449px; - width: 68px; - height: 68px; -} -.shop_shield_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -1648px -1518px; - width: 68px; - height: 68px; -} -.shop_weapon_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: 0px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -69px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -138px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -207px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -276px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -345px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -414px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -483px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -552px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -621px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -690px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -759px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -828px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -897px -1618px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-10.png'); - background-position: -966px -1618px; - width: 68px; - height: 68px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-11.css b/website/client/assets/css/sprites/spritesmith-main-11.css deleted file mode 100644 index 706f14a9ac..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-11.css +++ /dev/null @@ -1,2640 +0,0 @@ -.shop_weapon_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1572px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -684px -1274px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -276px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1572px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -552px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -414px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -345px; - width: 68px; - height: 68px; -} -.shop_weapon_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -276px; - width: 68px; - height: 68px; -} -.shop_weapon_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -207px; - width: 68px; - height: 68px; -} -.slim_armor_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1001px -1001px; - width: 90px; - height: 90px; -} -.slim_armor_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px 0px; - width: 90px; - height: 90px; -} -.slim_armor_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -1092px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -1092px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -1092px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -400px; - width: 96px; - height: 90px; -} -.slim_armor_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1183px -1183px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -511px -637px; - width: 93px; - height: 90px; -} -.slim_armor_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -91px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -182px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -273px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -364px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -455px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -546px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px -637px; - width: 90px; - height: 90px; -} -.slim_armor_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -182px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px -182px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px -182px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px 0px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -91px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -182px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -273px; - width: 114px; - height: 90px; -} -.slim_armor_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px -273px; - width: 114px; - height: 90px; -} -.slim_armor_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_candycane { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_ski { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_snowflake { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_winter2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -910px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_winter2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1092px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_winter2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -637px; - width: 96px; - height: 90px; -} -.weapon_special_winter2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -182px; - width: 90px; - height: 90px; -} -.weapon_special_winter2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -605px -637px; - width: 93px; - height: 90px; -} -.weapon_special_winter2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -637px; - width: 90px; - height: 90px; -} -.weapon_special_winter2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -819px; - width: 90px; - height: 90px; -} -.weapon_special_winter2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -1001px; - width: 90px; - height: 90px; -} -.weapon_special_winter2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_winter2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -1183px; - width: 90px; - height: 90px; -} -.weapon_special_winter2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1274px; - width: 90px; - height: 90px; -} -.weapon_special_winter2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -760px 0px; - width: 90px; - height: 90px; -} -.weapon_special_winter2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -364px; - width: 114px; - height: 90px; -} -.weapon_special_winter2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px -364px; - width: 114px; - height: 90px; -} -.weapon_special_winter2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px -364px; - width: 114px; - height: 90px; -} -.weapon_special_winter2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -364px; - width: 114px; - height: 90px; -} -.weapon_special_winter2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px 0px; - width: 114px; - height: 90px; -} -.weapon_special_winter2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px -91px; - width: 114px; - height: 90px; -} -.weapon_special_winter2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px 0px; - width: 114px; - height: 90px; -} -.weapon_special_winter2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px -273px; - width: 114px; - height: 90px; -} -.weapon_special_yeti { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -728px; - width: 90px; - height: 90px; -} -.back_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -728px; - width: 90px; - height: 90px; -} -.back_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -728px; - width: 90px; - height: 90px; -} -.body_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -728px; - width: 90px; - height: 90px; -} -.body_special_wondercon_gold { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -728px; - width: 90px; - height: 90px; -} -.body_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -728px; - width: 90px; - height: 90px; -} -.eyewear_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -728px; - width: 90px; - height: 90px; -} -.eyewear_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -728px; - width: 90px; - height: 90px; -} -.shop_back_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -138px; - width: 68px; - height: 68px; -} -.shop_back_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -69px; - width: 68px; - height: 68px; -} -.shop_body_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px 0px; - width: 68px; - height: 68px; -} -.shop_body_special_wondercon_gold { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1518px -1503px; - width: 68px; - height: 68px; -} -.shop_body_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1449px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_wondercon_black { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_wondercon_red { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1503px; - width: 68px; - height: 68px; -} -.eyewear_special_aetherMask { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px -364px; - width: 114px; - height: 90px; -} -.eyewear_special_blackHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -728px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_blackHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -876px -743px; - width: 60px; - height: 60px; -} -.eyewear_special_blackTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_blackTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -25px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_blueHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_blueHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -116px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_blueTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_blueTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_greenHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_greenHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -298px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_greenTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_greenTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -389px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_pinkHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_pinkHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -480px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_pinkTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_pinkTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -571px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_redHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_redHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -662px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_redTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_redTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -753px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_whiteHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -819px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_whiteHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -844px -834px; - width: 60px; - height: 60px; -} -.eyewear_special_whiteTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px 0px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_whiteTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -967px -15px; - width: 60px; - height: 60px; -} -.eyewear_special_yellowHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -91px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_yellowHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -967px -106px; - width: 60px; - height: 60px; -} -.eyewear_special_yellowTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -182px; - width: 90px; - height: 90px; -} -.customize-option.eyewear_special_yellowTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -967px -197px; - width: 60px; - height: 60px; -} -.shop_eyewear_special_aetherMask { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_blackHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_blackTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_blueHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_blueTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_greenHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_greenTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_pinkHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_pinkTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_redHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_redTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_whiteHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_whiteTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_yellowHalfMoon { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1503px; - width: 68px; - height: 68px; -} -.shop_eyewear_special_yellowTopFrame { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1503px; - width: 68px; - height: 68px; -} -.headAccessory_special_bearEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1001px -1183px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_bearEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1026px -1198px; - width: 60px; - height: 60px; -} -.headAccessory_special_blackHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px -182px; - width: 114px; - height: 90px; -} -.headAccessory_special_blueHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px 0px; - width: 114px; - height: 90px; -} -.headAccessory_special_cactusEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px 0px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_cactusEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -15px; - width: 60px; - height: 60px; -} -.headAccessory_special_foxEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -91px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_foxEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -106px; - width: 60px; - height: 60px; -} -.headAccessory_special_greenHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px -273px; - width: 114px; - height: 90px; -} -.headAccessory_special_lionEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -273px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_lionEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -288px; - width: 60px; - height: 60px; -} -.headAccessory_special_pandaEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -364px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_pandaEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -379px; - width: 60px; - height: 60px; -} -.headAccessory_special_pigEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -455px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_pigEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -470px; - width: 60px; - height: 60px; -} -.headAccessory_special_pinkHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px -91px; - width: 114px; - height: 90px; -} -.headAccessory_special_redHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px 0px; - width: 114px; - height: 90px; -} -.headAccessory_special_tigerEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -728px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_tigerEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -743px; - width: 60px; - height: 60px; -} -.headAccessory_special_whiteHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px -91px; - width: 114px; - height: 90px; -} -.headAccessory_special_wolfEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -910px; - width: 90px; - height: 90px; -} -.customize-option.headAccessory_special_wolfEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1331px -925px; - width: 60px; - height: 60px; -} -.headAccessory_special_yellowHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -91px; - width: 114px; - height: 90px; -} -.shop_headAccessory_special_bearEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1098px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_blackHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1029px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_blueHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -960px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_cactusEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -891px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_foxEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -822px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_greenHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -753px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_lionEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -615px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_pandaEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -1274px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_pigEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1572px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_pinkHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -552px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_redHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -190px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_tigerEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -259px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_whiteHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -328px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_wolfEars { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -397px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_yellowHeadband { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -466px; - width: 68px; - height: 68px; -} -.head_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -910px; - width: 90px; - height: 90px; -} -.customize-option.head_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -753px -925px; - width: 60px; - height: 60px; -} -.head_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -910px; - width: 90px; - height: 90px; -} -.head_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -910px -910px; - width: 90px; - height: 90px; -} -.head_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px 0px; - width: 90px; - height: 90px; -} -.head_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -91px; - width: 90px; - height: 90px; -} -.head_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -182px; - width: 90px; - height: 90px; -} -.head_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -273px; - width: 90px; - height: 90px; -} -.head_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -364px; - width: 90px; - height: 90px; -} -.head_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -455px; - width: 90px; - height: 90px; -} -.head_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -546px; - width: 90px; - height: 90px; -} -.head_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -637px; - width: 90px; - height: 90px; -} -.head_special_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -728px; - width: 90px; - height: 90px; -} -.head_special_bardHat { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -819px; - width: 90px; - height: 90px; -} -.head_special_clandestineCowl { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1033px -910px; - width: 90px; - height: 90px; -} -.head_special_dandyHat { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1001px; - width: 90px; - height: 90px; -} -.head_special_fireCoralCirclet { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -1001px; - width: 90px; - height: 90px; -} -.head_special_kabuto { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -1001px; - width: 90px; - height: 90px; -} -.head_special_lunarWarriorHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -1001px; - width: 90px; - height: 90px; -} -.head_special_mammothRiderHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -1001px; - width: 90px; - height: 90px; -} -.head_special_namingDay2017 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -1001px; - width: 90px; - height: 90px; -} -.head_special_pageHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -1001px; - width: 90px; - height: 90px; -} -.head_special_pyromancersTurban { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -1001px; - width: 90px; - height: 90px; -} -.head_special_roguishRainbowMessengerHood { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -1001px; - width: 90px; - height: 90px; -} -.head_special_snowSovereignCrown { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -1001px; - width: 90px; - height: 90px; -} -.head_special_spikedHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -910px -1001px; - width: 90px; - height: 90px; -} -.head_special_turkeyHelmBase { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -455px; - width: 114px; - height: 90px; -} -.head_special_turkeyHelmGilded { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -115px -455px; - width: 114px; - height: 90px; -} -.head_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -91px; - width: 90px; - height: 90px; -} -.head_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -182px; - width: 90px; - height: 90px; -} -.head_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -273px; - width: 90px; - height: 90px; -} -.head_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -364px; - width: 90px; - height: 90px; -} -.head_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -455px; - width: 90px; - height: 90px; -} -.head_wizard_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -546px; - width: 90px; - height: 90px; -} -.head_wizard_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -637px; - width: 90px; - height: 90px; -} -.head_wizard_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -728px; - width: 90px; - height: 90px; -} -.head_wizard_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -819px; - width: 90px; - height: 90px; -} -.head_wizard_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -910px; - width: 90px; - height: 90px; -} -.shop_head_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1503px; - width: 68px; - height: 68px; -} -.shop_head_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1503px; - width: 68px; - height: 68px; -} -.shop_head_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1503px; - width: 68px; - height: 68px; -} -.shop_head_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1503px; - width: 68px; - height: 68px; -} -.shop_head_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1380px; - width: 68px; - height: 68px; -} -.shop_head_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1311px; - width: 68px; - height: 68px; -} -.shop_head_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1242px; - width: 68px; - height: 68px; -} -.shop_head_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1173px; - width: 68px; - height: 68px; -} -.shop_head_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1104px; - width: 68px; - height: 68px; -} -.shop_head_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1035px; - width: 68px; - height: 68px; -} -.shop_head_special_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -966px; - width: 68px; - height: 68px; -} -.shop_head_special_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -897px; - width: 68px; - height: 68px; -} -.shop_head_special_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -828px; - width: 68px; - height: 68px; -} -.shop_head_special_bardHat { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -759px; - width: 68px; - height: 68px; -} -.shop_head_special_clandestineCowl { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -690px; - width: 68px; - height: 68px; -} -.shop_head_special_dandyHat { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -621px; - width: 68px; - height: 68px; -} -.shop_head_special_fireCoralCirclet { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px -121px; - width: 68px; - height: 68px; -} -.shop_head_special_kabuto { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -483px; - width: 68px; - height: 68px; -} -.shop_head_special_lunarWarriorHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -414px; - width: 68px; - height: 68px; -} -.shop_head_special_mammothRiderHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -345px; - width: 68px; - height: 68px; -} -.shop_head_special_namingDay2017 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -1311px; - width: 40px; - height: 40px; -} -.shop_head_special_pageHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -897px; - width: 68px; - height: 68px; -} -.shop_head_special_pyromancersTurban { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -828px; - width: 68px; - height: 68px; -} -.shop_head_special_roguishRainbowMessengerHood { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -759px; - width: 68px; - height: 68px; -} -.shop_head_special_snowSovereignCrown { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -690px; - width: 68px; - height: 68px; -} -.shop_head_special_spikedHelm { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -621px; - width: 68px; - height: 68px; -} -.shop_head_special_turkeyHelmBase { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -552px; - width: 68px; - height: 68px; -} -.shop_head_special_turkeyHelmGilded { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -483px; - width: 68px; - height: 68px; -} -.shop_head_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -414px; - width: 68px; - height: 68px; -} -.shop_head_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -345px; - width: 68px; - height: 68px; -} -.shop_head_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -276px; - width: 68px; - height: 68px; -} -.shop_head_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -207px; - width: 68px; - height: 68px; -} -.shop_head_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -138px; - width: 68px; - height: 68px; -} -.shop_head_wizard_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -69px; - width: 68px; - height: 68px; -} -.shop_head_wizard_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px 0px; - width: 68px; - height: 68px; -} -.shop_head_wizard_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1305px -1274px; - width: 68px; - height: 68px; -} -.shop_head_wizard_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1236px -1274px; - width: 68px; - height: 68px; -} -.shop_head_wizard_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1167px -1274px; - width: 68px; - height: 68px; -} -.shield_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -1274px; - width: 90px; - height: 90px; -} -.shield_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -1274px; - width: 90px; - height: 90px; -} -.shield_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1183px; - width: 90px; - height: 90px; -} -.shield_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -1274px; - width: 90px; - height: 90px; -} -.shield_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -1274px; - width: 90px; - height: 90px; -} -.shield_rogue_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -1274px; - width: 90px; - height: 90px; -} -.shield_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -637px; - width: 103px; - height: 90px; -} -.shield_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -104px -637px; - width: 103px; - height: 90px; -} -.shield_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -273px; - width: 114px; - height: 90px; -} -.shield_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -491px; - width: 96px; - height: 90px; -} -.shield_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -455px; - width: 114px; - height: 90px; -} -.shield_rogue_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -460px -455px; - width: 114px; - height: 90px; -} -.shield_special_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -1183px; - width: 90px; - height: 90px; -} -.shield_special_diamondStave { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -311px -637px; - width: 102px; - height: 90px; -} -.shield_special_goldenknight { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -546px; - width: 111px; - height: 90px; -} -.shield_special_lootBag { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -1183px; - width: 90px; - height: 90px; -} -.shield_special_mammothRiderHorn { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -1183px; - width: 90px; - height: 90px; -} -.shield_special_moonpearlShield { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -1183px; - width: 90px; - height: 90px; -} -.shield_special_roguishRainbowMessage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -1183px; - width: 90px; - height: 90px; -} -.shield_special_wakizashi { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -112px -546px; - width: 114px; - height: 87px; -} -.shield_special_wintryMirror { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -227px -546px; - width: 114px; - height: 87px; -} -.shield_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -1001px; - width: 90px; - height: 90px; -} -.shield_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -910px; - width: 90px; - height: 90px; -} -.shield_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -819px; - width: 90px; - height: 90px; -} -.shield_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -728px; - width: 90px; - height: 90px; -} -.shield_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -637px; - width: 90px; - height: 90px; -} -.shop_shield_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -966px; - width: 68px; - height: 68px; -} -.shop_shield_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -1035px; - width: 68px; - height: 68px; -} -.shop_shield_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -1104px; - width: 68px; - height: 68px; -} -.shop_shield_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -1173px; - width: 68px; - height: 68px; -} -.shop_shield_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1397px -1242px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_rogue_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_diamondStave { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_goldenknight { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_lootBag { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_mammothRiderHorn { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_moonpearlShield { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_roguishRainbowMessage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_wakizashi { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_special_wintryMirror { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1365px; - width: 68px; - height: 68px; -} -.shop_shield_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px 0px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -69px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -138px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -207px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -276px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -345px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -414px; - width: 68px; - height: 68px; -} -.shop_weapon_healer_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -483px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -552px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -621px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -690px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -759px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -828px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -897px; - width: 68px; - height: 68px; -} -.shop_weapon_rogue_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -966px; - width: 68px; - height: 68px; -} -.shop_weapon_special_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1035px; - width: 68px; - height: 68px; -} -.shop_weapon_special_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1104px; - width: 68px; - height: 68px; -} -.shop_weapon_special_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1173px; - width: 68px; - height: 68px; -} -.shop_weapon_special_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1242px; - width: 68px; - height: 68px; -} -.shop_weapon_special_aetherCrystals { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1311px; - width: 68px; - height: 68px; -} -.shop_weapon_special_bardInstrument { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_critical { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_fencingFoil { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_lunarScythe { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_mammothRiderSpear { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_nomadsScimitar { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_pageBanner { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_roguishRainbowMessage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_skeletonKey { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_tachi { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_taskwoodsLantern { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_special_tridentOfCrashingTides { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1035px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1173px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_warrior_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1380px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1449px -1434px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px 0px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -69px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -138px; - width: 68px; - height: 68px; -} -.shop_weapon_wizard_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -207px; - width: 68px; - height: 68px; -} -.weapon_healer_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -546px; - width: 90px; - height: 90px; -} -.weapon_healer_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -455px; - width: 90px; - height: 90px; -} -.weapon_healer_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -364px; - width: 90px; - height: 90px; -} -.weapon_healer_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -273px; - width: 90px; - height: 90px; -} -.weapon_healer_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -182px; - width: 90px; - height: 90px; -} -.weapon_healer_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px -91px; - width: 90px; - height: 90px; -} -.weapon_healer_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1215px 0px; - width: 90px; - height: 90px; -} -.weapon_rogue_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1092px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1001px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -910px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -728px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -1092px; - width: 90px; - height: 90px; -} -.weapon_rogue_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -208px -637px; - width: 102px; - height: 90px; -} -.weapon_special_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_aetherCrystals { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -230px -455px; - width: 114px; - height: 90px; -} -.weapon_special_bardInstrument { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_fencingFoil { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_lunarScythe { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1124px -1001px; - width: 90px; - height: 90px; -} -.weapon_special_mammothRiderSpear { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -637px -910px; - width: 90px; - height: 90px; -} -.weapon_special_nomadsScimitar { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -546px -910px; - width: 90px; - height: 90px; -} -.weapon_special_pageBanner { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -455px -910px; - width: 90px; - height: 90px; -} -.weapon_special_roguishRainbowMessage { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -364px -910px; - width: 90px; - height: 90px; -} -.weapon_special_skeletonKey { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -273px -910px; - width: 90px; - height: 90px; -} -.weapon_special_tachi { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -182px -910px; - width: 90px; - height: 90px; -} -.weapon_special_taskwoodsLantern { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -91px -910px; - width: 90px; - height: 90px; -} -.weapon_special_tridentOfCrashingTides { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -910px; - width: 90px; - height: 90px; -} -.weapon_warrior_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -819px; - width: 90px; - height: 90px; -} -.weapon_warrior_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -728px; - width: 90px; - height: 90px; -} -.weapon_warrior_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -637px; - width: 90px; - height: 90px; -} -.weapon_warrior_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -546px; - width: 90px; - height: 90px; -} -.weapon_warrior_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -455px; - width: 90px; - height: 90px; -} -.weapon_warrior_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -364px; - width: 90px; - height: 90px; -} -.weapon_warrior_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -942px -273px; - width: 90px; - height: 90px; -} -.weapon_wizard_0 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -546px; - width: 90px; - height: 90px; -} -.weapon_wizard_1 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -455px; - width: 90px; - height: 90px; -} -.weapon_wizard_2 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -364px; - width: 90px; - height: 90px; -} -.weapon_wizard_3 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -273px; - width: 90px; - height: 90px; -} -.weapon_wizard_4 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -182px; - width: 90px; - height: 90px; -} -.weapon_wizard_5 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -91px; - width: 90px; - height: 90px; -} -.weapon_wizard_6 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px 0px; - width: 90px; - height: 90px; -} -.Pet_Currency_Gem { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1104px -1572px; - width: 68px; - height: 68px; -} -.Pet_Currency_Gem1x { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1656px -1518px; - width: 15px; - height: 13px; -} -.Pet_Currency_Gem2x { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -574px -594px; - width: 30px; - height: 26px; -} -.PixelPaw-Gold { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1518px; - width: 51px; - height: 51px; -} -.PixelPaw { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1535px -1449px; - width: 51px; - height: 51px; -} -.PixelPaw002 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1466px -1380px; - width: 51px; - height: 51px; -} -.avatar_floral_healer { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -300px; - width: 99px; - height: 99px; -} -.avatar_floral_rogue { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -100px; - width: 99px; - height: 99px; -} -.avatar_floral_warrior { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px 0px; - width: 99px; - height: 99px; -} -.avatar_floral_wizard { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -200px; - width: 99px; - height: 99px; -} -.empty_bottles { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -660px -582px; - width: 64px; - height: 54px; -} -.ghost { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -851px -637px; - width: 90px; - height: 90px; -} -.inventory_present { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1449px; - width: 68px; - height: 68px; -} -.inventory_present_01 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -621px; - width: 68px; - height: 68px; -} -.inventory_present_02 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -690px; - width: 68px; - height: 68px; -} -.inventory_present_03 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -759px; - width: 68px; - height: 68px; -} -.inventory_present_04 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -828px; - width: 68px; - height: 68px; -} -.inventory_present_05 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -897px; - width: 68px; - height: 68px; -} -.inventory_present_06 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -966px; - width: 68px; - height: 68px; -} -.inventory_present_07 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1035px; - width: 68px; - height: 68px; -} -.inventory_present_08 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1104px; - width: 68px; - height: 68px; -} -.inventory_present_09 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1173px; - width: 68px; - height: 68px; -} -.inventory_present_10 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1242px; - width: 68px; - height: 68px; -} -.inventory_present_11 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1311px; - width: 68px; - height: 68px; -} -.inventory_present_12 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -1380px; - width: 68px; - height: 68px; -} -.inventory_special_birthday { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_congrats { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -69px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_fortify { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -138px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_getwell { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -207px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_goodluck { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -276px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_greeting { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -345px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_nye { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -414px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_opaquePotion { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -483px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_seafoam { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -552px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_shinySeed { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -621px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_snowball { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -690px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_spookySparkles { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -759px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_thankyou { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -828px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_trinket { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -897px -1572px; - width: 68px; - height: 68px; -} -.inventory_special_valentine { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -966px -1572px; - width: 68px; - height: 68px; -} -.knockout { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -342px -546px; - width: 120px; - height: 47px; -} -.pet_key { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1311px -1572px; - width: 68px; - height: 68px; -} -.rebirth_orb { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1242px -1572px; - width: 68px; - height: 68px; -} -.seafoam_star { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: 0px -728px; - width: 90px; - height: 90px; -} -.shop_armoire { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1604px -483px; - width: 68px; - height: 68px; -} -.snowman { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1306px -546px; - width: 90px; - height: 90px; -} -.zzz { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -463px -546px; - width: 40px; - height: 40px; -} -.zzz_light { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -504px -546px; - width: 40px; - height: 40px; -} -.notif_inventory_present_01 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -725px -582px; - width: 28px; - height: 28px; -} -.notif_inventory_present_02 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -545px -546px; - width: 28px; - height: 28px; -} -.notif_inventory_present_03 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -574px -546px; - width: 28px; - height: 28px; -} -.notif_inventory_present_04 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -603px -546px; - width: 28px; - height: 28px; -} -.notif_inventory_present_05 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -342px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_06 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -371px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_07 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -487px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_08 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -429px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_09 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -458px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_10 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -545px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_11 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -516px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_present_12 { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -400px -594px; - width: 28px; - height: 28px; -} -.notif_inventory_special_birthday { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -725px -611px; - width: 20px; - height: 24px; -} -.notif_inventory_special_congrats { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -751px; - width: 20px; - height: 22px; -} -.notif_inventory_special_getwell { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -774px; - width: 20px; - height: 22px; -} -.notif_inventory_special_goodluck { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -632px -546px; - width: 20px; - height: 26px; -} -.notif_inventory_special_greeting { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -819px -728px; - width: 20px; - height: 22px; -} -.notif_inventory_special_nye { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -1438px -1311px; - width: 24px; - height: 26px; -} -.notif_inventory_special_thankyou { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -605px -594px; - width: 20px; - height: 24px; -} -.notif_inventory_special_valentine { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -626px -594px; - width: 20px; - height: 24px; -} -.npc_bailey { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -699px -637px; - width: 60px; - height: 72px; -} -.npc_justin { - background-image: url('~assets/images/sprites/spritesmith-main-11.png'); - background-position: -575px 0px; - width: 84px; - height: 120px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-12.css b/website/client/assets/css/sprites/spritesmith-main-12.css deleted file mode 100644 index eeee146f63..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-12.css +++ /dev/null @@ -1,402 +0,0 @@ -.npc_matt { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -597px -1535px; - width: 195px; - height: 138px; -} -.background_dysheartener { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px 0px; - width: 306px; - height: 202px; -} -.banner_flair_dysheartener { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1963px -836px; - width: 69px; - height: 18px; -} -.phobia_dysheartener { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1187px -880px; - width: 201px; - height: 195px; -} -.quest_alligator { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -1079px; - width: 201px; - height: 213px; -} -.quest_armadillo { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -435px; - width: 219px; - height: 219px; -} -.quest_atom1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1105px -1315px; - width: 250px; - height: 150px; -} -.quest_atom2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -389px -1535px; - width: 207px; - height: 138px; -} -.quest_atom3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -747px -440px; - width: 216px; - height: 180px; -} -.quest_axolotl { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -747px 0px; - width: 219px; - height: 219px; -} -.quest_badger { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -747px -220px; - width: 219px; - height: 219px; -} -.quest_basilist { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px -392px; - width: 189px; - height: 141px; -} -.quest_beetle { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -1293px; - width: 204px; - height: 201px; -} -.quest_bronze { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -440px -655px; - width: 219px; - height: 219px; -} -.quest_bunny { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -967px -660px; - width: 210px; - height: 186px; -} -.quest_butterfly { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -967px 0px; - width: 219px; - height: 219px; -} -.quest_cheetah { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -967px -220px; - width: 219px; - height: 219px; -} -.quest_cow { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1535px; - width: 174px; - height: 213px; -} -.quest_dilatory { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -220px -875px; - width: 219px; - height: 219px; -} -.quest_dilatoryDistress1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -868px; - width: 210px; - height: 210px; -} -.quest_dilatoryDistress2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px -534px; - width: 150px; - height: 150px; -} -.quest_dilatoryDistress3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -880px -875px; - width: 219px; - height: 219px; -} -.quest_dilatory_derby { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -875px; - width: 219px; - height: 219px; -} -.quest_dolphin { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1187px 0px; - width: 219px; - height: 219px; -} -.quest_dustbunnies { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1187px -220px; - width: 219px; - height: 219px; -} -.quest_egg { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px -184px; - width: 165px; - height: 207px; -} -.quest_evilsanta { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px -836px; - width: 118px; - height: 131px; -} -.quest_evilsanta2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1095px; - width: 219px; - height: 219px; -} -.quest_falcon { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -220px -1095px; - width: 219px; - height: 219px; -} -.quest_ferret { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -307px 0px; - width: 219px; - height: 219px; -} -.quest_frog { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -660px -1315px; - width: 221px; - height: 213px; -} -.quest_ghost_stag { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -880px -1095px; - width: 219px; - height: 219px; -} -.quest_goldenknight1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1100px -1095px; - width: 219px; - height: 219px; -} -.quest_goldenknight2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1356px -1315px; - width: 250px; - height: 150px; -} -.quest_goldenknight3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -203px; - width: 219px; - height: 231px; -} -.quest_gryphon { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -527px -220px; - width: 216px; - height: 177px; -} -.quest_guineapig { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px -660px; - width: 219px; - height: 219px; -} -.quest_harpy { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px -880px; - width: 219px; - height: 219px; -} -.quest_hedgehog { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px -1100px; - width: 219px; - height: 186px; -} -.quest_hippo { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -220px -1315px; - width: 219px; - height: 219px; -} -.quest_horse { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -1315px; - width: 219px; - height: 219px; -} -.quest_kangaroo { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px -440px; - width: 219px; - height: 219px; -} -.quest_kraken { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -307px -220px; - width: 216px; - height: 177px; -} -.quest_lostMasterclasser1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -660px -1095px; - width: 219px; - height: 219px; -} -.quest_lostMasterclasser2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -440px -1095px; - width: 219px; - height: 219px; -} -.quest_lostMasterclasser3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1187px -660px; - width: 219px; - height: 219px; -} -.quest_mayhemMistiflying1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px -685px; - width: 150px; - height: 150px; -} -.quest_mayhemMistiflying2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -660px -875px; - width: 219px; - height: 219px; -} -.quest_mayhemMistiflying3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -440px -875px; - width: 219px; - height: 219px; -} -.quest_monkey { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -660px -655px; - width: 219px; - height: 219px; -} -.quest_moon1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px 0px; - width: 216px; - height: 216px; -} -.quest_moon2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -220px -655px; - width: 219px; - height: 219px; -} -.quest_moon3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -440px -435px; - width: 219px; - height: 219px; -} -.quest_moonstone1 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -527px 0px; - width: 219px; - height: 219px; -} -.quest_moonstone2 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px -220px; - width: 219px; - height: 219px; -} -.quest_moonstone3 { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -440px -1315px; - width: 219px; - height: 219px; -} -.quest_nudibranch { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -651px; - width: 216px; - height: 216px; -} -.quest_octopus { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -882px -1315px; - width: 222px; - height: 177px; -} -.quest_owl { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1187px -440px; - width: 219px; - height: 219px; -} -.quest_peacock { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -434px; - width: 216px; - height: 216px; -} -.quest_penguin { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1844px 0px; - width: 190px; - height: 183px; -} -.quest_pterodactyl { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -967px -440px; - width: 219px; - height: 219px; -} -.quest_rat { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: 0px -655px; - width: 219px; - height: 219px; -} -.quest_robot { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -220px -435px; - width: 219px; - height: 219px; -} -.quest_rock { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1627px -217px; - width: 216px; - height: 216px; -} -.quest_rooster { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -175px -1535px; - width: 213px; - height: 174px; -} -.quest_sabretooth { - background-image: url('~assets/images/sprites/spritesmith-main-12.png'); - background-position: -1407px 0px; - width: 219px; - height: 219px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-13.css b/website/client/assets/css/sprites/spritesmith-main-13.css deleted file mode 100644 index 93aea030b8..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-13.css +++ /dev/null @@ -1,2088 +0,0 @@ -.quest_TEMPLATE_FOR_MISSING_IMAGE { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px 0px; - width: 221px; - height: 39px; -} -.quest_seaserpent { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -663px 0px; - width: 219px; - height: 219px; -} -.quest_sheep { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -883px -440px; - width: 219px; - height: 219px; -} -.quest_silver { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -883px -220px; - width: 219px; - height: 219px; -} -.quest_slime { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -443px 0px; - width: 219px; - height: 219px; -} -.quest_sloth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -226px; - width: 219px; - height: 219px; -} -.quest_snail { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -434px -666px; - width: 219px; - height: 213px; -} -.quest_snake { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -434px -883px; - width: 216px; - height: 177px; -} -.quest_spider { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -651px -883px; - width: 250px; - height: 150px; -} -.quest_squirrel { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -663px -220px; - width: 219px; - height: 219px; -} -.quest_stoikalmCalamity1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -178px; - width: 150px; - height: 150px; -} -.quest_stoikalmCalamity2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -220px -446px; - width: 219px; - height: 219px; -} -.quest_stoikalmCalamity3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -440px -446px; - width: 219px; - height: 219px; -} -.quest_taskwoodsTerror1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -329px; - width: 150px; - height: 150px; -} -.quest_taskwoodsTerror2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -217px -666px; - width: 216px; - height: 216px; -} -.quest_taskwoodsTerror3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -223px 0px; - width: 219px; - height: 219px; -} -.quest_treeling { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -654px -666px; - width: 216px; - height: 177px; -} -.quest_trex { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px 0px; - width: 204px; - height: 177px; -} -.quest_trex_undead { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -883px; - width: 216px; - height: 177px; -} -.quest_triceratops { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -883px 0px; - width: 219px; - height: 219px; -} -.quest_turtle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -660px -446px; - width: 219px; - height: 219px; -} -.quest_unicorn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -446px; - width: 219px; - height: 219px; -} -.quest_velociraptor { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px 0px; - width: 222px; - height: 225px; -} -.quest_vice1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -217px -883px; - width: 216px; - height: 177px; -} -.quest_vice2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -440px -226px; - width: 219px; - height: 219px; -} -.quest_vice3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -871px -666px; - width: 216px; - height: 177px; -} -.quest_whale { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -220px -226px; - width: 219px; - height: 219px; -} -.quest_yarn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -666px; - width: 216px; - height: 216px; -} -.quest_atom1_soapBars { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1079px -1618px; - width: 48px; - height: 51px; -} -.quest_dilatoryDistress1_blueFins { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -1010px; - width: 51px; - height: 48px; -} -.quest_dilatoryDistress1_fireCoral { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1128px -1618px; - width: 48px; - height: 51px; -} -.quest_egg_plainEgg { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -1213px; - width: 48px; - height: 51px; -} -.quest_evilsanta2_branches { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -178px; - width: 48px; - height: 51px; -} -.quest_evilsanta2_tracks { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1618px; - width: 54px; - height: 60px; -} -.quest_goldenknight1_testimony { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1177px -1618px; - width: 48px; - height: 51px; -} -.quest_lostMasterclasser1_ancientTome { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1061px; - width: 33px; - height: 42px; -} -.quest_lostMasterclasser1_forbiddenTome { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1104px; - width: 33px; - height: 42px; -} -.quest_lostMasterclasser1_hiddenTome { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1272px -1167px; - width: 33px; - height: 42px; -} -.quest_mayhemMistiflying2_mistifly1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1030px -1618px; - width: 48px; - height: 51px; -} -.quest_mayhemMistiflying2_mistifly2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -981px -1618px; - width: 48px; - height: 51px; -} -.quest_mayhemMistiflying2_mistifly3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -932px -1618px; - width: 48px; - height: 51px; -} -.quest_moon1_shard { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -282px; - width: 42px; - height: 42px; -} -.quest_moonstone1_moonstone { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1587px; - width: 30px; - height: 30px; -} -.quest_robot_bolt { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -381px; - width: 48px; - height: 51px; -} -.quest_robot_gear { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -329px; - width: 48px; - height: 51px; -} -.quest_robot_spring { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -230px; - width: 48px; - height: 51px; -} -.quest_silver_cancerRune { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1685px -1618px; - width: 39px; - height: 39px; -} -.quest_silver_moonRune { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1254px -433px; - width: 39px; - height: 42px; -} -.quest_silver_silverIngot { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1455px -1213px; - width: 48px; - height: 51px; -} -.quest_stoikalmCalamity2_icicleCoin { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1406px -1213px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_brownie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1357px -1213px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_dryad { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -883px -1618px; - width: 48px; - height: 51px; -} -.quest_taskwoodsTerror2_pixie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1226px -1618px; - width: 48px; - height: 51px; -} -.quest_vice2_lightCrystal { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1398px -1618px; - width: 40px; - height: 40px; -} -.inventory_quest_scroll_alligator { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1311px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_armadillo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1380px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -40px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1035px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -40px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1480px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -109px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_atom3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -40px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_axolotl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -109px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_badger { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -109px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_basilist { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -178px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_beetle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -178px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_bronze { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -178px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_bunny { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -247px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_butterfly { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -247px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_cheetah { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -247px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_cow { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -316px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatoryDistress1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -316px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatoryDistress2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -385px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatoryDistress2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -385px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatoryDistress3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -454px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatoryDistress3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -385px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dilatory_derby { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -316px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dolphin { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -454px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_dustbunnies { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -454px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_egg { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -523px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_evilsanta { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -523px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_evilsanta2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -523px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_falcon { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -592px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_ferret { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -592px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_frog { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -592px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_ghost_stag { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -661px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -661px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -661px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -730px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -730px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -799px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_goldenknight3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -730px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_gryphon { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -799px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_guineapig { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -799px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_harpy { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -868px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_hedgehog { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -868px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_hippo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -868px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_horse { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -937px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_kangaroo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -937px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_kraken { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -937px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -1006px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -1006px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -1075px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -1006px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -1075px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -1075px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser4 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1377px -1144px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_lostMasterclasser4_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1308px -1144px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_mayhemMistiflying1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1446px -1144px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_mayhemMistiflying2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1209px -586px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_mayhemMistiflying2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1209px -480px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_mayhemMistiflying3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1209px -798px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_mayhemMistiflying3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1209px -692px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_monkey { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1209px -904px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1008px -883px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moon3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_moonstone3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_nudibranch { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_octopus { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_owl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -897px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_peacock { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -966px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_penguin { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1035px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_pterodactyl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_rat { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1173px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_robot { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1242px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_rock { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1311px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_rooster { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1380px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_sabretooth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1449px -1273px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_seaserpent { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_sheep { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_silver { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_slime { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_sloth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_snail { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_snake { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_spider { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_squirrel { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_stoikalmCalamity1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_stoikalmCalamity2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_stoikalmCalamity2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_stoikalmCalamity3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -897px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_stoikalmCalamity3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_taskwoodsTerror1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -966px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_taskwoodsTerror2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_taskwoodsTerror2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1035px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_taskwoodsTerror3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1242px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_taskwoodsTerror3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1173px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_treeling { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1311px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_trex { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1449px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_trex_undead { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1380px -1342px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_triceratops { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_turtle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_unicorn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_velociraptor { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice1 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice1_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice2 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice2_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice3 { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_vice3_locked { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_whale { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1411px; - width: 68px; - height: 68px; -} -.inventory_quest_scroll_yarn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_aquaticAmigos { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_birdBuddies { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -897px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_cuddleBuddies { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -966px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_farmFriends { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1242px; - width: 68px; - height: 68px; -} -.quest_bundle_featheredFriends { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_forestFriends { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1173px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_hugabug { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1242px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_mythicalMarvels { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1311px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_oddballs { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1380px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_rockingReptiles { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1449px -1411px; - width: 68px; - height: 68px; -} -.quest_bundle_splashyPals { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px 0px; - width: 68px; - height: 68px; -} -.quest_bundle_winterQuests { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -69px; - width: 68px; - height: 68px; -} -.quest_bundle_witchyFamiliars { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -138px; - width: 68px; - height: 68px; -} -.shop_gem { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -207px; - width: 68px; - height: 68px; -} -.shop_opaquePotion { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -276px; - width: 68px; - height: 68px; -} -.shop_potion { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -345px; - width: 68px; - height: 68px; -} -.shop_seafoam { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -414px; - width: 68px; - height: 68px; -} -.shop_shinySeed { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -483px; - width: 68px; - height: 68px; -} -.shop_snowball { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -552px; - width: 68px; - height: 68px; -} -.shop_spookySparkles { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -621px; - width: 68px; - height: 68px; -} -.shop_mounts_MagicalBee-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -690px; - width: 68px; - height: 68px; -} -.shop_mounts_Mammoth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -759px; - width: 68px; - height: 68px; -} -.shop_mounts_MantisShrimp-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -828px; - width: 68px; - height: 68px; -} -.shop_mounts_Phoenix-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -897px; - width: 68px; - height: 68px; -} -.shop_pets_MagicalBee-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -966px; - width: 68px; - height: 68px; -} -.shop_pets_Mammoth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1035px; - width: 68px; - height: 68px; -} -.shop_pets_MantisShrimp-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1104px; - width: 68px; - height: 68px; -} -.shop_pets_Phoenix-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1530px -1173px; - width: 68px; - height: 68px; -} -.shop_backStab { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -984px -989px; - width: 40px; - height: 40px; -} -.shop_brightness { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1357px -1618px; - width: 40px; - height: 40px; -} -.shop_defensiveStance { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1316px -1618px; - width: 40px; - height: 40px; -} -.shop_earth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1439px -1618px; - width: 40px; - height: 40px; -} -.shop_fireball { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1275px -1618px; - width: 40px; - height: 40px; -} -.shop_frost { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1025px -989px; - width: 40px; - height: 40px; -} -.shop_heal { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -943px -989px; - width: 40px; - height: 40px; -} -.shop_healAll { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -902px -989px; - width: 40px; - height: 40px; -} -.shop_intimidate { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1237px -1010px; - width: 40px; - height: 40px; -} -.shop_mpheal { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1644px -1618px; - width: 40px; - height: 40px; -} -.shop_pickPocket { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1603px -1618px; - width: 40px; - height: 40px; -} -.shop_protectAura { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1562px -1618px; - width: 40px; - height: 40px; -} -.shop_smash { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1521px -1618px; - width: 40px; - height: 40px; -} -.shop_stealth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1480px -1618px; - width: 40px; - height: 40px; -} -.shop_toolsOfTrade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1196px -1010px; - width: 40px; - height: 40px; -} -.shop_valorousPresence { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1155px -1010px; - width: 40px; - height: 40px; -} -.Pet_Egg_Alligator { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -897px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Armadillo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -966px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Axolotl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1035px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Badger { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_BearCub { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1173px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Beetle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1242px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Bunny { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1311px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Butterfly { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1380px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Cactus { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1449px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Cheetah { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1518px -1480px; - width: 68px; - height: 68px; -} -.Pet_Egg_Cow { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px 0px; - width: 68px; - height: 68px; -} -.Pet_Egg_Cuttlefish { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -69px; - width: 68px; - height: 68px; -} -.Pet_Egg_Deer { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -138px; - width: 68px; - height: 68px; -} -.Pet_Egg_Dolphin { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -207px; - width: 68px; - height: 68px; -} -.Pet_Egg_Dragon { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -276px; - width: 68px; - height: 68px; -} -.Pet_Egg_Egg { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -345px; - width: 68px; - height: 68px; -} -.Pet_Egg_Falcon { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -414px; - width: 68px; - height: 68px; -} -.Pet_Egg_Ferret { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -483px; - width: 68px; - height: 68px; -} -.Pet_Egg_FlyingPig { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -552px; - width: 68px; - height: 68px; -} -.Pet_Egg_Fox { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -621px; - width: 68px; - height: 68px; -} -.Pet_Egg_Frog { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -690px; - width: 68px; - height: 68px; -} -.Pet_Egg_Gryphon { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -759px; - width: 68px; - height: 68px; -} -.Pet_Egg_GuineaPig { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -828px; - width: 68px; - height: 68px; -} -.Pet_Egg_Hedgehog { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -897px; - width: 68px; - height: 68px; -} -.Pet_Egg_Hippo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -966px; - width: 68px; - height: 68px; -} -.Pet_Egg_Horse { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1035px; - width: 68px; - height: 68px; -} -.Pet_Egg_Kangaroo { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1104px; - width: 68px; - height: 68px; -} -.Pet_Egg_LionCub { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1173px; - width: 68px; - height: 68px; -} -.Pet_Egg_Monkey { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1242px; - width: 68px; - height: 68px; -} -.Pet_Egg_Nudibranch { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1311px; - width: 68px; - height: 68px; -} -.Pet_Egg_Octopus { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1380px; - width: 68px; - height: 68px; -} -.Pet_Egg_Owl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1599px -1449px; - width: 68px; - height: 68px; -} -.Pet_Egg_PandaCub { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Parrot { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Peacock { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Penguin { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_PolarBear { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Pterodactyl { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Rat { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Robot { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Rock { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Rooster { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Sabretooth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_SeaSerpent { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Seahorse { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Sheep { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -897px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Slime { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -966px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Sloth { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1035px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Snail { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1104px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Snake { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1173px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Spider { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1242px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Squirrel { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1311px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_TRex { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1518px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_TigerCub { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1380px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Treeling { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1449px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Triceratops { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1587px -1549px; - width: 68px; - height: 68px; -} -.Pet_Egg_Turtle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px 0px; - width: 68px; - height: 68px; -} -.Pet_Egg_Unicorn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -69px; - width: 68px; - height: 68px; -} -.Pet_Egg_Velociraptor { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -138px; - width: 68px; - height: 68px; -} -.Pet_Egg_Whale { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -207px; - width: 68px; - height: 68px; -} -.Pet_Egg_Wolf { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -276px; - width: 68px; - height: 68px; -} -.Pet_Egg_Yarn { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -345px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -414px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -483px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -552px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -621px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -690px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -759px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -828px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -897px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -966px; - width: 68px; - height: 68px; -} -.Pet_Food_Cake_Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1035px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1104px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1173px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1242px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1311px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1380px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1449px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1668px -1518px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Candy_Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Chocolate { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Fish { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Honey { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Meat { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Milk { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1618px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -828px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -759px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -690px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -621px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -552px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -483px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -414px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Pie_Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -345px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Potatoe { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -276px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_RottenMeat { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -207px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Saddle { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -138px -1480px; - width: 68px; - height: 68px; -} -.Pet_Food_Strawberry { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -69px -1480px; - width: 68px; - height: 68px; -} -.Mount_Body_Alligator-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Alligator-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1167px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1060px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -954px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -848px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -742px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -636px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -530px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -424px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Armadillo-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -318px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -212px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -106px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: 0px -1061px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -902px -883px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -904px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -798px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -692px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -586px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-White { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1103px -480px; - width: 105px; - height: 105px; -} -.Mount_Body_Axolotl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-13.png'); - background-position: -1166px -1167px; - width: 105px; - height: 105px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-16.css b/website/client/assets/css/sprites/spritesmith-main-16.css deleted file mode 100644 index dade5cbc59..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-16.css +++ /dev/null @@ -1,1404 +0,0 @@ -.Mount_Body_Parrot-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Parrot-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -1272px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Peacock-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_Penguin-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -1272px; - width: 105px; - height: 105px; -} -.Mount_Body_Phoenix-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -1378px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -1484px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1619px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Pterodactyl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -665px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -786px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Rat-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -771px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Robot-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -892px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rock-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -877px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Rooster-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -998px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Sabretooth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -136px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -272px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -272px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -136px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -272px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Sabretooth-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_SeaSerpent-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_SeaSerpent-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -983px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Seahorse-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1104px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1089px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Sheep-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -545px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1210px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Slime-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1195px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Sloth-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1316px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snail-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Snake-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1301px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1422px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Squirrel-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -121px -544px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -227px -544px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -333px -544px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -439px -544px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -545px -544px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px 0px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -109px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -218px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -327px; - width: 105px; - height: 108px; -} -.Mount_Body_Squirrel-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -680px -436px; - width: 105px; - height: 108px; -} -.Mount_Body_TRex-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -136px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -272px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -408px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -544px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_TRex-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -136px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_TigerCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -742px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1378px -1407px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -954px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -1272px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1528px -1378px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -106px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -212px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -424px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -530px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -636px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: 0px -544px; - width: 120px; - height: 120px; -} -.Mount_Body_TigerCub-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -848px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -954px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1060px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1166px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_TigerCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1272px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1378px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1484px -1513px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Red { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-White { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Treeling-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -1634px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Base { - background-image: url('~assets/images/sprites/spritesmith-main-16.png'); - background-position: -318px -1619px; - width: 105px; - height: 105px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-17.css b/website/client/assets/css/sprites/spritesmith-main-17.css deleted file mode 100644 index b1339c515e..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-17.css +++ /dev/null @@ -1,1344 +0,0 @@ -.Mount_Body_Triceratops-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Triceratops-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turkey-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turkey-Gilded { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -922px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Turtle-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1028px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Unicorn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1028px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -1060px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -1166px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -1272px; - width: 105px; - height: 105px; -} -.Mount_Body_Velociraptor-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -1378px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1558px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -602px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -708px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Whale-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -816px; - width: 105px; - height: 105px; -} -.Mount_Body_Wolf-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px 0px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px -136px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px -272px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px -408px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px -544px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -680px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -136px -680px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -272px -680px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -408px -680px; - width: 135px; - height: 135px; -} -.Mount_Body_Wolf-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -544px -680px; - width: 135px; - height: 135px; -} -.Mount_Body_Yarn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px 0px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -106px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -212px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -318px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -424px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -530px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -636px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -742px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -848px; - width: 105px; - height: 105px; -} -.Mount_Body_Yarn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1134px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Alligator-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1060px -1134px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -496px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -742px; - width: 105px; - height: 105px; -} -.Mount_Head_Armadillo-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -848px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1240px -1060px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Axolotl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1060px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1166px -1240px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_Badger-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -530px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -742px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -848px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -1060px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1346px -1166px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1060px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1166px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1272px -1346px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Polar { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -530px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -742px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -848px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -1060px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -680px -680px; - width: 120px; - height: 120px; -} -.Mount_Head_BearCub-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1452px -1272px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: 0px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -106px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -212px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_BearCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -318px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -424px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -530px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1060px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1166px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1272px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Beetle-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1378px -1452px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -530px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -742px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -848px; - width: 105px; - height: 105px; -} -.Mount_Head_Bunny-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1558px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_Butterfly-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px -124px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px -248px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px -372px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px -496px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px -620px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px 0px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -124px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -248px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-White { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -922px -372px; - width: 105px; - height: 123px; -} -.Mount_Head_Butterfly-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -816px 0px; - width: 105px; - height: 123px; -} -.Mount_Head_Cactus-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -636px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Base { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -742px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -848px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -954px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1060px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1166px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1272px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1378px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1484px -1558px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -318px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -424px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -530px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -636px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -742px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -848px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -954px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -1060px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-Red { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -1166px; - width: 105px; - height: 105px; -} -.Mount_Head_Cactus-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-17.png'); - background-position: -1664px -1272px; - width: 105px; - height: 105px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-21.css b/website/client/assets/css/sprites/spritesmith-main-21.css deleted file mode 100644 index cb89db5762..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-21.css +++ /dev/null @@ -1,1944 +0,0 @@ -.Mount_Head_Wolf-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px 0px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -136px 0px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -272px 0px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -136px; - width: 135px; - height: 135px; -} -.Mount_Head_Wolf-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -136px -136px; - width: 135px; - height: 135px; -} -.Mount_Head_Yarn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -106px -272px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -272px -136px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -272px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -212px -378px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -212px -272px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -408px 0px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -408px -106px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -408px -212px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -378px; - width: 105px; - height: 105px; -} -.Mount_Head_Yarn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -106px -378px; - width: 105px; - height: 105px; -} -.Mount_Icon_Aether-Invisible { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -318px -272px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -318px -378px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -400px -378px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -514px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -514px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -514px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -514px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Alligator-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -484px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -596px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -596px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -596px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -596px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -596px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -678px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Armadillo-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -678px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -678px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -678px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -678px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Axolotl-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -760px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_Badger-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -684px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -842px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Polar { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -784px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -924px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Beetle-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -884px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1006px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Bunny-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Butterfly-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -984px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1088px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1170px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cactus-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1084px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cheetah-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cow-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1230px -1184px; - width: 81px; - height: 99px; -} -.Mount_Icon_Cuttlefish-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Deer-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1334px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dolphin-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1230px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1312px -1284px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1416px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Dragon-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1230px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1312px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1394px -1384px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Egg-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1498px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_Falcon-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_Ferret-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1580px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1148px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1230px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1312px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1394px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Red { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1476px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1558px -1484px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -500px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -900px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -1000px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-White { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -1100px; - width: 81px; - height: 99px; -} -.Mount_Icon_FlyingPig-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -1200px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -1300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Base { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1662px -1400px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: 0px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -82px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -164px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -246px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -328px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -410px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -492px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -574px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -656px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -738px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -820px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -902px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -984px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1066px -1584px; - width: 81px; - height: 99px; -} -.Mount_Icon_Fox-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-21.png'); - background-position: -1252px -300px; - width: 81px; - height: 99px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-26.css b/website/client/assets/css/sprites/spritesmith-main-26.css deleted file mode 100644 index f535b47ed4..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-26.css +++ /dev/null @@ -1,672 +0,0 @@ -.Pet-Unicorn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px 0px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -600px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px 0px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -100px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -100px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -100px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px 0px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -100px; - width: 81px; - height: 99px; -} -.Pet-Unicorn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -200px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Base { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -200px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -200px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -200px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px 0px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -100px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -200px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -300px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -300px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -300px; - width: 81px; - height: 99px; -} -.Pet-Velociraptor-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -300px; - width: 81px; - height: 99px; -} -.Pet-Whale-Base { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -300px; - width: 81px; - height: 99px; -} -.Pet-Whale-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px 0px; - width: 81px; - height: 99px; -} -.Pet-Whale-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -100px; - width: 81px; - height: 99px; -} -.Pet-Whale-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -200px; - width: 81px; - height: 99px; -} -.Pet-Whale-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -300px; - width: 81px; - height: 99px; -} -.Pet-Whale-Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px 0px; - width: 81px; - height: 99px; -} -.Pet-Whale-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -100px; - width: 81px; - height: 99px; -} -.Pet-Whale-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -200px; - width: 81px; - height: 99px; -} -.Pet-Whale-White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -300px; - width: 81px; - height: 99px; -} -.Pet-Whale-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Base { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Ember { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Floral { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Frost { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Glass { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Glow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Holly { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -200px; - width: 81px; - height: 99px; -} -.Pet-Wolf-RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -300px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -400px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -500px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Silver { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Veggie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -574px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Veteran { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -656px -600px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Watery { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px 0px; - width: 81px; - height: 99px; -} -.Pet-Wolf-White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -100px; - width: 81px; - height: 99px; -} -.Pet-Wolf-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -200px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Base { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -300px; - width: 81px; - height: 99px; -} -.Pet-Yarn-CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -400px; - width: 81px; - height: 99px; -} -.Pet-Yarn-CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -500px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -738px -600px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -700px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -82px -700px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -164px -700px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -246px -700px; - width: 81px; - height: 99px; -} -.Pet-Yarn-White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -328px -700px; - width: 81px; - height: 99px; -} -.Pet-Yarn-Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -410px -700px; - width: 81px; - height: 99px; -} -.Pet_HatchingPotion_Aquatic { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -561px -700px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Base { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -207px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Bronze { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -630px -700px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Celestial { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -699px -700px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_CottonCandyBlue { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px 0px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_CottonCandyPink { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -69px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Cupid { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -138px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Desert { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -207px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Ember { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -276px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Fairy { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -345px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Floral { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -414px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Frost { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -483px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Ghost { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -552px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Glass { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -621px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Glow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -820px -690px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Golden { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: 0px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Holly { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -69px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_IcySnow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -138px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Peppermint { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -492px -700px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Purple { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -276px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Rainbow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -345px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Red { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -414px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_RoseQuartz { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -483px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_RoyalPurple { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -552px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Shade { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -621px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Shadow { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -690px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Shimmer { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -759px -800px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Silver { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px 0px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Skeleton { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -69px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Spooky { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -138px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_StarryNight { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -207px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Sunshine { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -276px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Thunderstorm { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -345px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Watery { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -414px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_White { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -483px; - width: 68px; - height: 68px; -} -.Pet_HatchingPotion_Zombie { - background-image: url('~assets/images/sprites/spritesmith-main-26.png'); - background-position: -889px -552px; - width: 68px; - height: 68px; -} diff --git a/website/client/assets/css/sprites/spritesmith-main-9.css b/website/client/assets/css/sprites/spritesmith-main-9.css deleted file mode 100644 index fdc5cf660f..0000000000 --- a/website/client/assets/css/sprites/spritesmith-main-9.css +++ /dev/null @@ -1,2208 +0,0 @@ -.shop_set_mystery_201809 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -345px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201809 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -575px -712px; - width: 114px; - height: 90px; -} -.broad_armor_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -457px -273px; - width: 114px; - height: 90px; -} -.head_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -348px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1640px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1518px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1449px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201810 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -182px; - width: 114px; - height: 90px; -} -.head_mystery_201811 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -273px; - width: 114px; - height: 90px; -} -.shop_head_mystery_201811 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1380px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201811 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1311px; - width: 68px; - height: 68px; -} -.shop_weapon_mystery_201811 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1173px; - width: 68px; - height: 68px; -} -.weapon_mystery_201811 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -348px; - width: 114px; - height: 90px; -} -.back_mystery_201812 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -457px 0px; - width: 114px; - height: 90px; -} -.headAccessory_mystery_201812 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -457px -91px; - width: 114px; - height: 90px; -} -.shop_back_mystery_201812 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -759px; - width: 68px; - height: 68px; -} -.shop_headAccessory_mystery_201812 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -345px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201812 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1449px -1571px; - width: 68px; - height: 68px; -} -.body_mystery_201901 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -439px; - width: 114px; - height: 90px; -} -.head_mystery_201901 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -439px; - width: 114px; - height: 90px; -} -.shop_body_mystery_201901 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1571px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201901 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201901 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1571px; - width: 68px; - height: 68px; -} -.eyewear_mystery_201902 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px -182px; - width: 114px; - height: 90px; -} -.shield_mystery_201902 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px -273px; - width: 114px; - height: 90px; -} -.shop_eyewear_mystery_201902 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201902 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1571px; - width: 68px; - height: 68px; -} -.shop_shield_mystery_201902 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1571px; - width: 68px; - height: 68px; -} -.broad_armor_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -530px; - width: 114px; - height: 90px; -} -.head_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -530px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1571px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1311px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1242px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201903 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -182px; - width: 114px; - height: 90px; -} -.broad_armor_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -273px; - width: 114px; - height: 90px; -} -.head_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -364px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1173px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1104px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1035px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201904 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -621px; - width: 114px; - height: 90px; -} -.back_mystery_201905 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -621px; - width: 114px; - height: 90px; -} -.headAccessory_mystery_201905 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -621px; - width: 114px; - height: 90px; -} -.shop_back_mystery_201905 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -966px; - width: 68px; - height: 68px; -} -.shop_headAccessory_mystery_201905 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -897px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201905 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -828px; - width: 68px; - height: 68px; -} -.broad_armor_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px 0px; - width: 117px; - height: 120px; -} -.headAccessory_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -118px 0px; - width: 117px; - height: 120px; -} -.shop_armor_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px 0px; - width: 68px; - height: 68px; -} -.shop_headAccessory_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1518px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1571px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201906 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -236px 0px; - width: 117px; - height: 120px; -} -.broad_armor_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -712px; - width: 114px; - height: 90px; -} -.eyewear_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -712px; - width: 114px; - height: 90px; -} -.head_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -712px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1571px; - width: 68px; - height: 68px; -} -.shop_eyewear_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1571px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1571px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201907 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -803px; - width: 114px; - height: 90px; -} -.broad_armor_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -803px; - width: 114px; - height: 90px; -} -.headAccessory_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -803px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1571px; - width: 68px; - height: 68px; -} -.shop_headAccessory_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1571px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201908 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px 0px; - width: 114px; - height: 90px; -} -.broad_armor_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -91px; - width: 114px; - height: 90px; -} -.head_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -182px; - width: 114px; - height: 90px; -} -.shop_armor_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1571px; - width: 68px; - height: 68px; -} -.shop_head_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1571px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_201909 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -546px; - width: 114px; - height: 90px; -} -.broad_armor_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1091px; - width: 90px; - height: 90px; -} -.eyewear_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1091px; - width: 90px; - height: 90px; -} -.head_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -985px; - width: 90px; - height: 90px; -} -.shop_armor_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -69px; - width: 68px; - height: 68px; -} -.shop_eyewear_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1571px; - width: 68px; - height: 68px; -} -.shop_head_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1571px; - width: 68px; - height: 68px; -} -.shop_set_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1571px; - width: 68px; - height: 68px; -} -.shop_weapon_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1449px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -985px; - width: 90px; - height: 90px; -} -.weapon_mystery_301404 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -985px; - width: 90px; - height: 90px; -} -.eyewear_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -273px; - width: 90px; - height: 90px; -} -.headAccessory_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -985px; - width: 90px; - height: 90px; -} -.head_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1273px; - width: 90px; - height: 90px; -} -.shield_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1182px; - width: 90px; - height: 90px; -} -.shop_eyewear_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -690px; - width: 68px; - height: 68px; -} -.shop_headAccessory_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -138px; - width: 68px; - height: 68px; -} -.shop_head_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -759px; - width: 68px; - height: 68px; -} -.shop_set_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -207px; - width: 68px; - height: 68px; -} -.shop_shield_mystery_301405 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -276px; - width: 68px; - height: 68px; -} -.broad_armor_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -637px; - width: 90px; - height: 90px; -} -.eyewear_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -1092px; - width: 90px; - height: 90px; -} -.head_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -358px; - width: 114px; - height: 87px; -} -.shop_armor_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -1380px; - width: 68px; - height: 68px; -} -.shop_eyewear_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1364px; - width: 68px; - height: 68px; -} -.shop_head_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px 0px; - width: 68px; - height: 68px; -} -.shop_set_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -69px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_301703 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -637px; - width: 90px; - height: 90px; -} -.broad_armor_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -91px; - width: 90px; - height: 90px; -} -.head_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1182px; - width: 90px; - height: 90px; -} -.shield_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1182px; - width: 90px; - height: 90px; -} -.shop_armor_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -414px; - width: 68px; - height: 68px; -} -.shop_head_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -483px; - width: 68px; - height: 68px; -} -.shop_set_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -552px; - width: 68px; - height: 68px; -} -.shop_shield_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1580px -621px; - width: 68px; - height: 68px; -} -.slim_armor_mystery_301704 { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -728px; - width: 90px; - height: 90px; -} -.head_special_piDay { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -91px; - width: 114px; - height: 90px; -} -.shield_special_piDay { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px 0px; - width: 114px; - height: 90px; -} -.shop_head_special_piDay { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -138px; - width: 68px; - height: 68px; -} -.shop_shield_special_piDay { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -207px; - width: 68px; - height: 68px; -} -.broad_armor_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -364px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -455px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -728px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -819px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -910px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -1001px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -348px; - width: 102px; - height: 90px; -} -.broad_armor_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -920px -894px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -446px; - width: 114px; - height: 87px; -} -.broad_armor_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -805px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -575px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -894px; - width: 114px; - height: 90px; -} -.broad_armor_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -985px; - width: 90px; - height: 90px; -} -.broad_armor_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px 0px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1091px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1091px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1091px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1091px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1091px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px 0px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -621px; - width: 102px; - height: 90px; -} -.headAccessory_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -182px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -273px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -364px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -455px; - width: 90px; - height: 90px; -} -.headAccessory_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -546px; - width: 90px; - height: 90px; -} -.headAccessory_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -805px -803px; - width: 90px; - height: 90px; -} -.headAccessory_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -728px; - width: 90px; - height: 90px; -} -.headAccessory_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -819px; - width: 90px; - height: 90px; -} -.headAccessory_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -910px; - width: 90px; - height: 90px; -} -.head_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -91px; - width: 90px; - height: 90px; -} -.head_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -182px; - width: 90px; - height: 90px; -} -.head_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -273px; - width: 90px; - height: 90px; -} -.head_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -364px; - width: 90px; - height: 90px; -} -.head_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -455px; - width: 90px; - height: 90px; -} -.head_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -546px; - width: 90px; - height: 90px; -} -.head_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -575px -530px; - width: 102px; - height: 90px; -} -.head_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -728px; - width: 90px; - height: 90px; -} -.head_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -819px; - width: 90px; - height: 90px; -} -.head_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -910px; - width: 90px; - height: 90px; -} -.head_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1091px; - width: 90px; - height: 90px; -} -.head_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1091px; - width: 90px; - height: 90px; -} -.head_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -728px; - width: 114px; - height: 90px; -} -.head_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -637px; - width: 114px; - height: 90px; -} -.head_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -455px; - width: 114px; - height: 90px; -} -.head_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -364px; - width: 114px; - height: 90px; -} -.head_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -273px; - width: 114px; - height: 90px; -} -.head_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -803px; - width: 114px; - height: 90px; -} -.head_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -575px -803px; - width: 114px; - height: 90px; -} -.head_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -803px; - width: 114px; - height: 90px; -} -.head_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1091px; - width: 90px; - height: 90px; -} -.head_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1091px; - width: 90px; - height: 90px; -} -.head_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -546px -1091px; - width: 90px; - height: 90px; -} -.head_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1091px; - width: 90px; - height: 90px; -} -.shield_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -1001px; - width: 90px; - height: 90px; -} -.shield_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1182px; - width: 90px; - height: 90px; -} -.shield_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1182px; - width: 90px; - height: 90px; -} -.shield_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1182px; - width: 90px; - height: 90px; -} -.shield_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -805px -712px; - width: 102px; - height: 90px; -} -.shield_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1182px; - width: 90px; - height: 90px; -} -.shield_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1182px; - width: 90px; - height: 90px; -} -.shield_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -803px; - width: 114px; - height: 90px; -} -.shield_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -182px; - width: 114px; - height: 87px; -} -.shield_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -712px; - width: 114px; - height: 90px; -} -.shield_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -457px -182px; - width: 114px; - height: 90px; -} -.shield_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -712px; - width: 114px; - height: 90px; -} -.shield_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -546px; - width: 114px; - height: 90px; -} -.shield_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -455px; - width: 114px; - height: 90px; -} -.shield_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -364px; - width: 114px; - height: 90px; -} -.shield_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1182px; - width: 90px; - height: 90px; -} -.shield_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1182px; - width: 90px; - height: 90px; -} -.shield_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1182px; - width: 90px; - height: 90px; -} -.shop_armor_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -276px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -414px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -483px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -552px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -621px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -690px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -828px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -897px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -966px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1035px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1104px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1649px -1242px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -1274px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -1183px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1238px -1092px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1147px -1001px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -917px -819px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -637px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -546px; - width: 68px; - height: 68px; -} -.shop_armor_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px -455px; - width: 68px; - height: 68px; -} -.shop_armor_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -457px -364px; - width: 68px; - height: 68px; -} -.shop_armor_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1364px; - width: 68px; - height: 68px; -} -.shop_armor_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1364px; - width: 68px; - height: 68px; -} -.shop_armor_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1364px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1433px; - width: 68px; - height: 68px; -} -.shop_headAccessory_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px 0px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1640px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1364px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1433px; - width: 68px; - height: 68px; -} -.shop_head_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1433px; - width: 68px; - height: 68px; -} -.shop_head_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1433px; - width: 68px; - height: 68px; -} -.shop_head_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1433px; - width: 68px; - height: 68px; -} -.shop_head_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1433px; - width: 68px; - height: 68px; -} -.shop_head_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1433px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -69px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -138px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -207px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -276px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -345px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -414px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -483px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -552px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -621px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -690px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -759px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -828px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -897px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -966px; - width: 68px; - height: 68px; -} -.shop_shield_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1035px; - width: 68px; - height: 68px; -} -.shop_shield_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1104px; - width: 68px; - height: 68px; -} -.shop_shield_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1173px; - width: 68px; - height: 68px; -} -.shop_shield_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1242px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1311px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1511px -1380px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -69px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -138px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -207px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -276px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -414px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -483px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -552px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -621px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -690px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -759px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -828px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -897px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -966px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1035px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1104px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1173px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1242px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1311px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1380px -1502px; - width: 68px; - height: 68px; -} -.shop_weapon_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1449px -1502px; - width: 68px; - height: 68px; -} -.slim_armor_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1182px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1182px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1183px -1182px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px 0px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -91px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -182px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -273px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -364px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -455px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -546px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -637px; - width: 90px; - height: 90px; -} -.slim_armor_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -270px; - width: 114px; - height: 87px; -} -.slim_armor_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px -91px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -802px 0px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -575px -621px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -621px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -621px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -455px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px -91px; - width: 114px; - height: 90px; -} -.slim_armor_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -687px 0px; - width: 114px; - height: 90px; -} -.slim_armor_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -819px; - width: 90px; - height: 90px; -} -.slim_armor_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -910px; - width: 90px; - height: 90px; -} -.slim_armor_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -1001px; - width: 90px; - height: 90px; -} -.slim_armor_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1329px -1092px; - width: 90px; - height: 90px; -} -.weapon_special_spring2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -182px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -273px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -364px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -455px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -439px; - width: 102px; - height: 90px; -} -.weapon_special_spring2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -637px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -728px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -819px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -910px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1001px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_spring2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -460px -530px; - width: 114px; - height: 90px; -} -.weapon_special_spring2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -530px; - width: 114px; - height: 90px; -} -.weapon_special_spring2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -530px; - width: 114px; - height: 90px; -} -.weapon_special_spring2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px -364px; - width: 114px; - height: 90px; -} -.weapon_special_spring2019Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px -91px; - width: 114px; - height: 90px; -} -.weapon_special_spring2019Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -572px 0px; - width: 114px; - height: 90px; -} -.weapon_special_spring2019Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -345px -439px; - width: 114px; - height: 90px; -} -.weapon_special_spring2019Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -439px; - width: 114px; - height: 90px; -} -.weapon_special_springHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1092px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_springMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1183px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_springRogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1274px -1273px; - width: 90px; - height: 90px; -} -.weapon_special_springWarrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px 0px; - width: 90px; - height: 90px; -} -.body_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -91px; - width: 90px; - height: 90px; -} -.body_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -182px; - width: 90px; - height: 90px; -} -.body_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -354px 0px; - width: 102px; - height: 105px; -} -.body_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -640px; - width: 90px; - height: 105px; -} -.body_special_summerHealer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -534px; - width: 90px; - height: 105px; -} -.body_special_summerMage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -852px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2015Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -546px; - width: 90px; - height: 90px; -} -.broad_armor_special_summer2015Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -637px; - width: 90px; - height: 90px; -} -.broad_armor_special_summer2015Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -221px -242px; - width: 102px; - height: 105px; -} -.broad_armor_special_summer2015Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -354px -106px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2016Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -354px -212px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2016Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -985px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2016Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -91px -985px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2016Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1032px -746px; - width: 90px; - height: 105px; -} -.broad_armor_special_summer2017Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -242px; - width: 114px; - height: 105px; -} -.broad_armor_special_summer2017Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -1420px -1183px; - width: 90px; - height: 90px; -} -.broad_armor_special_summer2017Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -242px; - width: 105px; - height: 105px; -} -.broad_armor_special_summer2017Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -712px; - width: 114px; - height: 90px; -} -.broad_armor_special_summer2018Healer { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -230px -121px; - width: 114px; - height: 120px; -} -.broad_armor_special_summer2018Mage { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -121px; - width: 114px; - height: 120px; -} -.broad_armor_special_summer2018Rogue { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: -115px -348px; - width: 114px; - height: 90px; -} -.broad_armor_special_summer2018Warrior { - background-image: url('~assets/images/sprites/spritesmith-main-9.png'); - background-position: 0px -121px; - width: 114px; - height: 120px; -} diff --git a/website/client/assets/images/sprites/spritesmith-largeSprites-0.png b/website/client/assets/images/sprites/spritesmith-largeSprites-0.png deleted file mode 100644 index 6a766dc132..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-largeSprites-0.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-0.png b/website/client/assets/images/sprites/spritesmith-main-0.png deleted file mode 100644 index 8498b1abed..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-0.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-1.png b/website/client/assets/images/sprites/spritesmith-main-1.png deleted file mode 100644 index 165c50b7d0..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-1.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-10.png b/website/client/assets/images/sprites/spritesmith-main-10.png deleted file mode 100644 index 0854346999..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-10.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-11.png b/website/client/assets/images/sprites/spritesmith-main-11.png deleted file mode 100644 index ed1e3cce91..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-11.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-12.png b/website/client/assets/images/sprites/spritesmith-main-12.png deleted file mode 100644 index 631d88d911..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-12.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-13.png b/website/client/assets/images/sprites/spritesmith-main-13.png deleted file mode 100644 index 7140dbd740..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-13.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-14.png b/website/client/assets/images/sprites/spritesmith-main-14.png deleted file mode 100644 index 9aa7fb70f5..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-14.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-15.png b/website/client/assets/images/sprites/spritesmith-main-15.png deleted file mode 100644 index 67e29f5cd9..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-15.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-16.png b/website/client/assets/images/sprites/spritesmith-main-16.png deleted file mode 100644 index 9361bbd96d..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-16.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-17.png b/website/client/assets/images/sprites/spritesmith-main-17.png deleted file mode 100644 index d77e99198f..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-17.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-18.png b/website/client/assets/images/sprites/spritesmith-main-18.png deleted file mode 100644 index ffe044db58..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-18.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-19.png b/website/client/assets/images/sprites/spritesmith-main-19.png deleted file mode 100644 index 44a03f616c..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-19.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-2.png b/website/client/assets/images/sprites/spritesmith-main-2.png deleted file mode 100644 index b41711be12..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-2.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-20.png b/website/client/assets/images/sprites/spritesmith-main-20.png deleted file mode 100644 index c2587af46f..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-20.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-21.png b/website/client/assets/images/sprites/spritesmith-main-21.png deleted file mode 100644 index 9abd45b765..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-21.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-22.png b/website/client/assets/images/sprites/spritesmith-main-22.png deleted file mode 100644 index 0a036a8400..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-22.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-23.png b/website/client/assets/images/sprites/spritesmith-main-23.png deleted file mode 100644 index 611db000db..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-23.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-24.png b/website/client/assets/images/sprites/spritesmith-main-24.png deleted file mode 100644 index ce4ffbda61..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-24.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-25.png b/website/client/assets/images/sprites/spritesmith-main-25.png deleted file mode 100644 index 913f0d0b69..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-25.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-26.png b/website/client/assets/images/sprites/spritesmith-main-26.png deleted file mode 100644 index d90767b2ba..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-26.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-3.png b/website/client/assets/images/sprites/spritesmith-main-3.png deleted file mode 100644 index 6a8e977a22..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-3.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-4.png b/website/client/assets/images/sprites/spritesmith-main-4.png deleted file mode 100644 index 646f383f69..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-4.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-5.png b/website/client/assets/images/sprites/spritesmith-main-5.png deleted file mode 100644 index d4e1f924ba..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-5.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-6.png b/website/client/assets/images/sprites/spritesmith-main-6.png deleted file mode 100644 index 72a840645e..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-6.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-7.png b/website/client/assets/images/sprites/spritesmith-main-7.png deleted file mode 100644 index 90f47fb4c3..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-7.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-8.png b/website/client/assets/images/sprites/spritesmith-main-8.png deleted file mode 100644 index d8b38b5aaf..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-8.png and /dev/null differ diff --git a/website/client/assets/images/sprites/spritesmith-main-9.png b/website/client/assets/images/sprites/spritesmith-main-9.png deleted file mode 100644 index 6e2f2d35f6..0000000000 Binary files a/website/client/assets/images/sprites/spritesmith-main-9.png and /dev/null differ diff --git a/website/client/babel.config.js b/website/client/babel.config.js new file mode 100644 index 0000000000..b90a77f6e8 --- /dev/null +++ b/website/client/babel.config.js @@ -0,0 +1,6 @@ +/* eslint-disable import/no-commonjs */ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset', + ], +}; diff --git a/website/client/components/404.vue b/website/client/components/404.vue deleted file mode 100644 index a02a9e944a..0000000000 --- a/website/client/components/404.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - \ No newline at end of file diff --git a/website/client/components/achievements/achievementFooter.vue b/website/client/components/achievements/achievementFooter.vue deleted file mode 100644 index dd899a34b6..0000000000 --- a/website/client/components/achievements/achievementFooter.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/armoireEmpty.vue b/website/client/components/achievements/armoireEmpty.vue deleted file mode 100644 index dca69af311..0000000000 --- a/website/client/components/achievements/armoireEmpty.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/chooseClass.vue b/website/client/components/achievements/chooseClass.vue deleted file mode 100644 index 9cd81fa8da..0000000000 --- a/website/client/components/achievements/chooseClass.vue +++ /dev/null @@ -1,203 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/contributor.vue b/website/client/components/achievements/contributor.vue deleted file mode 100644 index eba4be3f8b..0000000000 --- a/website/client/components/achievements/contributor.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/death.vue b/website/client/components/achievements/death.vue deleted file mode 100644 index c052a48bbf..0000000000 --- a/website/client/components/achievements/death.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/dropsEnabled.vue b/website/client/components/achievements/dropsEnabled.vue deleted file mode 100644 index dd96965650..0000000000 --- a/website/client/components/achievements/dropsEnabled.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/genericAchievement.vue b/website/client/components/achievements/genericAchievement.vue deleted file mode 100644 index 6f1b9042e2..0000000000 --- a/website/client/components/achievements/genericAchievement.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/invitedFriend.vue b/website/client/components/achievements/invitedFriend.vue deleted file mode 100644 index 24522181c2..0000000000 --- a/website/client/components/achievements/invitedFriend.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/joinedChallenge.vue b/website/client/components/achievements/joinedChallenge.vue deleted file mode 100644 index 703e3e4c72..0000000000 --- a/website/client/components/achievements/joinedChallenge.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/joinedGuild.vue b/website/client/components/achievements/joinedGuild.vue deleted file mode 100644 index 2896b617f5..0000000000 --- a/website/client/components/achievements/joinedGuild.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/justAddWater.vue b/website/client/components/achievements/justAddWater.vue deleted file mode 100644 index c89d252b8b..0000000000 --- a/website/client/components/achievements/justAddWater.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/login-incentives.vue b/website/client/components/achievements/login-incentives.vue deleted file mode 100644 index cb6a9cbc59..0000000000 --- a/website/client/components/achievements/login-incentives.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/lostMasterclasser.vue b/website/client/components/achievements/lostMasterclasser.vue deleted file mode 100644 index 8ff6ef6c46..0000000000 --- a/website/client/components/achievements/lostMasterclasser.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/lowHealth.vue b/website/client/components/achievements/lowHealth.vue deleted file mode 100644 index ccc2938689..0000000000 --- a/website/client/components/achievements/lowHealth.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/mindOverMatter.vue b/website/client/components/achievements/mindOverMatter.vue deleted file mode 100644 index 013891d5d2..0000000000 --- a/website/client/components/achievements/mindOverMatter.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/newStuff.vue b/website/client/components/achievements/newStuff.vue deleted file mode 100644 index b4730855b2..0000000000 --- a/website/client/components/achievements/newStuff.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/questCompleted.vue b/website/client/components/achievements/questCompleted.vue deleted file mode 100644 index 208fa8b298..0000000000 --- a/website/client/components/achievements/questCompleted.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/questInvitation.vue b/website/client/components/achievements/questInvitation.vue deleted file mode 100644 index f8d6b4c840..0000000000 --- a/website/client/components/achievements/questInvitation.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/website/client/components/achievements/rebirth.vue b/website/client/components/achievements/rebirth.vue deleted file mode 100644 index 42a1720177..0000000000 --- a/website/client/components/achievements/rebirth.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/rebirthEnabled.vue b/website/client/components/achievements/rebirthEnabled.vue deleted file mode 100644 index 012ce14e60..0000000000 --- a/website/client/components/achievements/rebirthEnabled.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/streak.vue b/website/client/components/achievements/streak.vue deleted file mode 100644 index 16fe2e043c..0000000000 --- a/website/client/components/achievements/streak.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/testing.vue b/website/client/components/achievements/testing.vue deleted file mode 100644 index ab1eda8eb7..0000000000 --- a/website/client/components/achievements/testing.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/testingletiant.vue b/website/client/components/achievements/testingletiant.vue deleted file mode 100644 index 0251527d7e..0000000000 --- a/website/client/components/achievements/testingletiant.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/ultimateGear.vue b/website/client/components/achievements/ultimateGear.vue deleted file mode 100644 index fdebfa9046..0000000000 --- a/website/client/components/achievements/ultimateGear.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/website/client/components/achievements/welcome.vue b/website/client/components/achievements/welcome.vue deleted file mode 100644 index 62bded79c7..0000000000 --- a/website/client/components/achievements/welcome.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/website/client/components/achievements/wonChallenge.vue b/website/client/components/achievements/wonChallenge.vue deleted file mode 100644 index de65914ea7..0000000000 --- a/website/client/components/achievements/wonChallenge.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/website/client/components/appFooter.vue b/website/client/components/appFooter.vue deleted file mode 100644 index 97bcf9b3da..0000000000 --- a/website/client/components/appFooter.vue +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - diff --git a/website/client/components/auth/authForm.vue b/website/client/components/auth/authForm.vue deleted file mode 100644 index 5489cf4f10..0000000000 --- a/website/client/components/auth/authForm.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - - diff --git a/website/client/components/auth/logout.vue b/website/client/components/auth/logout.vue deleted file mode 100644 index b826794272..0000000000 --- a/website/client/components/auth/logout.vue +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/website/client/components/avatar.vue b/website/client/components/avatar.vue deleted file mode 100644 index db56336a60..0000000000 --- a/website/client/components/avatar.vue +++ /dev/null @@ -1,228 +0,0 @@ - - - - - diff --git a/website/client/components/avatarModal/body-settings.vue b/website/client/components/avatarModal/body-settings.vue deleted file mode 100644 index cea1b2c7dd..0000000000 --- a/website/client/components/avatarModal/body-settings.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/website/client/components/avatarModal/extra-settings.vue b/website/client/components/avatarModal/extra-settings.vue deleted file mode 100644 index 406771ebfd..0000000000 --- a/website/client/components/avatarModal/extra-settings.vue +++ /dev/null @@ -1,272 +0,0 @@ - - - - - diff --git a/website/client/components/avatarModal/hair-settings.vue b/website/client/components/avatarModal/hair-settings.vue deleted file mode 100644 index d86f608aba..0000000000 --- a/website/client/components/avatarModal/hair-settings.vue +++ /dev/null @@ -1,341 +0,0 @@ - - - - - diff --git a/website/client/components/avatarModal/skin-settings.vue b/website/client/components/avatarModal/skin-settings.vue deleted file mode 100644 index f180b47a3f..0000000000 --- a/website/client/components/avatarModal/skin-settings.vue +++ /dev/null @@ -1,114 +0,0 @@ - - - - - diff --git a/website/client/components/bannedAccountModal.vue b/website/client/components/bannedAccountModal.vue deleted file mode 100644 index ae6d0cd9ae..0000000000 --- a/website/client/components/bannedAccountModal.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/website/client/components/categories/categoryTags.vue b/website/client/components/categories/categoryTags.vue deleted file mode 100644 index aaa0209db3..0000000000 --- a/website/client/components/categories/categoryTags.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue deleted file mode 100644 index d243af8053..0000000000 --- a/website/client/components/challenges/challengeDetail.vue +++ /dev/null @@ -1,401 +0,0 @@ - - - - - diff --git a/website/client/components/challenges/closeChallengeModal.vue b/website/client/components/challenges/closeChallengeModal.vue deleted file mode 100644 index a85779d427..0000000000 --- a/website/client/components/challenges/closeChallengeModal.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/website/client/components/challenges/groupChallenges.vue b/website/client/components/challenges/groupChallenges.vue deleted file mode 100644 index 1415b921a9..0000000000 --- a/website/client/components/challenges/groupChallenges.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/website/client/components/challenges/index.vue b/website/client/components/challenges/index.vue deleted file mode 100644 index 8a2588ca1b..0000000000 --- a/website/client/components/challenges/index.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/website/client/components/challenges/leaveChallengeModal.vue b/website/client/components/challenges/leaveChallengeModal.vue deleted file mode 100644 index 0925a4e1d0..0000000000 --- a/website/client/components/challenges/leaveChallengeModal.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/website/client/components/creatorIntro.vue b/website/client/components/creatorIntro.vue deleted file mode 100644 index 5ce0cd529b..0000000000 --- a/website/client/components/creatorIntro.vue +++ /dev/null @@ -1,963 +0,0 @@ - - - - - diff --git a/website/client/components/emptyView.vue b/website/client/components/emptyView.vue deleted file mode 100644 index 01274826f4..0000000000 --- a/website/client/components/emptyView.vue +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/website/client/components/group-plans/billing.vue b/website/client/components/group-plans/billing.vue deleted file mode 100644 index 976028f89e..0000000000 --- a/website/client/components/group-plans/billing.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - diff --git a/website/client/components/group-plans/createGroupModalPages.vue b/website/client/components/group-plans/createGroupModalPages.vue deleted file mode 100644 index 8e480a9c11..0000000000 --- a/website/client/components/group-plans/createGroupModalPages.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - - - diff --git a/website/client/components/group-plans/groupPlanOverviewModal.vue b/website/client/components/group-plans/groupPlanOverviewModal.vue deleted file mode 100644 index 11d28ebfb7..0000000000 --- a/website/client/components/group-plans/groupPlanOverviewModal.vue +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - diff --git a/website/client/components/group-plans/index.vue b/website/client/components/group-plans/index.vue deleted file mode 100644 index 82a20d244d..0000000000 --- a/website/client/components/group-plans/index.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - diff --git a/website/client/components/groupLink.vue b/website/client/components/groupLink.vue deleted file mode 100644 index e1861565f9..0000000000 --- a/website/client/components/groupLink.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/groups/chat.vue b/website/client/components/groups/chat.vue deleted file mode 100644 index 424fc71e33..0000000000 --- a/website/client/components/groups/chat.vue +++ /dev/null @@ -1,313 +0,0 @@ - - - - - diff --git a/website/client/components/groups/createPartyModal.vue b/website/client/components/groups/createPartyModal.vue deleted file mode 100644 index 6e0ea2956a..0000000000 --- a/website/client/components/groups/createPartyModal.vue +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - diff --git a/website/client/components/groups/groupFormModal.vue b/website/client/components/groups/groupFormModal.vue deleted file mode 100644 index 55b52da07a..0000000000 --- a/website/client/components/groups/groupFormModal.vue +++ /dev/null @@ -1,454 +0,0 @@ - - - - - diff --git a/website/client/components/groups/groupGemsModal.vue b/website/client/components/groups/groupGemsModal.vue deleted file mode 100644 index 769451d6b9..0000000000 --- a/website/client/components/groups/groupGemsModal.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/website/client/components/groups/groupPlan.vue b/website/client/components/groups/groupPlan.vue deleted file mode 100644 index 8d30345589..0000000000 --- a/website/client/components/groups/groupPlan.vue +++ /dev/null @@ -1,382 +0,0 @@ - - - - - diff --git a/website/client/components/groups/index.vue b/website/client/components/groups/index.vue deleted file mode 100644 index d06e409333..0000000000 --- a/website/client/components/groups/index.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/website/client/components/groups/inviteModal.vue b/website/client/components/groups/inviteModal.vue deleted file mode 100644 index a1e8a312eb..0000000000 --- a/website/client/components/groups/inviteModal.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - diff --git a/website/client/components/groups/myGuilds.vue b/website/client/components/groups/myGuilds.vue deleted file mode 100644 index 9cbd87ee79..0000000000 --- a/website/client/components/groups/myGuilds.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - - diff --git a/website/client/components/groups/newPartyModal.pug b/website/client/components/groups/newPartyModal.pug deleted file mode 100644 index 7cecf2c272..0000000000 --- a/website/client/components/groups/newPartyModal.pug +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/website/client/components/groups/publicGuildItem.vue b/website/client/components/groups/publicGuildItem.vue deleted file mode 100644 index 0fb9d5244f..0000000000 --- a/website/client/components/groups/publicGuildItem.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - - diff --git a/website/client/components/groups/questDetailsModal.vue b/website/client/components/groups/questDetailsModal.vue deleted file mode 100644 index e025221025..0000000000 --- a/website/client/components/groups/questDetailsModal.vue +++ /dev/null @@ -1,224 +0,0 @@ - - - - - diff --git a/website/client/components/groups/questSidebarSection.vue b/website/client/components/groups/questSidebarSection.vue deleted file mode 100644 index 66ed19ae56..0000000000 --- a/website/client/components/groups/questSidebarSection.vue +++ /dev/null @@ -1,294 +0,0 @@ - - - - - diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue deleted file mode 100644 index 86776fb7d9..0000000000 --- a/website/client/components/groups/tavern.vue +++ /dev/null @@ -1,550 +0,0 @@ - - - - - diff --git a/website/client/components/hall/heroes.vue b/website/client/components/hall/heroes.vue deleted file mode 100644 index fe13b65723..0000000000 --- a/website/client/components/hall/heroes.vue +++ /dev/null @@ -1,210 +0,0 @@ - - - - - diff --git a/website/client/components/hall/index.vue b/website/client/components/hall/index.vue deleted file mode 100644 index f420ebfcfd..0000000000 --- a/website/client/components/hall/index.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/website/client/components/hall/patrons.vue b/website/client/components/hall/patrons.vue deleted file mode 100644 index f0f8befa25..0000000000 --- a/website/client/components/hall/patrons.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/website/client/components/header/menu.vue b/website/client/components/header/menu.vue deleted file mode 100644 index a6c2e33a72..0000000000 --- a/website/client/components/header/menu.vue +++ /dev/null @@ -1,531 +0,0 @@ - - - - - diff --git a/website/client/components/header/notifications/challengeInvitation.vue b/website/client/components/header/notifications/challengeInvitation.vue deleted file mode 100644 index 97083da552..0000000000 --- a/website/client/components/header/notifications/challengeInvitation.vue +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/website/client/components/header/notifications/groupTaskApproved.vue b/website/client/components/header/notifications/groupTaskApproved.vue deleted file mode 100644 index 35982f3ef9..0000000000 --- a/website/client/components/header/notifications/groupTaskApproved.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/groupTaskAssigned.vue b/website/client/components/header/notifications/groupTaskAssigned.vue deleted file mode 100644 index 5916ba27a6..0000000000 --- a/website/client/components/header/notifications/groupTaskAssigned.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/groupTaskClaimed.vue b/website/client/components/header/notifications/groupTaskClaimed.vue deleted file mode 100644 index 508177dbb2..0000000000 --- a/website/client/components/header/notifications/groupTaskClaimed.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/groupTaskNeedsWork.vue b/website/client/components/header/notifications/groupTaskNeedsWork.vue deleted file mode 100644 index 068e479f72..0000000000 --- a/website/client/components/header/notifications/groupTaskNeedsWork.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/guildInvitation.vue b/website/client/components/header/notifications/guildInvitation.vue deleted file mode 100644 index ffe5429503..0000000000 --- a/website/client/components/header/notifications/guildInvitation.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/justAddWater.vue b/website/client/components/header/notifications/justAddWater.vue deleted file mode 100644 index 9889b28cc4..0000000000 --- a/website/client/components/header/notifications/justAddWater.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/lostMasterclasser.vue b/website/client/components/header/notifications/lostMasterclasser.vue deleted file mode 100644 index c72aa02d3e..0000000000 --- a/website/client/components/header/notifications/lostMasterclasser.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/mindOverMatter.vue b/website/client/components/header/notifications/mindOverMatter.vue deleted file mode 100644 index 9044a25a91..0000000000 --- a/website/client/components/header/notifications/mindOverMatter.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/website/client/components/header/notifications/newInboxMessage.vue b/website/client/components/header/notifications/newInboxMessage.vue deleted file mode 100644 index 05f76b2f15..0000000000 --- a/website/client/components/header/notifications/newInboxMessage.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/newMysteryItems.vue b/website/client/components/header/notifications/newMysteryItems.vue deleted file mode 100644 index 763b848b11..0000000000 --- a/website/client/components/header/notifications/newMysteryItems.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/newStuff.vue b/website/client/components/header/notifications/newStuff.vue deleted file mode 100644 index a479748413..0000000000 --- a/website/client/components/header/notifications/newStuff.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/partyInvitation.vue b/website/client/components/header/notifications/partyInvitation.vue deleted file mode 100644 index a93d277970..0000000000 --- a/website/client/components/header/notifications/partyInvitation.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/header/notifications/questInvitation.vue b/website/client/components/header/notifications/questInvitation.vue deleted file mode 100644 index 506e1e4cf2..0000000000 --- a/website/client/components/header/notifications/questInvitation.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/website/client/components/header/notifications/unallocatedStatsPoints.vue b/website/client/components/header/notifications/unallocatedStatsPoints.vue deleted file mode 100644 index 0cb6bd554c..0000000000 --- a/website/client/components/header/notifications/unallocatedStatsPoints.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/website/client/components/header/notifications/verifyUsername.vue b/website/client/components/header/notifications/verifyUsername.vue deleted file mode 100644 index cb848322e8..0000000000 --- a/website/client/components/header/notifications/verifyUsername.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/website/client/components/header/userDropdown.vue b/website/client/components/header/userDropdown.vue deleted file mode 100644 index 6fe67f63f9..0000000000 --- a/website/client/components/header/userDropdown.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/equipment/attributesPopover.vue b/website/client/components/inventory/equipment/attributesPopover.vue deleted file mode 100644 index 3b51f1310c..0000000000 --- a/website/client/components/inventory/equipment/attributesPopover.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/equipment/equipGearModal.vue b/website/client/components/inventory/equipment/equipGearModal.vue deleted file mode 100644 index 415aa93167..0000000000 --- a/website/client/components/inventory/equipment/equipGearModal.vue +++ /dev/null @@ -1,219 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/equipment/index.vue b/website/client/components/inventory/equipment/index.vue deleted file mode 100644 index 03b3a727e0..0000000000 --- a/website/client/components/inventory/equipment/index.vue +++ /dev/null @@ -1,406 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/index.vue b/website/client/components/inventory/index.vue deleted file mode 100644 index 2647658916..0000000000 --- a/website/client/components/inventory/index.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - \ No newline at end of file diff --git a/website/client/components/inventory/item.vue b/website/client/components/inventory/item.vue deleted file mode 100644 index f188b2f272..0000000000 --- a/website/client/components/inventory/item.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - diff --git a/website/client/components/inventory/items/cards-modal.vue b/website/client/components/inventory/items/cards-modal.vue deleted file mode 100644 index 62ccd17d69..0000000000 --- a/website/client/components/inventory/items/cards-modal.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/items/index.vue b/website/client/components/inventory/items/index.vue deleted file mode 100644 index 6ffae15b42..0000000000 --- a/website/client/components/inventory/items/index.vue +++ /dev/null @@ -1,500 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/stable/foodItem.vue b/website/client/components/inventory/stable/foodItem.vue deleted file mode 100644 index e858763ab4..0000000000 --- a/website/client/components/inventory/stable/foodItem.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - diff --git a/website/client/components/inventory/stable/hatchedPetDialog.vue b/website/client/components/inventory/stable/hatchedPetDialog.vue deleted file mode 100644 index 0b36304569..0000000000 --- a/website/client/components/inventory/stable/hatchedPetDialog.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/stable/hatchingModal.vue b/website/client/components/inventory/stable/hatchingModal.vue deleted file mode 100644 index a7fc612f89..0000000000 --- a/website/client/components/inventory/stable/hatchingModal.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue deleted file mode 100644 index e4e68ecc0e..0000000000 --- a/website/client/components/inventory/stable/index.vue +++ /dev/null @@ -1,817 +0,0 @@ - - - - - - - diff --git a/website/client/components/inventory/stable/mountItem.vue b/website/client/components/inventory/stable/mountItem.vue deleted file mode 100644 index b8d84a827b..0000000000 --- a/website/client/components/inventory/stable/mountItem.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - diff --git a/website/client/components/inventory/stable/mountRaisedModal.vue b/website/client/components/inventory/stable/mountRaisedModal.vue deleted file mode 100644 index 29c2a4803f..0000000000 --- a/website/client/components/inventory/stable/mountRaisedModal.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - diff --git a/website/client/components/inventory/stable/petItem.vue b/website/client/components/inventory/stable/petItem.vue deleted file mode 100644 index c96668b104..0000000000 --- a/website/client/components/inventory/stable/petItem.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - - - diff --git a/website/client/components/members/removeMemberModal.vue b/website/client/components/members/removeMemberModal.vue deleted file mode 100644 index 7fc706d322..0000000000 --- a/website/client/components/members/removeMemberModal.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/website/client/components/modifyInventory.vue b/website/client/components/modifyInventory.vue deleted file mode 100644 index 68aa4de7b3..0000000000 --- a/website/client/components/modifyInventory.vue +++ /dev/null @@ -1,316 +0,0 @@ - - - diff --git a/website/client/components/parentPage.vue b/website/client/components/parentPage.vue deleted file mode 100644 index 1e0681ba50..0000000000 --- a/website/client/components/parentPage.vue +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/website/client/components/payments/buyGemsModal.vue b/website/client/components/payments/buyGemsModal.vue deleted file mode 100644 index f99244006f..0000000000 --- a/website/client/components/payments/buyGemsModal.vue +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - diff --git a/website/client/components/payments/cancelModalConfirm.vue b/website/client/components/payments/cancelModalConfirm.vue deleted file mode 100644 index 604c5585f6..0000000000 --- a/website/client/components/payments/cancelModalConfirm.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - \ No newline at end of file diff --git a/website/client/components/payments/canceledModal.vue b/website/client/components/payments/canceledModal.vue deleted file mode 100644 index e3f2960a71..0000000000 --- a/website/client/components/payments/canceledModal.vue +++ /dev/null @@ -1,100 +0,0 @@ - - - - - \ No newline at end of file diff --git a/website/client/components/payments/sendGemsModal.vue b/website/client/components/payments/sendGemsModal.vue deleted file mode 100644 index 79ddea17ff..0000000000 --- a/website/client/components/payments/sendGemsModal.vue +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - diff --git a/website/client/components/payments/successModal.vue b/website/client/components/payments/successModal.vue deleted file mode 100644 index fff10bccd2..0000000000 --- a/website/client/components/payments/successModal.vue +++ /dev/null @@ -1,187 +0,0 @@ - - - - - \ No newline at end of file diff --git a/website/client/components/private-message-modal.vue b/website/client/components/private-message-modal.vue deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/website/client/components/selectMembersModal.vue b/website/client/components/selectMembersModal.vue deleted file mode 100644 index 49315788b5..0000000000 --- a/website/client/components/selectMembersModal.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - - - diff --git a/website/client/components/settings/api.vue b/website/client/components/settings/api.vue deleted file mode 100644 index 291c3640f8..0000000000 --- a/website/client/components/settings/api.vue +++ /dev/null @@ -1,142 +0,0 @@ - - - - - diff --git a/website/client/components/settings/dataExport.vue b/website/client/components/settings/dataExport.vue deleted file mode 100644 index 07f434fd86..0000000000 --- a/website/client/components/settings/dataExport.vue +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/website/client/components/settings/deleteModal.vue b/website/client/components/settings/deleteModal.vue deleted file mode 100644 index 34838b0504..0000000000 --- a/website/client/components/settings/deleteModal.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - diff --git a/website/client/components/settings/index.vue b/website/client/components/settings/index.vue deleted file mode 100644 index 68366e1107..0000000000 --- a/website/client/components/settings/index.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/website/client/components/settings/notifications.vue b/website/client/components/settings/notifications.vue deleted file mode 100644 index dfc6dfb964..0000000000 --- a/website/client/components/settings/notifications.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - diff --git a/website/client/components/settings/promoCode.vue b/website/client/components/settings/promoCode.vue deleted file mode 100644 index fd12622856..0000000000 --- a/website/client/components/settings/promoCode.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/website/client/components/settings/resetModal.vue b/website/client/components/settings/resetModal.vue deleted file mode 100644 index 0c514e6b6f..0000000000 --- a/website/client/components/settings/resetModal.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/website/client/components/settings/restoreModal.vue b/website/client/components/settings/restoreModal.vue deleted file mode 100644 index 0e4cd628a8..0000000000 --- a/website/client/components/settings/restoreModal.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - diff --git a/website/client/components/settings/site.vue b/website/client/components/settings/site.vue deleted file mode 100644 index 4f6d75d1f8..0000000000 --- a/website/client/components/settings/site.vue +++ /dev/null @@ -1,528 +0,0 @@ - - - - - diff --git a/website/client/components/settings/subscription.vue b/website/client/components/settings/subscription.vue deleted file mode 100644 index 80023627c8..0000000000 --- a/website/client/components/settings/subscription.vue +++ /dev/null @@ -1,262 +0,0 @@ - - - - - diff --git a/website/client/components/settings/usernameForm.vue b/website/client/components/settings/usernameForm.vue deleted file mode 100644 index 86885a42ac..0000000000 --- a/website/client/components/settings/usernameForm.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - - diff --git a/website/client/components/settings/verifyUsername.vue b/website/client/components/settings/verifyUsername.vue deleted file mode 100644 index b096c5f033..0000000000 --- a/website/client/components/settings/verifyUsername.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - diff --git a/website/client/components/shared/inventoryDrawer.vue b/website/client/components/shared/inventoryDrawer.vue deleted file mode 100644 index a2fa8fd83d..0000000000 --- a/website/client/components/shared/inventoryDrawer.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - - diff --git a/website/client/components/shops/balanceInfo.vue b/website/client/components/shops/balanceInfo.vue deleted file mode 100644 index 80ba7dbae3..0000000000 --- a/website/client/components/shops/balanceInfo.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/website/client/components/shops/buyModal.vue b/website/client/components/shops/buyModal.vue deleted file mode 100644 index a54b33deab..0000000000 --- a/website/client/components/shops/buyModal.vue +++ /dev/null @@ -1,523 +0,0 @@ - - - - - diff --git a/website/client/components/shops/featuredItemsHeader.vue b/website/client/components/shops/featuredItemsHeader.vue deleted file mode 100644 index 04ccc614ad..0000000000 --- a/website/client/components/shops/featuredItemsHeader.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - diff --git a/website/client/components/shops/index.vue b/website/client/components/shops/index.vue deleted file mode 100644 index 5c275f7a82..0000000000 --- a/website/client/components/shops/index.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/website/client/components/shops/market/categoryItem.vue b/website/client/components/shops/market/categoryItem.vue deleted file mode 100644 index bdd4546ca9..0000000000 --- a/website/client/components/shops/market/categoryItem.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - diff --git a/website/client/components/shops/market/categoryRow.vue b/website/client/components/shops/market/categoryRow.vue deleted file mode 100644 index 9f4b96acd6..0000000000 --- a/website/client/components/shops/market/categoryRow.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - diff --git a/website/client/components/shops/market/equipmentSection.vue b/website/client/components/shops/market/equipmentSection.vue deleted file mode 100644 index 9baa3d9dcf..0000000000 --- a/website/client/components/shops/market/equipmentSection.vue +++ /dev/null @@ -1,178 +0,0 @@ - - - - - diff --git a/website/client/components/shops/market/filter.vue b/website/client/components/shops/market/filter.vue deleted file mode 100644 index 5bd39a6b1e..0000000000 --- a/website/client/components/shops/market/filter.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/website/client/components/shops/market/index.vue b/website/client/components/shops/market/index.vue deleted file mode 100644 index fb2f332da8..0000000000 --- a/website/client/components/shops/market/index.vue +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - diff --git a/website/client/components/shops/market/sellModal.vue b/website/client/components/shops/market/sellModal.vue deleted file mode 100644 index d0bd729ec9..0000000000 --- a/website/client/components/shops/market/sellModal.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - diff --git a/website/client/components/shops/quests/buyQuestModal.vue b/website/client/components/shops/quests/buyQuestModal.vue deleted file mode 100644 index 82f60b833a..0000000000 --- a/website/client/components/shops/quests/buyQuestModal.vue +++ /dev/null @@ -1,341 +0,0 @@ - - - - - diff --git a/website/client/components/shops/quests/index.vue b/website/client/components/shops/quests/index.vue deleted file mode 100644 index 1fad6f5d12..0000000000 --- a/website/client/components/shops/quests/index.vue +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - diff --git a/website/client/components/shops/quests/questDialogContent.vue b/website/client/components/shops/quests/questDialogContent.vue deleted file mode 100644 index 48a9eb082c..0000000000 --- a/website/client/components/shops/quests/questDialogContent.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - diff --git a/website/client/components/shops/quests/questDialogDrops.vue b/website/client/components/shops/quests/questDialogDrops.vue deleted file mode 100644 index 5329be085a..0000000000 --- a/website/client/components/shops/quests/questDialogDrops.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/website/client/components/shops/quests/questInfo.vue b/website/client/components/shops/quests/questInfo.vue deleted file mode 100644 index fb5eab4924..0000000000 --- a/website/client/components/shops/quests/questInfo.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - diff --git a/website/client/components/shops/seasonal/index.vue b/website/client/components/shops/seasonal/index.vue deleted file mode 100644 index 1bb372ed9e..0000000000 --- a/website/client/components/shops/seasonal/index.vue +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - diff --git a/website/client/components/shops/shopItem.vue b/website/client/components/shops/shopItem.vue deleted file mode 100644 index 6492d59d7e..0000000000 --- a/website/client/components/shops/shopItem.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - - - diff --git a/website/client/components/shops/timeTravelers/index.vue b/website/client/components/shops/timeTravelers/index.vue deleted file mode 100644 index 5521ce2770..0000000000 --- a/website/client/components/shops/timeTravelers/index.vue +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - diff --git a/website/client/components/sidebarSection.vue b/website/client/components/sidebarSection.vue deleted file mode 100644 index 24f150ef00..0000000000 --- a/website/client/components/sidebarSection.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - \ No newline at end of file diff --git a/website/client/components/static/app.vue b/website/client/components/static/app.vue deleted file mode 100644 index cfcf1fa02a..0000000000 --- a/website/client/components/static/app.vue +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/website/client/components/static/clearBrowserData.vue b/website/client/components/static/clearBrowserData.vue deleted file mode 100644 index 39c97cda76..0000000000 --- a/website/client/components/static/clearBrowserData.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/website/client/components/static/communityGuidelines.vue b/website/client/components/static/communityGuidelines.vue deleted file mode 100644 index bcdfc5362c..0000000000 --- a/website/client/components/static/communityGuidelines.vue +++ /dev/null @@ -1,213 +0,0 @@ - - - diff --git a/website/client/components/static/contact.vue b/website/client/components/static/contact.vue deleted file mode 100644 index da945b06f4..0000000000 --- a/website/client/components/static/contact.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/website/client/components/static/faq.vue b/website/client/components/static/faq.vue deleted file mode 100644 index 7a8ca6792d..0000000000 --- a/website/client/components/static/faq.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - - - diff --git a/website/client/components/static/features.vue b/website/client/components/static/features.vue deleted file mode 100644 index 3489bea63f..0000000000 --- a/website/client/components/static/features.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/website/client/components/static/groupPlans.vue b/website/client/components/static/groupPlans.vue deleted file mode 100644 index 3ca04c185e..0000000000 --- a/website/client/components/static/groupPlans.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - - - diff --git a/website/client/components/static/header.vue b/website/client/components/static/header.vue deleted file mode 100644 index 9d17a17fb0..0000000000 --- a/website/client/components/static/header.vue +++ /dev/null @@ -1,201 +0,0 @@ - - - - - diff --git a/website/client/components/static/home.vue b/website/client/components/static/home.vue deleted file mode 100644 index a6acf92a55..0000000000 --- a/website/client/components/static/home.vue +++ /dev/null @@ -1,733 +0,0 @@ - - - - - - - diff --git a/website/client/components/static/merch.vue b/website/client/components/static/merch.vue deleted file mode 100644 index d4f3f440b9..0000000000 --- a/website/client/components/static/merch.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/website/client/components/static/overview.vue b/website/client/components/static/overview.vue deleted file mode 100644 index 5866630186..0000000000 --- a/website/client/components/static/overview.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - diff --git a/website/client/components/static/pressKit.vue b/website/client/components/static/pressKit.vue deleted file mode 100644 index 150606dce0..0000000000 --- a/website/client/components/static/pressKit.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/website/client/components/static/privacy.vue b/website/client/components/static/privacy.vue deleted file mode 100644 index 2ecda4b8ad..0000000000 --- a/website/client/components/static/privacy.vue +++ /dev/null @@ -1,299 +0,0 @@ - diff --git a/website/client/components/static/terms.vue b/website/client/components/static/terms.vue deleted file mode 100644 index b5b52955a2..0000000000 --- a/website/client/components/static/terms.vue +++ /dev/null @@ -1,568 +0,0 @@ - diff --git a/website/client/components/tasks/approvalFooter.vue b/website/client/components/tasks/approvalFooter.vue deleted file mode 100644 index 55c7f0db3f..0000000000 --- a/website/client/components/tasks/approvalFooter.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - - - diff --git a/website/client/components/tasks/approvalHeader.vue b/website/client/components/tasks/approvalHeader.vue deleted file mode 100644 index e36476d3d5..0000000000 --- a/website/client/components/tasks/approvalHeader.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/website/client/components/tasks/approvalModal.vue b/website/client/components/tasks/approvalModal.vue deleted file mode 100644 index 96973750d0..0000000000 --- a/website/client/components/tasks/approvalModal.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - diff --git a/website/client/components/tasks/brokenTaskModal.vue b/website/client/components/tasks/brokenTaskModal.vue deleted file mode 100644 index a940cd17cc..0000000000 --- a/website/client/components/tasks/brokenTaskModal.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - diff --git a/website/client/components/tasks/taskModal.vue b/website/client/components/tasks/taskModal.vue deleted file mode 100644 index cd55e3cdc2..0000000000 --- a/website/client/components/tasks/taskModal.vue +++ /dev/null @@ -1,1023 +0,0 @@ - - - - - - - diff --git a/website/client/components/tasks/user.vue b/website/client/components/tasks/user.vue deleted file mode 100644 index 102a5e953e..0000000000 --- a/website/client/components/tasks/user.vue +++ /dev/null @@ -1,468 +0,0 @@ - - - - - diff --git a/website/client/components/ui/checkbox.vue b/website/client/components/ui/checkbox.vue deleted file mode 100644 index ee0ea51ed5..0000000000 --- a/website/client/components/ui/checkbox.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/website/client/components/ui/countBadge.vue b/website/client/components/ui/countBadge.vue deleted file mode 100644 index a33f2e98e7..0000000000 --- a/website/client/components/ui/countBadge.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/website/client/components/ui/drawerHeaderTabs.vue b/website/client/components/ui/drawerHeaderTabs.vue deleted file mode 100644 index ec0738bf97..0000000000 --- a/website/client/components/ui/drawerHeaderTabs.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/website/client/components/ui/drawerSlider.vue b/website/client/components/ui/drawerSlider.vue deleted file mode 100644 index 220c35b0dc..0000000000 --- a/website/client/components/ui/drawerSlider.vue +++ /dev/null @@ -1,189 +0,0 @@ - - - - - diff --git a/website/client/components/ui/filterDropdown.vue b/website/client/components/ui/filterDropdown.vue deleted file mode 100644 index d1ebd52b3b..0000000000 --- a/website/client/components/ui/filterDropdown.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/website/client/components/ui/itemRows.vue b/website/client/components/ui/itemRows.vue deleted file mode 100644 index 9790a2df6b..0000000000 --- a/website/client/components/ui/itemRows.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/website/client/components/ui/layoutSection.vue b/website/client/components/ui/layoutSection.vue deleted file mode 100644 index 11c527c492..0000000000 --- a/website/client/components/ui/layoutSection.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - diff --git a/website/client/components/ui/pageLayout.vue b/website/client/components/ui/pageLayout.vue deleted file mode 100644 index 9981923d53..0000000000 --- a/website/client/components/ui/pageLayout.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/website/client/components/ui/starBadge.vue b/website/client/components/ui/starBadge.vue deleted file mode 100644 index 1748277f4e..0000000000 --- a/website/client/components/ui/starBadge.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/website/client/components/ui/statsbar.vue b/website/client/components/ui/statsbar.vue deleted file mode 100644 index dc7ddb37c0..0000000000 --- a/website/client/components/ui/statsbar.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - diff --git a/website/client/components/userLink.vue b/website/client/components/userLink.vue deleted file mode 100644 index e1607540ba..0000000000 --- a/website/client/components/userLink.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/website/client/components/userMenu/achievements.vue b/website/client/components/userMenu/achievements.vue deleted file mode 100644 index a39e9e2827..0000000000 --- a/website/client/components/userMenu/achievements.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - - - diff --git a/website/client/components/userMenu/profile.vue b/website/client/components/userMenu/profile.vue deleted file mode 100644 index 02ecf467f6..0000000000 --- a/website/client/components/userMenu/profile.vue +++ /dev/null @@ -1,661 +0,0 @@ - - - - - - - diff --git a/website/client/components/userMenu/profileModal.vue b/website/client/components/userMenu/profileModal.vue deleted file mode 100644 index 86dc296b5a..0000000000 --- a/website/client/components/userMenu/profileModal.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - diff --git a/website/client/components/userMenu/profilePage.vue b/website/client/components/userMenu/profilePage.vue deleted file mode 100644 index 43ef9d2922..0000000000 --- a/website/client/components/userMenu/profilePage.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/website/client/components/userMenu/profileStats.vue b/website/client/components/userMenu/profileStats.vue deleted file mode 100644 index c410a57133..0000000000 --- a/website/client/components/userMenu/profileStats.vue +++ /dev/null @@ -1,523 +0,0 @@ - - - - - diff --git a/website/client/components/userMenu/stats.vue b/website/client/components/userMenu/stats.vue deleted file mode 100644 index 34fa0d7b79..0000000000 --- a/website/client/components/userMenu/stats.vue +++ /dev/null @@ -1,301 +0,0 @@ - - - - - diff --git a/website/client/components/world-boss/worldBossInfoModal.vue b/website/client/components/world-boss/worldBossInfoModal.vue deleted file mode 100644 index af418b7b30..0000000000 --- a/website/client/components/world-boss/worldBossInfoModal.vue +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - diff --git a/website/client/components/world-boss/worldBossRageModal.vue b/website/client/components/world-boss/worldBossRageModal.vue deleted file mode 100644 index 3905a80ff8..0000000000 --- a/website/client/components/world-boss/worldBossRageModal.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - diff --git a/website/client/components/yesterdailyModal.vue b/website/client/components/yesterdailyModal.vue deleted file mode 100644 index 698b98c1ec..0000000000 --- a/website/client/components/yesterdailyModal.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/website/client/directives/directive.common.js b/website/client/directives/directive.common.js deleted file mode 100644 index 151bc76870..0000000000 --- a/website/client/directives/directive.common.js +++ /dev/null @@ -1,8 +0,0 @@ -// https://stackoverflow.com/a/40720172/1298154 -export const emit = (vnode, emitName, data) => { - let handlers = vnode.data && vnode.data.on || vnode.componentOptions && vnode.componentOptions.listeners; - - if (handlers && handlers[emitName]) { - handlers[emitName].fns(data); - } -}; diff --git a/website/client/libs/encodeParams.js b/website/client/libs/encodeParams.js deleted file mode 100644 index 1666e92fa5..0000000000 --- a/website/client/libs/encodeParams.js +++ /dev/null @@ -1,7 +0,0 @@ -// Equivalent of jQuery's param - -export default function (params) { - return Object.keys(params).map((k) => { - return `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`; - }).join('&'); -} diff --git a/website/client/libs/logging.js b/website/client/libs/logging.js deleted file mode 100644 index 32b7132a53..0000000000 --- a/website/client/libs/logging.js +++ /dev/null @@ -1,9 +0,0 @@ -export function setUpLogging () { - let _LTracker = window._LTracker || []; // eslint-disable-line - _LTracker.push({ // eslint-disable-line - logglyKey: process.env.LOGGLY_CLIENT_TOKEN, // eslint-disable-line no-process-env - sendConsoleErrors: true, - tag: 'ClientJS', - json: true, - }); -} diff --git a/website/client/mixins/pinUtils.js b/website/client/mixins/pinUtils.js deleted file mode 100644 index b003754b01..0000000000 --- a/website/client/mixins/pinUtils.js +++ /dev/null @@ -1,19 +0,0 @@ -import notifications from 'client/mixins/notifications'; -import isPinned from 'common/script/libs/isPinned'; - -export default { - mixins: [notifications], - methods: { - isPinned (item) { - return isPinned(this.user, item); - }, - togglePinned (item) { - if (!this.$store.dispatch('user:togglePinnedItem', {type: item.pinType, path: item.path})) { - this.showUnpinNotification(item); - } - }, - showUnpinNotification (item) { - this.text(this.$t('unpinnedItem', {item: item.text})); - }, - }, -}; diff --git a/website/client/mixins/styleHelper.js b/website/client/mixins/styleHelper.js deleted file mode 100644 index 3821f46b8d..0000000000 --- a/website/client/mixins/styleHelper.js +++ /dev/null @@ -1,18 +0,0 @@ -export default { - methods: { - userLevelStyle (user, style) { - style = style || ''; - let npc = user && user.backer && user.backer.npc ? user.backer.npc : ''; - let level = user && user.contributor && user.contributor.level ? user.contributor.level : ''; - style += this.userLevelStyleFromLevel(level, npc, style); - return style; - }, - userLevelStyleFromLevel (level, npc, style) { - style = style || ''; - if (npc) style += ' npc'; - style += level ? ` tier${level}` : ' no-tier'; - - return style; - }, - }, -}; diff --git a/website/client/mixins/userState.js b/website/client/mixins/userState.js deleted file mode 100644 index d52d6e2be2..0000000000 --- a/website/client/mixins/userState.js +++ /dev/null @@ -1,7 +0,0 @@ -import { mapState } from 'client/libs/store'; - -export const userStateMixin = { - computed: { - ...mapState({user: 'user.data'}), - }, -}; diff --git a/website/client/package-lock.json b/website/client/package-lock.json new file mode 100644 index 0000000000..e70267e6eb --- /dev/null +++ b/website/client/package-lock.json @@ -0,0 +1,12030 @@ +{ + "name": "habitica-client", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@amplitude/ua-parser-js": { + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-bmW++BLt1Hg+4HCExLXP+0Jhgy2eTsEevqkVc5o4yYbgwdP/gV3gEQXzyVrMVlWWNLgph/tFIkf5PVlSpCELEg==" + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", + "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.4", + "@babel/helpers": "^7.6.2", + "@babel/parser": "^7.6.4", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.3", + "@babel/types": "^7.6.3", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", + "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "requires": { + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", + "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==" + }, + "@babel/traverse": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", + "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", + "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz", + "integrity": "sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", + "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", + "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz", + "integrity": "sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", + "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", + "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", + "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "requires": { + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz", + "integrity": "sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", + "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/preset-env": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", + "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.6.2", + "@babel/types": "^7.6.3", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.6.3.tgz", + "integrity": "sha512-933SXHQr7apa95F+3IqkBne8mqOnu1kDh6dnSddC07aW/R51WsOVD7MSczJ6DRpq/L8KLll7TFDxmt30pft44w==", + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", + "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.2", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", + "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.3.1.tgz", + "integrity": "sha512-75ocgnI7HG/I01iGA3/rs0y6PXydUA/kxhFZM0HoT8NLSTnt/J8Gq03iKl4a4B/2A3iMG0ctXtxr5Hg9SGr1gw==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@nuxt/opencollective": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.0.tgz", + "integrity": "sha512-Vf09BxCdj1iT2IRqVwX5snaY2WCTkvM0O4cWWSO1ThCFuc4if0Q/nNwAgCxRU0FeYHJ7DdyMUNSdswCLKlVqeg==", + "requires": { + "chalk": "^2.4.2", + "consola": "^2.10.1", + "node-fetch": "^2.6.0" + } + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz", + "integrity": "sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==", + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "12.7.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", + "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", + "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==" + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0.tgz", + "integrity": "sha512-U+JNwVQSmaLKjO3lzCUC3cNXxprgezV1N+jOdqbP4xWNaqtWUCJnkjTVcgECM18A/AinDKPcUUeoyhU7yxUxXQ==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.0.5.tgz", + "integrity": "sha512-EXq/eqqw0rpQjVNOz1AIC/K6c4/6VNva7PenMK+MmmE/n9wNHn3BFI5t8Dz3tkuKU57Zlln/HUKjfdm29cvrcw==", + "requires": { + "@babel/core": "^7.6.4", + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.4.4", + "@babel/plugin-proposal-decorators": "^7.6.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.6.2", + "@babel/preset-env": "^7.6.3", + "@babel/runtime": "^7.6.3", + "@babel/runtime-corejs3": "^7.6.3", + "@vue/babel-preset-jsx": "^1.1.1", + "babel-plugin-dynamic-import-node": "^2.2.0", + "babel-plugin-module-resolver": "^3.2.0", + "core-js": "^3.3.2", + "core-js-compat": "^3.3.2" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.1.tgz", + "integrity": "sha512-SeyndwQZc8MAOkhbJaC34ocTwcKekKkwrwnTMC3YF8VmGp5IQWW5gPIU66bqO9WFBXFA3J3ANsUbP2pj8q8KdQ==", + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "@vue/babel-sugar-functional-vue": "^1.0.0", + "@vue/babel-sugar-inject-h": "^1.0.0", + "@vue/babel-sugar-v-model": "^1.1.1", + "@vue/babel-sugar-v-on": "^1.1.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0.tgz", + "integrity": "sha512-XE/jNaaorTuhWayCz+QClk5AB9OV5HzrwbzEC6sIUY0J60A28ONQKeTwxfidW42egOkqNH/UU6eE3KLfmiDj0Q==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0.tgz", + "integrity": "sha512-NxWU+DqtbZgfGvd25GPoFMj+rvyQ8ZA1pHj8vIeqRij+vx3sXoKkObjA9ulZunvWw5F6uG9xYy4ytpxab/X+Hg==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.1.tgz", + "integrity": "sha512-qiPbdUTiqNQdhXzvWQMVfrYGHCiMmscY7j/cudLxdxWZ8AFhgPRVlniVgaWIT7A1iOjs92e8U6qVyqkf0d4ZrA==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.0.tgz", + "integrity": "sha512-8DwAj/RLpmrDP4eZ3erJcKcyuLArLUYagNODTsSQrMdG5zmLJoFFtEjODfYRh/XxM2wXv9Wxe+HAB41FQxxwQA==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.0.0", + "camelcase": "^5.0.0" + } + }, + "@vue/cli-overlay": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.0.5.tgz", + "integrity": "sha512-guVLEZoV1QtCEjByutSizgBQin/L0Pvz2siQqU+eOFXzXs7P/MtyUYhbKh07AUHHEQEbqGJOvxSIks/fLfrp4w==" + }, + "@vue/cli-plugin-babel": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.0.5.tgz", + "integrity": "sha512-2B/DDgdWvE6mBRhpUu9tNkaoFLopxr5/2tzXbGLH8Lkr8HToNERZ4RoGSSV1akTsosAxXSER9wGSa9jXhZ41iA==", + "requires": { + "@babel/core": "^7.6.4", + "@vue/babel-preset-app": "^4.0.5", + "@vue/cli-shared-utils": "^4.0.5", + "babel-loader": "^8.0.6", + "webpack": "^4.0.0" + }, + "dependencies": { + "@vue/cli-shared-utils": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.0.5.tgz", + "integrity": "sha512-NlNZ4Dx5QcP5uO5fCOLgkN2tbhNan5EcptPvXawW/md18cIpMlKbph6L6lEfJj8vrSvTUf2i/FyoFSh1rV53hw==", + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.1", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.7", + "semver": "^6.1.0", + "string.prototype.padstart": "^3.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.0.5.tgz", + "integrity": "sha512-hiPU2+knz3GgSUDniekbp81Iciax9yIFzz1swy1QTJGABXT/3gqakz7Gc0IGgpo+wRkMHk9DyCK8+TpI6wdtWg==", + "requires": { + "@vue/cli-shared-utils": "^4.0.5", + "eslint-loader": "^2.1.2", + "globby": "^9.2.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + }, + "dependencies": { + "@vue/cli-shared-utils": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.0.5.tgz", + "integrity": "sha512-NlNZ4Dx5QcP5uO5fCOLgkN2tbhNan5EcptPvXawW/md18cIpMlKbph6L6lEfJj8vrSvTUf2i/FyoFSh1rV53hw==", + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.1", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.7", + "semver": "^6.1.0", + "string.prototype.padstart": "^3.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@vue/cli-plugin-router": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.0.5.tgz", + "integrity": "sha512-pSbw7CZZd6fQHomwIsxX/qyMBFeXsxhUOrwjmp1s03qe/VjsyREIsLW+L5BiXoHZQFdqfH2NaOF9Uivxiv2cvQ==", + "requires": { + "@vue/cli-shared-utils": "^4.0.5" + } + }, + "@vue/cli-plugin-unit-mocha": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-mocha/-/cli-plugin-unit-mocha-4.0.5.tgz", + "integrity": "sha512-DVpl73eWDt6rcebzzAzWXeacGxkPVbVWA5P63sBpiS0NIBz8Byt3OOS90JeBVF8NLKxtA3/2Ub8sxwM3aFiZsA==", + "requires": { + "@vue/cli-shared-utils": "^4.0.5", + "jsdom": "^15.2.0", + "jsdom-global": "^3.0.2", + "mocha": "^6.2.2", + "mochapack": "^1.1.5" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.0.5.tgz", + "integrity": "sha512-stppb+Fw5J84EA9EPs2jpclCr1lJbYtJClmEIP8RZZzGm0xGGdwMEK+VUOYjaFo4kMrReteSiMww8jxdRCeijg==" + }, + "@vue/cli-service": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.0.5.tgz", + "integrity": "sha512-ScVaGzbLbtiTqlzFBBpGoYEdw6kZTSsQwgBJ2UjO5GZwVhx6Tbcwusw+pUC2zxUPoFki5FrTdbBZO6lrVkwATw==", + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@vue/cli-overlay": "^4.0.5", + "@vue/cli-plugin-router": "^4.0.5", + "@vue/cli-plugin-vuex": "^4.0.5", + "@vue/cli-shared-utils": "^4.0.5", + "@vue/component-compiler-utils": "^3.0.0", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^6.1.1", + "acorn-walk": "^6.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.5.1", + "browserslist": "^4.7.1", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "chalk": "^2.4.2", + "cli-highlight": "^2.1.1", + "clipboardy": "^2.0.0", + "cliui": "^5.0.0", + "copy-webpack-plugin": "^5.0.3", + "css-loader": "^3.1.0", + "cssnano": "^4.1.10", + "current-script-polyfill": "^1.0.0", + "debug": "^4.1.1", + "default-gateway": "^5.0.2", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^1.0.2", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.8.0", + "minimist": "^1.2.0", + "ora": "^3.4.0", + "portfinder": "^1.0.25", + "postcss-loader": "^3.0.0", + "read-pkg": "^5.1.1", + "semver": "^6.1.0", + "slash": "^3.0.0", + "source-map-url": "^0.4.0", + "ssri": "^6.0.1", + "string.prototype.padend": "^3.0.0", + "terser-webpack-plugin": "^2.1.2", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.7.0", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.8.2", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "@vue/cli-plugin-router": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.0.5.tgz", + "integrity": "sha512-pSbw7CZZd6fQHomwIsxX/qyMBFeXsxhUOrwjmp1s03qe/VjsyREIsLW+L5BiXoHZQFdqfH2NaOF9Uivxiv2cvQ==", + "requires": { + "@vue/cli-shared-utils": "^4.0.5" + } + }, + "browserslist": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "caniuse-lite": { + "version": "1.0.30001005", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001005.tgz", + "integrity": "sha512-g78miZm1Z5njjYR216a5812oPiLgV1ssndgGxITHWUopmjUrCswMisA0a2kSB7a0vZRox6JOKhM51+efmYN8Mg==" + }, + "electron-to-chromium": { + "version": "1.3.296", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz", + "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==" + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "requires": { + "semver": "^6.0.0" + } + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", + "requires": { + "semver": "^6.3.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "serialize-javascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.0.tgz", + "integrity": "sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser-webpack-plugin": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz", + "integrity": "sha512-jwdauV5Al7zopR6OAYvIIRcxXCSvLjZjr7uZE8l2tIWb/ryrGN48sJftqGf5k9z09tWhajx53ldp0XPI080YnA==", + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.0.0", + "jest-worker": "^24.9.0", + "schema-utils": "^2.5.0", + "serialize-javascript": "^2.1.0", + "source-map": "^0.6.1", + "terser": "^4.3.9", + "webpack-sources": "^1.4.3" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.0.5.tgz", + "integrity": "sha512-NlNZ4Dx5QcP5uO5fCOLgkN2tbhNan5EcptPvXawW/md18cIpMlKbph6L6lEfJj8vrSvTUf2i/FyoFSh1rV53hw==", + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.1", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.7", + "semver": "^6.1.0", + "string.prototype.padstart": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.0.0.tgz", + "integrity": "sha512-am+04/0UX7ektcmvhYmrf84BDVAD8afFOf4asZjN84q8xzxFclbk5x0MtxuKGfp+zjN5WWPJn3fjFAWtDdIGSw==", + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^5.0.0", + "prettier": "1.16.3", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-8VCoJeeH8tCkzhkpfOkt+abALQkS11OIHhte5MBzYaKMTqK0A3ZAKEUVAffsOklhEv7t0yrQt696Opnu9oAx+w==" + }, + "@vue/test-utils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz", + "integrity": "sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA==", + "requires": { + "dom-event-types": "^1.0.0", + "lodash": "^4.17.4" + } + }, + "@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz", + "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==" + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", + "integrity": "sha512-2scffjvioEmNz0OyDSLGWDfKCVwaKc6l9Pm9kOIREU13ClXZvHpg/nRL5xyjSSSLhOnXqft2HpsAzNEEA8cFFg==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "acorn-jsx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==" + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amplitude-js": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-5.6.0.tgz", + "integrity": "sha512-XGaM0sTvMOrVYqfHhkKEikjQ/SzhEGbupxYopcrzEpEuNLenSOIBMyB0JycBcFI1hTWR4rGJ2TDRqIeRMmUZvg==", + "requires": { + "@amplitude/ua-parser-js": "0.7.20", + "blueimp-md5": "^2.10.0", + "query-string": "5" + }, + "dependencies": { + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + }, + "dependencies": { + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.0.tgz", + "integrity": "sha512-j2IRvaCfrUxIiZun9ba4mhJ2omhw4OY88/yVzLO+lHhGBumAAK72PgM6gkbSN8iregPOn1ZlxGkmZh2CQ7X4AQ==", + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001004", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.19", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "browserslist": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001005", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001005.tgz", + "integrity": "sha512-g78miZm1Z5njjYR216a5812oPiLgV1ssndgGxITHWUopmjUrCswMisA0a2kSB7a0vZRox6JOKhM51+efmYN8Mg==" + }, + "electron-to-chromium": { + "version": "1.3.296", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz", + "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==" + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", + "requires": { + "semver": "^6.3.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "axios-progress-bar": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/axios-progress-bar/-/axios-progress-bar-1.2.0.tgz", + "integrity": "sha512-PEgWb/b2SMyHnKJ/cxA46OdCuNeVlo8eqL0HxXPtz+6G/Jtpyo49icPbW+jpO1wUeDEjbqpseMoCyWxESxf5pA==" + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-module-resolver": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", + "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", + "requires": { + "find-babel-config": "^1.1.0", + "glob": "^7.1.2", + "pkg-up": "^2.0.0", + "reselect": "^3.0.1", + "resolve": "^1.4.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bluebird": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", + "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==" + }, + "blueimp-md5": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.12.0.tgz", + "integrity": "sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "bootstrap": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + }, + "bootstrap-vue": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.4.tgz", + "integrity": "sha512-/5WXa3ir5uajcs7ze7jz7QXpYuJGWHjvJ8biMq0+e0IIIxw2jSdh4LsiFKD7C7qtgKre28hhXOfx79RmZX4wcQ==", + "requires": { + "@nuxt/opencollective": "^0.3.0", + "bootstrap": ">=4.3.1 <5.0.0", + "popper.js": "^1.15.0", + "portal-vue": "^2.1.6", + "vue-functional-data-merge": "^3.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000999", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz", + "integrity": "sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==" + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.1.tgz", + "integrity": "sha512-0y0VlNmdD99GXZHYnvrQcmHxP8Bi6T00qucGgBgGv4kJ0RyDthNnnFPupHV7PYv/OXSVk+azFbOeaW6+vGmx9A==", + "requires": { + "chalk": "^2.3.0", + "highlight.js": "^9.6.0", + "mz": "^2.4.0", + "parse5": "^4.0.0", + "yargs": "^13.0.0" + }, + "dependencies": { + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + } + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "clipboardy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.1.0.tgz", + "integrity": "sha512-2pzOUxWcLlXWtn+Jd6js3o12TysNOOVes/aQfg+MT/35vrxWzedHlLwyoJpXjsFKWm95BTNEcMGD9+a7mKzZkQ==", + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", + "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.10.1.tgz", + "integrity": "sha512-4sxpH6SGFYLADfUip4vuY65f/gEogrzJoniVhNUYkJHtng0l8ZjnDCqxxrSVRHOHwKxsy8Vm5ONZh1wOR3/l/w==" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "requires": { + "cacache": "^11.3.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "core-js": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.4.tgz", + "integrity": "sha512-BtibooaAmSOptGLRccsuX/dqgPtXwNgqcvYA6kOTTMzonRxZ+pJS4e+6mvVutESfXMeTnK8m3M+aBu3bkJbR+w==" + }, + "core-js-compat": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.4.tgz", + "integrity": "sha512-7OK3/LPP8R3Ovasf3GilEOp+o1w0ZKJ75FMou2RDfTwIV69G5RkKCGFnqgBv/ZhR6xo9GCzlfVALyHmydbE7DA==", + "requires": { + "browserslist": "^4.7.2", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001005", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001005.tgz", + "integrity": "sha512-g78miZm1Z5njjYR216a5812oPiLgV1ssndgGxITHWUopmjUrCswMisA0a2kSB7a0vZRox6JOKhM51+efmYN8Mg==" + }, + "electron-to-chromium": { + "version": "1.3.296", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz", + "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==" + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", + "requires": { + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "core-js-pure": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.3.4.tgz", + "integrity": "sha512-hqxt6XpR4zIMNUY920oNyAtwaq4yg8IScmXumnfyRWF9+ur7wtjr/4eCdfTJzY64jmi8WRCwIqNBKzYeOKdvnw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", + "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.17", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.0", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + }, + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.33", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", + "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.5.3" + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + } + } + }, + "cssom": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.1.tgz", + "integrity": "sha512-6Aajq0XmukE7HdXUU6IoSWuH1H6gH9z6qmagsstTiN7cW2FNTsb+J2Chs+ufPgZCsV/yo8oaEudQLrb9dGxSVQ==" + }, + "cssstyle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.0.0.tgz", + "integrity": "sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "current-script-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz", + "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=" + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + }, + "default-gateway": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.4.tgz", + "integrity": "sha512-RncYZFuHZlB69pT3aAZK/YUjOpllMc3pKm/dIxHR0AyJlhRKSFbLIQbZia1WOrNoY0F1UsqadrHW9mx/lAWAgg==", + "requires": { + "execa": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz", + "integrity": "sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "npm-run-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.0.tgz", + "integrity": "sha512-8eyAOAH+bYXFPSnNnKr3J+yoybe8O87Is5rtAQ8qRczJz1ajcsjg8l2oZqP+Ppx15Ii3S1vUTjQN2h4YO2tWWQ==", + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-event-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz", + "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==" + }, + "dom-serializer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==" + }, + "electron-to-chromium": { + "version": "1.3.282", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.282.tgz", + "integrity": "sha512-irSaDeCGgfMu1OA30bhqIBr+dx+pDJjRbwCpob7YWqVZbzXblybNzPGklVnWqv4EXxbkEAzQYqiNCqNTgu00lQ==" + }, + "element-in-view": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/element-in-view/-/element-in-view-0.1.0.tgz", + "integrity": "sha1-Zi9B+ajTuMpFh8HdtCe30nr4i8k=" + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", + "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", + "requires": { + "stackframe": "^1.1.0" + } + }, + "es-abstract": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-config-habitrpg": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-6.2.0.tgz", + "integrity": "sha512-tmfcNRuTu2vWPxUqbZ68miEEBGKb64u8skF1KaYTzZUODPX4BxLsMZFijTRauBBLLRxtA7+H0l8hXQ3GHqsDog==", + "requires": { + "eslint": "^6.5.1", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-mocha": "^6.1.1", + "eslint-plugin-vue": "^5.2.3" + }, + "dependencies": { + "eslint-plugin-mocha": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.2.0.tgz", + "integrity": "sha512-vE/+tHJVom2BkMOiwkOKcAM5YqGPk3C6gMvQ32DHihKkaXF6vmxtj3UEOg64wP3m8/Zk5V/UmQbFE5nqu1EXSg==", + "requires": { + "ramda": "^0.26.1" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-plugin-mocha": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.3.0.tgz", + "integrity": "sha512-3uwlJVLijjEmBeNyH60nzqgA1gacUWLUmcKV8PIGNvj1kwP/CTgAWQHn2ayyJVwziX+KETkr9opNwT1qD/RZ5A==", + "requires": { + "ramda": "^0.26.1" + } + }, + "eslint-plugin-vue": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz", + "integrity": "sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==", + "requires": { + "vue-eslint-parser": "^5.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==" + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", + "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", + "requires": { + "reusify": "^1.0.0" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fp-ts": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz", + "integrity": "sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": false, + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": false, + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": false, + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": false, + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": false, + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": false, + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": false, + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": false, + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "minipass": { + "version": "2.3.5", + "resolved": false, + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": false, + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": false, + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "optional": true + }, + "needle": { + "version": "2.3.0", + "resolved": false, + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": false, + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": false, + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": false, + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": false, + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": false, + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": false, + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": false, + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": false, + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "semver": { + "version": "5.7.0", + "resolved": false, + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": false, + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": false, + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + }, + "yallist": { + "version": "3.0.3", + "resolved": false, + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "habitica-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.0.tgz", + "integrity": "sha1-DN8rTqjwNjPXBmBRyI0W6YOTeSE=", + "requires": { + "habitica-markdown-emoji": "1.2.4", + "markdown-it": "8.0.0", + "markdown-it-link-attributes": "1.0.0", + "markdown-it-linkify-images": "1.0.0" + } + }, + "habitica-markdown-emoji": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/habitica-markdown-emoji/-/habitica-markdown-emoji-1.2.4.tgz", + "integrity": "sha1-iCobZmVpDGTLO90KTtxf91W67dE=", + "requires": { + "markdown-it-emoji": "^1.1.1" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=" + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hellojs": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/hellojs/-/hellojs-1.18.1.tgz", + "integrity": "sha512-T673GW3RSuM4xzYfJpp/wNPDbUG9FlNSNkQn0thII8DOpl3NphcmtmNrHrmv8hyk1fosJHkgzDfbcpJvmeq5Gw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "highlight.js": { + "version": "9.15.10", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.10.tgz", + "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + } + } + }, + "inspectpack": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/inspectpack/-/inspectpack-4.2.2.tgz", + "integrity": "sha512-UrEVd1ykpWCMgEkfGzxrPQA8D1Md017t7IgeiYOp7ulG3rvGusyYq9AfUvKsNfEWCDyVjLhRbancnl4XxLwvBA==", + "requires": { + "chalk": "^2.4.0", + "io-ts": "^1.0.5", + "io-ts-reporters": "^0.0.20", + "pify": "^3.0.0", + "semver-compare": "^1.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "intro.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/intro.js/-/intro.js-2.9.3.tgz", + "integrity": "sha512-hC+EXWnEuJeA3CveGMat3XHePd2iaXNFJIVfvJh2E9IzBMGLTlhWvPIVHAgKlOpO4lNayCxEqzr4N02VmHFr9Q==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "requires": { + "fp-ts": "^1.0.0" + } + }, + "io-ts-reporters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/io-ts-reporters/-/io-ts-reporters-0.0.20.tgz", + "integrity": "sha512-ZGyPkto96U8exipqA915ZqxIJsaFLavgZIQOEgg4Pa8qgq1Hl9ZKBtN708ZXPzlAGR/jxofrD4QNT8SHowIDVA==", + "requires": { + "fp-ts": "^1.0.1", + "io-ts": "^1.0.2" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "javascript-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.0.tgz", + "integrity": "sha512-zzK8+ByrzvOL6N92hRewwUKL0wN0TOaIuUjX0Jj8lraxWvr5wHYs2YTjaj2lstF+8qMv5cmPPef47va8NT8lDw==" + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=" + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "requires": { + "easy-stack": "^1.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.0.tgz", + "integrity": "sha512-+hRyEfjRPFwTYMmSQ3/f7U9nP8ZNZmbkmUek760ZpxnCPWJIhaaLRuUSvpJ36fZKCGENxLwxClzwpOpnXNfChQ==", + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.4", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "jsdom-global": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", + "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==" + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.0.0.tgz", + "integrity": "sha1-5mJVSXoOQJ6Bb7xngHl19PJvb4I=", + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.3" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=" + }, + "markdown-it-link-attributes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-1.0.0.tgz", + "integrity": "sha1-jaHKFynw+hbGVhWwsQdbecg3Gi4=" + }, + "markdown-it-linkify-images": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-linkify-images/-/markdown-it-linkify-images-1.0.0.tgz", + "integrity": "sha1-gTTsj0gM4pxD44Ck4narBnyuRoY=" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", + "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "mochapack": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/mochapack/-/mochapack-1.1.5.tgz", + "integrity": "sha512-k4Qukx7lpHLgvQcjCaJDa/PqvQED9DjsuuwaS2dTmjK2vus++DTYDRrnf4KYH2/aROgFqwPe+5gDhnAiwoxQ8Q==", + "requires": { + "babel-runtime": "^6.26.0", + "chalk": "^2.4.2", + "chokidar": "^3.0.2", + "glob-parent": "^5.0.0", + "globby": "^10.0.1", + "interpret": "^1.2.0", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "memory-fs": "^0.4.1", + "minimatch": "^3.0.4", + "nodent-runtime": "^3.2.1", + "normalize-path": "^3.0.0", + "progress": "^2.0.3", + "source-map-support": "^0.5.13", + "strip-ansi": "^5.2.0", + "toposort": "^2.0.2", + "yargs": "^13.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.2.tgz", + "integrity": "sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", + "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", + "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "requires": { + "picomatch": "^2.0.4" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "requires": { + "async": "^1.4.0", + "ini": "^1.3.0", + "secure-keys": "^1.0.0", + "yargs": "^3.19.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz", + "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==", + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-releases": { + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.35.tgz", + "integrity": "sha512-JGcM/wndCN/2elJlU0IGdVEJQQnJwsLbgPCFd2pY7V0mxf17bZ0Gb/lgOtL29ZQhvEX5shnVhxQyZz3ex94N8w==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "nodent-runtime": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz", + "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "popper.js": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", + "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==" + }, + "portal-vue": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.6.tgz", + "integrity": "sha512-lvCF85D4e8whd0nN32D8FqKwwkk7nYUI3Ku8UAEx4Z1reomu75dv5evRUTZNaj1EalxxWNXiNl0EHRq36fG8WA==" + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + } + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "prettier": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz", + "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==" + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "ramda": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.1.tgz", + "integrity": "sha512-zQzJ3UETUWOMd/pJJGH/zvRsBVO97m11RcpfUhcQUHEXf0yHUBgOIE/Nw8aK0m1XyVJPeq228iIK7gVxsJ/Puw==", + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.4.1.tgz", + "integrity": "sha512-RqYLpkPZX5Oc3fw/kHHHyP56fg5Y+XBpIpV8nCg0znIALfq3OH+Ea9Hfeac9BAMwG5IICltiZ0vxFvJQONfA5w==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "requires": { + "xmlchars": "^2.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "smartbanner.js": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.14.6.tgz", + "integrity": "sha512-yAc7ueVIiQ3kyHrQxOZncZiEFv6ubXxWj5E01xj45njFk8XZ8zG3VpAFPl70Yvmv/H0L/qjxOmQqF3H3T0j/SQ==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sortablejs": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.1.tgz", + "integrity": "sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ==" + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stackframe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", + "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.padstart": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz", + "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-inline-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz", + "integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==", + "requires": { + "loader-utils": "^0.2.11", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" + }, + "svg-url-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-3.0.2.tgz", + "integrity": "sha512-MUJFVU2uuOTZW6Eq6NuXZxhaIyWiuKtZMcT90nCkcvIZPGGc0CYyZWYP/rtXUkja5qagNMpxDwdZ/tuC6ywfWg==", + "requires": { + "file-loader": "~4.2.0", + "loader-utils": "~1.2.3" + } + }, + "svgo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", + "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.33", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "svgo-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.1.tgz", + "integrity": "sha512-9dyz/h6ae04pAVRz7QY8bLXtMbwA19NPpCPfCixgW0qXNDCOlHbDRqvtT5/2gzRxfuibWCUP6ZBQmZWF9rjWhQ==", + "requires": { + "js-yaml": "^3.13.1", + "loader-utils": "^1.0.3" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", + "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.2.0.tgz", + "integrity": "sha512-G8nk3np8ZAnwhHXas1JxJEwJyQdqFXAKJehfgZ/XrC48volFBRtO+FIKtF2u0Ma3bw+4vnDVjHPAQYlF9p2vsw==", + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validator": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "vue": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", + "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" + }, + "vue-eslint-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", + "integrity": "sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==", + "requires": { + "debug": "^4.1.0", + "eslint-scope": "^4.0.0", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.1.0", + "esquery": "^1.0.1", + "lodash": "^4.17.11" + }, + "dependencies": { + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + } + } + }, + "vue-functional-data-merge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", + "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" + }, + "vue-loader": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz", + "integrity": "sha512-fwIKtA23Pl/rqfYP5TSGK7gkEuLhoTvRYW+TU7ER3q9GpNLt/PjG5NLv3XHRDiTg7OPM1JcckBgds+VnAc+HbA==", + "requires": { + "@vue/component-compiler-utils": "^3.0.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-mugen-scroll": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/vue-mugen-scroll/-/vue-mugen-scroll-0.2.6.tgz", + "integrity": "sha512-6FOBzotc8p/GDQZYkEdenxPydDvABUuxqMese6Zv4fpEZf7CjNSabRtAeBUtg+339Z9iKMdpzussbqFHCRXVqA==", + "requires": { + "element-in-view": "^0.1.0", + "throttleit": "^1.0.0" + } + }, + "vue-router": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.3.tgz", + "integrity": "sha512-8iSa4mGNXBjyuSZFCCO4fiKfvzqk+mhL0lnKuGcQtO1eoj8nq3CmbEG8FwK5QqoqwDgsjsf1GDuisDX4cdb/aQ==" + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", + "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" + }, + "vuedraggable": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.23.2.tgz", + "integrity": "sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==", + "requires": { + "sortablejs": "^1.10.1" + } + }, + "vuejs-datepicker": { + "version": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", + "from": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webpack": { + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-bundle-analyzer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", + "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-chain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.0.0.tgz", + "integrity": "sha512-NK62XgJOOSmYs4kaXFIKKeClpuOVHY7m6e4XwxbVX/2HAUboH6xFCTVXMVv8+jB6K8o/UGjlo1Cv3XXOyNAAGw==", + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.0" + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + } + } +} diff --git a/website/client/package.json b/website/client/package.json new file mode 100644 index 0000000000..3e52d9a989 --- /dev/null +++ b/website/client/package.json @@ -0,0 +1,56 @@ +{ + "name": "habitica-client", + "version": "1.0.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js", + "lint": "vue-cli-service lint .", + "postinstall": "node ./scripts/npm-postinstall.js" + }, + "dependencies": { + "@vue/cli-plugin-babel": "^4.0.5", + "@vue/cli-plugin-eslint": "^4.0.5", + "@vue/cli-plugin-router": "^4.0.5", + "@vue/cli-plugin-unit-mocha": "^4.0.5", + "@vue/cli-service": "^4.0.5", + "@vue/test-utils": "1.0.0-beta.29", + "amplitude-js": "^5.6.0", + "axios": "^0.19.0", + "axios-progress-bar": "^1.2.0", + "babel-eslint": "^10.0.1", + "bootstrap": "^4.3.1", + "bootstrap-vue": "^2.0.4", + "chai": "^4.1.2", + "core-js": "^3.3.4", + "eslint": "^6.6.0", + "eslint-config-habitrpg": "^6.2.0", + "eslint-plugin-mocha": "^5.3.0", + "eslint-plugin-vue": "^5.0.0", + "habitica-markdown": "^1.3.0", + "hellojs": "^1.18.1", + "inspectpack": "^4.2.2", + "intro.js": "^2.9.3", + "jquery": "^3.4.1", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "nconf": "^0.10.0", + "sass": "^1.23.1", + "sass-loader": "^8.0.0", + "smartbanner.js": "^1.14.5", + "svg-inline-loader": "^0.8.0", + "svg-url-loader": "^3.0.2", + "svgo": "^1.3.0", + "svgo-loader": "^2.2.1", + "uuid": "^3.3.3", + "validator": "^11.1.0", + "vue": "^2.6.10", + "vue-mugen-scroll": "^0.2.6", + "vue-router": "^3.0.6", + "vue-template-compiler": "^2.6.10", + "vuedraggable": "^2.23.1", + "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", + "webpack": "^4.41.2" + } +} diff --git a/website/client/postcss.config.js b/website/client/postcss.config.js new file mode 100644 index 0000000000..c50b2f27f7 --- /dev/null +++ b/website/client/postcss.config.js @@ -0,0 +1,6 @@ +/* eslint-disable import/no-commonjs */ +module.exports = { + plugins: { + autoprefixer: {}, + }, +}; diff --git a/website/client/index.html b/website/client/public/index.html similarity index 98% rename from website/client/index.html rename to website/client/public/index.html index 32ecee0b0e..8e65f80c3b 100644 --- a/website/client/index.html +++ b/website/client/public/index.html @@ -2,6 +2,7 @@ + Habitica - Gamify Your Life diff --git a/website/static/audio/airuTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/airuTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/airuTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/airuTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/airuTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/airuTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/airuTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/airuTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/airuTheme/Chat.mp3 b/website/client/public/static/audio/airuTheme/Chat.mp3 similarity index 100% rename from website/static/audio/airuTheme/Chat.mp3 rename to website/client/public/static/audio/airuTheme/Chat.mp3 diff --git a/website/static/audio/airuTheme/Chat.ogg b/website/client/public/static/audio/airuTheme/Chat.ogg similarity index 100% rename from website/static/audio/airuTheme/Chat.ogg rename to website/client/public/static/audio/airuTheme/Chat.ogg diff --git a/website/static/audio/airuTheme/Daily.mp3 b/website/client/public/static/audio/airuTheme/Daily.mp3 similarity index 100% rename from website/static/audio/airuTheme/Daily.mp3 rename to website/client/public/static/audio/airuTheme/Daily.mp3 diff --git a/website/static/audio/airuTheme/Daily.ogg b/website/client/public/static/audio/airuTheme/Daily.ogg similarity index 100% rename from website/static/audio/airuTheme/Daily.ogg rename to website/client/public/static/audio/airuTheme/Daily.ogg diff --git a/website/static/audio/airuTheme/Death.mp3 b/website/client/public/static/audio/airuTheme/Death.mp3 similarity index 100% rename from website/static/audio/airuTheme/Death.mp3 rename to website/client/public/static/audio/airuTheme/Death.mp3 diff --git a/website/static/audio/airuTheme/Death.ogg b/website/client/public/static/audio/airuTheme/Death.ogg similarity index 100% rename from website/static/audio/airuTheme/Death.ogg rename to website/client/public/static/audio/airuTheme/Death.ogg diff --git a/website/static/audio/airuTheme/Item_Drop.mp3 b/website/client/public/static/audio/airuTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/airuTheme/Item_Drop.mp3 rename to website/client/public/static/audio/airuTheme/Item_Drop.mp3 diff --git a/website/static/audio/airuTheme/Item_Drop.ogg b/website/client/public/static/audio/airuTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/airuTheme/Item_Drop.ogg rename to website/client/public/static/audio/airuTheme/Item_Drop.ogg diff --git a/website/static/audio/airuTheme/Level_Up.mp3 b/website/client/public/static/audio/airuTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/airuTheme/Level_Up.mp3 rename to website/client/public/static/audio/airuTheme/Level_Up.mp3 diff --git a/website/static/audio/airuTheme/Level_Up.ogg b/website/client/public/static/audio/airuTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/airuTheme/Level_Up.ogg rename to website/client/public/static/audio/airuTheme/Level_Up.ogg diff --git a/website/static/audio/airuTheme/Minus_Habit.mp3 b/website/client/public/static/audio/airuTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/airuTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/airuTheme/Minus_Habit.mp3 diff --git a/website/static/audio/airuTheme/Minus_Habit.ogg b/website/client/public/static/audio/airuTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/airuTheme/Minus_Habit.ogg rename to website/client/public/static/audio/airuTheme/Minus_Habit.ogg diff --git a/website/static/audio/airuTheme/Plus_Habit.mp3 b/website/client/public/static/audio/airuTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/airuTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/airuTheme/Plus_Habit.mp3 diff --git a/website/static/audio/airuTheme/Plus_Habit.ogg b/website/client/public/static/audio/airuTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/airuTheme/Plus_Habit.ogg rename to website/client/public/static/audio/airuTheme/Plus_Habit.ogg diff --git a/website/static/audio/airuTheme/Reward.mp3 b/website/client/public/static/audio/airuTheme/Reward.mp3 similarity index 100% rename from website/static/audio/airuTheme/Reward.mp3 rename to website/client/public/static/audio/airuTheme/Reward.mp3 diff --git a/website/static/audio/airuTheme/Reward.ogg b/website/client/public/static/audio/airuTheme/Reward.ogg similarity index 100% rename from website/static/audio/airuTheme/Reward.ogg rename to website/client/public/static/audio/airuTheme/Reward.ogg diff --git a/website/static/audio/airuTheme/Todo.mp3 b/website/client/public/static/audio/airuTheme/Todo.mp3 similarity index 100% rename from website/static/audio/airuTheme/Todo.mp3 rename to website/client/public/static/audio/airuTheme/Todo.mp3 diff --git a/website/static/audio/airuTheme/Todo.ogg b/website/client/public/static/audio/airuTheme/Todo.ogg similarity index 100% rename from website/static/audio/airuTheme/Todo.ogg rename to website/client/public/static/audio/airuTheme/Todo.ogg diff --git a/website/static/audio/arashiTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/arashiTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/arashiTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/arashiTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/arashiTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/arashiTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/arashiTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/arashiTheme/Chat.mp3 b/website/client/public/static/audio/arashiTheme/Chat.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Chat.mp3 rename to website/client/public/static/audio/arashiTheme/Chat.mp3 diff --git a/website/static/audio/arashiTheme/Chat.ogg b/website/client/public/static/audio/arashiTheme/Chat.ogg similarity index 100% rename from website/static/audio/arashiTheme/Chat.ogg rename to website/client/public/static/audio/arashiTheme/Chat.ogg diff --git a/website/static/audio/arashiTheme/Daily.mp3 b/website/client/public/static/audio/arashiTheme/Daily.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Daily.mp3 rename to website/client/public/static/audio/arashiTheme/Daily.mp3 diff --git a/website/static/audio/arashiTheme/Daily.ogg b/website/client/public/static/audio/arashiTheme/Daily.ogg similarity index 100% rename from website/static/audio/arashiTheme/Daily.ogg rename to website/client/public/static/audio/arashiTheme/Daily.ogg diff --git a/website/static/audio/arashiTheme/Death.mp3 b/website/client/public/static/audio/arashiTheme/Death.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Death.mp3 rename to website/client/public/static/audio/arashiTheme/Death.mp3 diff --git a/website/static/audio/arashiTheme/Death.ogg b/website/client/public/static/audio/arashiTheme/Death.ogg similarity index 100% rename from website/static/audio/arashiTheme/Death.ogg rename to website/client/public/static/audio/arashiTheme/Death.ogg diff --git a/website/static/audio/arashiTheme/Item_Drop.mp3 b/website/client/public/static/audio/arashiTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Item_Drop.mp3 rename to website/client/public/static/audio/arashiTheme/Item_Drop.mp3 diff --git a/website/static/audio/arashiTheme/Item_Drop.ogg b/website/client/public/static/audio/arashiTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/arashiTheme/Item_Drop.ogg rename to website/client/public/static/audio/arashiTheme/Item_Drop.ogg diff --git a/website/static/audio/arashiTheme/Level_Up.mp3 b/website/client/public/static/audio/arashiTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Level_Up.mp3 rename to website/client/public/static/audio/arashiTheme/Level_Up.mp3 diff --git a/website/static/audio/arashiTheme/Level_Up.ogg b/website/client/public/static/audio/arashiTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/arashiTheme/Level_Up.ogg rename to website/client/public/static/audio/arashiTheme/Level_Up.ogg diff --git a/website/static/audio/arashiTheme/Minus_Habit.mp3 b/website/client/public/static/audio/arashiTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/arashiTheme/Minus_Habit.mp3 diff --git a/website/static/audio/arashiTheme/Minus_Habit.ogg b/website/client/public/static/audio/arashiTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/arashiTheme/Minus_Habit.ogg rename to website/client/public/static/audio/arashiTheme/Minus_Habit.ogg diff --git a/website/static/audio/arashiTheme/Plus_Habit.mp3 b/website/client/public/static/audio/arashiTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/arashiTheme/Plus_Habit.mp3 diff --git a/website/static/audio/arashiTheme/Plus_Habit.ogg b/website/client/public/static/audio/arashiTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/arashiTheme/Plus_Habit.ogg rename to website/client/public/static/audio/arashiTheme/Plus_Habit.ogg diff --git a/website/static/audio/arashiTheme/Reward.mp3 b/website/client/public/static/audio/arashiTheme/Reward.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Reward.mp3 rename to website/client/public/static/audio/arashiTheme/Reward.mp3 diff --git a/website/static/audio/arashiTheme/Reward.ogg b/website/client/public/static/audio/arashiTheme/Reward.ogg similarity index 100% rename from website/static/audio/arashiTheme/Reward.ogg rename to website/client/public/static/audio/arashiTheme/Reward.ogg diff --git a/website/static/audio/arashiTheme/Todo.mp3 b/website/client/public/static/audio/arashiTheme/Todo.mp3 similarity index 100% rename from website/static/audio/arashiTheme/Todo.mp3 rename to website/client/public/static/audio/arashiTheme/Todo.mp3 diff --git a/website/static/audio/arashiTheme/Todo.ogg b/website/client/public/static/audio/arashiTheme/Todo.ogg similarity index 100% rename from website/static/audio/arashiTheme/Todo.ogg rename to website/client/public/static/audio/arashiTheme/Todo.ogg diff --git a/website/static/audio/beatscribeNesTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/beatscribeNesTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/beatscribeNesTheme/Chat.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Chat.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Chat.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Chat.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Chat.ogg b/website/client/public/static/audio/beatscribeNesTheme/Chat.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Chat.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Chat.ogg diff --git a/website/static/audio/beatscribeNesTheme/Daily.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Daily.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Daily.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Daily.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Daily.ogg b/website/client/public/static/audio/beatscribeNesTheme/Daily.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Daily.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Daily.ogg diff --git a/website/static/audio/beatscribeNesTheme/Death.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Death.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Death.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Death.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Death.ogg b/website/client/public/static/audio/beatscribeNesTheme/Death.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Death.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Death.ogg diff --git a/website/static/audio/beatscribeNesTheme/Item_Drop.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Item_Drop.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Item_Drop.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Item_Drop.ogg b/website/client/public/static/audio/beatscribeNesTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Item_Drop.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Item_Drop.ogg diff --git a/website/static/audio/beatscribeNesTheme/Minus_Habit.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Minus_Habit.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Minus_Habit.ogg b/website/client/public/static/audio/beatscribeNesTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Minus_Habit.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Minus_Habit.ogg diff --git a/website/static/audio/beatscribeNesTheme/Plus_Habit.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Plus_Habit.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Plus_Habit.ogg b/website/client/public/static/audio/beatscribeNesTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Plus_Habit.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Plus_Habit.ogg diff --git a/website/static/audio/beatscribeNesTheme/Reward.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Reward.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Reward.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Reward.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Reward.ogg b/website/client/public/static/audio/beatscribeNesTheme/Reward.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Reward.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Reward.ogg diff --git a/website/static/audio/beatscribeNesTheme/Todo.mp3 b/website/client/public/static/audio/beatscribeNesTheme/Todo.mp3 similarity index 100% rename from website/static/audio/beatscribeNesTheme/Todo.mp3 rename to website/client/public/static/audio/beatscribeNesTheme/Todo.mp3 diff --git a/website/static/audio/beatscribeNesTheme/Todo.ogg b/website/client/public/static/audio/beatscribeNesTheme/Todo.ogg similarity index 100% rename from website/static/audio/beatscribeNesTheme/Todo.ogg rename to website/client/public/static/audio/beatscribeNesTheme/Todo.ogg diff --git a/website/static/audio/danielTheBard/Achievement_Unlocked.mp3 b/website/client/public/static/audio/danielTheBard/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/danielTheBard/Achievement_Unlocked.mp3 diff --git a/website/static/audio/danielTheBard/Achievement_Unlocked.ogg b/website/client/public/static/audio/danielTheBard/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/danielTheBard/Achievement_Unlocked.ogg rename to website/client/public/static/audio/danielTheBard/Achievement_Unlocked.ogg diff --git a/website/static/audio/danielTheBard/Chat.mp3 b/website/client/public/static/audio/danielTheBard/Chat.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Chat.mp3 rename to website/client/public/static/audio/danielTheBard/Chat.mp3 diff --git a/website/static/audio/danielTheBard/Chat.ogg b/website/client/public/static/audio/danielTheBard/Chat.ogg similarity index 100% rename from website/static/audio/danielTheBard/Chat.ogg rename to website/client/public/static/audio/danielTheBard/Chat.ogg diff --git a/website/static/audio/danielTheBard/Daily.mp3 b/website/client/public/static/audio/danielTheBard/Daily.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Daily.mp3 rename to website/client/public/static/audio/danielTheBard/Daily.mp3 diff --git a/website/static/audio/danielTheBard/Daily.ogg b/website/client/public/static/audio/danielTheBard/Daily.ogg similarity index 100% rename from website/static/audio/danielTheBard/Daily.ogg rename to website/client/public/static/audio/danielTheBard/Daily.ogg diff --git a/website/static/audio/danielTheBard/Death.mp3 b/website/client/public/static/audio/danielTheBard/Death.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Death.mp3 rename to website/client/public/static/audio/danielTheBard/Death.mp3 diff --git a/website/static/audio/danielTheBard/Death.ogg b/website/client/public/static/audio/danielTheBard/Death.ogg similarity index 100% rename from website/static/audio/danielTheBard/Death.ogg rename to website/client/public/static/audio/danielTheBard/Death.ogg diff --git a/website/static/audio/danielTheBard/Item_Drop.mp3 b/website/client/public/static/audio/danielTheBard/Item_Drop.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Item_Drop.mp3 rename to website/client/public/static/audio/danielTheBard/Item_Drop.mp3 diff --git a/website/static/audio/danielTheBard/Item_Drop.ogg b/website/client/public/static/audio/danielTheBard/Item_Drop.ogg similarity index 100% rename from website/static/audio/danielTheBard/Item_Drop.ogg rename to website/client/public/static/audio/danielTheBard/Item_Drop.ogg diff --git a/website/static/audio/danielTheBard/Level_Up.mp3 b/website/client/public/static/audio/danielTheBard/Level_Up.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Level_Up.mp3 rename to website/client/public/static/audio/danielTheBard/Level_Up.mp3 diff --git a/website/static/audio/danielTheBard/Level_Up.ogg b/website/client/public/static/audio/danielTheBard/Level_Up.ogg similarity index 100% rename from website/static/audio/danielTheBard/Level_Up.ogg rename to website/client/public/static/audio/danielTheBard/Level_Up.ogg diff --git a/website/static/audio/danielTheBard/Minus_Habit.mp3 b/website/client/public/static/audio/danielTheBard/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Minus_Habit.mp3 rename to website/client/public/static/audio/danielTheBard/Minus_Habit.mp3 diff --git a/website/static/audio/danielTheBard/Minus_Habit.ogg b/website/client/public/static/audio/danielTheBard/Minus_Habit.ogg similarity index 100% rename from website/static/audio/danielTheBard/Minus_Habit.ogg rename to website/client/public/static/audio/danielTheBard/Minus_Habit.ogg diff --git a/website/static/audio/danielTheBard/Plus_Habit.mp3 b/website/client/public/static/audio/danielTheBard/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Plus_Habit.mp3 rename to website/client/public/static/audio/danielTheBard/Plus_Habit.mp3 diff --git a/website/static/audio/danielTheBard/Plus_Habit.ogg b/website/client/public/static/audio/danielTheBard/Plus_Habit.ogg similarity index 100% rename from website/static/audio/danielTheBard/Plus_Habit.ogg rename to website/client/public/static/audio/danielTheBard/Plus_Habit.ogg diff --git a/website/static/audio/danielTheBard/Reward.mp3 b/website/client/public/static/audio/danielTheBard/Reward.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Reward.mp3 rename to website/client/public/static/audio/danielTheBard/Reward.mp3 diff --git a/website/static/audio/danielTheBard/Reward.ogg b/website/client/public/static/audio/danielTheBard/Reward.ogg similarity index 100% rename from website/static/audio/danielTheBard/Reward.ogg rename to website/client/public/static/audio/danielTheBard/Reward.ogg diff --git a/website/static/audio/danielTheBard/Todo.mp3 b/website/client/public/static/audio/danielTheBard/Todo.mp3 similarity index 100% rename from website/static/audio/danielTheBard/Todo.mp3 rename to website/client/public/static/audio/danielTheBard/Todo.mp3 diff --git a/website/static/audio/danielTheBard/Todo.ogg b/website/client/public/static/audio/danielTheBard/Todo.ogg similarity index 100% rename from website/static/audio/danielTheBard/Todo.ogg rename to website/client/public/static/audio/danielTheBard/Todo.ogg diff --git a/website/static/audio/dewinTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/dewinTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/dewinTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/dewinTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/dewinTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/dewinTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/dewinTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/dewinTheme/Boss_Battles_Background_Music.mp3 b/website/client/public/static/audio/dewinTheme/Boss_Battles_Background_Music.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Boss_Battles_Background_Music.mp3 rename to website/client/public/static/audio/dewinTheme/Boss_Battles_Background_Music.mp3 diff --git a/website/static/audio/dewinTheme/Boss_Battles_Background_Music.ogg b/website/client/public/static/audio/dewinTheme/Boss_Battles_Background_Music.ogg similarity index 100% rename from website/static/audio/dewinTheme/Boss_Battles_Background_Music.ogg rename to website/client/public/static/audio/dewinTheme/Boss_Battles_Background_Music.ogg diff --git a/website/static/audio/dewinTheme/Chat.mp3 b/website/client/public/static/audio/dewinTheme/Chat.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Chat.mp3 rename to website/client/public/static/audio/dewinTheme/Chat.mp3 diff --git a/website/static/audio/dewinTheme/Chat.ogg b/website/client/public/static/audio/dewinTheme/Chat.ogg similarity index 100% rename from website/static/audio/dewinTheme/Chat.ogg rename to website/client/public/static/audio/dewinTheme/Chat.ogg diff --git a/website/static/audio/dewinTheme/Checklist_Complete.mp3 b/website/client/public/static/audio/dewinTheme/Checklist_Complete.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Checklist_Complete.mp3 rename to website/client/public/static/audio/dewinTheme/Checklist_Complete.mp3 diff --git a/website/static/audio/dewinTheme/Checklist_Complete.ogg b/website/client/public/static/audio/dewinTheme/Checklist_Complete.ogg similarity index 100% rename from website/static/audio/dewinTheme/Checklist_Complete.ogg rename to website/client/public/static/audio/dewinTheme/Checklist_Complete.ogg diff --git a/website/static/audio/dewinTheme/Daily.mp3 b/website/client/public/static/audio/dewinTheme/Daily.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Daily.mp3 rename to website/client/public/static/audio/dewinTheme/Daily.mp3 diff --git a/website/static/audio/dewinTheme/Daily.ogg b/website/client/public/static/audio/dewinTheme/Daily.ogg similarity index 100% rename from website/static/audio/dewinTheme/Daily.ogg rename to website/client/public/static/audio/dewinTheme/Daily.ogg diff --git a/website/static/audio/dewinTheme/Death.mp3 b/website/client/public/static/audio/dewinTheme/Death.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Death.mp3 rename to website/client/public/static/audio/dewinTheme/Death.mp3 diff --git a/website/static/audio/dewinTheme/Death.ogg b/website/client/public/static/audio/dewinTheme/Death.ogg similarity index 100% rename from website/static/audio/dewinTheme/Death.ogg rename to website/client/public/static/audio/dewinTheme/Death.ogg diff --git a/website/static/audio/dewinTheme/Item_Drop.mp3 b/website/client/public/static/audio/dewinTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Item_Drop.mp3 rename to website/client/public/static/audio/dewinTheme/Item_Drop.mp3 diff --git a/website/static/audio/dewinTheme/Item_Drop.ogg b/website/client/public/static/audio/dewinTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/dewinTheme/Item_Drop.ogg rename to website/client/public/static/audio/dewinTheme/Item_Drop.ogg diff --git a/website/static/audio/dewinTheme/Level_Up.mp3 b/website/client/public/static/audio/dewinTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Level_Up.mp3 rename to website/client/public/static/audio/dewinTheme/Level_Up.mp3 diff --git a/website/static/audio/dewinTheme/Level_Up.ogg b/website/client/public/static/audio/dewinTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/dewinTheme/Level_Up.ogg rename to website/client/public/static/audio/dewinTheme/Level_Up.ogg diff --git a/website/static/audio/dewinTheme/Minus_Habit.mp3 b/website/client/public/static/audio/dewinTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/dewinTheme/Minus_Habit.mp3 diff --git a/website/static/audio/dewinTheme/Minus_Habit.ogg b/website/client/public/static/audio/dewinTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/dewinTheme/Minus_Habit.ogg rename to website/client/public/static/audio/dewinTheme/Minus_Habit.ogg diff --git a/website/static/audio/dewinTheme/Plus_Habit.mp3 b/website/client/public/static/audio/dewinTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/dewinTheme/Plus_Habit.mp3 diff --git a/website/static/audio/dewinTheme/Plus_Habit.ogg b/website/client/public/static/audio/dewinTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/dewinTheme/Plus_Habit.ogg rename to website/client/public/static/audio/dewinTheme/Plus_Habit.ogg diff --git a/website/static/audio/dewinTheme/Reward.mp3 b/website/client/public/static/audio/dewinTheme/Reward.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Reward.mp3 rename to website/client/public/static/audio/dewinTheme/Reward.mp3 diff --git a/website/static/audio/dewinTheme/Reward.ogg b/website/client/public/static/audio/dewinTheme/Reward.ogg similarity index 100% rename from website/static/audio/dewinTheme/Reward.ogg rename to website/client/public/static/audio/dewinTheme/Reward.ogg diff --git a/website/static/audio/dewinTheme/Settings_Page_Background_Music.mp3 b/website/client/public/static/audio/dewinTheme/Settings_Page_Background_Music.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Settings_Page_Background_Music.mp3 rename to website/client/public/static/audio/dewinTheme/Settings_Page_Background_Music.mp3 diff --git a/website/static/audio/dewinTheme/Settings_Page_Background_Music.ogg b/website/client/public/static/audio/dewinTheme/Settings_Page_Background_Music.ogg similarity index 100% rename from website/static/audio/dewinTheme/Settings_Page_Background_Music.ogg rename to website/client/public/static/audio/dewinTheme/Settings_Page_Background_Music.ogg diff --git a/website/static/audio/dewinTheme/Todo.mp3 b/website/client/public/static/audio/dewinTheme/Todo.mp3 similarity index 100% rename from website/static/audio/dewinTheme/Todo.mp3 rename to website/client/public/static/audio/dewinTheme/Todo.mp3 diff --git a/website/static/audio/dewinTheme/Todo.ogg b/website/client/public/static/audio/dewinTheme/Todo.ogg similarity index 100% rename from website/static/audio/dewinTheme/Todo.ogg rename to website/client/public/static/audio/dewinTheme/Todo.ogg diff --git a/website/static/audio/farvoidTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/farvoidTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/farvoidTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/farvoidTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/farvoidTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/farvoidTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/farvoidTheme/Chat.mp3 b/website/client/public/static/audio/farvoidTheme/Chat.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Chat.mp3 rename to website/client/public/static/audio/farvoidTheme/Chat.mp3 diff --git a/website/static/audio/farvoidTheme/Chat.ogg b/website/client/public/static/audio/farvoidTheme/Chat.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Chat.ogg rename to website/client/public/static/audio/farvoidTheme/Chat.ogg diff --git a/website/static/audio/farvoidTheme/Daily.mp3 b/website/client/public/static/audio/farvoidTheme/Daily.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Daily.mp3 rename to website/client/public/static/audio/farvoidTheme/Daily.mp3 diff --git a/website/static/audio/farvoidTheme/Daily.ogg b/website/client/public/static/audio/farvoidTheme/Daily.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Daily.ogg rename to website/client/public/static/audio/farvoidTheme/Daily.ogg diff --git a/website/static/audio/farvoidTheme/Death.mp3 b/website/client/public/static/audio/farvoidTheme/Death.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Death.mp3 rename to website/client/public/static/audio/farvoidTheme/Death.mp3 diff --git a/website/static/audio/farvoidTheme/Death.ogg b/website/client/public/static/audio/farvoidTheme/Death.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Death.ogg rename to website/client/public/static/audio/farvoidTheme/Death.ogg diff --git a/website/static/audio/farvoidTheme/Item_Drop.mp3 b/website/client/public/static/audio/farvoidTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Item_Drop.mp3 rename to website/client/public/static/audio/farvoidTheme/Item_Drop.mp3 diff --git a/website/static/audio/farvoidTheme/Item_Drop.ogg b/website/client/public/static/audio/farvoidTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Item_Drop.ogg rename to website/client/public/static/audio/farvoidTheme/Item_Drop.ogg diff --git a/website/static/audio/farvoidTheme/Level_Up.mp3 b/website/client/public/static/audio/farvoidTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Level_Up.mp3 rename to website/client/public/static/audio/farvoidTheme/Level_Up.mp3 diff --git a/website/static/audio/farvoidTheme/Level_Up.ogg b/website/client/public/static/audio/farvoidTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Level_Up.ogg rename to website/client/public/static/audio/farvoidTheme/Level_Up.ogg diff --git a/website/static/audio/farvoidTheme/Minus_Habit.mp3 b/website/client/public/static/audio/farvoidTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/farvoidTheme/Minus_Habit.mp3 diff --git a/website/static/audio/farvoidTheme/Minus_Habit.ogg b/website/client/public/static/audio/farvoidTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Minus_Habit.ogg rename to website/client/public/static/audio/farvoidTheme/Minus_Habit.ogg diff --git a/website/static/audio/farvoidTheme/Plus_Habit.mp3 b/website/client/public/static/audio/farvoidTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/farvoidTheme/Plus_Habit.mp3 diff --git a/website/static/audio/farvoidTheme/Plus_Habit.ogg b/website/client/public/static/audio/farvoidTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Plus_Habit.ogg rename to website/client/public/static/audio/farvoidTheme/Plus_Habit.ogg diff --git a/website/static/audio/farvoidTheme/Reward.mp3 b/website/client/public/static/audio/farvoidTheme/Reward.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Reward.mp3 rename to website/client/public/static/audio/farvoidTheme/Reward.mp3 diff --git a/website/static/audio/farvoidTheme/Reward.ogg b/website/client/public/static/audio/farvoidTheme/Reward.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Reward.ogg rename to website/client/public/static/audio/farvoidTheme/Reward.ogg diff --git a/website/static/audio/farvoidTheme/Todo.mp3 b/website/client/public/static/audio/farvoidTheme/Todo.mp3 similarity index 100% rename from website/static/audio/farvoidTheme/Todo.mp3 rename to website/client/public/static/audio/farvoidTheme/Todo.mp3 diff --git a/website/static/audio/farvoidTheme/Todo.ogg b/website/client/public/static/audio/farvoidTheme/Todo.ogg similarity index 100% rename from website/static/audio/farvoidTheme/Todo.ogg rename to website/client/public/static/audio/farvoidTheme/Todo.ogg diff --git a/website/static/audio/gokulTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/gokulTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/gokulTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/gokulTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/gokulTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/gokulTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/gokulTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/gokulTheme/Chat.mp3 b/website/client/public/static/audio/gokulTheme/Chat.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Chat.mp3 rename to website/client/public/static/audio/gokulTheme/Chat.mp3 diff --git a/website/static/audio/gokulTheme/Chat.ogg b/website/client/public/static/audio/gokulTheme/Chat.ogg similarity index 100% rename from website/static/audio/gokulTheme/Chat.ogg rename to website/client/public/static/audio/gokulTheme/Chat.ogg diff --git a/website/static/audio/gokulTheme/Daily.mp3 b/website/client/public/static/audio/gokulTheme/Daily.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Daily.mp3 rename to website/client/public/static/audio/gokulTheme/Daily.mp3 diff --git a/website/static/audio/gokulTheme/Daily.ogg b/website/client/public/static/audio/gokulTheme/Daily.ogg similarity index 100% rename from website/static/audio/gokulTheme/Daily.ogg rename to website/client/public/static/audio/gokulTheme/Daily.ogg diff --git a/website/static/audio/gokulTheme/Death.mp3 b/website/client/public/static/audio/gokulTheme/Death.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Death.mp3 rename to website/client/public/static/audio/gokulTheme/Death.mp3 diff --git a/website/static/audio/gokulTheme/Death.ogg b/website/client/public/static/audio/gokulTheme/Death.ogg similarity index 100% rename from website/static/audio/gokulTheme/Death.ogg rename to website/client/public/static/audio/gokulTheme/Death.ogg diff --git a/website/static/audio/gokulTheme/Item_Drop.mp3 b/website/client/public/static/audio/gokulTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Item_Drop.mp3 rename to website/client/public/static/audio/gokulTheme/Item_Drop.mp3 diff --git a/website/static/audio/gokulTheme/Item_Drop.ogg b/website/client/public/static/audio/gokulTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/gokulTheme/Item_Drop.ogg rename to website/client/public/static/audio/gokulTheme/Item_Drop.ogg diff --git a/website/static/audio/gokulTheme/Level_Up.mp3 b/website/client/public/static/audio/gokulTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Level_Up.mp3 rename to website/client/public/static/audio/gokulTheme/Level_Up.mp3 diff --git a/website/static/audio/gokulTheme/Level_Up.ogg b/website/client/public/static/audio/gokulTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/gokulTheme/Level_Up.ogg rename to website/client/public/static/audio/gokulTheme/Level_Up.ogg diff --git a/website/static/audio/gokulTheme/Minus_Habit.mp3 b/website/client/public/static/audio/gokulTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/gokulTheme/Minus_Habit.mp3 diff --git a/website/static/audio/gokulTheme/Minus_Habit.ogg b/website/client/public/static/audio/gokulTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/gokulTheme/Minus_Habit.ogg rename to website/client/public/static/audio/gokulTheme/Minus_Habit.ogg diff --git a/website/static/audio/gokulTheme/Plus_Habit.mp3 b/website/client/public/static/audio/gokulTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/gokulTheme/Plus_Habit.mp3 diff --git a/website/static/audio/gokulTheme/Plus_Habit.ogg b/website/client/public/static/audio/gokulTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/gokulTheme/Plus_Habit.ogg rename to website/client/public/static/audio/gokulTheme/Plus_Habit.ogg diff --git a/website/static/audio/gokulTheme/Reward.mp3 b/website/client/public/static/audio/gokulTheme/Reward.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Reward.mp3 rename to website/client/public/static/audio/gokulTheme/Reward.mp3 diff --git a/website/static/audio/gokulTheme/Reward.ogg b/website/client/public/static/audio/gokulTheme/Reward.ogg similarity index 100% rename from website/static/audio/gokulTheme/Reward.ogg rename to website/client/public/static/audio/gokulTheme/Reward.ogg diff --git a/website/static/audio/gokulTheme/Todo.mp3 b/website/client/public/static/audio/gokulTheme/Todo.mp3 similarity index 100% rename from website/static/audio/gokulTheme/Todo.mp3 rename to website/client/public/static/audio/gokulTheme/Todo.mp3 diff --git a/website/static/audio/gokulTheme/Todo.ogg b/website/client/public/static/audio/gokulTheme/Todo.ogg similarity index 100% rename from website/static/audio/gokulTheme/Todo.ogg rename to website/client/public/static/audio/gokulTheme/Todo.ogg diff --git a/website/static/audio/lunasolTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/lunasolTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/lunasolTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/lunasolTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/lunasolTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/lunasolTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/lunasolTheme/Chat.mp3 b/website/client/public/static/audio/lunasolTheme/Chat.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Chat.mp3 rename to website/client/public/static/audio/lunasolTheme/Chat.mp3 diff --git a/website/static/audio/lunasolTheme/Chat.ogg b/website/client/public/static/audio/lunasolTheme/Chat.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Chat.ogg rename to website/client/public/static/audio/lunasolTheme/Chat.ogg diff --git a/website/static/audio/lunasolTheme/Daily.mp3 b/website/client/public/static/audio/lunasolTheme/Daily.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Daily.mp3 rename to website/client/public/static/audio/lunasolTheme/Daily.mp3 diff --git a/website/static/audio/lunasolTheme/Daily.ogg b/website/client/public/static/audio/lunasolTheme/Daily.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Daily.ogg rename to website/client/public/static/audio/lunasolTheme/Daily.ogg diff --git a/website/static/audio/lunasolTheme/Death.mp3 b/website/client/public/static/audio/lunasolTheme/Death.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Death.mp3 rename to website/client/public/static/audio/lunasolTheme/Death.mp3 diff --git a/website/static/audio/lunasolTheme/Death.ogg b/website/client/public/static/audio/lunasolTheme/Death.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Death.ogg rename to website/client/public/static/audio/lunasolTheme/Death.ogg diff --git a/website/static/audio/lunasolTheme/Item_Drop.mp3 b/website/client/public/static/audio/lunasolTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Item_Drop.mp3 rename to website/client/public/static/audio/lunasolTheme/Item_Drop.mp3 diff --git a/website/static/audio/lunasolTheme/Item_Drop.ogg b/website/client/public/static/audio/lunasolTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Item_Drop.ogg rename to website/client/public/static/audio/lunasolTheme/Item_Drop.ogg diff --git a/website/static/audio/lunasolTheme/Level_Up.mp3 b/website/client/public/static/audio/lunasolTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Level_Up.mp3 rename to website/client/public/static/audio/lunasolTheme/Level_Up.mp3 diff --git a/website/static/audio/lunasolTheme/Level_Up.ogg b/website/client/public/static/audio/lunasolTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Level_Up.ogg rename to website/client/public/static/audio/lunasolTheme/Level_Up.ogg diff --git a/website/static/audio/lunasolTheme/Minus_Habit.mp3 b/website/client/public/static/audio/lunasolTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/lunasolTheme/Minus_Habit.mp3 diff --git a/website/static/audio/lunasolTheme/Minus_Habit.ogg b/website/client/public/static/audio/lunasolTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Minus_Habit.ogg rename to website/client/public/static/audio/lunasolTheme/Minus_Habit.ogg diff --git a/website/static/audio/lunasolTheme/Plus_Habit.mp3 b/website/client/public/static/audio/lunasolTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/lunasolTheme/Plus_Habit.mp3 diff --git a/website/static/audio/lunasolTheme/Plus_Habit.ogg b/website/client/public/static/audio/lunasolTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Plus_Habit.ogg rename to website/client/public/static/audio/lunasolTheme/Plus_Habit.ogg diff --git a/website/static/audio/lunasolTheme/Reward.mp3 b/website/client/public/static/audio/lunasolTheme/Reward.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Reward.mp3 rename to website/client/public/static/audio/lunasolTheme/Reward.mp3 diff --git a/website/static/audio/lunasolTheme/Reward.ogg b/website/client/public/static/audio/lunasolTheme/Reward.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Reward.ogg rename to website/client/public/static/audio/lunasolTheme/Reward.ogg diff --git a/website/static/audio/lunasolTheme/Todo.mp3 b/website/client/public/static/audio/lunasolTheme/Todo.mp3 similarity index 100% rename from website/static/audio/lunasolTheme/Todo.mp3 rename to website/client/public/static/audio/lunasolTheme/Todo.mp3 diff --git a/website/static/audio/lunasolTheme/Todo.ogg b/website/client/public/static/audio/lunasolTheme/Todo.ogg similarity index 100% rename from website/static/audio/lunasolTheme/Todo.ogg rename to website/client/public/static/audio/lunasolTheme/Todo.ogg diff --git a/website/static/audio/luneFoxTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/luneFoxTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/luneFoxTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/luneFoxTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/luneFoxTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/luneFoxTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/luneFoxTheme/Chat.mp3 b/website/client/public/static/audio/luneFoxTheme/Chat.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Chat.mp3 rename to website/client/public/static/audio/luneFoxTheme/Chat.mp3 diff --git a/website/static/audio/luneFoxTheme/Chat.ogg b/website/client/public/static/audio/luneFoxTheme/Chat.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Chat.ogg rename to website/client/public/static/audio/luneFoxTheme/Chat.ogg diff --git a/website/static/audio/luneFoxTheme/Daily.mp3 b/website/client/public/static/audio/luneFoxTheme/Daily.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Daily.mp3 rename to website/client/public/static/audio/luneFoxTheme/Daily.mp3 diff --git a/website/static/audio/luneFoxTheme/Daily.ogg b/website/client/public/static/audio/luneFoxTheme/Daily.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Daily.ogg rename to website/client/public/static/audio/luneFoxTheme/Daily.ogg diff --git a/website/static/audio/luneFoxTheme/Death.mp3 b/website/client/public/static/audio/luneFoxTheme/Death.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Death.mp3 rename to website/client/public/static/audio/luneFoxTheme/Death.mp3 diff --git a/website/static/audio/luneFoxTheme/Death.ogg b/website/client/public/static/audio/luneFoxTheme/Death.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Death.ogg rename to website/client/public/static/audio/luneFoxTheme/Death.ogg diff --git a/website/static/audio/luneFoxTheme/Item_Drop.mp3 b/website/client/public/static/audio/luneFoxTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Item_Drop.mp3 rename to website/client/public/static/audio/luneFoxTheme/Item_Drop.mp3 diff --git a/website/static/audio/luneFoxTheme/Item_Drop.ogg b/website/client/public/static/audio/luneFoxTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Item_Drop.ogg rename to website/client/public/static/audio/luneFoxTheme/Item_Drop.ogg diff --git a/website/static/audio/luneFoxTheme/Level_Up.mp3 b/website/client/public/static/audio/luneFoxTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Level_Up.mp3 rename to website/client/public/static/audio/luneFoxTheme/Level_Up.mp3 diff --git a/website/static/audio/luneFoxTheme/Level_Up.ogg b/website/client/public/static/audio/luneFoxTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Level_Up.ogg rename to website/client/public/static/audio/luneFoxTheme/Level_Up.ogg diff --git a/website/static/audio/luneFoxTheme/Minus_Habit.mp3 b/website/client/public/static/audio/luneFoxTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/luneFoxTheme/Minus_Habit.mp3 diff --git a/website/static/audio/luneFoxTheme/Minus_Habit.ogg b/website/client/public/static/audio/luneFoxTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Minus_Habit.ogg rename to website/client/public/static/audio/luneFoxTheme/Minus_Habit.ogg diff --git a/website/static/audio/luneFoxTheme/Plus_Habit.mp3 b/website/client/public/static/audio/luneFoxTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/luneFoxTheme/Plus_Habit.mp3 diff --git a/website/static/audio/luneFoxTheme/Plus_Habit.ogg b/website/client/public/static/audio/luneFoxTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Plus_Habit.ogg rename to website/client/public/static/audio/luneFoxTheme/Plus_Habit.ogg diff --git a/website/static/audio/luneFoxTheme/Reward.mp3 b/website/client/public/static/audio/luneFoxTheme/Reward.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Reward.mp3 rename to website/client/public/static/audio/luneFoxTheme/Reward.mp3 diff --git a/website/static/audio/luneFoxTheme/Reward.ogg b/website/client/public/static/audio/luneFoxTheme/Reward.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Reward.ogg rename to website/client/public/static/audio/luneFoxTheme/Reward.ogg diff --git a/website/static/audio/luneFoxTheme/Todo.mp3 b/website/client/public/static/audio/luneFoxTheme/Todo.mp3 similarity index 100% rename from website/static/audio/luneFoxTheme/Todo.mp3 rename to website/client/public/static/audio/luneFoxTheme/Todo.mp3 diff --git a/website/static/audio/luneFoxTheme/Todo.ogg b/website/client/public/static/audio/luneFoxTheme/Todo.ogg similarity index 100% rename from website/static/audio/luneFoxTheme/Todo.ogg rename to website/client/public/static/audio/luneFoxTheme/Todo.ogg diff --git a/website/static/audio/maflTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/maflTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/maflTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/maflTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/maflTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/maflTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/maflTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/maflTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/maflTheme/Boss_Battles_Background_Music.mp3 b/website/client/public/static/audio/maflTheme/Boss_Battles_Background_Music.mp3 similarity index 100% rename from website/static/audio/maflTheme/Boss_Battles_Background_Music.mp3 rename to website/client/public/static/audio/maflTheme/Boss_Battles_Background_Music.mp3 diff --git a/website/static/audio/maflTheme/Boss_Battles_Background_Music.ogg b/website/client/public/static/audio/maflTheme/Boss_Battles_Background_Music.ogg similarity index 100% rename from website/static/audio/maflTheme/Boss_Battles_Background_Music.ogg rename to website/client/public/static/audio/maflTheme/Boss_Battles_Background_Music.ogg diff --git a/website/static/audio/maflTheme/Chat.mp3 b/website/client/public/static/audio/maflTheme/Chat.mp3 similarity index 100% rename from website/static/audio/maflTheme/Chat.mp3 rename to website/client/public/static/audio/maflTheme/Chat.mp3 diff --git a/website/static/audio/maflTheme/Chat.ogg b/website/client/public/static/audio/maflTheme/Chat.ogg similarity index 100% rename from website/static/audio/maflTheme/Chat.ogg rename to website/client/public/static/audio/maflTheme/Chat.ogg diff --git a/website/static/audio/maflTheme/Checklist_Complete.mp3 b/website/client/public/static/audio/maflTheme/Checklist_Complete.mp3 similarity index 100% rename from website/static/audio/maflTheme/Checklist_Complete.mp3 rename to website/client/public/static/audio/maflTheme/Checklist_Complete.mp3 diff --git a/website/static/audio/maflTheme/Checklist_Complete.ogg b/website/client/public/static/audio/maflTheme/Checklist_Complete.ogg similarity index 100% rename from website/static/audio/maflTheme/Checklist_Complete.ogg rename to website/client/public/static/audio/maflTheme/Checklist_Complete.ogg diff --git a/website/static/audio/maflTheme/Daily.mp3 b/website/client/public/static/audio/maflTheme/Daily.mp3 similarity index 100% rename from website/static/audio/maflTheme/Daily.mp3 rename to website/client/public/static/audio/maflTheme/Daily.mp3 diff --git a/website/static/audio/maflTheme/Daily.ogg b/website/client/public/static/audio/maflTheme/Daily.ogg similarity index 100% rename from website/static/audio/maflTheme/Daily.ogg rename to website/client/public/static/audio/maflTheme/Daily.ogg diff --git a/website/static/audio/maflTheme/Death.mp3 b/website/client/public/static/audio/maflTheme/Death.mp3 similarity index 100% rename from website/static/audio/maflTheme/Death.mp3 rename to website/client/public/static/audio/maflTheme/Death.mp3 diff --git a/website/static/audio/maflTheme/Death.ogg b/website/client/public/static/audio/maflTheme/Death.ogg similarity index 100% rename from website/static/audio/maflTheme/Death.ogg rename to website/client/public/static/audio/maflTheme/Death.ogg diff --git a/website/static/audio/maflTheme/Item_Drop.mp3 b/website/client/public/static/audio/maflTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/maflTheme/Item_Drop.mp3 rename to website/client/public/static/audio/maflTheme/Item_Drop.mp3 diff --git a/website/static/audio/maflTheme/Item_Drop.ogg b/website/client/public/static/audio/maflTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/maflTheme/Item_Drop.ogg rename to website/client/public/static/audio/maflTheme/Item_Drop.ogg diff --git a/website/static/audio/maflTheme/Level_Up.mp3 b/website/client/public/static/audio/maflTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/maflTheme/Level_Up.mp3 rename to website/client/public/static/audio/maflTheme/Level_Up.mp3 diff --git a/website/static/audio/maflTheme/Level_Up.ogg b/website/client/public/static/audio/maflTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/maflTheme/Level_Up.ogg rename to website/client/public/static/audio/maflTheme/Level_Up.ogg diff --git a/website/static/audio/maflTheme/Login.mp3 b/website/client/public/static/audio/maflTheme/Login.mp3 similarity index 100% rename from website/static/audio/maflTheme/Login.mp3 rename to website/client/public/static/audio/maflTheme/Login.mp3 diff --git a/website/static/audio/maflTheme/Login.ogg b/website/client/public/static/audio/maflTheme/Login.ogg similarity index 100% rename from website/static/audio/maflTheme/Login.ogg rename to website/client/public/static/audio/maflTheme/Login.ogg diff --git a/website/static/audio/maflTheme/Minus_Habit.mp3 b/website/client/public/static/audio/maflTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/maflTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/maflTheme/Minus_Habit.mp3 diff --git a/website/static/audio/maflTheme/Minus_Habit.ogg b/website/client/public/static/audio/maflTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/maflTheme/Minus_Habit.ogg rename to website/client/public/static/audio/maflTheme/Minus_Habit.ogg diff --git a/website/static/audio/maflTheme/Plus_Habit.mp3 b/website/client/public/static/audio/maflTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/maflTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/maflTheme/Plus_Habit.mp3 diff --git a/website/static/audio/maflTheme/Plus_Habit.ogg b/website/client/public/static/audio/maflTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/maflTheme/Plus_Habit.ogg rename to website/client/public/static/audio/maflTheme/Plus_Habit.ogg diff --git a/website/static/audio/maflTheme/Reward.mp3 b/website/client/public/static/audio/maflTheme/Reward.mp3 similarity index 100% rename from website/static/audio/maflTheme/Reward.mp3 rename to website/client/public/static/audio/maflTheme/Reward.mp3 diff --git a/website/static/audio/maflTheme/Reward.ogg b/website/client/public/static/audio/maflTheme/Reward.ogg similarity index 100% rename from website/static/audio/maflTheme/Reward.ogg rename to website/client/public/static/audio/maflTheme/Reward.ogg diff --git a/website/static/audio/maflTheme/Settings_Page_Background_Music.mp3 b/website/client/public/static/audio/maflTheme/Settings_Page_Background_Music.mp3 similarity index 100% rename from website/static/audio/maflTheme/Settings_Page_Background_Music.mp3 rename to website/client/public/static/audio/maflTheme/Settings_Page_Background_Music.mp3 diff --git a/website/static/audio/maflTheme/Settings_Page_Background_Music.ogg b/website/client/public/static/audio/maflTheme/Settings_Page_Background_Music.ogg similarity index 100% rename from website/static/audio/maflTheme/Settings_Page_Background_Music.ogg rename to website/client/public/static/audio/maflTheme/Settings_Page_Background_Music.ogg diff --git a/website/static/audio/maflTheme/Todo.mp3 b/website/client/public/static/audio/maflTheme/Todo.mp3 similarity index 100% rename from website/static/audio/maflTheme/Todo.mp3 rename to website/client/public/static/audio/maflTheme/Todo.mp3 diff --git a/website/static/audio/maflTheme/Todo.ogg b/website/client/public/static/audio/maflTheme/Todo.ogg similarity index 100% rename from website/static/audio/maflTheme/Todo.ogg rename to website/client/public/static/audio/maflTheme/Todo.ogg diff --git a/website/static/audio/pizildenTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/pizildenTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/pizildenTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/pizildenTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/pizildenTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/pizildenTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/pizildenTheme/Chat.mp3 b/website/client/public/static/audio/pizildenTheme/Chat.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Chat.mp3 rename to website/client/public/static/audio/pizildenTheme/Chat.mp3 diff --git a/website/static/audio/pizildenTheme/Chat.ogg b/website/client/public/static/audio/pizildenTheme/Chat.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Chat.ogg rename to website/client/public/static/audio/pizildenTheme/Chat.ogg diff --git a/website/static/audio/pizildenTheme/Daily.mp3 b/website/client/public/static/audio/pizildenTheme/Daily.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Daily.mp3 rename to website/client/public/static/audio/pizildenTheme/Daily.mp3 diff --git a/website/static/audio/pizildenTheme/Daily.ogg b/website/client/public/static/audio/pizildenTheme/Daily.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Daily.ogg rename to website/client/public/static/audio/pizildenTheme/Daily.ogg diff --git a/website/static/audio/pizildenTheme/Death.mp3 b/website/client/public/static/audio/pizildenTheme/Death.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Death.mp3 rename to website/client/public/static/audio/pizildenTheme/Death.mp3 diff --git a/website/static/audio/pizildenTheme/Death.ogg b/website/client/public/static/audio/pizildenTheme/Death.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Death.ogg rename to website/client/public/static/audio/pizildenTheme/Death.ogg diff --git a/website/static/audio/pizildenTheme/Item_Drop.mp3 b/website/client/public/static/audio/pizildenTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Item_Drop.mp3 rename to website/client/public/static/audio/pizildenTheme/Item_Drop.mp3 diff --git a/website/static/audio/pizildenTheme/Item_Drop.ogg b/website/client/public/static/audio/pizildenTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Item_Drop.ogg rename to website/client/public/static/audio/pizildenTheme/Item_Drop.ogg diff --git a/website/static/audio/pizildenTheme/Level_Up.mp3 b/website/client/public/static/audio/pizildenTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Level_Up.mp3 rename to website/client/public/static/audio/pizildenTheme/Level_Up.mp3 diff --git a/website/static/audio/pizildenTheme/Level_Up.ogg b/website/client/public/static/audio/pizildenTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Level_Up.ogg rename to website/client/public/static/audio/pizildenTheme/Level_Up.ogg diff --git a/website/static/audio/pizildenTheme/Minus_Habit.mp3 b/website/client/public/static/audio/pizildenTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/pizildenTheme/Minus_Habit.mp3 diff --git a/website/static/audio/pizildenTheme/Minus_Habit.ogg b/website/client/public/static/audio/pizildenTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Minus_Habit.ogg rename to website/client/public/static/audio/pizildenTheme/Minus_Habit.ogg diff --git a/website/static/audio/pizildenTheme/Plus_Habit.mp3 b/website/client/public/static/audio/pizildenTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/pizildenTheme/Plus_Habit.mp3 diff --git a/website/static/audio/pizildenTheme/Plus_Habit.ogg b/website/client/public/static/audio/pizildenTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Plus_Habit.ogg rename to website/client/public/static/audio/pizildenTheme/Plus_Habit.ogg diff --git a/website/static/audio/pizildenTheme/Reward.mp3 b/website/client/public/static/audio/pizildenTheme/Reward.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Reward.mp3 rename to website/client/public/static/audio/pizildenTheme/Reward.mp3 diff --git a/website/static/audio/pizildenTheme/Reward.ogg b/website/client/public/static/audio/pizildenTheme/Reward.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Reward.ogg rename to website/client/public/static/audio/pizildenTheme/Reward.ogg diff --git a/website/static/audio/pizildenTheme/Todo.mp3 b/website/client/public/static/audio/pizildenTheme/Todo.mp3 similarity index 100% rename from website/static/audio/pizildenTheme/Todo.mp3 rename to website/client/public/static/audio/pizildenTheme/Todo.mp3 diff --git a/website/static/audio/pizildenTheme/Todo.ogg b/website/client/public/static/audio/pizildenTheme/Todo.ogg similarity index 100% rename from website/static/audio/pizildenTheme/Todo.ogg rename to website/client/public/static/audio/pizildenTheme/Todo.ogg diff --git a/website/static/audio/rosstavoTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/rosstavoTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/rosstavoTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/rosstavoTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/rosstavoTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/rosstavoTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/rosstavoTheme/Chat.mp3 b/website/client/public/static/audio/rosstavoTheme/Chat.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Chat.mp3 rename to website/client/public/static/audio/rosstavoTheme/Chat.mp3 diff --git a/website/static/audio/rosstavoTheme/Chat.ogg b/website/client/public/static/audio/rosstavoTheme/Chat.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Chat.ogg rename to website/client/public/static/audio/rosstavoTheme/Chat.ogg diff --git a/website/static/audio/rosstavoTheme/Daily.mp3 b/website/client/public/static/audio/rosstavoTheme/Daily.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Daily.mp3 rename to website/client/public/static/audio/rosstavoTheme/Daily.mp3 diff --git a/website/static/audio/rosstavoTheme/Daily.ogg b/website/client/public/static/audio/rosstavoTheme/Daily.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Daily.ogg rename to website/client/public/static/audio/rosstavoTheme/Daily.ogg diff --git a/website/static/audio/rosstavoTheme/Death.mp3 b/website/client/public/static/audio/rosstavoTheme/Death.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Death.mp3 rename to website/client/public/static/audio/rosstavoTheme/Death.mp3 diff --git a/website/static/audio/rosstavoTheme/Death.ogg b/website/client/public/static/audio/rosstavoTheme/Death.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Death.ogg rename to website/client/public/static/audio/rosstavoTheme/Death.ogg diff --git a/website/static/audio/rosstavoTheme/Item_Drop.mp3 b/website/client/public/static/audio/rosstavoTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Item_Drop.mp3 rename to website/client/public/static/audio/rosstavoTheme/Item_Drop.mp3 diff --git a/website/static/audio/rosstavoTheme/Item_Drop.ogg b/website/client/public/static/audio/rosstavoTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Item_Drop.ogg rename to website/client/public/static/audio/rosstavoTheme/Item_Drop.ogg diff --git a/website/static/audio/rosstavoTheme/Level_Up.mp3 b/website/client/public/static/audio/rosstavoTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Level_Up.mp3 rename to website/client/public/static/audio/rosstavoTheme/Level_Up.mp3 diff --git a/website/static/audio/rosstavoTheme/Level_Up.ogg b/website/client/public/static/audio/rosstavoTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Level_Up.ogg rename to website/client/public/static/audio/rosstavoTheme/Level_Up.ogg diff --git a/website/static/audio/rosstavoTheme/Minus_Habit.mp3 b/website/client/public/static/audio/rosstavoTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/rosstavoTheme/Minus_Habit.mp3 diff --git a/website/static/audio/rosstavoTheme/Minus_Habit.ogg b/website/client/public/static/audio/rosstavoTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Minus_Habit.ogg rename to website/client/public/static/audio/rosstavoTheme/Minus_Habit.ogg diff --git a/website/static/audio/rosstavoTheme/Plus_Habit.mp3 b/website/client/public/static/audio/rosstavoTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/rosstavoTheme/Plus_Habit.mp3 diff --git a/website/static/audio/rosstavoTheme/Plus_Habit.ogg b/website/client/public/static/audio/rosstavoTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Plus_Habit.ogg rename to website/client/public/static/audio/rosstavoTheme/Plus_Habit.ogg diff --git a/website/static/audio/rosstavoTheme/Reward.mp3 b/website/client/public/static/audio/rosstavoTheme/Reward.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Reward.mp3 rename to website/client/public/static/audio/rosstavoTheme/Reward.mp3 diff --git a/website/static/audio/rosstavoTheme/Reward.ogg b/website/client/public/static/audio/rosstavoTheme/Reward.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Reward.ogg rename to website/client/public/static/audio/rosstavoTheme/Reward.ogg diff --git a/website/static/audio/rosstavoTheme/Todo.mp3 b/website/client/public/static/audio/rosstavoTheme/Todo.mp3 similarity index 100% rename from website/static/audio/rosstavoTheme/Todo.mp3 rename to website/client/public/static/audio/rosstavoTheme/Todo.mp3 diff --git a/website/static/audio/rosstavoTheme/Todo.ogg b/website/client/public/static/audio/rosstavoTheme/Todo.ogg similarity index 100% rename from website/static/audio/rosstavoTheme/Todo.ogg rename to website/client/public/static/audio/rosstavoTheme/Todo.ogg diff --git a/website/static/audio/spacePenguinTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/spacePenguinTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/spacePenguinTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/spacePenguinTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/spacePenguinTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/spacePenguinTheme/Chat.mp3 b/website/client/public/static/audio/spacePenguinTheme/Chat.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Chat.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Chat.mp3 diff --git a/website/static/audio/spacePenguinTheme/Chat.ogg b/website/client/public/static/audio/spacePenguinTheme/Chat.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Chat.ogg rename to website/client/public/static/audio/spacePenguinTheme/Chat.ogg diff --git a/website/static/audio/spacePenguinTheme/Daily.mp3 b/website/client/public/static/audio/spacePenguinTheme/Daily.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Daily.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Daily.mp3 diff --git a/website/static/audio/spacePenguinTheme/Daily.ogg b/website/client/public/static/audio/spacePenguinTheme/Daily.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Daily.ogg rename to website/client/public/static/audio/spacePenguinTheme/Daily.ogg diff --git a/website/static/audio/spacePenguinTheme/Death.mp3 b/website/client/public/static/audio/spacePenguinTheme/Death.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Death.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Death.mp3 diff --git a/website/static/audio/spacePenguinTheme/Death.ogg b/website/client/public/static/audio/spacePenguinTheme/Death.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Death.ogg rename to website/client/public/static/audio/spacePenguinTheme/Death.ogg diff --git a/website/static/audio/spacePenguinTheme/Item_Drop.mp3 b/website/client/public/static/audio/spacePenguinTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Item_Drop.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Item_Drop.mp3 diff --git a/website/static/audio/spacePenguinTheme/Item_Drop.ogg b/website/client/public/static/audio/spacePenguinTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Item_Drop.ogg rename to website/client/public/static/audio/spacePenguinTheme/Item_Drop.ogg diff --git a/website/static/audio/spacePenguinTheme/Level_Up.mp3 b/website/client/public/static/audio/spacePenguinTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Level_Up.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Level_Up.mp3 diff --git a/website/static/audio/spacePenguinTheme/Level_Up.ogg b/website/client/public/static/audio/spacePenguinTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Level_Up.ogg rename to website/client/public/static/audio/spacePenguinTheme/Level_Up.ogg diff --git a/website/static/audio/spacePenguinTheme/Minus_Habit.mp3 b/website/client/public/static/audio/spacePenguinTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Minus_Habit.mp3 diff --git a/website/static/audio/spacePenguinTheme/Minus_Habit.ogg b/website/client/public/static/audio/spacePenguinTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Minus_Habit.ogg rename to website/client/public/static/audio/spacePenguinTheme/Minus_Habit.ogg diff --git a/website/static/audio/spacePenguinTheme/Plus_Habit.mp3 b/website/client/public/static/audio/spacePenguinTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Plus_Habit.mp3 diff --git a/website/static/audio/spacePenguinTheme/Plus_Habit.ogg b/website/client/public/static/audio/spacePenguinTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Plus_Habit.ogg rename to website/client/public/static/audio/spacePenguinTheme/Plus_Habit.ogg diff --git a/website/static/audio/spacePenguinTheme/Reward.mp3 b/website/client/public/static/audio/spacePenguinTheme/Reward.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Reward.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Reward.mp3 diff --git a/website/static/audio/spacePenguinTheme/Reward.ogg b/website/client/public/static/audio/spacePenguinTheme/Reward.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Reward.ogg rename to website/client/public/static/audio/spacePenguinTheme/Reward.ogg diff --git a/website/static/audio/spacePenguinTheme/Todo.mp3 b/website/client/public/static/audio/spacePenguinTheme/Todo.mp3 similarity index 100% rename from website/static/audio/spacePenguinTheme/Todo.mp3 rename to website/client/public/static/audio/spacePenguinTheme/Todo.mp3 diff --git a/website/static/audio/spacePenguinTheme/Todo.ogg b/website/client/public/static/audio/spacePenguinTheme/Todo.ogg similarity index 100% rename from website/static/audio/spacePenguinTheme/Todo.ogg rename to website/client/public/static/audio/spacePenguinTheme/Todo.ogg diff --git a/website/static/audio/triumphTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/triumphTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/triumphTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/triumphTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/triumphTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/triumphTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/triumphTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/triumphTheme/Chat.mp3 b/website/client/public/static/audio/triumphTheme/Chat.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Chat.mp3 rename to website/client/public/static/audio/triumphTheme/Chat.mp3 diff --git a/website/static/audio/triumphTheme/Chat.ogg b/website/client/public/static/audio/triumphTheme/Chat.ogg similarity index 100% rename from website/static/audio/triumphTheme/Chat.ogg rename to website/client/public/static/audio/triumphTheme/Chat.ogg diff --git a/website/static/audio/triumphTheme/Daily.mp3 b/website/client/public/static/audio/triumphTheme/Daily.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Daily.mp3 rename to website/client/public/static/audio/triumphTheme/Daily.mp3 diff --git a/website/static/audio/triumphTheme/Daily.ogg b/website/client/public/static/audio/triumphTheme/Daily.ogg similarity index 100% rename from website/static/audio/triumphTheme/Daily.ogg rename to website/client/public/static/audio/triumphTheme/Daily.ogg diff --git a/website/static/audio/triumphTheme/Death.mp3 b/website/client/public/static/audio/triumphTheme/Death.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Death.mp3 rename to website/client/public/static/audio/triumphTheme/Death.mp3 diff --git a/website/static/audio/triumphTheme/Death.ogg b/website/client/public/static/audio/triumphTheme/Death.ogg similarity index 100% rename from website/static/audio/triumphTheme/Death.ogg rename to website/client/public/static/audio/triumphTheme/Death.ogg diff --git a/website/static/audio/triumphTheme/Item_Drop.mp3 b/website/client/public/static/audio/triumphTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Item_Drop.mp3 rename to website/client/public/static/audio/triumphTheme/Item_Drop.mp3 diff --git a/website/static/audio/triumphTheme/Item_Drop.ogg b/website/client/public/static/audio/triumphTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/triumphTheme/Item_Drop.ogg rename to website/client/public/static/audio/triumphTheme/Item_Drop.ogg diff --git a/website/static/audio/triumphTheme/Level_Up.mp3 b/website/client/public/static/audio/triumphTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Level_Up.mp3 rename to website/client/public/static/audio/triumphTheme/Level_Up.mp3 diff --git a/website/static/audio/triumphTheme/Level_Up.ogg b/website/client/public/static/audio/triumphTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/triumphTheme/Level_Up.ogg rename to website/client/public/static/audio/triumphTheme/Level_Up.ogg diff --git a/website/static/audio/triumphTheme/Minus_Habit.mp3 b/website/client/public/static/audio/triumphTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/triumphTheme/Minus_Habit.mp3 diff --git a/website/static/audio/triumphTheme/Minus_Habit.ogg b/website/client/public/static/audio/triumphTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/triumphTheme/Minus_Habit.ogg rename to website/client/public/static/audio/triumphTheme/Minus_Habit.ogg diff --git a/website/static/audio/triumphTheme/Plus_Habit.mp3 b/website/client/public/static/audio/triumphTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/triumphTheme/Plus_Habit.mp3 diff --git a/website/static/audio/triumphTheme/Plus_Habit.ogg b/website/client/public/static/audio/triumphTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/triumphTheme/Plus_Habit.ogg rename to website/client/public/static/audio/triumphTheme/Plus_Habit.ogg diff --git a/website/static/audio/triumphTheme/Reward.mp3 b/website/client/public/static/audio/triumphTheme/Reward.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Reward.mp3 rename to website/client/public/static/audio/triumphTheme/Reward.mp3 diff --git a/website/static/audio/triumphTheme/Reward.ogg b/website/client/public/static/audio/triumphTheme/Reward.ogg similarity index 100% rename from website/static/audio/triumphTheme/Reward.ogg rename to website/client/public/static/audio/triumphTheme/Reward.ogg diff --git a/website/static/audio/triumphTheme/Todo.mp3 b/website/client/public/static/audio/triumphTheme/Todo.mp3 similarity index 100% rename from website/static/audio/triumphTheme/Todo.mp3 rename to website/client/public/static/audio/triumphTheme/Todo.mp3 diff --git a/website/static/audio/triumphTheme/Todo.ogg b/website/client/public/static/audio/triumphTheme/Todo.ogg similarity index 100% rename from website/static/audio/triumphTheme/Todo.ogg rename to website/client/public/static/audio/triumphTheme/Todo.ogg diff --git a/website/static/audio/wattsTheme/Achievement_Unlocked.mp3 b/website/client/public/static/audio/wattsTheme/Achievement_Unlocked.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Achievement_Unlocked.mp3 rename to website/client/public/static/audio/wattsTheme/Achievement_Unlocked.mp3 diff --git a/website/static/audio/wattsTheme/Achievement_Unlocked.ogg b/website/client/public/static/audio/wattsTheme/Achievement_Unlocked.ogg similarity index 100% rename from website/static/audio/wattsTheme/Achievement_Unlocked.ogg rename to website/client/public/static/audio/wattsTheme/Achievement_Unlocked.ogg diff --git a/website/static/audio/wattsTheme/Chat.mp3 b/website/client/public/static/audio/wattsTheme/Chat.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Chat.mp3 rename to website/client/public/static/audio/wattsTheme/Chat.mp3 diff --git a/website/static/audio/wattsTheme/Chat.ogg b/website/client/public/static/audio/wattsTheme/Chat.ogg similarity index 100% rename from website/static/audio/wattsTheme/Chat.ogg rename to website/client/public/static/audio/wattsTheme/Chat.ogg diff --git a/website/static/audio/wattsTheme/Daily.mp3 b/website/client/public/static/audio/wattsTheme/Daily.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Daily.mp3 rename to website/client/public/static/audio/wattsTheme/Daily.mp3 diff --git a/website/static/audio/wattsTheme/Daily.ogg b/website/client/public/static/audio/wattsTheme/Daily.ogg similarity index 100% rename from website/static/audio/wattsTheme/Daily.ogg rename to website/client/public/static/audio/wattsTheme/Daily.ogg diff --git a/website/static/audio/wattsTheme/Death.mp3 b/website/client/public/static/audio/wattsTheme/Death.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Death.mp3 rename to website/client/public/static/audio/wattsTheme/Death.mp3 diff --git a/website/static/audio/wattsTheme/Death.ogg b/website/client/public/static/audio/wattsTheme/Death.ogg similarity index 100% rename from website/static/audio/wattsTheme/Death.ogg rename to website/client/public/static/audio/wattsTheme/Death.ogg diff --git a/website/static/audio/wattsTheme/Item_Drop.mp3 b/website/client/public/static/audio/wattsTheme/Item_Drop.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Item_Drop.mp3 rename to website/client/public/static/audio/wattsTheme/Item_Drop.mp3 diff --git a/website/static/audio/wattsTheme/Item_Drop.ogg b/website/client/public/static/audio/wattsTheme/Item_Drop.ogg similarity index 100% rename from website/static/audio/wattsTheme/Item_Drop.ogg rename to website/client/public/static/audio/wattsTheme/Item_Drop.ogg diff --git a/website/static/audio/wattsTheme/Level_Up.mp3 b/website/client/public/static/audio/wattsTheme/Level_Up.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Level_Up.mp3 rename to website/client/public/static/audio/wattsTheme/Level_Up.mp3 diff --git a/website/static/audio/wattsTheme/Level_Up.ogg b/website/client/public/static/audio/wattsTheme/Level_Up.ogg similarity index 100% rename from website/static/audio/wattsTheme/Level_Up.ogg rename to website/client/public/static/audio/wattsTheme/Level_Up.ogg diff --git a/website/static/audio/wattsTheme/Minus_Habit.mp3 b/website/client/public/static/audio/wattsTheme/Minus_Habit.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Minus_Habit.mp3 rename to website/client/public/static/audio/wattsTheme/Minus_Habit.mp3 diff --git a/website/static/audio/wattsTheme/Minus_Habit.ogg b/website/client/public/static/audio/wattsTheme/Minus_Habit.ogg similarity index 100% rename from website/static/audio/wattsTheme/Minus_Habit.ogg rename to website/client/public/static/audio/wattsTheme/Minus_Habit.ogg diff --git a/website/static/audio/wattsTheme/Plus_Habit.mp3 b/website/client/public/static/audio/wattsTheme/Plus_Habit.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Plus_Habit.mp3 rename to website/client/public/static/audio/wattsTheme/Plus_Habit.mp3 diff --git a/website/static/audio/wattsTheme/Plus_Habit.ogg b/website/client/public/static/audio/wattsTheme/Plus_Habit.ogg similarity index 100% rename from website/static/audio/wattsTheme/Plus_Habit.ogg rename to website/client/public/static/audio/wattsTheme/Plus_Habit.ogg diff --git a/website/static/audio/wattsTheme/Reward.mp3 b/website/client/public/static/audio/wattsTheme/Reward.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Reward.mp3 rename to website/client/public/static/audio/wattsTheme/Reward.mp3 diff --git a/website/static/audio/wattsTheme/Reward.ogg b/website/client/public/static/audio/wattsTheme/Reward.ogg similarity index 100% rename from website/static/audio/wattsTheme/Reward.ogg rename to website/client/public/static/audio/wattsTheme/Reward.ogg diff --git a/website/static/audio/wattsTheme/Todo.mp3 b/website/client/public/static/audio/wattsTheme/Todo.mp3 similarity index 100% rename from website/static/audio/wattsTheme/Todo.mp3 rename to website/client/public/static/audio/wattsTheme/Todo.mp3 diff --git a/website/static/audio/wattsTheme/Todo.ogg b/website/client/public/static/audio/wattsTheme/Todo.ogg similarity index 100% rename from website/static/audio/wattsTheme/Todo.ogg rename to website/client/public/static/audio/wattsTheme/Todo.ogg diff --git a/website/static/emails/images/10-days-recapture-v1.png b/website/client/public/static/emails/images/10-days-recapture-v1.png similarity index 100% rename from website/static/emails/images/10-days-recapture-v1.png rename to website/client/public/static/emails/images/10-days-recapture-v1.png diff --git a/website/static/emails/images/3-days-1-month-recapture-v1.png b/website/client/public/static/emails/images/3-days-1-month-recapture-v1.png similarity index 100% rename from website/static/emails/images/3-days-1-month-recapture-v1.png rename to website/client/public/static/emails/images/3-days-1-month-recapture-v1.png diff --git a/website/static/emails/images/PROMO-Enchanted-Armoire-v1.png b/website/client/public/static/emails/images/PROMO-Enchanted-Armoire-v1.png similarity index 100% rename from website/static/emails/images/PROMO-Enchanted-Armoire-v1.png rename to website/client/public/static/emails/images/PROMO-Enchanted-Armoire-v1.png diff --git a/website/static/emails/images/android-promo-v1.png b/website/client/public/static/emails/images/android-promo-v1.png similarity index 100% rename from website/static/emails/images/android-promo-v1.png rename to website/client/public/static/emails/images/android-promo-v1.png diff --git a/website/static/emails/images/iphone-promo-v1.png b/website/client/public/static/emails/images/iphone-promo-v1.png similarity index 100% rename from website/static/emails/images/iphone-promo-v1.png rename to website/client/public/static/emails/images/iphone-promo-v1.png diff --git a/website/static/emails/images/meta-image.png b/website/client/public/static/emails/images/meta-image.png similarity index 100% rename from website/static/emails/images/meta-image.png rename to website/client/public/static/emails/images/meta-image.png diff --git a/website/static/emails/images/one-day-v1.png b/website/client/public/static/emails/images/one-day-v1.png similarity index 100% rename from website/static/emails/images/one-day-v1.png rename to website/client/public/static/emails/images/one-day-v1.png diff --git a/website/static/emails/images/spring-2015-00-v1.png b/website/client/public/static/emails/images/spring-2015-00-v1.png similarity index 100% rename from website/static/emails/images/spring-2015-00-v1.png rename to website/client/public/static/emails/images/spring-2015-00-v1.png diff --git a/website/static/emails/images/spring-2015-01-v1.png b/website/client/public/static/emails/images/spring-2015-01-v1.png similarity index 100% rename from website/static/emails/images/spring-2015-01-v1.png rename to website/client/public/static/emails/images/spring-2015-01-v1.png diff --git a/website/static/emails/images/subscription-begins-time-travelers-v1.png b/website/client/public/static/emails/images/subscription-begins-time-travelers-v1.png similarity index 100% rename from website/static/emails/images/subscription-begins-time-travelers-v1.png rename to website/client/public/static/emails/images/subscription-begins-time-travelers-v1.png diff --git a/website/static/emails/images/subscription-begins-v1.png b/website/client/public/static/emails/images/subscription-begins-v1.png similarity index 100% rename from website/static/emails/images/subscription-begins-v1.png rename to website/client/public/static/emails/images/subscription-begins-v1.png diff --git a/website/static/icons/favicon.ico b/website/client/public/static/icons/favicon.ico similarity index 100% rename from website/static/icons/favicon.ico rename to website/client/public/static/icons/favicon.ico diff --git a/website/static/icons/favicon_192x192.png b/website/client/public/static/icons/favicon_192x192.png similarity index 100% rename from website/static/icons/favicon_192x192.png rename to website/client/public/static/icons/favicon_192x192.png diff --git a/website/static/merch/stickermule-logo.png b/website/client/public/static/merch/stickermule-logo.png similarity index 100% rename from website/static/merch/stickermule-logo.png rename to website/client/public/static/merch/stickermule-logo.png diff --git a/website/static/merch/stickermule-logo.svg b/website/client/public/static/merch/stickermule-logo.svg similarity index 100% rename from website/static/merch/stickermule-logo.svg rename to website/client/public/static/merch/stickermule-logo.svg diff --git a/website/static/merch/stickermule.png b/website/client/public/static/merch/stickermule.png similarity index 100% rename from website/static/merch/stickermule.png rename to website/client/public/static/merch/stickermule.png diff --git a/website/static/merch/teespring-eu-logo.png b/website/client/public/static/merch/teespring-eu-logo.png similarity index 100% rename from website/static/merch/teespring-eu-logo.png rename to website/client/public/static/merch/teespring-eu-logo.png diff --git a/website/static/merch/teespring-eu.png b/website/client/public/static/merch/teespring-eu.png similarity index 100% rename from website/static/merch/teespring-eu.png rename to website/client/public/static/merch/teespring-eu.png diff --git a/website/static/merch/teespring-logo.png b/website/client/public/static/merch/teespring-logo.png similarity index 100% rename from website/static/merch/teespring-logo.png rename to website/client/public/static/merch/teespring-logo.png diff --git a/website/static/merch/teespring-logo.svg b/website/client/public/static/merch/teespring-logo.svg similarity index 100% rename from website/static/merch/teespring-logo.svg rename to website/client/public/static/merch/teespring-logo.svg diff --git a/website/static/merch/teespring-mug-eu-logo.png b/website/client/public/static/merch/teespring-mug-eu-logo.png similarity index 100% rename from website/static/merch/teespring-mug-eu-logo.png rename to website/client/public/static/merch/teespring-mug-eu-logo.png diff --git a/website/static/merch/teespring-mug-eu.png b/website/client/public/static/merch/teespring-mug-eu.png similarity index 100% rename from website/static/merch/teespring-mug-eu.png rename to website/client/public/static/merch/teespring-mug-eu.png diff --git a/website/static/merch/teespring-mug-logo.png b/website/client/public/static/merch/teespring-mug-logo.png similarity index 100% rename from website/static/merch/teespring-mug-logo.png rename to website/client/public/static/merch/teespring-mug-logo.png diff --git a/website/static/merch/teespring-mug.png b/website/client/public/static/merch/teespring-mug.png similarity index 100% rename from website/static/merch/teespring-mug.png rename to website/client/public/static/merch/teespring-mug.png diff --git a/website/static/merch/teespring.png b/website/client/public/static/merch/teespring.png similarity index 100% rename from website/static/merch/teespring.png rename to website/client/public/static/merch/teespring.png diff --git a/website/static/presskit/Boss/Basi-List.png b/website/client/public/static/presskit/Boss/Basi-List.png similarity index 100% rename from website/static/presskit/Boss/Basi-List.png rename to website/client/public/static/presskit/Boss/Basi-List.png diff --git a/website/static/presskit/Boss/Battling the Ghost Stag.png b/website/client/public/static/presskit/Boss/Battling the Ghost Stag.png similarity index 100% rename from website/static/presskit/Boss/Battling the Ghost Stag.png rename to website/client/public/static/presskit/Boss/Battling the Ghost Stag.png diff --git a/website/static/presskit/Boss/Dread Drag'on of Dilatory.png b/website/client/public/static/presskit/Boss/Dread Drag'on of Dilatory.png similarity index 100% rename from website/static/presskit/Boss/Dread Drag'on of Dilatory.png rename to website/client/public/static/presskit/Boss/Dread Drag'on of Dilatory.png diff --git a/website/static/presskit/Boss/Laundromancer.png b/website/client/public/static/presskit/Boss/Laundromancer.png similarity index 100% rename from website/static/presskit/Boss/Laundromancer.png rename to website/client/public/static/presskit/Boss/Laundromancer.png diff --git a/website/static/presskit/Boss/Necro-Vice.png b/website/client/public/static/presskit/Boss/Necro-Vice.png similarity index 100% rename from website/static/presskit/Boss/Necro-Vice.png rename to website/client/public/static/presskit/Boss/Necro-Vice.png diff --git a/website/static/presskit/Boss/SnackLess Monster.png b/website/client/public/static/presskit/Boss/SnackLess Monster.png similarity index 100% rename from website/static/presskit/Boss/SnackLess Monster.png rename to website/client/public/static/presskit/Boss/SnackLess Monster.png diff --git a/website/static/presskit/Boss/Stagnant Dishes.png b/website/client/public/static/presskit/Boss/Stagnant Dishes.png similarity index 100% rename from website/static/presskit/Boss/Stagnant Dishes.png rename to website/client/public/static/presskit/Boss/Stagnant Dishes.png diff --git a/website/static/presskit/Habitica - Gamify Your Life.mp4 b/website/client/public/static/presskit/Habitica - Gamify Your Life.mp4 similarity index 100% rename from website/static/presskit/Habitica - Gamify Your Life.mp4 rename to website/client/public/static/presskit/Habitica - Gamify Your Life.mp4 diff --git a/website/static/presskit/Logo/Android.png b/website/client/public/static/presskit/Logo/Android.png similarity index 100% rename from website/static/presskit/Logo/Android.png rename to website/client/public/static/presskit/Logo/Android.png diff --git a/website/static/presskit/Logo/Habitica Gryphon.png b/website/client/public/static/presskit/Logo/Habitica Gryphon.png similarity index 100% rename from website/static/presskit/Logo/Habitica Gryphon.png rename to website/client/public/static/presskit/Logo/Habitica Gryphon.png diff --git a/website/static/presskit/Logo/Icon with Text.png b/website/client/public/static/presskit/Logo/Icon with Text.png similarity index 100% rename from website/static/presskit/Logo/Icon with Text.png rename to website/client/public/static/presskit/Logo/Icon with Text.png diff --git a/website/static/presskit/Logo/Icon.png b/website/client/public/static/presskit/Logo/Icon.png similarity index 100% rename from website/static/presskit/Logo/Icon.png rename to website/client/public/static/presskit/Logo/Icon.png diff --git a/website/static/presskit/Logo/Text.png b/website/client/public/static/presskit/Logo/Text.png similarity index 100% rename from website/static/presskit/Logo/Text.png rename to website/client/public/static/presskit/Logo/Text.png diff --git a/website/static/presskit/Logo/iOS.png b/website/client/public/static/presskit/Logo/iOS.png similarity index 100% rename from website/static/presskit/Logo/iOS.png rename to website/client/public/static/presskit/Logo/iOS.png diff --git a/website/static/presskit/Promo/Promo - Thin.png b/website/client/public/static/presskit/Promo/Promo - Thin.png similarity index 100% rename from website/static/presskit/Promo/Promo - Thin.png rename to website/client/public/static/presskit/Promo/Promo - Thin.png diff --git a/website/static/presskit/Promo/Promo.png b/website/client/public/static/presskit/Promo/Promo.png similarity index 100% rename from website/static/presskit/Promo/Promo.png rename to website/client/public/static/presskit/Promo/Promo.png diff --git a/website/static/presskit/Samples/Android/Add Tasks.png b/website/client/public/static/presskit/Samples/Android/Add Tasks.png similarity index 100% rename from website/static/presskit/Samples/Android/Add Tasks.png rename to website/client/public/static/presskit/Samples/Android/Add Tasks.png diff --git a/website/static/presskit/Samples/Android/Login.png b/website/client/public/static/presskit/Samples/Android/Login.png similarity index 100% rename from website/static/presskit/Samples/Android/Login.png rename to website/client/public/static/presskit/Samples/Android/Login.png diff --git a/website/static/presskit/Samples/Android/Party.png b/website/client/public/static/presskit/Samples/Android/Party.png similarity index 100% rename from website/static/presskit/Samples/Android/Party.png rename to website/client/public/static/presskit/Samples/Android/Party.png diff --git a/website/static/presskit/Samples/Android/Shops.png b/website/client/public/static/presskit/Samples/Android/Shops.png similarity index 100% rename from website/static/presskit/Samples/Android/Shops.png rename to website/client/public/static/presskit/Samples/Android/Shops.png diff --git a/website/static/presskit/Samples/Android/Stats.png b/website/client/public/static/presskit/Samples/Android/Stats.png similarity index 100% rename from website/static/presskit/Samples/Android/Stats.png rename to website/client/public/static/presskit/Samples/Android/Stats.png diff --git a/website/static/presskit/Samples/Android/Tasks Page.png b/website/client/public/static/presskit/Samples/Android/Tasks Page.png similarity index 100% rename from website/static/presskit/Samples/Android/Tasks Page.png rename to website/client/public/static/presskit/Samples/Android/Tasks Page.png diff --git a/website/static/presskit/Samples/Android/User.png b/website/client/public/static/presskit/Samples/Android/User.png similarity index 100% rename from website/static/presskit/Samples/Android/User.png rename to website/client/public/static/presskit/Samples/Android/User.png diff --git a/website/static/presskit/Samples/Website/Challenges.png b/website/client/public/static/presskit/Samples/Website/Challenges.png similarity index 100% rename from website/static/presskit/Samples/Website/Challenges.png rename to website/client/public/static/presskit/Samples/Website/Challenges.png diff --git a/website/static/presskit/Samples/Website/CheckInIncentives.png b/website/client/public/static/presskit/Samples/Website/CheckInIncentives.png similarity index 100% rename from website/static/presskit/Samples/Website/CheckInIncentives.png rename to website/client/public/static/presskit/Samples/Website/CheckInIncentives.png diff --git a/website/static/presskit/Samples/Website/Equipment.png b/website/client/public/static/presskit/Samples/Website/Equipment.png similarity index 100% rename from website/static/presskit/Samples/Website/Equipment.png rename to website/client/public/static/presskit/Samples/Website/Equipment.png diff --git a/website/static/presskit/Samples/Website/Guilds.png b/website/client/public/static/presskit/Samples/Website/Guilds.png similarity index 100% rename from website/static/presskit/Samples/Website/Guilds.png rename to website/client/public/static/presskit/Samples/Website/Guilds.png diff --git a/website/static/presskit/Samples/Website/Inventory.png b/website/client/public/static/presskit/Samples/Website/Inventory.png similarity index 100% rename from website/static/presskit/Samples/Website/Inventory.png rename to website/client/public/static/presskit/Samples/Website/Inventory.png diff --git a/website/static/presskit/Samples/Website/Market.png b/website/client/public/static/presskit/Samples/Website/Market.png similarity index 100% rename from website/static/presskit/Samples/Website/Market.png rename to website/client/public/static/presskit/Samples/Website/Market.png diff --git a/website/static/presskit/Samples/Website/Market2.png b/website/client/public/static/presskit/Samples/Website/Market2.png similarity index 100% rename from website/static/presskit/Samples/Website/Market2.png rename to website/client/public/static/presskit/Samples/Website/Market2.png diff --git a/website/static/presskit/Samples/Website/Tavern.png b/website/client/public/static/presskit/Samples/Website/Tavern.png similarity index 100% rename from website/static/presskit/Samples/Website/Tavern.png rename to website/client/public/static/presskit/Samples/Website/Tavern.png diff --git a/website/static/presskit/Samples/iOS/Boss.png b/website/client/public/static/presskit/Samples/iOS/Boss.png similarity index 100% rename from website/static/presskit/Samples/iOS/Boss.png rename to website/client/public/static/presskit/Samples/iOS/Boss.png diff --git a/website/static/presskit/Samples/iOS/Level Up.png b/website/client/public/static/presskit/Samples/iOS/Level Up.png similarity index 100% rename from website/static/presskit/Samples/iOS/Level Up.png rename to website/client/public/static/presskit/Samples/iOS/Level Up.png diff --git a/website/static/presskit/Samples/iOS/Market.png b/website/client/public/static/presskit/Samples/iOS/Market.png similarity index 100% rename from website/static/presskit/Samples/iOS/Market.png rename to website/client/public/static/presskit/Samples/iOS/Market.png diff --git a/website/static/presskit/Samples/iOS/Party.png b/website/client/public/static/presskit/Samples/iOS/Party.png similarity index 100% rename from website/static/presskit/Samples/iOS/Party.png rename to website/client/public/static/presskit/Samples/iOS/Party.png diff --git a/website/static/presskit/Samples/iOS/Tasks Page.png b/website/client/public/static/presskit/Samples/iOS/Tasks Page.png similarity index 100% rename from website/static/presskit/Samples/iOS/Tasks Page.png rename to website/client/public/static/presskit/Samples/iOS/Tasks Page.png diff --git a/website/static/presskit/presskit.zip b/website/client/public/static/presskit/presskit.zip similarity index 100% rename from website/static/presskit/presskit.zip rename to website/client/public/static/presskit/presskit.zip diff --git a/website/client/scripts/npm-postinstall.js b/website/client/scripts/npm-postinstall.js new file mode 100644 index 0000000000..da02c161c3 --- /dev/null +++ b/website/client/scripts/npm-postinstall.js @@ -0,0 +1,9 @@ +/* eslint-disable import/no-commonjs */ + +const { execSync } = require('child_process'); + +if (process.env.NODE_ENV === 'production') { + execSync('npm run build', { + stdio: 'inherit', + }); +} diff --git a/website/client/app.vue b/website/client/src/app.vue similarity index 61% rename from website/client/app.vue rename to website/client/src/app.vue index 3ca879f043..3b2cfc8817 100644 --- a/website/client/app.vue +++ b/website/client/src/app.vue @@ -1,56 +1,102 @@ -