Merge branch 'develop' into unlock-fixes

This commit is contained in:
Matteo Pagliazzi 2020-05-06 11:49:28 +02:00
commit 613895e294
256 changed files with 22853 additions and 22265 deletions

1
.gitignore vendored
View file

@ -4,6 +4,7 @@ website/transpiled-babel/
website/common/transpiled-babel/
node_modules
content_cache
i18n_cache
apidoc_build
*.swp
.idea*

View file

@ -1,6 +1,6 @@
* Code is GPL v3 licensed:
This Source Code is subject to the terms of the GNU General Public License, v. 3.0.
If a copy of the GPL was not distributed with this file, You can obtain one at http://www.gnu.org/licenses/gpl-3.0.txt
If a copy of the GPL was not distributed with this file, you can obtain one at http://www.gnu.org/licenses/gpl-3.0.txt
* Assets and content designed for Mozilla BrowserQuest are licensed under CC-BY-SA 3.0:
http://creativecommons.org/licenses/by-sa/3.0/

View file

@ -79,5 +79,6 @@
"APPLE_TEAM_ID": "",
"APPLE_AUTH_CLIENT_ID": "",
"APPLE_AUTH_KEY_ID": "",
"BLOCKED_IPS": ""
"BLOCKED_IPS": "",
"LOG_AMPLITUDE_EVENTS": "false"
}

View file

@ -11,10 +11,16 @@ gulp.task('build:babel:common', () => gulp.src('website/common/script/**/*.js')
gulp.task('build:babel', gulp.parallel('build:babel:server', 'build:babel:common', done => done()));
gulp.task('build:cache', gulp.parallel(
'cache:content',
'cache:i18n',
done => done(),
));
gulp.task('build:prod', gulp.series(
'build:babel',
'apidoc',
'content:cache',
'build:cache',
done => done(),
));

View file

@ -2,7 +2,7 @@ import gulp from 'gulp';
import fs from 'fs';
// TODO parallelize, use gulp file helpers
gulp.task('content:cache', done => {
gulp.task('cache:content', done => {
// Requiring at runtime because these files access `common`
// code which in production works only if transpiled so after
// gulp build:babel:common has run
@ -32,3 +32,32 @@ gulp.task('content:cache', done => {
done(err);
}
});
gulp.task('cache:i18n', done => {
// Requiring at runtime because these files access `common`
// code which in production works only if transpiled so after
// gulp build:babel:common has run
const { BROWSER_SCRIPT_CACHE_PATH, geti18nBrowserScript } = require('../website/server/libs/i18n'); // eslint-disable-line global-require
const { langCodes } = require('../website/server/libs/i18n'); // eslint-disable-line global-require
try {
// create the cache folder (if it doesn't exist)
try {
fs.mkdirSync(BROWSER_SCRIPT_CACHE_PATH);
} catch (err) {
if (err.code !== 'EEXIST') throw err;
}
// create and save the i18n browser script for each language
langCodes.forEach(languageCode => {
fs.writeFileSync(
`${BROWSER_SCRIPT_CACHE_PATH}${languageCode}.js`,
geti18nBrowserScript(languageCode),
'utf8',
);
});
done();
} catch (err) {
done(err);
}
});

View file

@ -161,4 +161,4 @@ gulp.task('sprites:checkCompiledDimensions', gulp.series('sprites:main', 'sprite
done();
}));
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:main', 'sprites:largeSprites', 'sprites:checkCompiledDimensions', done => done()));
gulp.task('sprites:compile', gulp.series('sprites:clean', 'sprites:checkCompiledDimensions', done => done()));

View file

@ -13,11 +13,11 @@ const gulp = require('gulp');
if (process.env.NODE_ENV === 'production') { // eslint-disable-line no-process-env
require('./gulp/gulp-apidoc'); // eslint-disable-line global-require
require('./gulp/gulp-content'); // eslint-disable-line global-require
require('./gulp/gulp-cache'); // eslint-disable-line global-require
require('./gulp/gulp-build'); // eslint-disable-line global-require
} else {
require('./gulp/gulp-apidoc'); // eslint-disable-line global-require
require('./gulp/gulp-content'); // eslint-disable-line global-require
require('./gulp/gulp-cache'); // eslint-disable-line global-require
require('./gulp/gulp-build'); // eslint-disable-line global-require
require('./gulp/gulp-console'); // eslint-disable-line global-require
require('./gulp/gulp-sprites'); // eslint-disable-line global-require

400
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.140.9",
"version": "4.141.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -13,28 +13,28 @@
}
},
"@babel/compat-data": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz",
"integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.6.tgz",
"integrity": "sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==",
"requires": {
"browserslist": "^4.9.1",
"browserslist": "^4.11.1",
"invariant": "^2.2.4",
"semver": "^5.5.0"
}
},
"@babel/core": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
"integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz",
"integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==",
"requires": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.9.0",
"@babel/generator": "^7.9.6",
"@babel/helper-module-transforms": "^7.9.0",
"@babel/helpers": "^7.9.0",
"@babel/parser": "^7.9.0",
"@babel/helpers": "^7.9.6",
"@babel/parser": "^7.9.6",
"@babel/template": "^7.8.6",
"@babel/traverse": "^7.9.0",
"@babel/types": "^7.9.0",
"@babel/traverse": "^7.9.6",
"@babel/types": "^7.9.6",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
@ -54,28 +54,24 @@
}
},
"@babel/generator": {
"version": "7.9.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz",
"integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
"integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
"requires": {
"@babel/types": "^7.9.0",
"@babel/types": "^7.9.6",
"jsesc": "^2.5.1",
"lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-module-transforms": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
"integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
"@babel/helper-function-name": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
"integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
"requires": {
"@babel/helper-module-imports": "^7.8.3",
"@babel/helper-replace-supers": "^7.8.6",
"@babel/helper-simple-access": "^7.8.3",
"@babel/helper-split-export-declaration": "^7.8.3",
"@babel/template": "^7.8.6",
"@babel/types": "^7.9.0",
"lodash": "^4.17.13"
"@babel/helper-get-function-arity": "^7.8.3",
"@babel/template": "^7.8.3",
"@babel/types": "^7.9.5"
}
},
"@babel/highlight": {
@ -89,9 +85,9 @@
}
},
"@babel/parser": {
"version": "7.9.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz",
"integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A=="
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
"integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q=="
},
"@babel/template": {
"version": "7.8.6",
@ -104,29 +100,36 @@
}
},
"@babel/traverse": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
"integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz",
"integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==",
"requires": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.9.0",
"@babel/helper-function-name": "^7.8.3",
"@babel/generator": "^7.9.6",
"@babel/helper-function-name": "^7.9.5",
"@babel/helper-split-export-declaration": "^7.8.3",
"@babel/parser": "^7.9.0",
"@babel/types": "^7.9.0",
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
}
},
"@babel/types": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
"integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.0",
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
}
}
},
"chalk": {
@ -150,11 +153,11 @@
}
},
"@babel/generator": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
"integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
"integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
"requires": {
"@babel/types": "^7.9.5",
"@babel/types": "^7.9.6",
"jsesc": "^2.5.1",
"lodash": "^4.17.13",
"source-map": "^0.5.0"
@ -166,9 +169,9 @@
"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
},
"@babel/types": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
@ -195,12 +198,12 @@
}
},
"@babel/helper-compilation-targets": {
"version": "7.8.7",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz",
"integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz",
"integrity": "sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==",
"requires": {
"@babel/compat-data": "^7.8.6",
"browserslist": "^4.9.1",
"@babel/compat-data": "^7.9.6",
"browserslist": "^4.11.1",
"invariant": "^2.2.4",
"levenary": "^1.1.1",
"semver": "^5.5.0"
@ -503,13 +506,13 @@
}
},
"@babel/helpers": {
"version": "7.9.2",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
"integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz",
"integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==",
"requires": {
"@babel/template": "^7.8.3",
"@babel/traverse": "^7.9.0",
"@babel/types": "^7.9.0"
"@babel/traverse": "^7.9.6",
"@babel/types": "^7.9.6"
},
"dependencies": {
"@babel/code-frame": {
@ -521,16 +524,26 @@
}
},
"@babel/generator": {
"version": "7.9.3",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz",
"integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
"integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
"requires": {
"@babel/types": "^7.9.0",
"@babel/types": "^7.9.6",
"jsesc": "^2.5.1",
"lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-function-name": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
"integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
"requires": {
"@babel/helper-get-function-arity": "^7.8.3",
"@babel/template": "^7.8.3",
"@babel/types": "^7.9.5"
}
},
"@babel/highlight": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
@ -542,34 +555,41 @@
}
},
"@babel/parser": {
"version": "7.9.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz",
"integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A=="
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
"integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q=="
},
"@babel/traverse": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
"integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz",
"integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==",
"requires": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.9.0",
"@babel/helper-function-name": "^7.8.3",
"@babel/generator": "^7.9.6",
"@babel/helper-function-name": "^7.9.5",
"@babel/helper-split-export-declaration": "^7.8.3",
"@babel/parser": "^7.9.0",
"@babel/types": "^7.9.0",
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
}
},
"@babel/types": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
"integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.0",
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
}
}
},
"chalk": {
@ -658,9 +678,9 @@
}
},
"@babel/plugin-proposal-object-rest-spread": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz",
"integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz",
"integrity": "sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==",
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/plugin-syntax-object-rest-spread": "^7.8.0",
@ -832,9 +852,9 @@
"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
},
"@babel/types": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
@ -919,35 +939,35 @@
}
},
"@babel/plugin-transform-modules-amd": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
"integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz",
"integrity": "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==",
"requires": {
"@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"babel-plugin-dynamic-import-node": "^2.3.0"
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-commonjs": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz",
"integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz",
"integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==",
"requires": {
"@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/helper-simple-access": "^7.8.3",
"babel-plugin-dynamic-import-node": "^2.3.0"
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-systemjs": {
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
"integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz",
"integrity": "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==",
"requires": {
"@babel/helper-hoist-variables": "^7.8.3",
"@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"babel-plugin-dynamic-import-node": "^2.3.0"
"babel-plugin-dynamic-import-node": "^2.3.3"
}
},
"@babel/plugin-transform-modules-umd": {
@ -1069,12 +1089,12 @@
}
},
"@babel/preset-env": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz",
"integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz",
"integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==",
"requires": {
"@babel/compat-data": "^7.9.0",
"@babel/helper-compilation-targets": "^7.8.7",
"@babel/compat-data": "^7.9.6",
"@babel/helper-compilation-targets": "^7.9.6",
"@babel/helper-module-imports": "^7.8.3",
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/plugin-proposal-async-generator-functions": "^7.8.3",
@ -1082,7 +1102,7 @@
"@babel/plugin-proposal-json-strings": "^7.8.3",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
"@babel/plugin-proposal-numeric-separator": "^7.8.3",
"@babel/plugin-proposal-object-rest-spread": "^7.9.5",
"@babel/plugin-proposal-object-rest-spread": "^7.9.6",
"@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
"@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
@ -1109,9 +1129,9 @@
"@babel/plugin-transform-function-name": "^7.8.3",
"@babel/plugin-transform-literals": "^7.8.3",
"@babel/plugin-transform-member-expression-literals": "^7.8.3",
"@babel/plugin-transform-modules-amd": "^7.9.0",
"@babel/plugin-transform-modules-commonjs": "^7.9.0",
"@babel/plugin-transform-modules-systemjs": "^7.9.0",
"@babel/plugin-transform-modules-amd": "^7.9.6",
"@babel/plugin-transform-modules-commonjs": "^7.9.6",
"@babel/plugin-transform-modules-systemjs": "^7.9.6",
"@babel/plugin-transform-modules-umd": "^7.9.0",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
"@babel/plugin-transform-new-target": "^7.8.3",
@ -1127,8 +1147,8 @@
"@babel/plugin-transform-typeof-symbol": "^7.8.4",
"@babel/plugin-transform-unicode-regex": "^7.8.3",
"@babel/preset-modules": "^0.1.3",
"@babel/types": "^7.9.5",
"browserslist": "^4.9.1",
"@babel/types": "^7.9.6",
"browserslist": "^4.11.1",
"core-js-compat": "^3.6.2",
"invariant": "^2.2.2",
"levenary": "^1.1.1",
@ -1141,9 +1161,9 @@
"integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g=="
},
"@babel/types": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
@ -1177,9 +1197,9 @@
}
},
"@babel/runtime": {
"version": "7.9.2",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
"integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz",
"integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
@ -1227,16 +1247,16 @@
}
},
"@babel/traverse": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
"integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz",
"integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==",
"requires": {
"@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.9.5",
"@babel/generator": "^7.9.6",
"@babel/helper-function-name": "^7.9.5",
"@babel/helper-split-export-declaration": "^7.8.3",
"@babel/parser": "^7.9.0",
"@babel/types": "^7.9.5",
"@babel/parser": "^7.9.6",
"@babel/types": "^7.9.6",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
@ -1271,14 +1291,14 @@
}
},
"@babel/parser": {
"version": "7.9.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
"integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
"integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q=="
},
"@babel/types": {
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
"integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
"version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"requires": {
"@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13",
@ -2170,9 +2190,9 @@
}
},
"apple-auth": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/apple-auth/-/apple-auth-1.0.5.tgz",
"integrity": "sha512-EbMm0rqWyUANxHJfiNGrvLkS3acdBfAj0TJ1hnA/jxq7+l9GTd2br5ajgjBjcHT5bbN6CsvuZFAdYofzn1J/6A==",
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/apple-auth/-/apple-auth-1.0.6.tgz",
"integrity": "sha512-dICsYIHBTX+7/1xdJZ4y4U08zOxEnL67GQ77l/HSKqEx9uC1wsY5dNjgbZf2F/1QnzAxDbAAHo0DgUCrA1k7zQ==",
"requires": {
"axios": "^0.19.0",
"express": "^4.17.1",
@ -2543,9 +2563,9 @@
}
},
"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==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
"integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
"requires": {
"object.assign": "^4.1.0"
}
@ -3207,20 +3227,20 @@
"dev": true
},
"browserslist": {
"version": "4.11.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
"integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
"integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
"requires": {
"caniuse-lite": "^1.0.30001038",
"electron-to-chromium": "^1.3.390",
"caniuse-lite": "^1.0.30001043",
"electron-to-chromium": "^1.3.413",
"node-releases": "^1.1.53",
"pkg-up": "^2.0.0"
}
},
"bson": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
},
"buffer-alloc": {
"version": "1.2.0",
@ -3370,9 +3390,9 @@
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
},
"caniuse-lite": {
"version": "1.0.30001041",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz",
"integrity": "sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA=="
"version": "1.0.30001050",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001050.tgz",
"integrity": "sha512-OvGZqalCwmapci76ISq5q4kuAskb1ebqF3FEQBv1LE1kWht0pojlDDqzFlmk5jgYkuZN7MNZ1n+ULwe/7MaDNQ=="
},
"capture-stack-trace": {
"version": "1.0.1",
@ -4139,9 +4159,9 @@
}
},
"csv-stringify": {
"version": "5.3.6",
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.3.6.tgz",
"integrity": "sha512-kPcRbMvo5NLLD71TAqW5K+g9kbM2HpIZJLAzm73Du8U+5TXmDp9YtXKCBLyxEh0q3Jbg8QhNFBz3b5VJzjZ/jw=="
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.5.0.tgz",
"integrity": "sha512-G05575DSO/9vFzQxZN+Srh30cNyHk0SM0ePyiTChMD5WVt7GMTVPBQf4rtgMF6mqhNCJUPw4pN8LDe8MF9EYOA=="
},
"currently-unhandled": {
"version": "0.4.1",
@ -4788,9 +4808,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
"version": "1.3.403",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz",
"integrity": "sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw=="
"version": "1.3.427",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz",
"integrity": "sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A=="
},
"emitter-listener": {
"version": "1.1.2",
@ -7359,14 +7379,33 @@
}
},
"habitica-markdown": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.2.tgz",
"integrity": "sha512-IyiS583DfqE+KvW4NQAB4K2HjJZ1oF50L0EDz7KaixyK7C41s47wsbN81QtNMB8LnRqbMHFDesD2xEzdicjFXw==",
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.4.0.tgz",
"integrity": "sha512-hklG3eBILNbx/VxGeRxuk+/RiWWllcd5QLNv7Kvm2wGBRTeK9c3my2eusGuHXkwStEFGxjJD5e0iMO47cGPxYw==",
"requires": {
"habitica-markdown-emoji": "1.2.4",
"markdown-it": "8.4.2",
"markdown-it-link-attributes": "1.0.0",
"markdown-it": "10.0.0",
"markdown-it-link-attributes": "3.0.0",
"markdown-it-linkify-images": "^1.1.1"
},
"dependencies": {
"entities": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
"integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw=="
},
"markdown-it": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
"integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
"requires": {
"argparse": "^1.0.7",
"entities": "~2.0.0",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
}
}
},
"habitica-markdown-emoji": {
@ -8724,9 +8763,9 @@
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"json5": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
"integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"requires": {
"minimist": "^1.2.5"
},
@ -9245,9 +9284,9 @@
"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="
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.0.tgz",
"integrity": "sha512-B34ySxVeo6MuEGSPCWyIYryuXINOvngNZL87Mp7YYfKIf6DcD837+lXA8mo6EBbauKsnGz22ZH0zsbOiQRWTNg=="
},
"markdown-it-linkify-images": {
"version": "1.1.1",
@ -9639,9 +9678,9 @@
"integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is="
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
"version": "2.25.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.25.1.tgz",
"integrity": "sha512-nRKMf9wDS4Fkyd0C9LXh2FFXinD+iwbJ5p/lh3CHitW9kZbRbJ8hCruiadiIXZVbeAqKZzqcTvHnK3mRhFjb6w=="
},
"moment-recur": {
"version": "1.0.7",
@ -9655,7 +9694,6 @@
"version": "3.5.6",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.6.tgz",
"integrity": "sha512-sh3q3GLDLT4QmoDLamxtAECwC3RGjq+oNuK1ENV8+tnipIavss6sMYt77hpygqlMOCt0Sla5cl7H4SKCVBCGEg==",
"dev": true,
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.4",
@ -9669,7 +9707,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"dev": true,
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
@ -9678,19 +9715,18 @@
"bson": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==",
"dev": true
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
}
}
},
"mongoose": {
"version": "5.9.9",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.9.tgz",
"integrity": "sha512-pLkIkM7XQwfbQ+xK1l57Zv0DYPH190/I6Cv5+PbJGfAU0HvX0atMlp+vly8zcjNTEvTkVM80qA5eBYBvZyLYXw==",
"version": "5.9.10",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.10.tgz",
"integrity": "sha512-w1HNukfJzzDLfcI1f79h2Wj4ogVbf+X8hRkyFgqlcjK7OnDlAgahjDMIsT+mCS9jKojrMhjSsZIs9FiRPkLqMg==",
"requires": {
"bson": "~1.1.1",
"bson": "^1.1.4",
"kareem": "2.3.1",
"mongodb": "3.5.5",
"mongodb": "3.5.6",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.7.0",
"mquery": "3.2.2",
@ -9699,30 +9735,6 @@
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"dependencies": {
"bl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"mongodb": {
"version": "3.5.5",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.5.tgz",
"integrity": "sha512-GCjDxR3UOltDq00Zcpzql6dQo1sVry60OXJY3TDmFc2SWFY6c8Gn1Ardidc5jDirvJrx2GC3knGOImKphbSL3A==",
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.1",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
}
}
},
"mongoose-legacy-pluralize": {

View file

@ -1,11 +1,11 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.140.9",
"version": "4.141.0",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.9.5",
"@babel/core": "^7.9.6",
"@babel/preset-env": "^7.9.6",
"@babel/register": "^7.9.0",
"@google-cloud/trace-agent": "^4.2.5",
"@slack/client": "^4.12.0",
@ -14,13 +14,13 @@
"amplitude": "^3.5.0",
"apidoc": "^0.17.5",
"apn": "^2.2.0",
"apple-auth": "^1.0.5",
"apple-auth": "^1.0.6",
"bcrypt": "^3.0.8",
"body-parser": "^1.18.3",
"compression": "^1.7.4",
"cookie-session": "^1.4.0",
"coupon-code": "^0.4.5",
"csv-stringify": "^5.3.6",
"csv-stringify": "^5.5.0",
"cwait": "^1.1.1",
"domain-middleware": "~0.1.0",
"eslint": "^6.8.0",
@ -36,7 +36,7 @@
"gulp-imagemin": "^6.2.0",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.9.0",
"habitica-markdown": "^1.3.2",
"habitica-markdown": "^1.4.0",
"helmet": "^3.22.0",
"image-size": "^0.8.3",
"in-app-purchase": "^1.11.3",
@ -46,9 +46,9 @@
"lodash": "^4.17.15",
"merge-stream": "^2.0.0",
"method-override": "^3.0.0",
"moment": "^2.24.0",
"moment": "^2.25.1",
"moment-recur": "^1.0.7",
"mongoose": "^5.9.9",
"mongoose": "^5.9.10",
"morgan": "^1.10.0",
"nconf": "^0.10.0",
"node-gcm": "^1.0.2",

View file

@ -879,6 +879,11 @@ describe('cron', () => {
tasksByType.todos.push(task);
});
afterEach(() => {
tasksByType.todos = [];
user.tasksOrder.todos = [];
});
it('should make uncompleted todos redder', () => {
const valueBefore = tasksByType.todos[0].value;
cron({
@ -887,6 +892,15 @@ describe('cron', () => {
expect(tasksByType.todos[0].value).to.be.lessThan(valueBefore);
});
it('should not make completed todos redder', () => {
tasksByType.todos[0].completed = true;
const valueBefore = tasksByType.todos[0].value;
cron({
user, tasksByType, daysMissed, analytics,
});
expect(tasksByType.todos[0].value).to.equal(valueBefore);
});
it('should add history of completed todos to user history', () => {
tasksByType.todos[0].completed = true;
@ -898,17 +912,13 @@ describe('cron', () => {
});
it('should remove completed todos from users taskOrder list', () => {
tasksByType.todos = [];
user.tasksOrder.todos = [];
const todo = {
text: 'test todo',
type: 'todo',
value: 0,
};
let task = new Tasks.todo(Tasks.Task.sanitize(todo)); // eslint-disable-line new-cap
tasksByType.todos.push(task);
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);
tasksByType.todos[0].completed = true;
@ -930,8 +940,6 @@ describe('cron', () => {
});
it('should preserve todos order in task list', () => {
tasksByType.todos = [];
user.tasksOrder.todos = [];
const todo = {
text: 'test todo',
type: 'todo',

View file

@ -119,4 +119,18 @@ describe('highlightMentions', () => {
expect(err).to.be.undefined;
});
it('github issue 12138, method crashes when regex chars are used in code block', async () => {
const text = '`[test]`';
let err;
try {
await highlightMentions(text);
} catch (e) {
err = e;
}
expect(err).to.be.undefined;
});
});

View file

@ -1,7 +1,9 @@
import moment from 'moment';
import { calculateSubscriptionTerminationDate } from '../../../../../../website/server/libs/payments/util';
import calculateSubscriptionTerminationDate from '../../../../../../website/server/libs/payments/calculateSubscriptionTerminationDate';
import api from '../../../../../../website/server/libs/payments/payments';
const groupPlanId = api.constants.GROUP_PLAN_CUSTOMER_ID;
describe('#calculateSubscriptionTerminationDate', () => {
let plan;
let nextBill;
@ -13,52 +15,67 @@ describe('#calculateSubscriptionTerminationDate', () => {
};
nextBill = moment();
});
it('should extend date to the exact amount of days left before the next bill will occur', () => {
nextBill = moment()
.add(5, 'days');
const expectedTerminationDate = moment()
.add(5, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('if nextBill is null, add 30 days to termination date', () => {
nextBill = null;
const expectedTerminationDate = moment()
.add(30, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('if nextBill is null and it\'s a group plan, add 2 days instead of 30', () => {
nextBill = null;
plan.customerId = api.constants.GROUP_PLAN_CUSTOMER_ID;
const expectedTerminationDate = moment()
.add(2, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('should add 30.5 days for each extraMonth', () => {
plan.extraMonths = 4;
const expectedTerminationDate = moment()
.add(30.5 * 4, 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('should round up if total days gained by extraMonth is a decimal number', () => {
plan.extraMonths = 5;
const expectedTerminationDate = moment()
.add(Math.ceil(30.5 * 5), 'days');
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('behaves like extraMonths is 0 if it\'s set to a negative number', () => {
plan.extraMonths = -5;
const expectedTerminationDate = moment();
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, api.constants);
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(expectedTerminationDate.diff(terminationDate, 'days')).to.eql(0);
});
it('returns current terminated date if it exists and is later than newly calculated date', () => {
const expectedTerminationDate = moment().add({ months: 5 }).toDate();
plan.terminationDate = expectedTerminationDate;
const terminationDate = calculateSubscriptionTerminationDate(nextBill, plan, groupPlanId);
expect(terminationDate).to.equal(expectedTerminationDate);
});
});

View file

@ -0,0 +1,12 @@
import { getMatchesByWordArray } from '../../../../website/server/libs/stringUtils';
import bannedWords from '../../../../website/server/libs/bannedWords';
describe('stringUtils', () => {
describe('getMatchesByWordArray', () => {
it('check all banned words are matched', async () => {
const message = bannedWords.join(',').replace(/\\/g, '');
const matches = getMatchesByWordArray(message, bannedWords);
expect(matches.length).to.equal(bannedWords.length);
});
});
});

View file

@ -14,8 +14,6 @@ import {
TAVERN_ID,
} from '../../../../../website/server/models/group';
import { CHAT_FLAG_FROM_SHADOW_MUTE, MAX_MESSAGE_LENGTH } from '../../../../../website/common/script/constants';
import { getMatchesByWordArray } from '../../../../../website/server/libs/stringUtils';
import bannedWords from '../../../../../website/server/libs/bannedWords';
import guildsAllowingBannedWords from '../../../../../website/server/libs/guildsAllowingBannedWords';
import * as email from '../../../../../website/server/libs/email';
@ -292,12 +290,6 @@ describe('POST /chat', () => {
.that.includes(testBannedWords.join(', '));
});
it('check all banned words are matched', async () => {
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 () => {
const wordAsSuffix = `prefix${testBannedWordMessage}`;
const message = await user.post('/groups/habitrpg/chat', { message: wordAsSuffix });

View file

@ -1,7 +1,5 @@
import { v4 as generateUUID } from 'uuid';
import {
each,
} from 'lodash';
import each from 'lodash/each';
import moment from 'moment';
import {
generateChallenge,
@ -13,7 +11,7 @@ import {
} from '../../../../helpers/api-integration/v3';
import { model as User } from '../../../../../website/server/models/user';
import payments from '../../../../../website/server/libs/payments/payments';
import { calculateSubscriptionTerminationDate } from '../../../../../website/server/libs/payments/util';
import calculateSubscriptionTerminationDate from '../../../../../website/server/libs/payments/calculateSubscriptionTerminationDate';
describe('POST /groups/:groupId/leave', () => {
const typesOfGroups = {
@ -359,6 +357,7 @@ describe('POST /groups/:groupId/leave', () => {
'purchased.plan.extraMonths': extraMonths,
});
});
it('calculates dateTerminated and sets extraMonths to zero after user leaves the group', async () => {
const userBeforeLeave = await User.findById(member._id).exec();
@ -373,7 +372,7 @@ describe('POST /groups/:groupId/leave', () => {
const expectedTerminationDate = calculateSubscriptionTerminationDate(null, {
customerId: payments.constants.GROUP_PLAN_CUSTOMER_ID,
extraMonths,
}, payments.constants);
}, payments.constants.GROUP_PLAN_CUSTOMER_ID);
expect(extraMonthsBefore).to.gte(12);
expect(extraMonthsAfter).to.equal(0);

View file

@ -10,6 +10,9 @@ describe('GET /hall/heroes', () => {
const nonHero = await generateUser();
const hero1 = await generateUser({
contributor: { level: 1 },
secret: {
text: 'Super-Hero',
},
});
const hero2 = await generateUser({
contributor: { level: 3 },
@ -21,6 +24,8 @@ describe('GET /hall/heroes', () => {
expect(heroes[1]._id).to.equal(hero1._id);
expect(heroes[0]).to.have.all.keys(['_id', 'contributor', 'backer', 'profile']);
// should not contain the secret
expect(heroes[1]).to.have.all.keys(['_id', 'contributor', 'backer', 'profile']);
expect(heroes[0].profile).to.have.all.keys(['name']);
@ -28,5 +33,6 @@ describe('GET /hall/heroes', () => {
expect(heroes[0].profile.name).to.equal(hero2.profile.name);
expect(heroes[1].profile.name).to.equal(hero1.profile.name);
expect(heroes[1].secret).to.equal(undefined);
});
});

View file

@ -43,15 +43,19 @@ describe('GET /heroes/:heroId', () => {
it('returns only necessary hero data given user id', async () => {
const hero = await generateUser({
contributor: { tier: 23 },
secret: {
text: 'Super Hero',
},
});
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',
'contributor', 'auth', 'items',
'contributor', 'auth', 'items', 'secret',
]);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);
expect(heroRes.secret.text).to.be.eq('Super Hero');
});
it('returns only necessary hero data given username', async () => {
@ -62,7 +66,7 @@ describe('GET /heroes/:heroId', () => {
expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items',
'contributor', 'auth', 'items', 'secret',
]);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);

View file

@ -7,6 +7,12 @@ import {
describe('PUT /heroes/:heroId', () => {
let user;
const heroFields = [
'_id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items', 'flags',
'secret',
];
before(async () => {
user = await generateUser({
contributor: { admin: true },
@ -51,10 +57,8 @@ describe('PUT /heroes/:heroId', () => {
});
// test response
expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items', 'flags',
]);
// works as: object has all and only these keys
expect(heroRes).to.have.all.keys(heroFields);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);
@ -130,10 +134,8 @@ describe('PUT /heroes/:heroId', () => {
});
// test response
expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items', 'flags',
]);
// works as: object has all and only these keys
expect(heroRes).to.have.all.keys(heroFields);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);
@ -157,10 +159,8 @@ describe('PUT /heroes/:heroId', () => {
});
// test response
expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items', 'flags',
]);
// works as: object has all and only these keys
expect(heroRes).to.have.all.keys(heroFields);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);
@ -173,6 +173,40 @@ describe('PUT /heroes/:heroId', () => {
expect(hero.contributor.text).to.equal('Astronaut');
});
it('updates contributor secret', async () => {
const secretText = 'my super hero';
const hero = await generateUser({
contributor: { level: 5 },
secret: {
text: 'supr hro typo',
},
});
const heroRes = await user.put(`/hall/heroes/${hero._id}`, {
contributor: { text: 'Astronaut' },
secret: {
text: secretText,
},
});
// test response
// works as: object has all and only these keys
expect(heroRes).to.have.all.keys(heroFields);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);
// test response values
expect(heroRes.contributor.level).to.equal(5); // doesn't modify previous values
expect(heroRes.contributor.text).to.equal('Astronaut');
expect(heroRes.secret.text).to.equal(secretText);
// test hero values
await hero.sync();
expect(hero.contributor.level).to.equal(5); // doesn't modify previous values
expect(hero.contributor.text).to.equal('Astronaut');
expect(hero.secret.text).to.equal(secretText);
});
it('updates items', async () => {
const hero = await generateUser();
const heroRes = await user.put(`/hall/heroes/${hero._id}`, {
@ -181,10 +215,8 @@ describe('PUT /heroes/:heroId', () => {
});
// test response
expect(heroRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'balance', 'profile', 'purchased',
'contributor', 'auth', 'items', 'flags',
]);
// works as: object has all and only these keys
expect(heroRes).to.have.all.keys(heroFields);
expect(heroRes.auth.local).not.to.have.keys(['salt', 'hashed_password']);
expect(heroRes.profile).to.have.all.keys(['name']);

View file

@ -29,6 +29,9 @@ describe('GET /members/:memberId', () => {
costume: false,
background: 'volcano',
},
secret: {
text: 'Clark Kent',
},
});
const memberRes = await user.get(`/members/${member._id}`);
expect(memberRes).to.have.all.keys([ // works as: object has all and only these keys
@ -46,6 +49,29 @@ describe('GET /members/:memberId', () => {
expect(memberRes.stats.toNextLevel).to.equal(common.tnl(memberRes.stats.lvl));
expect(memberRes.inbox.optOut).to.exist;
expect(memberRes.inbox.messages).to.not.exist;
expect(memberRes.secret).to.not.exist;
});
it('does not return secret for the own account', async () => {
// 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',
},
secret: {
text: 'Clark Kent',
},
});
const memberRes = await member.get(`/members/${member._id}`);
expect(memberRes).to.have.keys([ // works as: object has all and only these keys
'_id', 'id', 'preferences', 'profile', 'stats', 'achievements', 'party',
'backer', 'contributor', 'auth', 'items', 'inbox', 'loginIncentives', 'flags',
]);
expect(memberRes.secret).to.not.exist;
});
it('handles non-existing members', async () => {

View file

@ -1,3 +1,4 @@
import range from 'lodash/range';
import {
generateUser,
} from '../../../../helpers/api-integration/v3';
@ -26,6 +27,7 @@ describe('GET /user', () => {
expect(returnedUser.auth.local.passwordHashMethod).to.not.exist;
expect(returnedUser.auth.local.salt).to.not.exist;
expect(returnedUser.apiToken).to.not.exist;
expect(returnedUser.secret).to.not.exist;
});
it('returns only user properties requested', async () => {
@ -38,4 +40,30 @@ describe('GET /user', () => {
expect(returnedUser.notifications).to.exist;
expect(returnedUser.stats).to.not.exist;
});
it('does not return requested private properties', async () => {
const returnedUser = await user.get('/user?userFields=apiToken,secret.text');
expect(returnedUser.apiToken).to.not.exist;
expect(returnedUser.secret).to.not.exist;
});
it('returns the full inbox', async () => {
const otherUser = await generateUser();
const amountOfMessages = 12;
const allMessagesPromise = range(amountOfMessages)
.map(i => otherUser.post('/members/send-private-message', {
toUserId: user.id,
message: `Message Num: ${i}`,
}));
await Promise.all(allMessagesPromise);
const returnedUser = await user.get('/user');
expect(returnedUser._id).to.equal(user._id);
expect(returnedUser.inbox).to.exist;
expect(Object.keys(returnedUser.inbox.messages)).to.have.a.lengthOf(amountOfMessages);
});
});

View file

@ -12,7 +12,11 @@ describe('GET /user/anonymized', () => {
const endpoint = '/user/anonymized';
before(async () => {
user = await generateUser();
user = await generateUser({
secret: {
text: 'Clark Kent',
},
});
await user.update({
newMessages: ['some', 'new', 'messages'],
'profile.name': 'profile',
@ -100,5 +104,7 @@ describe('GET /user/anonymized', () => {
});
}
});
expect(returnedUser.secret).to.not.exist;
});
});

View file

@ -117,4 +117,24 @@ describe('POST /user/reset', () => {
expect(userChallengeTask).to.exist;
expect(syncedGroupTask).to.exist;
});
it('does not delete secret', async () => {
const admin = await generateUser({
contributor: { admin: true },
});
const hero = await generateUser({
contributor: { level: 1 },
secret: {
text: 'Super-Hero',
},
});
await hero.post('/user/reset');
const heroRes = await admin.get(`/hall/heroes/${hero.auth.local.username}`);
expect(heroRes.secret).to.exist;
expect(heroRes.secret.text).to.be.eq('Super-Hero');
});
});

View file

@ -107,6 +107,7 @@ describe('PUT /user', () => {
'customization gem purchases': { 'purchased.background.tavern': true, 'purchased.skin.bear': true },
notifications: [{ type: 123 }],
webhooks: { webhooks: [{ url: 'https://foobar.com' }] },
secret: { secret: { text: 'Some new text' } },
};
each(protectedOperations, (data, testName) => {
@ -129,6 +130,7 @@ describe('PUT /user', () => {
webhooks: { 'preferences.webhooks': [1, 2, 3] },
sleep: { 'preferences.sleep': true },
'disable classes': { 'preferences.disableClasses': true },
secret: { secret: { text: 'Some new text' } },
};
each(protectedOperations, (data, testName) => {

View file

@ -63,7 +63,7 @@ describe('GET /inbox/conversations', () => {
expect(messages[4].text).to.equal('first');
});
it('returns four messages when using page-query ', async () => {
it('returns five messages when using page-query ', async () => {
const promises = [];
for (let i = 0; i < 10; i += 1) {

View file

@ -26,6 +26,7 @@ describe('GET /user', () => {
expect(returnedUser.auth.local.passwordHashMethod).to.not.exist;
expect(returnedUser.auth.local.salt).to.not.exist;
expect(returnedUser.apiToken).to.not.exist;
expect(returnedUser.secret).to.not.exist;
});
it('returns only user properties requested', async () => {
@ -39,6 +40,13 @@ describe('GET /user', () => {
expect(returnedUser.stats).to.not.exist;
});
it('does not return requested private properties', async () => {
const returnedUser = await user.get('/user?userFields=apiToken,secret.text');
expect(returnedUser.apiToken).to.not.exist;
expect(returnedUser.secret).to.not.exist;
});
it('does not return new inbox messages', async () => {
const otherUser = await generateUser();

View file

@ -117,4 +117,25 @@ describe('POST /user/reset', () => {
expect(userChallengeTask).to.exist;
expect(syncedGroupTask).to.exist;
});
it('does not delete secret', async () => {
const admin = await generateUser({
contributor: { admin: true },
});
const hero = await generateUser({
contributor: { level: 1 },
secret: {
text: 'Super-Hero',
},
});
await hero.post('/user/reset');
const heroRes = await admin.get(`/hall/heroes/${hero.auth.local.username}`);
expect(heroRes.secret).to.exist;
expect(heroRes.secret.text).to.be.eq('Super-Hero');
});
});

View file

@ -91,6 +91,7 @@ describe('PUT /user', () => {
'customization gem purchases': { 'purchased.background.tavern': true, 'purchased.skin.bear': true },
notifications: [{ type: 123 }],
webhooks: { webhooks: [{ url: 'https://foobar.com' }] },
secret: { secret: { text: 'Some new text' } },
};
each(protectedOperations, (data, testName) => {
@ -113,6 +114,7 @@ describe('PUT /user', () => {
webhooks: { 'preferences.webhooks': [1, 2, 3] },
sleep: { 'preferences.sleep': true },
'disable classes': { 'preferences.disableClasses': true },
secret: { secret: { text: 'Some new text' } },
};
each(protectedOperations, (data, testName) => {

View file

@ -119,7 +119,7 @@ describe('shared.ops.buyGem', () => {
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('maxBuyGems', { convCap: planGemLimits.convCap }));
done();
}
});

View file

@ -52,6 +52,22 @@ describe('shared.ops.reset', () => {
expect(user.stats.lvl).to.equal(1);
});
it('resets user\'s stat points (str, con, int, per, points)', () => {
user.stats.str = 2;
user.stats.con = 2;
user.stats.int = 2;
user.stats.per = 2;
user.stats.points = 2;
reset(user);
expect(user.stats.str).to.equal(0);
expect(user.stats.con).to.equal(0);
expect(user.stats.int).to.equal(0);
expect(user.stats.per).to.equal(0);
expect(user.stats.points).to.equal(1);
});
it('resets user\'s gold', () => {
user.stats.gp = 20;

View file

@ -7265,9 +7265,9 @@
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"bootstrap-vue": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.11.0.tgz",
"integrity": "sha512-T23+aVVSDifX1SsI5y69bYZzbm8iQHlmgiBUw9XxY1KTw/fb4xvUq4+Y01Tsaul04+zmrUah/5zvUGKLwTcH7A==",
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.13.0.tgz",
"integrity": "sha512-V/q2tgIY+tDxeBGOwqdPC4jk8CWmpwpSVY/1OVGxg4Jg1Jxcs6gQn7chhpI9KuBrO8diG/Nd6JRtnYwyE3b7Qw==",
"requires": {
"@nuxt/opencollective": "^0.3.0",
"bootstrap": ">=4.4.1 <5.0.0",
@ -11676,13 +11676,13 @@
}
},
"habitica-markdown": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.2.tgz",
"integrity": "sha512-IyiS583DfqE+KvW4NQAB4K2HjJZ1oF50L0EDz7KaixyK7C41s47wsbN81QtNMB8LnRqbMHFDesD2xEzdicjFXw==",
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.4.0.tgz",
"integrity": "sha512-hklG3eBILNbx/VxGeRxuk+/RiWWllcd5QLNv7Kvm2wGBRTeK9c3my2eusGuHXkwStEFGxjJD5e0iMO47cGPxYw==",
"requires": {
"habitica-markdown-emoji": "1.2.4",
"markdown-it": "8.4.2",
"markdown-it-link-attributes": "1.0.0",
"markdown-it": "10.0.0",
"markdown-it-link-attributes": "3.0.0",
"markdown-it-linkify-images": "^1.1.1"
}
},
@ -13560,22 +13560,15 @@
}
},
"markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
"integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"entities": "~2.0.0",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
},
"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": {
@ -13584,9 +13577,9 @@
"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="
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/markdown-it-link-attributes/-/markdown-it-link-attributes-3.0.0.tgz",
"integrity": "sha512-B34ySxVeo6MuEGSPCWyIYryuXINOvngNZL87Mp7YYfKIf6DcD837+lXA8mo6EBbauKsnGz22ZH0zsbOiQRWTNg=="
},
"markdown-it-linkify-images": {
"version": "1.1.1",
@ -13594,6 +13587,25 @@
"integrity": "sha512-1IEmAaAjIgAwY+tZI0sxDXdy9QKHutj5cN0lH2JBiSZt+2NYKrWRJj0cloQW3OFIfP2MLFA1E+6OLJhXPiLgNw==",
"requires": {
"markdown-it": "^8.4.2"
},
"dependencies": {
"entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
},
"markdown-it": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
"integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
"requires": {
"argparse": "^1.0.7",
"entities": "~1.1.1",
"linkify-it": "^2.0.0",
"mdurl": "^1.0.1",
"uc.micro": "^1.0.5"
}
}
}
},
"markdown-to-jsx": {
@ -17146,9 +17158,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sass": {
"version": "1.26.3",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz",
"integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==",
"version": "1.26.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz",
"integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==",
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
}
@ -19761,15 +19773,15 @@
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
},
"webpack": {
"version": "4.42.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz",
"integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==",
"version": "4.43.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz",
"integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==",
"requires": {
"@webassemblyjs/ast": "1.9.0",
"@webassemblyjs/helper-module-context": "1.9.0",
"@webassemblyjs/wasm-edit": "1.9.0",
"@webassemblyjs/wasm-parser": "1.9.0",
"acorn": "^6.2.1",
"acorn": "^6.4.1",
"ajv": "^6.10.2",
"ajv-keywords": "^3.4.1",
"chrome-trace-event": "^1.0.2",
@ -19786,7 +19798,7 @@
"schema-utils": "^1.0.0",
"tapable": "^1.1.3",
"terser-webpack-plugin": "^1.4.3",
"watchpack": "^1.6.0",
"watchpack": "^1.6.1",
"webpack-sources": "^1.4.1"
},
"dependencies": {
@ -19796,9 +19808,9 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mkdirp": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
"integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "^1.2.5"
}

View file

@ -29,14 +29,14 @@
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.11.0",
"bootstrap-vue": "^2.13.0",
"chai": "^4.1.2",
"core-js": "^3.6.5",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
"eslint-plugin-vue": "^6.2.2",
"habitica-markdown": "^1.3.2",
"habitica-markdown": "^1.4.0",
"hellojs": "^1.18.4",
"inspectpack": "^4.4.0",
"intro.js": "^2.9.3",
@ -44,7 +44,7 @@
"lodash": "^4.17.15",
"moment": "^2.24.0",
"nconf": "^0.10.0",
"sass": "^1.26.3",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.15.0",
"svg-inline-loader": "^0.8.2",
@ -60,6 +60,6 @@
"vue-template-compiler": "^2.6.11",
"vuedraggable": "^2.23.1",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec",
"webpack": "^4.42.1"
"webpack": "^4.43.0"
}
}

View file

@ -1,96 +1,24 @@
.promo_april_fools_2020 {
.promo_armoire_backgrounds_202005 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -445px -184px;
background-position: -313px 0px;
width: 423px;
height: 147px;
}
.promo_armoire_backgrounds_202004 {
.promo_mystery_202005 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -433px -337px;
width: 423px;
height: 147px;
}
.promo_egg_quest {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -648px;
width: 354px;
height: 147px;
}
.promo_mystery_202004 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -796px;
background-position: 0px -223px;
width: 282px;
height: 147px;
}
.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -355px -648px;
width: 354px;
height: 147px;
}
.customize-option.promo_pastel_skin_hair {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -380px -663px;
width: 60px;
height: 60px;
}
.promo_seasonal_shop_spring {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -524px;
width: 162px;
height: 138px;
}
.promo_shiny_seeds {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -424px -500px;
width: 360px;
height: 147px;
}
.promo_spring_2019 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -337px;
width: 432px;
height: 162px;
}
.promo_spring_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -445px 0px;
width: 429px;
height: 183px;
}
.promo_spring_potions_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -500px;
width: 423px;
height: 147px;
}
.promo_take_this {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -663px;
background-position: -313px -148px;
width: 96px;
height: 69px;
}
.scene_citrusella {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -196px;
width: 152px;
height: 176px;
}
.scene_hat_guild {
.scene_casting_spells {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
width: 444px;
height: 336px;
}
.scene_meditation {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px -373px;
width: 150px;
height: 150px;
}
.scene_tasks {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -875px 0px;
width: 240px;
height: 195px;
width: 312px;
height: 222px;
}

View file

@ -1060,157 +1060,157 @@
width: 141px;
height: 147px;
}
.background_habit_city_streets {
.background_habit_city_rooftops {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -1184px;
width: 141px;
height: 147px;
}
.background_halflings_house {
.background_habit_city_streets {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -1332px;
width: 141px;
height: 147px;
}
.background_hall_of_heroes {
.background_halflings_house {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -1332px;
width: 141px;
height: 147px;
}
.background_harvest_feast {
.background_hall_of_heroes {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -1332px;
width: 141px;
height: 147px;
}
.background_harvest_fields {
.background_harvest_feast {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -1332px;
width: 141px;
height: 147px;
}
.background_harvest_moon {
.background_harvest_fields {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -1332px;
width: 141px;
height: 147px;
}
.background_haunted_house {
.background_harvest_moon {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -1332px;
width: 141px;
height: 147px;
}
.background_heather_field {
.background_haunted_house {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -1332px;
width: 141px;
height: 147px;
}
.background_holiday_market {
.background_heather_field {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -1332px;
width: 141px;
height: 147px;
}
.background_holiday_wreath {
.background_holiday_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -1332px;
width: 141px;
height: 147px;
}
.background_ice_cave {
.background_holiday_wreath {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1278px -1332px;
width: 141px;
height: 147px;
}
.background_iceberg {
.background_hot_air_balloon {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -1332px;
width: 141px;
height: 147px;
}
.background_idyllic_cabin {
.background_ice_cave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px 0px;
width: 141px;
height: 147px;
}
.background_in_a_classroom {
.background_iceberg {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -148px;
width: 141px;
height: 147px;
}
.background_in_an_ancient_tomb {
.background_idyllic_cabin {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -296px;
width: 141px;
height: 147px;
}
.background_island_waterfalls {
.background_in_a_classroom {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -444px;
width: 141px;
height: 147px;
}
.background_kelp_forest {
.background_in_an_ancient_tomb {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -592px;
width: 141px;
height: 147px;
}
.background_lake_with_floating_lanterns {
.background_island_waterfalls {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -740px;
width: 141px;
height: 147px;
}
.background_lighthouse_shore {
.background_kelp_forest {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -888px;
width: 141px;
height: 147px;
}
.background_lilypad {
.background_lake_with_floating_lanterns {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1036px;
width: 141px;
height: 147px;
}
.background_magic_beanstalk {
.background_lighthouse_shore {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1184px;
width: 141px;
height: 147px;
}
.background_magical_candles {
.background_lilypad {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1332px;
width: 141px;
height: 147px;
}
.background_magical_museum {
.background_magic_beanstalk {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -1480px;
width: 141px;
height: 147px;
}
.background_marble_temple {
.background_magical_candles {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -1480px;
width: 141px;
height: 147px;
}
.background_market {
.background_magical_museum {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -1480px;
width: 141px;
height: 147px;
}
.background_meandering_cave {
.background_marble_temple {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -1480px;
width: 141px;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,51 +1,75 @@
.quest_TEMPLATE_FOR_MISSING_IMAGE {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -502px -1519px;
background-position: -502px -1543px;
width: 221px;
height: 39px;
}
.quest_dolphin {
.quest_dilatory {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px 0px;
width: 219px;
height: 219px;
}
.quest_dustbunnies {
.quest_dilatoryDistress1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1332px;
width: 210px;
height: 210px;
}
.quest_dilatoryDistress2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -567px;
width: 150px;
height: 150px;
}
.quest_dilatoryDistress3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px 0px;
width: 219px;
height: 219px;
}
.quest_egg {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -362px;
width: 165px;
height: 207px;
}
.quest_evilsanta {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -1023px;
width: 118px;
height: 131px;
}
.quest_evilsanta2 {
.quest_dolphin {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -232px;
width: 219px;
height: 219px;
}
.quest_falcon {
.quest_dustbunnies {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_ferret {
.quest_egg {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -359px;
width: 165px;
height: 207px;
}
.quest_evilsanta {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -1171px;
width: 118px;
height: 131px;
}
.quest_evilsanta2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -232px;
width: 219px;
height: 219px;
}
.quest_falcon {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px 0px;
width: 219px;
height: 219px;
}
.quest_ferret {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -220px;
width: 219px;
height: 219px;
}
.quest_frog {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px 0px;
@ -54,19 +78,19 @@
}
.quest_ghost_stag {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px 0px;
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_goldenknight1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -220px;
background-position: -220px -452px;
width: 219px;
height: 219px;
}
.quest_goldenknight2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1519px;
background-position: 0px -1543px;
width: 250px;
height: 150px;
}
@ -78,91 +102,91 @@
}
.quest_gryphon {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -443px -1332px;
background-position: -654px -1332px;
width: 216px;
height: 177px;
}
.quest_guineapig {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -452px;
background-position: -440px -452px;
width: 219px;
height: 219px;
}
.quest_harpy {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -452px;
background-position: -660px -452px;
width: 219px;
height: 219px;
}
.quest_hedgehog {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1332px;
background-position: -211px -1332px;
width: 219px;
height: 186px;
}
.quest_hippo {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -452px;
background-position: -880px 0px;
width: 219px;
height: 219px;
}
.quest_horse {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -452px;
background-position: -880px -220px;
width: 219px;
height: 219px;
}
.quest_kangaroo {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px 0px;
background-position: -880px -440px;
width: 219px;
height: 219px;
}
.quest_kraken {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -1332px;
background-position: -871px -1332px;
width: 216px;
height: 177px;
}
.quest_lostMasterclasser1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -220px;
background-position: 0px -672px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -440px;
background-position: -220px -672px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -672px;
background-position: -440px -672px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -570px;
background-position: -1762px -718px;
width: 150px;
height: 150px;
}
.quest_mayhemMistiflying2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -672px;
background-position: -660px -672px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -672px;
background-position: -880px -672px;
width: 219px;
height: 219px;
}
.quest_monkey {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -672px;
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
@ -174,31 +198,31 @@
}
.quest_moon2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -672px;
background-position: -1100px -220px;
width: 219px;
height: 219px;
}
.quest_moon3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px 0px;
background-position: -1100px -440px;
width: 219px;
height: 219px;
}
.quest_moonstone1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -220px;
background-position: -1100px -660px;
width: 219px;
height: 219px;
}
.quest_moonstone2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -440px;
background-position: 0px -892px;
width: 219px;
height: 219px;
}
.quest_moonstone3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -660px;
background-position: -220px -892px;
width: 219px;
height: 219px;
}
@ -210,13 +234,13 @@
}
.quest_octopus {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -1332px;
background-position: -431px -1332px;
width: 222px;
height: 177px;
}
.quest_owl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -892px;
background-position: -440px -892px;
width: 219px;
height: 219px;
}
@ -228,25 +252,25 @@
}
.quest_penguin {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -178px;
background-position: -1762px -175px;
width: 190px;
height: 183px;
}
.quest_pterodactyl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -892px;
background-position: -660px -892px;
width: 219px;
height: 219px;
}
.quest_rat {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -892px;
background-position: -880px -892px;
width: 219px;
height: 219px;
}
.quest_robot {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -892px;
background-position: -1100px -892px;
width: 219px;
height: 219px;
}
@ -258,49 +282,49 @@
}
.quest_rooster {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1528px -1332px;
background-position: -1762px 0px;
width: 213px;
height: 174px;
}
.quest_ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -892px;
background-position: -1320px 0px;
width: 219px;
height: 219px;
}
.quest_sabretooth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -892px;
background-position: -1320px -220px;
width: 219px;
height: 219px;
}
.quest_seaserpent {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px 0px;
background-position: -1320px -440px;
width: 219px;
height: 219px;
}
.quest_sheep {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -220px;
background-position: -1320px -660px;
width: 219px;
height: 219px;
}
.quest_silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -440px;
background-position: -1320px -880px;
width: 219px;
height: 219px;
}
.quest_slime {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -660px;
background-position: 0px -1112px;
width: 219px;
height: 219px;
}
.quest_sloth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -880px;
background-position: -220px -1112px;
width: 219px;
height: 219px;
}
@ -312,43 +336,43 @@
}
.quest_snake {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -877px -1332px;
background-position: -1088px -1332px;
width: 216px;
height: 177px;
}
.quest_spider {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -251px -1519px;
background-position: -251px -1543px;
width: 250px;
height: 150px;
}
.quest_squirrel {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1112px;
background-position: -440px -1112px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -721px;
background-position: -1762px -869px;
width: 150px;
height: 150px;
}
.quest_stoikalmCalamity2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -1112px;
background-position: -660px -1112px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -1112px;
background-position: -880px -1112px;
width: 219px;
height: 219px;
}
.quest_taskwoodsTerror1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px -872px;
background-position: -1762px -1020px;
width: 150px;
height: 150px;
}
@ -360,37 +384,19 @@
}
.quest_taskwoodsTerror3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -1112px;
background-position: -1100px -1112px;
width: 219px;
height: 219px;
}
.quest_treeling {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1094px -1332px;
background-position: -1305px -1332px;
width: 216px;
height: 177px;
}
.quest_trex {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1762px 0px;
width: 204px;
height: 177px;
}
.quest_trex_undead {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1311px -1332px;
background-position: -1522px -1332px;
width: 216px;
height: 177px;
}
.quest_triceratops {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -1112px;
width: 219px;
height: 219px;
}
.quest_turtle {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -1112px;
width: 219px;
height: 219px;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,324 +1,414 @@
.icon_background_rainy_city {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -910px -1456px;
width: 68px;
height: 68px;
}
.icon_background_red {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -979px -1456px;
width: 68px;
height: 68px;
}
.icon_background_rolling_hills {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1048px -1456px;
width: 68px;
height: 68px;
}
.icon_background_rose_garden {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1117px -1456px;
width: 68px;
height: 68px;
}
.icon_background_rowboat {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1186px -1456px;
width: 68px;
height: 68px;
}
.icon_background_sandcastle {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1255px -1456px;
width: 68px;
height: 68px;
}
.icon_background_school_of_fish {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1324px -1456px;
width: 68px;
height: 68px;
}
.icon_background_scribes_workshop {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1393px -1456px;
width: 68px;
height: 68px;
}
.icon_background_seafarer_ship {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1462px -1456px;
width: 68px;
height: 68px;
}
.icon_background_seaside_cliffs {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px 0px;
width: 68px;
height: 68px;
}
.icon_background_shimmering_ice_prism {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -69px;
width: 68px;
height: 68px;
}
.icon_background_shimmery_bubbles {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -138px;
width: 68px;
height: 68px;
}
.icon_background_slimy_swamp {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -207px;
width: 68px;
height: 68px;
}
.icon_background_snowglobe {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -276px;
width: 68px;
height: 68px;
}
.icon_background_snowman_army {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -182px;
background-position: -1552px -345px;
width: 68px;
height: 68px;
}
.icon_background_snowy_day_fireplace {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -251px;
background-position: -1552px -414px;
width: 68px;
height: 68px;
}
.icon_background_snowy_pines {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -320px;
background-position: -1552px -483px;
width: 68px;
height: 68px;
}
.icon_background_snowy_sunrise {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -389px;
background-position: -1552px -552px;
width: 68px;
height: 68px;
}
.icon_background_south_pole {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -458px;
background-position: -1552px -621px;
width: 68px;
height: 68px;
}
.icon_background_sparkling_snowflake {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -527px;
background-position: -1552px -690px;
width: 68px;
height: 68px;
}
.icon_background_spider_web {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -596px;
background-position: -1552px -759px;
width: 68px;
height: 68px;
}
.icon_background_spooky_hotel {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -665px;
background-position: -1552px -828px;
width: 68px;
height: 68px;
}
.icon_background_spring_rain {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -734px;
background-position: -1552px -897px;
width: 68px;
height: 68px;
}
.icon_background_stable {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -803px;
background-position: -1552px -966px;
width: 68px;
height: 68px;
}
.icon_background_stained_glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -872px;
background-position: -1552px -1035px;
width: 68px;
height: 68px;
}
.icon_background_starry_skies {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -941px;
background-position: -1552px -1104px;
width: 68px;
height: 68px;
}
.icon_background_starry_winter_night {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1010px;
background-position: -1552px -1173px;
width: 68px;
height: 68px;
}
.icon_background_steamworks {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1079px;
background-position: -1552px -1242px;
width: 68px;
height: 68px;
}
.icon_background_stoikalm_volcanoes {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1148px;
background-position: -1552px -1311px;
width: 68px;
height: 68px;
}
.icon_background_stone_circle {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1217px;
background-position: -1552px -1380px;
width: 68px;
height: 68px;
}
.icon_background_stormy_rooftops {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1286px;
background-position: -1552px -1449px;
width: 68px;
height: 68px;
}
.icon_background_stormy_ship {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1355px;
background-position: 0px -1547px;
width: 68px;
height: 68px;
}
.icon_background_strange_sewers {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -1424px;
width: 68px;
height: 68px;
}
.icon_background_succulent_garden {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: 0px -1547px;
width: 68px;
height: 68px;
}
.icon_background_summer_fireworks {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -69px -1547px;
width: 68px;
height: 68px;
}
.icon_background_sunken_ship {
.icon_background_strawberry_patch {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -138px -1547px;
width: 68px;
height: 68px;
}
.icon_background_sunset_meadow {
.icon_background_succulent_garden {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -207px -1547px;
width: 68px;
height: 68px;
}
.icon_background_sunset_oasis {
.icon_background_summer_fireworks {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -276px -1547px;
width: 68px;
height: 68px;
}
.icon_background_sunset_savannah {
.icon_background_sunken_ship {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -345px -1547px;
width: 68px;
height: 68px;
}
.icon_background_swarming_darkness {
.icon_background_sunset_meadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -414px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tar_pits {
.icon_background_sunset_oasis {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -483px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tavern {
.icon_background_sunset_savannah {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -552px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tea_party {
.icon_background_swarming_darkness {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -621px -1547px;
width: 68px;
height: 68px;
}
.icon_background_terraced_rice_field {
.icon_background_tar_pits {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -690px -1547px;
width: 68px;
height: 68px;
}
.icon_background_thunderstorm {
.icon_background_tavern {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -759px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tide_pool {
.icon_background_tea_party {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -828px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tornado {
.icon_background_terraced_rice_field {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -897px -1547px;
width: 68px;
height: 68px;
}
.icon_background_toymakers_workshop {
.icon_background_thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -966px -1547px;
width: 68px;
height: 68px;
}
.icon_background_training_grounds {
.icon_background_tide_pool {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1035px -1547px;
width: 68px;
height: 68px;
}
.icon_background_treasure_room {
.icon_background_tornado {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1104px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tree_roots {
.icon_background_toymakers_workshop {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1173px -1547px;
width: 68px;
height: 68px;
}
.icon_background_treehouse {
.icon_background_training_grounds {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1242px -1547px;
width: 68px;
height: 68px;
}
.icon_background_tulip_garden {
.icon_background_treasure_room {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1311px -1547px;
width: 68px;
height: 68px;
}
.icon_background_twinkly_lights {
.icon_background_tree_roots {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1380px -1547px;
width: 68px;
height: 68px;
}
.icon_background_twinkly_party_lights {
.icon_background_treehouse {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1449px -1547px;
width: 68px;
height: 68px;
}
.icon_background_underwater_vents {
.icon_background_tulip_garden {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1518px -1547px;
width: 68px;
height: 68px;
}
.icon_background_twinkly_lights {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1621px 0px;
width: 68px;
height: 68px;
}
.icon_background_twinkly_party_lights {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1621px -69px;
width: 68px;
height: 68px;
}
.icon_background_underwater_vents {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1621px -138px;
width: 68px;
height: 68px;
}
.icon_background_valentines_day_feasting_hall {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px 0px;
background-position: -1621px -207px;
width: 68px;
height: 68px;
}
.icon_background_violet {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -69px;
background-position: -1621px -276px;
width: 68px;
height: 68px;
}
.icon_background_volcano {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -138px;
background-position: -1621px -345px;
width: 68px;
height: 68px;
}
.icon_background_waterfall_rock {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -207px;
background-position: -1621px -414px;
width: 68px;
height: 68px;
}
.icon_background_wedding_arch {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -276px;
background-position: -1621px -483px;
width: 68px;
height: 68px;
}
.icon_background_windy_autumn {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -345px;
background-position: -1621px -552px;
width: 68px;
height: 68px;
}
.icon_background_winter_fireworks {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -414px;
background-position: -1621px -621px;
width: 68px;
height: 68px;
}
.icon_background_winter_night {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -483px;
background-position: -1621px -690px;
width: 68px;
height: 68px;
}
.icon_background_winter_nocturne {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -552px;
background-position: -1621px -759px;
width: 68px;
height: 68px;
}
.icon_background_winter_storefront {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -621px;
background-position: -1621px -828px;
width: 68px;
height: 68px;
}
.icon_background_winter_town {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -690px;
background-position: -1621px -897px;
width: 68px;
height: 68px;
}
.icon_background_yellow {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -759px;
background-position: -1621px -966px;
width: 68px;
height: 68px;
}
@ -2304,73 +2394,73 @@
}
.button_chair_black {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1242px;
background-position: -1621px -1449px;
width: 60px;
height: 60px;
}
.button_chair_blue {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1303px;
background-position: -1621px -1510px;
width: 60px;
height: 60px;
}
.button_chair_green {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1364px;
background-position: 0px -1616px;
width: 60px;
height: 60px;
}
.button_chair_handleless_black {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -828px;
background-position: -1621px -1035px;
width: 68px;
height: 68px;
}
.button_chair_handleless_blue {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -897px;
background-position: -1621px -1104px;
width: 68px;
height: 68px;
}
.button_chair_handleless_green {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -966px;
background-position: -1621px -1173px;
width: 68px;
height: 68px;
}
.button_chair_handleless_pink {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1035px;
background-position: -1621px -1242px;
width: 68px;
height: 68px;
}
.button_chair_handleless_red {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1104px;
background-position: -1621px -1311px;
width: 68px;
height: 68px;
}
.button_chair_handleless_yellow {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1173px;
background-position: -1621px -1380px;
width: 68px;
height: 68px;
}
.button_chair_pink {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1425px;
background-position: -61px -1616px;
width: 60px;
height: 60px;
}
.button_chair_red {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1486px;
background-position: -122px -1616px;
width: 60px;
height: 60px;
}
.button_chair_yellow {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1643px -1547px;
background-position: -183px -1616px;
width: 60px;
height: 60px;
}
@ -3670,111 +3760,3 @@
width: 60px;
height: 60px;
}
.hair_bangs_3_frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -910px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -935px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_ghostwhite {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1001px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_ghostwhite {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1026px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_green {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1092px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_green {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1117px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_halloween {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1183px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_halloween {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1208px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1274px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1299px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_hollygreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1365px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_hollygreen {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1390px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_midnight {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1456px -1456px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_midnight {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1481px -1471px;
width: 60px;
height: 60px;
}
.hair_bangs_3_pblue {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_pblue {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1577px -15px;
width: 60px;
height: 60px;
}
.hair_bangs_3_pblue2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1552px -91px;
width: 90px;
height: 90px;
}
.customize-option.hair_bangs_3_pblue2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-2.png');
background-position: -1577px -106px;
width: 60px;
height: 60px;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 470 KiB

After

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 KiB

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 424 KiB

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 147 KiB

View file

@ -4,23 +4,47 @@
line-height: 1.33;
color: $gray-200;
padding: 4px 8px;
box-shadow: 0 1px 1px 0 rgba($black, 0.12);
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
}
.badge-pill {
border-radius: 100px;
}
.badge-round {
height: 1.5rem;
width: 1.5rem;
border-radius: 100%;
}
.badge-default {
background: $gray-500;
box-shadow: none;
}
.badge-dialog {
position: absolute;
left: -16px;
top: -16px;
.badge-pin {
width: 36px;
height: 36px;
padding: 0.5rem;
}
}
.badge-item {
position: absolute;
top: -9px;
}
.badge-top {
position: absolute;
left: calc((100% - 24px) / 2);
top: -12px;
}
.badge-purple {
position: absolute;
color: $white;

View file

@ -68,8 +68,6 @@ $purple-600: #D5C8FF;
$header-color: #D5C8FF;
$header-dark-background: #271B3D;
$suggested-item-color: #D5C8FF;
$healer-color: #FFA624;
$rogue-color: #4F2A93;
$warrior-color: #C92B2B;

View file

@ -32,9 +32,8 @@
@import './dragdrop';
@import './banner';
@import './progress-bar';
@import './pin';
@import './animals';
@import './iconalert';
@import './tiers';
@import './payments';
@import './datepicker.scss';
@import './datepicker.scss';

View file

@ -24,7 +24,7 @@
@media only screen and (min-width: 1440px){
margin-right: 1.71em;
}
// Desktop L (1280)
@media only screen and (min-width: 1280px) and (max-width: 1439px) {
margin-right: 0.43em;
@ -47,8 +47,9 @@
height: 92px;
border-radius: 2px;
background: $white;
box-shadow: 0 2px 2px 0 rgba($black, 0.15), 0 1px 4px 0 rgba($black, 0.1);
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
border: 1px solid transparent;
cursor: pointer;
&-empty {
background: $gray-10;
@ -61,8 +62,8 @@
}
&:hover {
box-shadow: 0 4px 4px 0 rgba($black, 0.16), 0 1px 8px 0 rgba($black, 0.12);
border-color: $purple-500;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
border-color: $purple-400;
}
&.highlight {
@ -72,15 +73,6 @@
&.highlight-border {
border-color: $purple-500;
}
&.suggested {
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
border: solid 1px $suggested-item-color;
}
&.suggested:hover {
border: solid 1px $purple-500;
}
}
.flat .item {

View file

@ -1,26 +0,0 @@
.badge-svg {
left: calc((100% - 18px) / 2);
cursor: pointer;
color: $gray-400;
background: $white;
padding: 4.5px 6px;
&.item-selected-badge {
background: $purple-300;
color: $white;
}
}
span.badge.badge-pill.badge-item.badge-svg:not(.item-selected-badge) {
color: #a5a1ac;
}
span.badge.badge-pill.badge-item.badge-svg.hide {
display: none;
}
.item:hover {
span.badge.badge-pill.badge-item.badge-svg.hide {
display: block;
}
}

View file

@ -1,12 +1,12 @@
// this variables are used to determine which shop npc/backgrounds should be loaded
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, normal, summer
// more to be added on future seasons
$npc_market_flavor: 'spring';
$npc_quests_flavor: 'spring';
$npc_seasonal_flavor: 'spring';
$npc_timetravelers_flavor: 'spring';
$npc_tavern_flavor: 'spring';
$npc_market_flavor: 'normal';
$npc_quests_flavor: 'normal';
$npc_seasonal_flavor: 'normal';
$npc_timetravelers_flavor: 'normal';
$npc_tavern_flavor: 'normal';
$restingToolbarHeight: 40px;
$menuToolbarHeight: 56px;

View file

@ -1,3 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
<path fill="#FFF" fill-rule="evenodd" d="M6.252 8.46l-2.71-2.712 4.602-3.58 1.688 1.689-3.58 4.602zm5.554-4.497l-.626-.627-.001-.001L8.666.822 8.037.194a.66.66 0 1 0-.934.934l.1.1L2.6 4.806l-.216-.216a.66.66 0 1 0-.934.934l.627.627v.001l1.418 1.418-3.301 3.302a.66.66 0 1 0 .934.934L4.43 8.505l1.417 1.417.001.002.628.627a.658.658 0 0 0 .934 0 .66.66 0 0 0 0-.934L7.194 9.4l3.58-4.602.098.099a.659.659 0 0 0 .934 0 .66.66 0 0 0 0-.934z"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="-2 -1.5 16 16">
<path id="prefix__a" d="M9.748 4.127l-3.27 4.205-2.31-2.31 4.205-3.27 1.375 1.375zm2.484-.091l-.554-.554V3.43l-.102-.051L8.463.267C8.293.095 8.063 0 7.82 0c-.244 0-.472.095-.644.267-.173.172-.267.401-.267.644 0 .195.061.382.174.536L2.87 4.724l-.06-.06c-.355-.354-.932-.354-1.288 0-.355.356-.355.933 0 1.288l1.87 1.869-3.126 3.125c-.355.355-.355.933 0 1.286.17.173.4.268.643.268.244 0 .474-.095.645-.267L4.68 9.108l1.87 1.87c.342.343.94.344 1.287 0 .355-.356.355-.933 0-1.289l-.06-.06 3.277-4.212c.345.252.87.215 1.18-.093.354-.356.354-.933 0-1.288z"/>
</svg>

Before

Width:  |  Height:  |  Size: 534 B

After

Width:  |  Height:  |  Size: 691 B

View file

@ -225,30 +225,30 @@ export default {
classGear (heroClass) {
if (heroClass === 'rogue') {
return {
armor: 'armor_special_spring2020Rogue',
head: 'head_special_spring2020Rogue',
shield: 'shield_special_spring2020Rogue',
weapon: 'weapon_special_spring2020Rogue',
armor: 'armor_rogue_5',
head: 'head_rogue_5',
shield: 'shield_rogue_6',
weapon: 'weapon_rogue_6',
};
} if (heroClass === 'wizard') {
return {
armor: 'armor_special_spring2020Mage',
head: 'head_special_spring2020Mage',
weapon: 'weapon_special_spring2020Mage',
armor: 'armor_wizard_5',
head: 'head_wizard_5',
weapon: 'weapon_wizard_6',
};
} if (heroClass === 'healer') {
return {
armor: 'armor_special_spring2020Healer',
head: 'head_special_spring2020Healer',
shield: 'shield_special_spring2020Healer',
weapon: 'weapon_special_spring2020Healer',
armor: 'armor_healer_5',
head: 'head_healer_5',
shield: 'shield_healer_5',
weapon: 'weapon_healer_6',
};
}
return {
armor: 'armor_special_spring2020Warrior',
head: 'head_special_spring2020Warrior',
shield: 'shield_special_spring2020Warrior',
weapon: 'weapon_special_spring2020Warrior',
armor: 'armor_warrior_5',
head: 'head_warrior_5',
shield: 'shield_warrior_5',
weapon: 'weapon_warrior_6',
};
},
selectionBox (selectedClass, heroClass) {

View file

@ -227,7 +227,7 @@
></i>
<div
v-if="!user.purchased.background[bg.key]"
class="purchase-background single"
class="purchase-background single d-flex align-items-center justify-content-center"
>
<div
class="svg-icon hourglass"
@ -237,16 +237,12 @@
</div>
<span
v-if="!user.purchased.background[bg.key]"
class="badge badge-pill badge-item badge-svg"
:class="{
'item-selected-badge': isBackgroundPinned(bg),
'hide': !isBackgroundPinned(bg)}"
@click.prevent.stop="togglePinned(bg)"
class="badge-top"
@click.stop.prevent="togglePinned(bg)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="isBackgroundPinned(bg)"
/>
</span>
</div>
</div>
@ -295,7 +291,7 @@
></i>
<div
v-if="!user.purchased.background[bg.key]"
class="purchase-background single"
class="purchase-background single d-flex align-items-center justify-content-center"
>
<div
class="svg-icon gem"
@ -305,16 +301,12 @@
</div>
<span
v-if="!user.purchased.background[bg.key]"
class="badge badge-pill badge-item badge-svg"
:class="{
'item-selected-badge': isBackgroundPinned(bg),
'hide': !isBackgroundPinned(bg)}"
@click.prevent.stop="togglePinned(bg)"
class="badge-top"
@click.stop.prevent="togglePinned(bg)"
>
<span
class="svg-icon inline icon-12 color"
v-html="icons.pin"
></span>
<pin-badge
:pinned="isBackgroundPinned(bg)"
/>
</span>
</div>
<div
@ -1095,38 +1087,14 @@
}
}
.badge-svg {
left: calc((100% - 18px) / 2);
cursor: pointer;
color: $gray-400;
background: $white;
padding: 4.5px 6px;
&.item-selected-badge {
background: $purple-300;
color: $white;
}
}
.icon-12 {
width: 12px;
height: 12px;
}
span.badge.badge-pill.badge-item.badge-svg:not(.item-selected-badge) {
color: #a5a1ac;
}
span.badge.badge-pill.badge-item.badge-svg.hide {
display: none;
}
.background-button {
margin-bottom: 15px;
}
.background-button:hover {
span.badge.badge-pill.badge-item.badge-svg.hide {
.badge-pin:not(.pinned) {
display: none;
}
&:hover .badge-pin {
display: block;
}
}
@ -1142,6 +1110,7 @@ import usernameForm from './settings/usernameForm';
import shops from '@/../../common/script/libs/shops';
import guide from '@/mixins/guide';
import notifications from '@/mixins/notifications';
import PinBadge from '@/components/ui/pinBadge';
import toggleSwitch from '@/components/ui/toggleSwitch';
import bodySettings from './avatarModal/body-settings';
import skinSettings from './avatarModal/skin-settings';
@ -1158,7 +1127,6 @@ import backgroundsIcon from '@/assets/svg/backgrounds.svg';
import gem from '@/assets/svg/gem.svg';
import hourglass from '@/assets/svg/hourglass.svg';
import gold from '@/assets/svg/gold.svg';
import pin from '@/assets/svg/pin.svg';
import arrowRight from '@/assets/svg/arrow_right.svg';
import arrowLeft from '@/assets/svg/arrow_left.svg';
import svgClose from '@/assets/svg/close.svg';
@ -1170,14 +1138,14 @@ import content from '@/../../common/script/content/index';
export default {
components: {
avatar,
bodySettings,
extraSettings,
hairSettings,
PinBadge,
skinSettings,
subMenu,
toggleSwitch,
usernameForm,
bodySettings,
skinSettings,
hairSettings,
extraSettings,
subMenu,
},
mixins: [guide, notifications, avatarEditorUtilies],
data () {
@ -1198,7 +1166,6 @@ export default {
backgroundsIcon,
gem,
hourglass,
pin,
gold,
arrowRight,
arrowLeft,

View file

@ -29,7 +29,7 @@
:class="{
'input-valid': invite.valid, 'is-invalid input-invalid': invite.valid === false}"
@keyup="expandInviteList"
@change="checkInviteList"
@input="inviteUpdated(invite)"
>
</div>
<div
@ -128,8 +128,6 @@
<script>
import clone from 'lodash/clone';
import debounce from 'lodash/debounce';
import filter from 'lodash/filter';
import forEach from 'lodash/forEach';
import isEmail from 'validator/lib/isEmail';
import isUUID from 'validator/lib/isUUID';
import { mapState } from '@/libs/store';
@ -152,25 +150,24 @@ export default {
computed: {
...mapState({ user: 'user.data' }),
cannotSubmit () {
const filteredInvites = filter(
this.invites,
invite => invite.text.length > 0 && !invite.valid,
);
if (filteredInvites.length > 0) return true;
return false;
const filledInvites = this.invites.filter(invite => invite.text.length);
return !filledInvites.length || filledInvites.some(invite => !invite.valid);
},
inviter () {
return this.user.profile.name;
},
},
methods: {
inviteUpdated (invite) {
this.clearErrors(invite);
this.checkInviteList();
},
checkInviteList: debounce(function checkList () {
this.invites = filter(
this.invites,
this.invites = this.invites.filter(
(invite, index) => invite.text.length > 0 || index === this.invites.length - 1,
);
while (this.invites.length < 2) this.invites.push(clone(INVITE_DEFAULTS));
forEach(this.invites, (value, index) => {
this.invites.forEach((value, index) => {
if (value.text.length < 1 || isEmail(value.text)) {
return this.fillErrors(index);
}
@ -185,12 +182,16 @@ export default {
return this.$store.dispatch('user:userLookup', { username: searchUsername })
.then(res => this.fillErrors(index, res));
});
}, 250),
}, 500),
expandInviteList () {
if (this.invites[this.invites.length - 1].text.length > 0) {
this.invites.push(clone(INVITE_DEFAULTS));
}
},
clearErrors (invite) {
invite.valid = null;
invite.error = null;
},
fillErrors (index, res) {
if (!res || res.status === 200) {
this.invites[index].error = null;
@ -216,7 +217,7 @@ export default {
uuids: [],
usernames: [],
};
forEach(this.invites, invite => {
this.invites.forEach(invite => {
if (invite.text.length < 1) return;
if (isEmail(invite.text)) {
invitationDetails.emails.push({ email: invite.text });

View file

@ -159,10 +159,10 @@
:class="group.key"
>
<!-- eslint-enable vue/no-use-v-if-with-v-for -->
<h2 class="mb-3">
<h2 class="d-flex align-items-center mb-3">
{{ group.label }}
<span
class="badge badge-pill badge-default"
class="badge badge-pill badge-default ml-2"
>{{ items[group.key].length }}</span>
</h2>
<itemRows

Some files were not shown because too many files have changed in this diff Show more