Compare commits
134 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1d68a95b64 | |||
| 88999a0751 | |||
| 2666c93e5f | |||
| 5faa49d032 | |||
| 55c800cb4b | |||
| deee147928 | |||
| a9cd36c109 | |||
| 4c1c00b0a3 | |||
| 245e135be8 | |||
| 978c707e17 | |||
| 623d38f281 | |||
| c88e458a97 | |||
| 9957db0669 | |||
| 2e21f58ae5 | |||
| 04be6d0744 | |||
| 8c43164e60 | |||
| 3fa940bdfd | |||
| 3492549081 | |||
| b7a6dd9706 | |||
| 78bdb52f8f | |||
| d80aaf3ab0 | |||
| 31cac936c8 | |||
| 3b54064a1f | |||
| 8b46df757f | |||
| 4a9040aefb | |||
| 723249e60d | |||
| 8b17ebd1f1 | |||
| 1c4c7b9f1e | |||
| 58887d9a3c | |||
| 664f960a8b | |||
| dfe53e8b68 | |||
| b608f0ad9c | |||
| d4e05835d7 | |||
| 9343c33f37 | |||
| afd1248ea3 | |||
| 0708829b2a | |||
| afa9a65933 | |||
| e93e91e57d | |||
| 53569ff983 | |||
| d0c736a7a6 | |||
| c8ee51b741 | |||
| 2bf63847c9 | |||
| 1d1b66d25a | |||
| 9ce4482040 | |||
| 28660c0bea | |||
| bc15d530e5 | |||
| 34b7acb246 | |||
| 4ef369c6f5 | |||
| 405721602f | |||
| 19cf89baec | |||
| 8a4e9888dd | |||
| e17b86a1f6 | |||
| 2181ab9713 | |||
| 8cb8411cc6 | |||
| da3e6f96ba | |||
| 91511746bc | |||
| aaba400d36 | |||
| 4e107d233b | |||
| c086d7b91d | |||
| 5b93199f35 | |||
| 3b82bb9494 | |||
| 1c347fc4b8 | |||
| 2f16fe11e1 | |||
| 05cf0cb50d | |||
| fb017e1f08 | |||
| 1ca528eb95 | |||
| 0ff2a8c264 | |||
| eed6cfaf6d | |||
| 202d74b8c4 | |||
| 3498b9ccdf | |||
| 39b39387d3 | |||
| c3278a3baf | |||
| df3b871dba | |||
| 18af9f8b40 | |||
| de36afc174 | |||
| fbb40c0d07 | |||
| 34d0922bcc | |||
| 55cf2f9795 | |||
| 9ff0766910 | |||
| 06d982401a | |||
| 140372a70d | |||
| bd9754221b | |||
| d58ca4c998 | |||
| 7c53f9fd21 | |||
| ae6918d52e | |||
| d367060a82 | |||
| 8e7ec46c8f | |||
| d0d32c0b58 | |||
| 1dd3bc188e | |||
| 608ae5fc43 | |||
| 391fa541ef | |||
| bc87e8b400 | |||
| 976e8cf242 | |||
| 2c566cb9e3 | |||
| 89d7f94fc3 | |||
| 7a15bfc140 | |||
| 59bd135e44 | |||
| cf04d9d0be | |||
| f918b4a68c | |||
| 4070dd7754 | |||
| d44b2fe785 | |||
| 57cf669a86 | |||
| f87bb7593e | |||
| b54f185d1f | |||
| 1785ac8226 | |||
| 77179d1ff1 | |||
| 492824ac90 | |||
| 55443ecc23 | |||
| 98b43c681a | |||
| 40f8c049ab | |||
| b5a7b58b57 | |||
| 006aad76d2 | |||
| 1a4af6d6bd | |||
| a0b0d1d855 | |||
| 3fb1241010 | |||
| f1d70dec18 | |||
| c7e7071998 | |||
| b4f699b7c4 | |||
| 874954b16b | |||
| 120b2e9ade | |||
| 7d00fe1ecb | |||
| 29ab8856ca | |||
| 1eb8ee4dc6 | |||
| 96c0c12c49 | |||
| 3eb9225b8b | |||
| 73a29f94a6 | |||
| 7bd190930f | |||
| d0e9339d3b | |||
| d45122ce06 | |||
| f3f5d6bb70 | |||
| 9b849e095c | |||
| 55ec42678e | |||
| adc7a6ee85 | |||
| ccc1d5b26e |
@@ -1,3 +1,7 @@
|
||||
# Files not included in deployments to Heroku, to save on file size.
|
||||
|
||||
/habitica-images
|
||||
/test
|
||||
/migrations
|
||||
/scripts
|
||||
/database_reports
|
||||
|
||||
@@ -20,17 +20,25 @@ function cssVarMap (sprite) {
|
||||
if (requiresSpecialTreatment) {
|
||||
sprite.custom = {
|
||||
px: {
|
||||
offsetX: `-${sprite.x + 25}px`,
|
||||
offsetY: `-${sprite.y + 15}px`,
|
||||
offsetX: '-25px',
|
||||
offsetY: '-15px',
|
||||
width: '60px',
|
||||
height: '60px',
|
||||
},
|
||||
};
|
||||
}
|
||||
if (sprite.name.indexOf('shirt') !== -1) sprite.custom.px.offsetY = `-${sprite.y + 35}px`; // even more for shirts
|
||||
|
||||
// even more for shirts
|
||||
if (sprite.name.indexOf('shirt') !== -1) {
|
||||
sprite.custom.px.offsetX = '-29px';
|
||||
sprite.custom.px.offsetY = '-42px';
|
||||
}
|
||||
|
||||
if (sprite.name.indexOf('hair_base') !== -1) {
|
||||
const styleArray = sprite.name.split('_').slice(2, 3);
|
||||
if (Number(styleArray[0]) > 14) sprite.custom.px.offsetY = `-${sprite.y}px`; // don't crop updos
|
||||
if (Number(styleArray[0]) > 14) {
|
||||
sprite.custom.px.offsetY = '0'; // don't crop updos
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "4.226.0",
|
||||
"version": "4.229.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -26,24 +26,24 @@
|
||||
"integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q=="
|
||||
},
|
||||
"@babel/core": {
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
|
||||
"integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz",
|
||||
"integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==",
|
||||
"requires": {
|
||||
"@ampproject/remapping": "^2.1.0",
|
||||
"@babel/code-frame": "^7.16.7",
|
||||
"@babel/generator": "^7.17.7",
|
||||
"@babel/generator": "^7.17.9",
|
||||
"@babel/helper-compilation-targets": "^7.17.7",
|
||||
"@babel/helper-module-transforms": "^7.17.7",
|
||||
"@babel/helpers": "^7.17.8",
|
||||
"@babel/parser": "^7.17.8",
|
||||
"@babel/helpers": "^7.17.9",
|
||||
"@babel/parser": "^7.17.9",
|
||||
"@babel/template": "^7.16.7",
|
||||
"@babel/traverse": "^7.17.3",
|
||||
"@babel/traverse": "^7.17.9",
|
||||
"@babel/types": "^7.17.0",
|
||||
"convert-source-map": "^1.7.0",
|
||||
"debug": "^4.1.0",
|
||||
"gensync": "^1.0.0-beta.2",
|
||||
"json5": "^2.1.2",
|
||||
"json5": "^2.2.1",
|
||||
"semver": "^6.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -61,9 +61,9 @@
|
||||
"integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ=="
|
||||
},
|
||||
"@babel/generator": {
|
||||
"version": "7.17.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
|
||||
"integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz",
|
||||
"integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==",
|
||||
"requires": {
|
||||
"@babel/types": "^7.17.0",
|
||||
"jsesc": "^2.5.1",
|
||||
@@ -81,6 +81,15 @@
|
||||
"semver": "^6.3.0"
|
||||
}
|
||||
},
|
||||
"@babel/helper-function-name": {
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
|
||||
"integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
|
||||
"requires": {
|
||||
"@babel/template": "^7.16.7",
|
||||
"@babel/types": "^7.17.0"
|
||||
}
|
||||
},
|
||||
"@babel/helper-module-transforms": {
|
||||
"version": "7.17.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz",
|
||||
@@ -110,9 +119,9 @@
|
||||
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.16.10",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
|
||||
"integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz",
|
||||
"integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==",
|
||||
"requires": {
|
||||
"@babel/helper-validator-identifier": "^7.16.7",
|
||||
"chalk": "^2.0.0",
|
||||
@@ -120,22 +129,22 @@
|
||||
}
|
||||
},
|
||||
"@babel/parser": {
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
|
||||
"integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ=="
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
|
||||
"integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg=="
|
||||
},
|
||||
"@babel/traverse": {
|
||||
"version": "7.17.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
|
||||
"integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz",
|
||||
"integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==",
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.16.7",
|
||||
"@babel/generator": "^7.17.3",
|
||||
"@babel/generator": "^7.17.9",
|
||||
"@babel/helper-environment-visitor": "^7.16.7",
|
||||
"@babel/helper-function-name": "^7.16.7",
|
||||
"@babel/helper-function-name": "^7.17.9",
|
||||
"@babel/helper-hoist-variables": "^7.16.7",
|
||||
"@babel/helper-split-export-declaration": "^7.16.7",
|
||||
"@babel/parser": "^7.17.3",
|
||||
"@babel/parser": "^7.17.9",
|
||||
"@babel/types": "^7.17.0",
|
||||
"debug": "^4.1.0",
|
||||
"globals": "^11.1.0"
|
||||
@@ -160,6 +169,11 @@
|
||||
"supports-color": "^5.3.0"
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
|
||||
},
|
||||
"semver": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
|
||||
@@ -418,12 +432,12 @@
|
||||
}
|
||||
},
|
||||
"@babel/helpers": {
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz",
|
||||
"integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz",
|
||||
"integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
|
||||
"requires": {
|
||||
"@babel/template": "^7.16.7",
|
||||
"@babel/traverse": "^7.17.3",
|
||||
"@babel/traverse": "^7.17.9",
|
||||
"@babel/types": "^7.17.0"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -436,24 +450,33 @@
|
||||
}
|
||||
},
|
||||
"@babel/generator": {
|
||||
"version": "7.17.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
|
||||
"integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz",
|
||||
"integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==",
|
||||
"requires": {
|
||||
"@babel/types": "^7.17.0",
|
||||
"jsesc": "^2.5.1",
|
||||
"source-map": "^0.5.0"
|
||||
}
|
||||
},
|
||||
"@babel/helper-function-name": {
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
|
||||
"integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
|
||||
"requires": {
|
||||
"@babel/template": "^7.16.7",
|
||||
"@babel/types": "^7.17.0"
|
||||
}
|
||||
},
|
||||
"@babel/helper-validator-identifier": {
|
||||
"version": "7.16.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
|
||||
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.16.10",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
|
||||
"integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz",
|
||||
"integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==",
|
||||
"requires": {
|
||||
"@babel/helper-validator-identifier": "^7.16.7",
|
||||
"chalk": "^2.0.0",
|
||||
@@ -461,22 +484,22 @@
|
||||
}
|
||||
},
|
||||
"@babel/parser": {
|
||||
"version": "7.17.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
|
||||
"integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ=="
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
|
||||
"integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg=="
|
||||
},
|
||||
"@babel/traverse": {
|
||||
"version": "7.17.3",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
|
||||
"integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
|
||||
"version": "7.17.9",
|
||||
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz",
|
||||
"integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==",
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.16.7",
|
||||
"@babel/generator": "^7.17.3",
|
||||
"@babel/generator": "^7.17.9",
|
||||
"@babel/helper-environment-visitor": "^7.16.7",
|
||||
"@babel/helper-function-name": "^7.16.7",
|
||||
"@babel/helper-function-name": "^7.17.9",
|
||||
"@babel/helper-hoist-variables": "^7.16.7",
|
||||
"@babel/helper-split-export-declaration": "^7.16.7",
|
||||
"@babel/parser": "^7.17.3",
|
||||
"@babel/parser": "^7.17.9",
|
||||
"@babel/types": "^7.17.0",
|
||||
"debug": "^4.1.0",
|
||||
"globals": "^11.1.0"
|
||||
@@ -1588,9 +1611,9 @@
|
||||
}
|
||||
},
|
||||
"@sinonjs/fake-timers": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz",
|
||||
"integrity": "sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==",
|
||||
"version": "9.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
|
||||
"integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@sinonjs/commons": "^1.7.0"
|
||||
@@ -2189,9 +2212,9 @@
|
||||
}
|
||||
},
|
||||
"apidoc": {
|
||||
"version": "0.51.0",
|
||||
"resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.51.0.tgz",
|
||||
"integrity": "sha512-3P4srhm6NA+kE/YRM4qL5jESElpQQJL+Z8n7hyr4uC+1DSwGzmE6adXPVxuT/hpDyShrqmRlHk8hf40RSqEsNw==",
|
||||
"version": "0.51.1",
|
||||
"resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.51.1.tgz",
|
||||
"integrity": "sha512-0dcL7NSUWDibgQ051ne/wXT0Dp+ArD66jwofuurxzRAPMuf2cRwa7GxRm9xlGXbOLaU7dVSZDr8LVeVBdI/oTQ==",
|
||||
"requires": {
|
||||
"bootstrap": "3.4.1",
|
||||
"commander": "^8.3.0",
|
||||
@@ -2207,11 +2230,9 @@
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it": "^12.2.0",
|
||||
"nodemon": "^2.0.15",
|
||||
"path-to-regexp": "^6.2.0",
|
||||
"prismjs": "^1.25.0",
|
||||
"semver": "^7.3.5",
|
||||
"style-loader": "^3.3.1",
|
||||
"url-parse": "^1.5.3",
|
||||
"webpack": "^5.64.2",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"winston": "^3.3.3"
|
||||
@@ -2410,11 +2431,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "6.2.0",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz",
|
||||
"integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg=="
|
||||
},
|
||||
"pupa": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
|
||||
@@ -2432,9 +2448,9 @@
|
||||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.3.5",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
|
||||
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
|
||||
"version": "7.3.7",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
|
||||
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
|
||||
"requires": {
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
@@ -3605,20 +3621,22 @@
|
||||
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.19.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
|
||||
"integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
|
||||
"version": "1.20.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
|
||||
"integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"http-errors": "1.8.1",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "~2.3.0",
|
||||
"qs": "6.9.7",
|
||||
"raw-body": "2.4.3",
|
||||
"type-is": "~1.6.18"
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.10.3",
|
||||
"raw-body": "2.5.1",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
@@ -3629,6 +3647,28 @@
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
||||
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
||||
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
||||
"requires": {
|
||||
"depd": "2.0.0",
|
||||
"inherits": "2.0.4",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"toidentifier": "1.0.1"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
@@ -3642,10 +3682,26 @@
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
||||
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.9.7",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
|
||||
"integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw=="
|
||||
"version": "6.10.3",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
|
||||
"integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
|
||||
"requires": {
|
||||
"side-channel": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -5444,9 +5500,9 @@
|
||||
}
|
||||
},
|
||||
"enhanced-resolve": {
|
||||
"version": "5.9.2",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz",
|
||||
"integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==",
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
|
||||
"integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
@@ -5556,114 +5612,114 @@
|
||||
}
|
||||
},
|
||||
"esbuild": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.28.tgz",
|
||||
"integrity": "sha512-YLNprkCcMVKQ5sekmCKEQ3Obu/L7s6+iij38xNKyBeSmSsTWur4Ky/9zB3XIGT8SCJITG/bZwAR2l7YOAXch4Q==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz",
|
||||
"integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==",
|
||||
"requires": {
|
||||
"esbuild-android-64": "0.14.28",
|
||||
"esbuild-android-arm64": "0.14.28",
|
||||
"esbuild-darwin-64": "0.14.28",
|
||||
"esbuild-darwin-arm64": "0.14.28",
|
||||
"esbuild-freebsd-64": "0.14.28",
|
||||
"esbuild-freebsd-arm64": "0.14.28",
|
||||
"esbuild-linux-32": "0.14.28",
|
||||
"esbuild-linux-64": "0.14.28",
|
||||
"esbuild-linux-arm": "0.14.28",
|
||||
"esbuild-linux-arm64": "0.14.28",
|
||||
"esbuild-linux-mips64le": "0.14.28",
|
||||
"esbuild-linux-ppc64le": "0.14.28",
|
||||
"esbuild-linux-riscv64": "0.14.28",
|
||||
"esbuild-linux-s390x": "0.14.28",
|
||||
"esbuild-netbsd-64": "0.14.28",
|
||||
"esbuild-openbsd-64": "0.14.28",
|
||||
"esbuild-sunos-64": "0.14.28",
|
||||
"esbuild-windows-32": "0.14.28",
|
||||
"esbuild-windows-64": "0.14.28",
|
||||
"esbuild-windows-arm64": "0.14.28"
|
||||
"esbuild-android-64": "0.14.36",
|
||||
"esbuild-android-arm64": "0.14.36",
|
||||
"esbuild-darwin-64": "0.14.36",
|
||||
"esbuild-darwin-arm64": "0.14.36",
|
||||
"esbuild-freebsd-64": "0.14.36",
|
||||
"esbuild-freebsd-arm64": "0.14.36",
|
||||
"esbuild-linux-32": "0.14.36",
|
||||
"esbuild-linux-64": "0.14.36",
|
||||
"esbuild-linux-arm": "0.14.36",
|
||||
"esbuild-linux-arm64": "0.14.36",
|
||||
"esbuild-linux-mips64le": "0.14.36",
|
||||
"esbuild-linux-ppc64le": "0.14.36",
|
||||
"esbuild-linux-riscv64": "0.14.36",
|
||||
"esbuild-linux-s390x": "0.14.36",
|
||||
"esbuild-netbsd-64": "0.14.36",
|
||||
"esbuild-openbsd-64": "0.14.36",
|
||||
"esbuild-sunos-64": "0.14.36",
|
||||
"esbuild-windows-32": "0.14.36",
|
||||
"esbuild-windows-64": "0.14.36",
|
||||
"esbuild-windows-arm64": "0.14.36"
|
||||
}
|
||||
},
|
||||
"esbuild-android-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.28.tgz",
|
||||
"integrity": "sha512-A52C3zq+9tNwCqZ+4kVLBxnk/WnrYM8P2+QNvNE9B6d2OVPs214lp3g6UyO+dKDhUdefhfPCuwkP8j2A/+szNA==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz",
|
||||
"integrity": "sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-android-arm64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.28.tgz",
|
||||
"integrity": "sha512-sm0fDEGElZhMC3HLZeECI2juE4aG7uPfMBMqNUhy9CeX399Pz8rC6e78OXMXInGjSdEAwQmCOHmfsP7uv3Q8rA==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz",
|
||||
"integrity": "sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-darwin-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.28.tgz",
|
||||
"integrity": "sha512-nzDd7mQ44FvsFHtOafZdBgn3Li5SMsnMnoz1J2MM37xJmR3wGNTFph88KypjHgWqwbxCI7MXS1U+sN4qDeeW6Q==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz",
|
||||
"integrity": "sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-darwin-arm64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.28.tgz",
|
||||
"integrity": "sha512-XEq/bLR/glsUl+uGrBimQzOVs/CmwI833fXUhP9xrLI3IJ+rKyrZ5IA8u+1crOEf1LoTn8tV+hInmX6rGjbScw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz",
|
||||
"integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-freebsd-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.28.tgz",
|
||||
"integrity": "sha512-rTKLgUj/HEcPeE5XZ7IZwWpFx7IWMfprN7QRk/TUJE1s1Ipb58esboIesUpjirJz/BwrgHq+FDG9ChAI8dZAtQ==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz",
|
||||
"integrity": "sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-freebsd-arm64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.28.tgz",
|
||||
"integrity": "sha512-sBffxD1UMOsB7aWMoExmipycjcy3HJGwmqE4GQZUTZvdiH4GhjgUiVdtPyt7kSCdL40JqnWQJ4b1l8Y51oCF4Q==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz",
|
||||
"integrity": "sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-32": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.28.tgz",
|
||||
"integrity": "sha512-+Wxidh3fBEQ9kHcCsD4etlBTMb1n6QY2uXv3rFhVn88CY/JP782MhA57/ipLMY4kOLeSKEuFGN4rtjHuhmRMig==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz",
|
||||
"integrity": "sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.28.tgz",
|
||||
"integrity": "sha512-7+xgsC4LvR6cnzaBdiljNnPDjbkwzahogN+S9uy9AoYw7ZjPnnXc6sjQAVCbqGb7MEgrWdpa6u/Tao79i4lWxg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz",
|
||||
"integrity": "sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-arm": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.28.tgz",
|
||||
"integrity": "sha512-L5isjmlLbh9E0WVllXiVETbScgMbth/+XkXQii1WwgO1RvLIfaGrVFz8d2n6EH/ImtgYxPYGx+OcvIKQBc91Rg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz",
|
||||
"integrity": "sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-arm64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.28.tgz",
|
||||
"integrity": "sha512-EjRHgwg+kgXABzyoPGPOPg4d5wZqRnZ/ZAxBDzLY+i6DS8OUfTSlZHWIOZzU4XF7125WxRBg9ULbrFJBl+57Eg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz",
|
||||
"integrity": "sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-mips64le": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.28.tgz",
|
||||
"integrity": "sha512-krx9SSg7yfiUKk64EmjefOyiEF6nv2bRE4um/LiTaQ6Y/6FP4UF3/Ou/AxZVyR154uSRq63xejcAsmswXAYRsw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz",
|
||||
"integrity": "sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-ppc64le": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.28.tgz",
|
||||
"integrity": "sha512-LD0Xxu9g+DNuhsEBV5QuVZ4uKVBMup0xPIruLweuAf9/mHXFnaCuNXUBF5t0DxKl7GQ5MSioKtnb92oMo+QXEw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz",
|
||||
"integrity": "sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-riscv64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.28.tgz",
|
||||
"integrity": "sha512-L/DWfRh2P0vxq4Y+qieSNXKGdMg+e9Qe8jkbN2/8XSGYDTPzO2OcAxSujob4qIh7iSl+cknbXV+BvH0YFR0jbg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz",
|
||||
"integrity": "sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-linux-s390x": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.28.tgz",
|
||||
"integrity": "sha512-rrgxmsbmL8QQknWGnAL9bGJRQYLOi2AzXy5OTwfhxnj9eqjo5mSVbJXjgiq5LPUAMQZGdPH5yaNK0obAXS81Zw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz",
|
||||
"integrity": "sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-loader": {
|
||||
@@ -5680,39 +5736,39 @@
|
||||
}
|
||||
},
|
||||
"esbuild-netbsd-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.28.tgz",
|
||||
"integrity": "sha512-h8wntIyOR8/xMVVM6TvJxxWKh4AjmLK87IPKpuVi8Pq0kyk0RMA+eo4PFGk5j2XK0D7dj8PcSF5NSlP9kN/j0A==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz",
|
||||
"integrity": "sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-openbsd-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.28.tgz",
|
||||
"integrity": "sha512-HBv18rVapbuDx52/fhZ/c/w6TXyaQAvRxiDDn5Hz/pBcwOs3cdd2WxeIKlWmDoqm2JMx5EVlq4IWgoaRX9mVkw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz",
|
||||
"integrity": "sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-sunos-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.28.tgz",
|
||||
"integrity": "sha512-zlIxePhZxKYheR2vBCgPVvTixgo/ozOfOMoP6RZj8dxzquU1NgeyhjkcRXucbLCtmoNJ+i4PtWwPZTLuDd3bGg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz",
|
||||
"integrity": "sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-windows-32": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.28.tgz",
|
||||
"integrity": "sha512-am9DIJxXlld1BOAY/VlvBQHMUCPL7S3gB/lnXIY3M4ys0gfuRqPf4EvMwZMzYUbFKBY+/Qb8SRgPRRGhwnJ8Kg==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz",
|
||||
"integrity": "sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-windows-64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.28.tgz",
|
||||
"integrity": "sha512-78PhySDnmRZlsPNp/W/5Fim8iivlBQQxfhBFIqR7xwvfDmCFUSByyMKP7LCHgNtb04yNdop8nJJkJaQ8Xnwgiw==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz",
|
||||
"integrity": "sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ==",
|
||||
"optional": true
|
||||
},
|
||||
"esbuild-windows-arm64": {
|
||||
"version": "0.14.28",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.28.tgz",
|
||||
"integrity": "sha512-VhXGBTo6HELD8zyHXynV6+L2jWx0zkKnGx4TmEdSBK7UVFACtOyfUqpToG0EtnYyRZ0HESBhzPSVpP781ovmvA==",
|
||||
"version": "0.14.36",
|
||||
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz",
|
||||
"integrity": "sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q==",
|
||||
"optional": true
|
||||
},
|
||||
"escalade": {
|
||||
@@ -7035,9 +7091,9 @@
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"fs-extra": {
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
|
||||
"integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
|
||||
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
@@ -9310,12 +9366,9 @@
|
||||
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
|
||||
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
}
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
@@ -9616,9 +9669,9 @@
|
||||
}
|
||||
},
|
||||
"loader-runner": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
|
||||
"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw=="
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
|
||||
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "2.0.2",
|
||||
@@ -10386,9 +10439,9 @@
|
||||
"integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is="
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.29.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
|
||||
"version": "2.29.3",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
|
||||
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
|
||||
},
|
||||
"moment-recur": {
|
||||
"version": "1.0.7",
|
||||
@@ -10754,20 +10807,20 @@
|
||||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
|
||||
},
|
||||
"nconf": {
|
||||
"version": "0.11.3",
|
||||
"resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.3.tgz",
|
||||
"integrity": "sha512-iYsAuDS9pzjVMGIzJrGE0Vk3Eh8r/suJanRAnWGBd29rVS2XtSgzcAo5l6asV3e4hH2idVONHirg1efoBOslBg==",
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz",
|
||||
"integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==",
|
||||
"requires": {
|
||||
"async": "^1.4.0",
|
||||
"async": "^3.0.0",
|
||||
"ini": "^2.0.0",
|
||||
"secure-keys": "^1.0.0",
|
||||
"yargs": "^16.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
|
||||
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
@@ -10777,11 +10830,6 @@
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
||||
},
|
||||
"cliui": {
|
||||
"version": "7.0.4",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
|
||||
@@ -10816,11 +10864,11 @@
|
||||
"integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
|
||||
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"requires": {
|
||||
"ansi-regex": "^5.0.0"
|
||||
"ansi-regex": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"wrap-ansi": {
|
||||
@@ -11908,9 +11956,9 @@
|
||||
}
|
||||
},
|
||||
"prismjs": {
|
||||
"version": "1.27.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
|
||||
"integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
|
||||
"version": "1.28.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
|
||||
"integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw=="
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
@@ -12058,11 +12106,6 @@
|
||||
"strict-uri-encode": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"querystringify": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
|
||||
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
|
||||
},
|
||||
"queue": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
|
||||
@@ -12100,16 +12143,33 @@
|
||||
"integrity": "sha512-8DVFOe89rreyut/vzwBI7vgXJynyYoYnH5XogtAKs0F/neAbCTTglXxSJ7fZeZamcFXZDvMidCBvps4KM+1srw=="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.4.3",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
|
||||
"integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
|
||||
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
|
||||
"requires": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "1.8.1",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
||||
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
||||
"requires": {
|
||||
"depd": "2.0.0",
|
||||
"inherits": "2.0.4",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"toidentifier": "1.0.1"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
@@ -12117,6 +12177,11 @@
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
},
|
||||
"statuses": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -12546,11 +12611,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"requires-port": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.17.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
|
||||
@@ -13059,13 +13119,13 @@
|
||||
}
|
||||
},
|
||||
"sinon": {
|
||||
"version": "13.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz",
|
||||
"integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==",
|
||||
"version": "13.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz",
|
||||
"integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@sinonjs/commons": "^1.8.3",
|
||||
"@sinonjs/fake-timers": "^9.0.0",
|
||||
"@sinonjs/fake-timers": "^9.1.2",
|
||||
"@sinonjs/samsam": "^6.1.1",
|
||||
"diff": "^5.0.0",
|
||||
"nise": "^5.1.1",
|
||||
@@ -13717,12 +13777,12 @@
|
||||
}
|
||||
},
|
||||
"stripe": {
|
||||
"version": "8.212.0",
|
||||
"resolved": "https://registry.npmjs.org/stripe/-/stripe-8.212.0.tgz",
|
||||
"integrity": "sha512-xQ2uPMRAmRyOiMZktw3hY8jZ8LFR9lEQRPEaQ5WcDcn51kMyn46GeikOikxiFTHEN8PeKRdwtpz4yNArAvu/Kg==",
|
||||
"version": "8.219.0",
|
||||
"resolved": "https://registry.npmjs.org/stripe/-/stripe-8.219.0.tgz",
|
||||
"integrity": "sha512-leQj9h2T4jhEz4Ta4irNTNgErPmXfF9h4nRYblTTrkTqldOmEWZQZIgXkNp1u6/UbOmMDRvxgh57UHyxwwfw0Q==",
|
||||
"requires": {
|
||||
"@types/node": ">=8.1.0",
|
||||
"qs": "^6.6.0"
|
||||
"qs": "^6.10.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"qs": {
|
||||
@@ -13746,9 +13806,9 @@
|
||||
"integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ=="
|
||||
},
|
||||
"superagent": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz",
|
||||
"integrity": "sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ==",
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.2.tgz",
|
||||
"integrity": "sha512-o9/fP6dww7a4xmEF5a484o2rG34UUGo8ztDlv7vbCWuqPhpndMi0f7eXxdlryk5U12Kzy46nh8eNpLAJ93Alsg==",
|
||||
"requires": {
|
||||
"component-emitter": "^1.3.0",
|
||||
"cookiejar": "^2.1.3",
|
||||
@@ -13764,9 +13824,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.3.3",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
|
||||
"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||
"requires": {
|
||||
"ms": "2.1.2"
|
||||
}
|
||||
@@ -14799,15 +14859,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"url-parse": {
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
|
||||
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
|
||||
"requires": {
|
||||
"querystringify": "^2.1.1",
|
||||
"requires-port": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"url-parse-lax": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
|
||||
@@ -15178,9 +15229,9 @@
|
||||
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
|
||||
},
|
||||
"webpack": {
|
||||
"version": "5.70.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
|
||||
"integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
|
||||
"version": "5.72.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz",
|
||||
"integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==",
|
||||
"requires": {
|
||||
"@types/eslint-scope": "^3.7.3",
|
||||
"@types/estree": "^0.0.51",
|
||||
@@ -15238,9 +15289,9 @@
|
||||
}
|
||||
},
|
||||
"graceful-fs": {
|
||||
"version": "4.2.9",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
|
||||
"integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
|
||||
"version": "4.2.10",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
|
||||
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
|
||||
},
|
||||
"webpack-sources": {
|
||||
"version": "3.2.3",
|
||||
@@ -15428,9 +15479,9 @@
|
||||
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw=="
|
||||
},
|
||||
"winston": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/winston/-/winston-3.6.0.tgz",
|
||||
"integrity": "sha512-9j8T75p+bcN6D00sF/zjFVmPp+t8KMPB1MzbbzYjeN9VWxdsYnTB40TkbNUEXAmILEfChMvAMgidlX64OG3p6w==",
|
||||
"version": "3.7.2",
|
||||
"resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz",
|
||||
"integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==",
|
||||
"requires": {
|
||||
"@dabh/diagnostics": "^2.0.2",
|
||||
"async": "^3.2.3",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.226.0",
|
||||
"version": "4.229.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.17.8",
|
||||
"@babel/core": "^7.17.9",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/register": "^7.17.7",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
@@ -13,10 +13,10 @@
|
||||
"accepts": "^1.3.8",
|
||||
"amazon-payments": "^0.2.9",
|
||||
"amplitude": "^6.0.0",
|
||||
"apidoc": "^0.51.0",
|
||||
"apidoc": "^0.51.1",
|
||||
"apple-auth": "^1.0.7",
|
||||
"bcrypt": "^5.0.1",
|
||||
"body-parser": "^1.19.2",
|
||||
"body-parser": "^1.20.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^2.0.0",
|
||||
@@ -47,11 +47,11 @@
|
||||
"lodash": "^4.17.21",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
"moment": "^2.29.1",
|
||||
"moment": "^2.29.3",
|
||||
"moment-recur": "^1.0.7",
|
||||
"mongoose": "^5.13.7",
|
||||
"morgan": "^1.10.0",
|
||||
"nconf": "^0.11.3",
|
||||
"nconf": "^0.12.0",
|
||||
"node-gcm": "^1.0.5",
|
||||
"on-headers": "^1.0.2",
|
||||
"passport": "^0.5.0",
|
||||
@@ -67,14 +67,14 @@
|
||||
"remove-markdown": "^0.3.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^4.2.0",
|
||||
"stripe": "^8.212.0",
|
||||
"superagent": "^7.1.1",
|
||||
"stripe": "^8.219.0",
|
||||
"superagent": "^7.1.2",
|
||||
"universal-analytics": "^0.5.3",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.6.0",
|
||||
"winston": "^3.7.2",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
@@ -122,7 +122,7 @@
|
||||
"monk": "^7.3.4",
|
||||
"require-again": "^2.0.0",
|
||||
"run-rs": "^0.7.6",
|
||||
"sinon": "^13.0.1",
|
||||
"sinon": "^13.0.2",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"sinon-stub-promise": "^4.0.0"
|
||||
},
|
||||
|
||||
@@ -40,7 +40,7 @@ async function deleteHabiticaData (user, email) {
|
||||
'auth.local.passwordHashMethod': 'bcrypt',
|
||||
};
|
||||
if (!user.auth.local.email) set['auth.local.email'] = `${user._id}@example.com`;
|
||||
await User.update(
|
||||
await User.updateOne(
|
||||
{ _id: user._id },
|
||||
{ $set: set },
|
||||
);
|
||||
|
||||
@@ -128,6 +128,22 @@ describe('cron middleware', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('runs cron if previous cron was incomplete', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 1 });
|
||||
user.auth.timestamps.loggedin = moment(new Date()).subtract({ days: 4 });
|
||||
const now = new Date();
|
||||
await user.save();
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
expect(moment(now).isSame(user.lastCron, 'day'));
|
||||
expect(moment(now).isSame(user.auth.timestamps.loggedin, 'day'));
|
||||
return resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('updates user.auth.timestamps.loggedin and lastCron', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 2 });
|
||||
const now = new Date();
|
||||
@@ -293,4 +309,33 @@ describe('cron middleware', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('cron should not run more than once', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 2 });
|
||||
await user.save();
|
||||
|
||||
sandbox.spy(cronLib, 'cron');
|
||||
|
||||
await Promise.all([new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}), new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}), new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}, 400);
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(cronLib.cron).to.be.calledOnce;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -811,6 +811,16 @@ describe('User Model', () => {
|
||||
expect(daysMissed).to.eql(5);
|
||||
});
|
||||
|
||||
it('correctly handles a cron that did not complete', () => {
|
||||
const now = moment();
|
||||
user.lastCron = moment(now).subtract(2, 'days');
|
||||
user.auth.timestamps.loggedIn = moment(now).subtract(5, 'days');
|
||||
|
||||
const { daysMissed } = user.daysUserHasMissed(now);
|
||||
|
||||
expect(daysMissed).to.eql(5);
|
||||
});
|
||||
|
||||
it('uses timezone from preferences to calculate days missed', () => {
|
||||
const now = moment('2017-07-08 01:00:00Z');
|
||||
user.lastCron = moment('2017-07-04 13:00:00Z');
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
@@ -9,15 +10,18 @@ describe('GET /user/auth/apple', () => {
|
||||
let api;
|
||||
let user;
|
||||
const appleEndpoint = '/user/auth/apple';
|
||||
|
||||
before(async () => {
|
||||
const expectedResult = { id: 'appleId', name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
let randomAppleId = '123456';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAppleId = generateUUID();
|
||||
const expectedResult = { id: randomAppleId, name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
appleAuth.appleProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
@@ -26,7 +30,7 @@ describe('GET /user/auth/apple', () => {
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal('appleId');
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal(randomAppleId);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('an apple user');
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import passport from 'passport';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
@@ -10,14 +11,15 @@ describe('POST /user/auth/social', () => {
|
||||
let api;
|
||||
let user;
|
||||
const endpoint = '/user/auth/social';
|
||||
const randomAccessToken = '123456';
|
||||
const facebookId = 'facebookId';
|
||||
const googleId = 'googleId';
|
||||
let randomAccessToken = '123456';
|
||||
let randomFacebookId = 'facebookId';
|
||||
let randomGoogleId = 'googleId';
|
||||
let network = 'NoNetwork';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAccessToken = generateUUID();
|
||||
});
|
||||
|
||||
it('fails if network is not supported', async () => {
|
||||
@@ -32,12 +34,23 @@ describe('POST /user/auth/social', () => {
|
||||
});
|
||||
|
||||
describe('facebook', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: facebookId, displayName: 'a facebook user' };
|
||||
beforeEach(async () => {
|
||||
randomFacebookId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+facebook@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
network = 'facebook';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -51,7 +64,8 @@ describe('POST /user/auth/social', () => {
|
||||
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
|
||||
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(facebookId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+facebook@example.com`);
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(randomFacebookId);
|
||||
});
|
||||
|
||||
it('logs an existing user in', async () => {
|
||||
@@ -68,6 +82,57 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
@@ -76,11 +141,28 @@ describe('POST /user/auth/social', () => {
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -92,12 +174,23 @@ describe('POST /user/auth/social', () => {
|
||||
});
|
||||
|
||||
describe('google', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: googleId, displayName: 'a google user' };
|
||||
beforeEach(async () => {
|
||||
randomGoogleId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+google@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
network = 'google';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -107,7 +200,8 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(googleId);
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(randomGoogleId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+google@example.com`);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
|
||||
});
|
||||
|
||||
@@ -125,6 +219,57 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
@@ -133,11 +278,28 @@ describe('POST /user/auth/social', () => {
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import moment from 'moment';
|
||||
|
||||
import { startOfDay, daysSince } from '../../../website/common/script/cron';
|
||||
import { startOfDay, daysSince, getPlanContext } from '../../../website/common/script/cron';
|
||||
|
||||
function localMoment (timeString, utcOffset) {
|
||||
return moment(timeString).utcOffset(utcOffset, true);
|
||||
@@ -181,4 +181,63 @@ describe('cron utility functions', () => {
|
||||
expect(result).to.equal(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getPlanContext', () => {
|
||||
const now = new Date(2022, 5, 1);
|
||||
|
||||
function baseUserData (count, offset, planId) {
|
||||
return {
|
||||
purchased: {
|
||||
plan: {
|
||||
consecutive: {
|
||||
count,
|
||||
offset,
|
||||
gemCapExtra: 25,
|
||||
trinkets: 19,
|
||||
},
|
||||
quantity: 1,
|
||||
extraMonths: 0,
|
||||
gemsBought: 0,
|
||||
owner: '116b4133-8fb7-43f2-b0de-706621a8c9d8',
|
||||
nextBillingDate: null,
|
||||
nextPaymentProcessing: null,
|
||||
planId,
|
||||
customerId: 'group-plan',
|
||||
dateUpdated: '2022-05-10T03:00:00.144+01:00',
|
||||
paymentMethod: 'Group Plan',
|
||||
dateTerminated: null,
|
||||
lastBillingDate: null,
|
||||
dateCreated: '2017-02-10T19:00:00.355+01:00',
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
it('offset 0, next date in 3 months', () => {
|
||||
const user = baseUserData(60, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-08-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 1, next date in 1 months', () => {
|
||||
const user = baseUserData(60, 1, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 2, next date in 2 months - with any plan', () => {
|
||||
const user = baseUserData(60, 2, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-07-10T02:00:00.144Z');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import getters from '@/store/getters';
|
||||
|
||||
export const userStyles = {
|
||||
contributor: {
|
||||
@@ -82,3 +83,25 @@ export const userStyles = {
|
||||
classSelected: true,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
export function mockStore ({
|
||||
userData,
|
||||
...state
|
||||
}) {
|
||||
return {
|
||||
getters,
|
||||
dispatch: () => {
|
||||
},
|
||||
watch: () => {
|
||||
},
|
||||
state: {
|
||||
user: {
|
||||
data: {
|
||||
...userData,
|
||||
},
|
||||
},
|
||||
...state,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,36 +1,46 @@
|
||||
.quest_lostMasterclasser4 {
|
||||
background: url("~@/assets/images/animated/quest_lostMasterclasser4.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_lostMasterclasser4.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.quest_windup {
|
||||
background: url("~@/assets/images/animated/quest_windup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_windup.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.quest_solarSystem {
|
||||
background: url("~@/assets/images/animated/quest_solarSystem.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_solarSystem.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert, .Pet_HatchingPotion_Veggie, .Pet_HatchingPotion_Windup {
|
||||
.quest_virtualpet {
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_virtualpet.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert, .Pet_HatchingPotion_Veggie, .Pet_HatchingPotion_Windup, .Pet_HatchingPotion_VirtualPet {
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Dessert.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Dessert.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Veggie {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Veggie.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Veggie.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Windup {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Windup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Windup.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_VirtualPet {
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_VirtualPet.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Gems {
|
||||
@@ -68,7 +78,7 @@
|
||||
|
||||
/* Critical */
|
||||
.weapon_special_critical {
|
||||
background: url("~@/assets/images/animated/weapon_special_critical.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_critical.gif") no-repeat;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
margin-left:-12px;
|
||||
@@ -85,32 +95,32 @@
|
||||
}
|
||||
|
||||
.head_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-ShadeHelmet.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-ShadeHelmet.gif") no-repeat;
|
||||
}
|
||||
.head_special_1 {
|
||||
background: url("~@/assets/images/animated/ContributorOnly-Equip-CrystalHelmet.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/ContributorOnly-Equip-CrystalHelmet.gif") no-repeat;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.broad_armor_special_0,.slim_armor_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-ShadeArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-ShadeArmor.gif") no-repeat;
|
||||
}
|
||||
.broad_armor_special_1,.slim_armor_special_1 {
|
||||
background: url("~@/assets/images/animated/ContributorOnly-Equip-CrystalArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/ContributorOnly-Equip-CrystalArmor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.shield_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Shield-TormentedSkull.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Shield-TormentedSkull.gif") no-repeat;
|
||||
}
|
||||
|
||||
.weapon_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Weapon-DarkSoulsBlade.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Weapon-DarkSoulsBlade.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet-Wolf-Cerberus {
|
||||
width: 105px;
|
||||
height: 72px;
|
||||
background: url("~@/assets/images/animated/BackerOnly-Pet-CerberusPup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Pet-CerberusPup.gif") no-repeat;
|
||||
}
|
||||
|
||||
.broad_armor_special_ks2019, .slim_armor_special_ks2019, .eyewear_special_ks2019, .head_special_ks2019, .shield_special_ks2019 {
|
||||
@@ -119,29 +129,29 @@
|
||||
}
|
||||
|
||||
.broad_armor_special_ks2019, .slim_armor_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonArmor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.eyewear_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonVisor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonVisor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.head_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonHelm.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonHelm.gif") no-repeat;
|
||||
}
|
||||
|
||||
.shield_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonShield.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonShield.gif") no-repeat;
|
||||
}
|
||||
|
||||
.weapon_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonGlaive.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonGlaive.gif") no-repeat;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
.Pet-Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Pet-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Pet-Gryphatrice.gif") no-repeat;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -152,11 +162,11 @@
|
||||
}
|
||||
|
||||
.Mount_Head_Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Mount-Head-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Head-Gryphatrice.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Mount_Body_Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_airship, .background_clocktower, .background_steamworks {
|
||||
@@ -165,15 +175,15 @@
|
||||
}
|
||||
|
||||
.background_airship {
|
||||
background: url("~@/assets/images/animated/background_airship.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_airship.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_clocktower {
|
||||
background: url("~@/assets/images/animated/background_clocktower.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_clocktower.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_steamworks {
|
||||
background: url("~@/assets/images/animated/background_steamworks.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_steamworks.gif") no-repeat;
|
||||
}
|
||||
|
||||
/* FIXME figure out how to handle customize menu!!
|
||||
|
||||
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 992 B |
|
Before Width: | Height: | Size: 872 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 759 B |
@@ -19,6 +19,11 @@
|
||||
top: -16px !important;
|
||||
}
|
||||
|
||||
.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert {
|
||||
.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert, .Pet.Pet-FlyingPig-VirtualPet {
|
||||
top: -28px !important;
|
||||
}
|
||||
|
||||
.Pet[class*="Virtual"] {
|
||||
left: 1.25rem;
|
||||
bottom: 0.5rem;
|
||||
}
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
</li>
|
||||
<li v-if="user">
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
@@ -224,7 +224,7 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-5 text-center text-md-left">
|
||||
© 2022 Habitica. All rights reserved.
|
||||
© {{ currentYear }} Habitica. All rights reserved.
|
||||
<div
|
||||
v-if="!IS_PRODUCTION && isUserLoaded"
|
||||
class="debug float-left"
|
||||
@@ -512,6 +512,10 @@ export default {
|
||||
if (!this.user) return null;
|
||||
return `${base}?uuid=${this.user._id}`;
|
||||
},
|
||||
currentYear () {
|
||||
const currentDate = new Date();
|
||||
return currentDate.getFullYear();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
plusTenHealth () {
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="form-group row text-center"
|
||||
v-if="!registering"
|
||||
class="form-group row text-center"
|
||||
>
|
||||
<div class="col-12 col-md-12">
|
||||
<div
|
||||
@@ -269,13 +269,13 @@
|
||||
<label
|
||||
v-once
|
||||
for="usernameInput"
|
||||
>{{ $t('email') }}</label>
|
||||
>{{ $t('emailOrUsername') }}</label>
|
||||
<input
|
||||
id="usernameInput"
|
||||
v-model="username"
|
||||
class="form-control"
|
||||
type="text"
|
||||
:placeholder="$t('emailPlaceholder')"
|
||||
:placeholder="$t('emailUsernamePlaceholder')"
|
||||
>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
></span>
|
||||
<!-- Pet-->
|
||||
<span
|
||||
v-if="member.items.currentPet"
|
||||
class="current-pet"
|
||||
:class="petClass"
|
||||
></span>
|
||||
@@ -131,10 +130,12 @@
|
||||
import some from 'lodash/some';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import foolPet from '../mixins/foolPet';
|
||||
|
||||
import ClassBadge from '@/components/members/classBadge';
|
||||
|
||||
export default {
|
||||
mixins: [foolPet],
|
||||
components: {
|
||||
ClassBadge,
|
||||
},
|
||||
@@ -243,11 +244,12 @@ export default {
|
||||
petClass () {
|
||||
if (some(
|
||||
this.currentEventList,
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert',
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual',
|
||||
)) {
|
||||
return `Pet-${this.member.items.currentPet} invert`;
|
||||
return this.foolPet(this.member.items.currentPet);
|
||||
}
|
||||
return `Pet-${this.member.items.currentPet}`;
|
||||
if (this.member.items.currentPet) return `Pet-${this.member.items.currentPet}`;
|
||||
return '';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -125,6 +125,16 @@ export default {
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
background-color: $white;
|
||||
|
||||
.sprite.customize-option.shirt {
|
||||
margin-left: -3px !important;
|
||||
// otherwise its overriden by the .outer-option-background:not(.none) { rules
|
||||
}
|
||||
|
||||
.sprite.customize-option.skin {
|
||||
margin-left: -8px !important;
|
||||
// otherwise its overriden by the .outer-option-background:not(.none) { rules
|
||||
}
|
||||
|
||||
.option {
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
@@ -203,17 +213,9 @@ export default {
|
||||
.outer-option-background:not(.none) {
|
||||
|
||||
.sprite.customize-option {
|
||||
// margin: 0 auto;
|
||||
//margin-left: -3px;
|
||||
//margin-top: -7px;
|
||||
margin-top: 0;
|
||||
margin-left: 0;
|
||||
|
||||
&.size, &.shirt {
|
||||
margin-top: -8px;
|
||||
margin-left: -4px;
|
||||
}
|
||||
|
||||
&.color-bangs {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
@@ -12,12 +12,18 @@
|
||||
{{ $t('reportBug') }}
|
||||
</h2>
|
||||
|
||||
<div v-once class="report-bug-header-describe">
|
||||
<div
|
||||
v-once
|
||||
class="report-bug-header-describe"
|
||||
>
|
||||
{{ $t('reportBugHeaderDescribe') }}
|
||||
</div>
|
||||
|
||||
<div class="dialog-close">
|
||||
<close-icon @click="close()" :purple="true"/>
|
||||
<close-icon
|
||||
:purple="true"
|
||||
@click="close()"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@@ -34,7 +40,10 @@
|
||||
>
|
||||
{{ $t('email') }}
|
||||
</label>
|
||||
<div class="mb-2 description-label" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="mb-2 description-label"
|
||||
>
|
||||
{{ $t('reportEmailText') }}
|
||||
</div>
|
||||
<input
|
||||
@@ -47,7 +56,10 @@
|
||||
:class="{'input-invalid': emailInvalid, 'input-valid': emailValid}"
|
||||
>
|
||||
|
||||
<div class="error-label mt-2" v-if="emailInvalid">
|
||||
<div
|
||||
v-if="emailInvalid"
|
||||
class="error-label mt-2"
|
||||
>
|
||||
{{ $t('reportEmailError') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -55,7 +67,10 @@
|
||||
<label v-once>
|
||||
{{ $t('reportDescription') }}
|
||||
</label>
|
||||
<div class="mb-2 description-label" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="mb-2 description-label"
|
||||
>
|
||||
{{ $t('reportDescriptionText') }}
|
||||
</div>
|
||||
<textarea
|
||||
|
||||
@@ -17,15 +17,22 @@
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="svg-icon check-icon"
|
||||
v-html="icons.checkCircleIcon"
|
||||
<span
|
||||
class="svg-icon check-icon"
|
||||
v-html="icons.checkCircleIcon"
|
||||
></span>
|
||||
|
||||
<div class="title" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="title"
|
||||
>
|
||||
{{ $t('reportSent') }}
|
||||
</div>
|
||||
|
||||
<div class="text mt-3 mb-4" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="text mt-3 mb-4"
|
||||
>
|
||||
{{ $t('reportSentDescription') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -143,12 +150,12 @@ export default {
|
||||
modalId: MODALS.BUG_REPORT_SUCCESS,
|
||||
};
|
||||
},
|
||||
computed: {},
|
||||
mounted () {},
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', MODALS.BUG_REPORT_SUCCESS);
|
||||
},
|
||||
},
|
||||
computed: {},
|
||||
mounted () {},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
<toggle-switch
|
||||
v-model="filterBackgrounds"
|
||||
class="backgroundFilterToggle"
|
||||
:label="'Hide locked backgrounds'"
|
||||
:label="$t('hideLockedBackgrounds')"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
@@ -247,6 +247,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<sub-menu
|
||||
v-if="!filterBackgrounds"
|
||||
class="text-center"
|
||||
:items="bgSubMenuItems"
|
||||
:active-sub-page="activeSubPage"
|
||||
|
||||
@@ -112,7 +112,7 @@ export default {
|
||||
},
|
||||
visualBuffs () {
|
||||
return {
|
||||
snowball: 'snowman',
|
||||
snowball: `avatar_snowball_${this.member.stats.class}`,
|
||||
spookySparkles: 'ghost',
|
||||
shinySeed: `avatar_floral_${this.member.stats.class}`,
|
||||
seafoam: 'seafoam_star',
|
||||
|
||||
@@ -361,8 +361,8 @@
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
</div>
|
||||
<router-link
|
||||
class="nav-link"
|
||||
:to="{name: 'groupPlan'}"
|
||||
:to="groupPlanTopLink"
|
||||
>
|
||||
{{ $t('group') }}
|
||||
</router-link>
|
||||
@@ -311,8 +311,8 @@
|
||||
</router-link>
|
||||
<a
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
@@ -780,6 +780,13 @@ export default {
|
||||
groupPlans: 'groupPlans.data',
|
||||
modalStack: 'modalStack',
|
||||
}),
|
||||
groupPlanTopLink () {
|
||||
if (!this.groupPlans || this.groupPlans.length === 0) return { name: 'groupPlan' };
|
||||
return {
|
||||
name: 'groupPlanDetailTaskInformation',
|
||||
params: { groupId: this.groupPlans[0]._id },
|
||||
};
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.getUserGroupPlans();
|
||||
@@ -839,7 +846,6 @@ export default {
|
||||
element.classList.add('down');
|
||||
element.lastChild.style.maxHeight = `${element.lastChild.scrollHeight}px`;
|
||||
},
|
||||
|
||||
closeMenu () {
|
||||
Array.from(document.getElementsByClassName('droppable')).forEach(droppableElement => {
|
||||
this.closeDropdown(droppableElement);
|
||||
|
||||
@@ -114,11 +114,13 @@ import some from 'lodash/some';
|
||||
import moment from 'moment';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { mapState } from '@/libs/store';
|
||||
import foolPet from '@/mixins/foolPet';
|
||||
import {
|
||||
isAllowedToFeed, isHatchable, isOwned, isSpecial,
|
||||
} from '../../../libs/createAnimal';
|
||||
|
||||
export default {
|
||||
mixins: [foolPet],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
@@ -169,9 +171,10 @@ export default {
|
||||
getPetItemClass () {
|
||||
if (this.isOwned() && some(
|
||||
this.currentEventList,
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert',
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual',
|
||||
)) {
|
||||
return `Pet Pet-${this.item.key} ${this.item.eggKey} invert`;
|
||||
const petString = `${this.item.eggKey}-${this.item.key}`;
|
||||
return `Pet ${this.foolPet(petString)}`;
|
||||
}
|
||||
|
||||
if (this.isOwned() || (this.mountOwned() && this.isHatchable())) {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { setup as setupPayments } from '@/libs/payments';
|
||||
|
||||
setupPayments();
|
||||
|
||||
storiesOf('Payments Buttons', module)
|
||||
storiesOf('Subscriptions/Payments Buttons', module)
|
||||
.add('simple', () => ({
|
||||
components: { PaymentsButtonsList },
|
||||
template: `
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<h5>{{ $t('dayStartAdjustment') }}</h5>
|
||||
<div class="mb-4">
|
||||
{{ $t('customDayStartInfo1') }}
|
||||
</div>
|
||||
<h3 v-once>{{ $t('adjustment') }}</h3>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="">
|
||||
<select
|
||||
v-model="newDayStart"
|
||||
class="form-control"
|
||||
>
|
||||
<option
|
||||
v-for="option in dayStartOptions"
|
||||
:key="option.value"
|
||||
:value="option.value"
|
||||
>
|
||||
{{ option.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
class="btn btn-primary full-width mt-3"
|
||||
:disabled="newDayStart === user.preferences.dayStart"
|
||||
@click="openDayStartModal()"
|
||||
>
|
||||
{{ $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<small>
|
||||
<p v-html="$t('timezoneUTC', {utc: timezoneOffsetToUtc})"></p>
|
||||
<p v-html="$t('timezoneInfo')"></p>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import moment from 'moment';
|
||||
import getUtcOffset from '../../../../common/script/fns/getUtcOffset';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
export default {
|
||||
name: 'dayStartAdjustment',
|
||||
data () {
|
||||
const dayStartOptions = [];
|
||||
for (let number = 0; number <= 12; number += 1) {
|
||||
const meridian = number < 12 ? 'AM' : 'PM';
|
||||
const hour = number % 12;
|
||||
const timeWithMeridian = `(${hour || 12}:00 ${meridian})`;
|
||||
const option = {
|
||||
value: number,
|
||||
name: `+${number} hours ${timeWithMeridian}`,
|
||||
};
|
||||
|
||||
if (number === 0) {
|
||||
option.name = `Default ${timeWithMeridian}`;
|
||||
}
|
||||
|
||||
dayStartOptions.push(option);
|
||||
}
|
||||
|
||||
return {
|
||||
newDayStart: 0,
|
||||
dayStartOptions,
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
this.newDayStart = this.user.preferences.dayStart;
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
user: 'user.data',
|
||||
}),
|
||||
timezoneOffsetToUtc () {
|
||||
const offsetString = moment().utcOffset(getUtcOffset(this.user)).format('Z');
|
||||
return `UTC${offsetString}`;
|
||||
},
|
||||
dayStart () {
|
||||
return this.user.preferences.dayStart;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async saveDayStart () {
|
||||
this.user.preferences.dayStart = this.newDayStart;
|
||||
await axios.post('/api/v4/user/custom-day-start', {
|
||||
dayStart: this.newDayStart,
|
||||
});
|
||||
// @TODO
|
||||
// Notification.text(response.data.data.message);
|
||||
},
|
||||
openDayStartModal () {
|
||||
const nextCron = this.calculateNextCron();
|
||||
// @TODO: Add generic modal
|
||||
if (!window.confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; // eslint-disable-line no-alert
|
||||
this.saveDayStart();
|
||||
// $rootScope.openModal('change-day-start', { scope: $scope });
|
||||
},
|
||||
calculateNextCron () {
|
||||
let nextCron = moment()
|
||||
.hours(this.newDayStart)
|
||||
.minutes(0)
|
||||
.seconds(0)
|
||||
.milliseconds(0);
|
||||
|
||||
const currentHour = moment().format('H');
|
||||
if (currentHour >= this.newDayStart) {
|
||||
nextCron = nextCron.add(1, 'day');
|
||||
}
|
||||
|
||||
return nextCron.format(`${this.user.preferences.dateFormat.toUpperCase()} @ h:mm a`);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.full-width {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
@@ -7,9 +7,9 @@
|
||||
>
|
||||
<div class="modal-body">
|
||||
<br>
|
||||
<strong v-if="user.auth.local.email">{{ $t('deleteLocalAccountText') }}</strong>
|
||||
<strong v-if="user.auth.local.has_password">{{ $t('deleteLocalAccountText') }}</strong>
|
||||
<strong
|
||||
v-if="!user.auth.local.email"
|
||||
v-if="!user.auth.local.has_password"
|
||||
>{{ $t('deleteSocialAccountText', {magicWord: 'DELETE'}) }}</strong>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
|
||||
@@ -213,49 +213,7 @@
|
||||
{{ $t('enableClass') }}
|
||||
</button>
|
||||
<hr>
|
||||
<div>
|
||||
<h5>{{ $t('customDayStart') }}</h5>
|
||||
<div class="alert alert-warning">
|
||||
{{ $t('customDayStartInfo1') }}
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="col-7">
|
||||
<select
|
||||
v-model="newDayStart"
|
||||
class="form-control"
|
||||
>
|
||||
<option
|
||||
v-for="option in dayStartOptions"
|
||||
:key="option.value"
|
||||
:value="option.value"
|
||||
>
|
||||
{{ option.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<button
|
||||
class="btn btn-block btn-primary mt-1"
|
||||
:disabled="newDayStart === user.preferences.dayStart"
|
||||
@click="openDayStartModal()"
|
||||
>
|
||||
{{ $t('saveCustomDayStart') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</div>
|
||||
<h5>{{ $t('timezone') }}</h5>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="col-12">
|
||||
<p v-html="$t('timezoneUTC', {utc: timezoneOffsetToUtc})"></p>
|
||||
<p v-html="$t('timezoneInfo')"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<day-start-adjustment />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
@@ -268,7 +226,7 @@
|
||||
:key="network.key"
|
||||
>
|
||||
<button
|
||||
v-if="!user.auth[network.key].id"
|
||||
v-if="!user.auth[network.key].id && network.key !== 'facebook'"
|
||||
class="btn btn-primary mb-2"
|
||||
@click="socialAuth(network.key, user)"
|
||||
>
|
||||
@@ -291,14 +249,22 @@
|
||||
</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<div v-if="!user.auth.local.email">
|
||||
<p>{{ $t('addLocalAuth') }}</p>
|
||||
<div v-if="!user.auth.local.has_password">
|
||||
<h5 v-if="!user.auth.local.email">
|
||||
{{ $t('addLocalAuth') }}
|
||||
</h5>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
{{ $t('addPasswordAuth') }}
|
||||
</h5>
|
||||
<div
|
||||
class="form"
|
||||
name="localAuth"
|
||||
novalidate="novalidate"
|
||||
>
|
||||
<div class="form-group">
|
||||
<div
|
||||
v-if="!user.auth.local.email"
|
||||
class="form-group"
|
||||
>
|
||||
<input
|
||||
v-model="localAuth.email"
|
||||
class="form-control"
|
||||
@@ -421,7 +387,9 @@
|
||||
{{ $t('saveAndConfirm') }}
|
||||
</button>
|
||||
</div>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
<h5
|
||||
v-if="user.auth.local.email"
|
||||
>
|
||||
{{ $t('changeEmail') }}
|
||||
</h5>
|
||||
<div
|
||||
@@ -439,7 +407,10 @@
|
||||
:placeholder="$t('newEmail')"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div
|
||||
v-if="user.auth.local.has_password"
|
||||
class="form-group"
|
||||
>
|
||||
<input
|
||||
v-model="emailUpdates.password"
|
||||
class="form-control"
|
||||
@@ -455,11 +426,11 @@
|
||||
{{ $t('submit') }}
|
||||
</button>
|
||||
</div>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
<h5 v-if="user.auth.local.has_password">
|
||||
{{ $t('changePass') }}
|
||||
</h5>
|
||||
<div
|
||||
v-if="user.auth.local.email"
|
||||
v-if="user.auth.local.has_password"
|
||||
class="form"
|
||||
name="changePassword"
|
||||
novalidate="novalidate"
|
||||
@@ -528,25 +499,20 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
input {
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.usersettings h5 {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.iconalert > div > span {
|
||||
line-height: 25px;
|
||||
}
|
||||
|
||||
.iconalert > div:after {
|
||||
clear: both;
|
||||
content: '';
|
||||
display: table;
|
||||
}
|
||||
|
||||
.input-error {
|
||||
color: $red-50;
|
||||
font-size: 90%;
|
||||
@@ -557,16 +523,15 @@
|
||||
|
||||
<script>
|
||||
import hello from 'hellojs';
|
||||
import moment from 'moment';
|
||||
import axios from 'axios';
|
||||
import debounce from 'lodash/debounce';
|
||||
import { mapState } from '@/libs/store';
|
||||
import restoreModal from './restoreModal';
|
||||
import resetModal from './resetModal';
|
||||
import deleteModal from './deleteModal';
|
||||
import dayStartAdjustment from './dayStartAdjustment';
|
||||
import { SUPPORTED_SOCIAL_NETWORKS } from '@/../../common/script/constants';
|
||||
import changeClass from '@/../../common/script/ops/changeClass';
|
||||
import getUtcOffset from '@/../../common/script/fns/getUtcOffset';
|
||||
import notificationsMixin from '../../mixins/notifications';
|
||||
import sounds from '../../libs/sounds';
|
||||
import { buildAppleAuthUrl } from '../../libs/auth';
|
||||
@@ -579,27 +544,15 @@ export default {
|
||||
restoreModal,
|
||||
resetModal,
|
||||
deleteModal,
|
||||
dayStartAdjustment,
|
||||
},
|
||||
mixins: [notificationsMixin],
|
||||
data () {
|
||||
const dayStartOptions = [];
|
||||
for (let number = 0; number < 24; number += 1) {
|
||||
const meridian = number < 12 ? 'AM' : 'PM';
|
||||
const hour = number % 12;
|
||||
const option = {
|
||||
value: number,
|
||||
name: `${hour || 12}:00 ${meridian}`,
|
||||
};
|
||||
dayStartOptions.push(option);
|
||||
}
|
||||
|
||||
return {
|
||||
SOCIAL_AUTH_NETWORKS: [],
|
||||
party: {},
|
||||
// Made available by the server as a script
|
||||
availableFormats: ['MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy/MM/dd'],
|
||||
dayStartOptions,
|
||||
newDayStart: 0,
|
||||
temporaryDisplayName: '',
|
||||
usernameUpdates: { username: '' },
|
||||
emailUpdates: {},
|
||||
@@ -623,13 +576,6 @@ export default {
|
||||
availableAudioThemes () {
|
||||
return ['off', ...this.content.audioThemes];
|
||||
},
|
||||
timezoneOffsetToUtc () {
|
||||
const offsetString = moment().utcOffset(getUtcOffset(this.user)).format('Z');
|
||||
return `UTC${offsetString}`;
|
||||
},
|
||||
dayStart () {
|
||||
return this.user.preferences.dayStart;
|
||||
},
|
||||
hasClass () {
|
||||
return this.$store.getters['members:hasClass'](this.user);
|
||||
},
|
||||
@@ -679,7 +625,6 @@ export default {
|
||||
this.SOCIAL_AUTH_NETWORKS = SUPPORTED_SOCIAL_NETWORKS;
|
||||
// @TODO: We may need to request the party here
|
||||
this.party = this.$store.state.party;
|
||||
this.newDayStart = this.user.preferences.dayStart;
|
||||
this.usernameUpdates.username = this.user.auth.local.username || null;
|
||||
this.temporaryDisplayName = this.user.profile.name;
|
||||
this.emailUpdates.newEmail = this.user.auth.local.email || null;
|
||||
@@ -779,32 +724,6 @@ export default {
|
||||
return false;
|
||||
});
|
||||
},
|
||||
calculateNextCron () {
|
||||
let nextCron = moment().hours(this.newDayStart).minutes(0).seconds(0)
|
||||
.milliseconds(0);
|
||||
|
||||
const currentHour = moment().format('H');
|
||||
if (currentHour >= this.newDayStart) {
|
||||
nextCron = nextCron.add(1, 'day');
|
||||
}
|
||||
|
||||
return nextCron.format(`${this.user.preferences.dateFormat.toUpperCase()} @ h:mm a`);
|
||||
},
|
||||
openDayStartModal () {
|
||||
const nextCron = this.calculateNextCron();
|
||||
// @TODO: Add generic modal
|
||||
if (!window.confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; // eslint-disable-line no-alert
|
||||
this.saveDayStart();
|
||||
// $rootScope.openModal('change-day-start', { scope: $scope });
|
||||
},
|
||||
async saveDayStart () {
|
||||
this.user.preferences.dayStart = this.newDayStart;
|
||||
await axios.post('/api/v4/user/custom-day-start', {
|
||||
dayStart: this.newDayStart,
|
||||
});
|
||||
// @TODO
|
||||
// Notification.text(response.data.data.message);
|
||||
},
|
||||
async changeLanguage (e) {
|
||||
const newLang = e.target.value;
|
||||
this.user.preferences.language = newLang;
|
||||
@@ -847,11 +766,9 @@ export default {
|
||||
window.location.href = buildAppleAuthUrl();
|
||||
} else {
|
||||
const auth = await hello(network).login({ scope: 'email' });
|
||||
|
||||
await this.$store.dispatch('auth:socialAuth', {
|
||||
auth,
|
||||
});
|
||||
|
||||
window.location.href = '/';
|
||||
}
|
||||
},
|
||||
@@ -865,8 +782,11 @@ export default {
|
||||
}
|
||||
},
|
||||
async addLocalAuth () {
|
||||
if (this.localAuth.email === '') {
|
||||
this.localAuth.email = this.user.auth.local.email;
|
||||
}
|
||||
await axios.post('/api/v4/user/auth/local/register', this.localAuth);
|
||||
window.alert(this.$t('addedLocalAuth')); // eslint-disable-line no-alert
|
||||
window.location.href = '/user/settings/site';
|
||||
},
|
||||
restoreEmptyUsername () {
|
||||
if (this.usernameUpdates.username.length < 1) {
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
import { storiesOf } from '@storybook/vue';
|
||||
|
||||
import Subscription from './subscription.vue';
|
||||
import { mockStore } from '../../../config/storybook/mock.data';
|
||||
|
||||
storiesOf('Subscriptions/Detail Page', module)
|
||||
.add('subscribed', () => ({
|
||||
components: { Subscription },
|
||||
template: `
|
||||
<div style="position: absolute; margin: 20px">
|
||||
<subscription ></subscription>
|
||||
</div>
|
||||
`,
|
||||
data () {
|
||||
return {
|
||||
};
|
||||
},
|
||||
store: mockStore({
|
||||
userData: {
|
||||
purchased: {
|
||||
plan: {
|
||||
customerId: 'customer-id',
|
||||
planId: 'plan-id',
|
||||
subscriptionId: 'sub-id',
|
||||
gemsBought: 22,
|
||||
dateUpdated: new Date(2021, 0, 15),
|
||||
consecutive: {
|
||||
count: 2,
|
||||
gemCapExtra: 4,
|
||||
offset: 2,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
}));
|
||||
@@ -93,7 +93,7 @@
|
||||
<div class="subscribe-card mx-auto">
|
||||
<div
|
||||
v-if="hasSubscription && !hasCanceledSubscription"
|
||||
class="d-flex flex-column align-items-center my-4"
|
||||
class="d-flex flex-column align-items-center"
|
||||
>
|
||||
<div class="round-container bg-green-10 d-flex align-items-center justify-content-center">
|
||||
<div
|
||||
@@ -102,7 +102,7 @@
|
||||
v-html="icons.checkmarkIcon"
|
||||
></div>
|
||||
</div>
|
||||
<h2 class="green-10 mx-auto">
|
||||
<h2 class="green-10 mx-auto mb-75">
|
||||
{{ $t('youAreSubscribed') }}
|
||||
</h2>
|
||||
<div
|
||||
@@ -180,17 +180,17 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="hasSubscription"
|
||||
class="bg-gray-700 p-2 text-center"
|
||||
class="bg-gray-700 py-3 mt-4 mb-3 text-center"
|
||||
>
|
||||
<div class="header-mini mb-3">
|
||||
{{ $t('subscriptionStats') }}
|
||||
</div>
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="ml-4 mr-3">
|
||||
<div class="d-flex">
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-calendar mr-2"
|
||||
class="svg-icon svg-calendar mr-1"
|
||||
v-html="icons.calendarIcon"
|
||||
>
|
||||
</div>
|
||||
@@ -204,49 +204,53 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-spacer"></div>
|
||||
<div>
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-gem mr-2"
|
||||
class="svg-icon svg-gem mr-1"
|
||||
v-html="icons.gemIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="number-heavy">
|
||||
{{ user.purchased.plan.consecutive.gemCapExtra }}
|
||||
{{ gemCap }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
{{ $t('gemCapExtra') }}
|
||||
{{ $t('gemCap') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-spacer"></div>
|
||||
<div>
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-hourglass mt-1 mr-2"
|
||||
class="svg-icon svg-hourglass mt-1 mr-1"
|
||||
v-html="icons.hourglassIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="number-heavy">
|
||||
{{ user.purchased.plan.consecutive.trinkets }}
|
||||
{{ nextHourGlass }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
{{ $t('mysticHourglassesTooltip') }}
|
||||
{{ $t('nextHourglass') }}*
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 nextHourglassDescription" v-once>
|
||||
*{{ $t('nextHourglassDescription') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column justify-content-center align-items-center mt-4 mb-3">
|
||||
<div class="d-flex flex-column justify-content-center align-items-center mb-3">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-heart mb-1"
|
||||
class="svg-icon svg-heart mb-2"
|
||||
v-html="icons.heartIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
<div class="thanks-for-support">
|
||||
{{ $t('giftSubscriptionText4') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -350,7 +354,7 @@
|
||||
.cancel-card {
|
||||
width: 28rem;
|
||||
border: 2px solid $gray-500;
|
||||
border-radius: 4px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
@@ -405,7 +409,10 @@
|
||||
}
|
||||
|
||||
.number-heavy {
|
||||
font-size: 24px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
line-height: 1.4;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.Pet-Jackalope-RoyalPurple {
|
||||
@@ -423,7 +430,10 @@
|
||||
|
||||
.stats-label {
|
||||
font-size: 12px;
|
||||
color: $gray-200;
|
||||
color: $gray-100;
|
||||
margin-top: 6px;
|
||||
font-weight: bold;
|
||||
line-height: 1.33;
|
||||
}
|
||||
|
||||
.stats-spacer {
|
||||
@@ -433,8 +443,9 @@
|
||||
}
|
||||
|
||||
.subscribe-card {
|
||||
padding-top: 2rem;
|
||||
width: 28rem;
|
||||
border-radius: 4px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
background-color: $white;
|
||||
}
|
||||
@@ -452,7 +463,14 @@
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.svg-calendar, .svg-heart {
|
||||
.svg-calendar {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-heart {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
@@ -479,8 +497,10 @@
|
||||
}
|
||||
|
||||
.svg-gem {
|
||||
width: 32px;
|
||||
height: 28px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-gems {
|
||||
@@ -494,8 +514,10 @@
|
||||
}
|
||||
|
||||
.svg-hourglass {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-gift-box {
|
||||
@@ -521,11 +543,34 @@
|
||||
.w-55 {
|
||||
width: 55%;
|
||||
}
|
||||
|
||||
.nextHourglassDescription {
|
||||
font-size: 12px;
|
||||
font-style: italic;
|
||||
line-height: 1.33;
|
||||
color: $gray-100;
|
||||
margin-left: 100px;
|
||||
margin-right: 100px;
|
||||
}
|
||||
|
||||
.justify-content-evenly {
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
.thanks-for-support {
|
||||
font-size: 12px;
|
||||
line-height: 1.33;
|
||||
text-align: center;
|
||||
color: $gray-100;
|
||||
}
|
||||
|
||||
.stat-column {
|
||||
width: 33%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import min from 'lodash/min';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
@@ -551,6 +596,7 @@ import logo from '@/assets/svg/habitica-logo-purple.svg';
|
||||
import paypalLogo from '@/assets/svg/paypal-logo.svg';
|
||||
import subscriberGems from '@/assets/svg/subscriber-gems.svg';
|
||||
import subscriberHourglasses from '@/assets/svg/subscriber-hourglasses.svg';
|
||||
import { getPlanContext } from '@/../../common/script/cron';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -649,23 +695,9 @@ export default {
|
||||
months: parseFloat(this.user.purchased.plan.extraMonths).toFixed(2),
|
||||
};
|
||||
},
|
||||
buyGemsGoldCap () {
|
||||
return {
|
||||
amount: min(this.gemGoldCap),
|
||||
};
|
||||
},
|
||||
gemGoldCap () {
|
||||
const baseCap = 25;
|
||||
const gemCapIncrement = 5;
|
||||
const capIncrementThreshold = 3;
|
||||
const { gemCapExtra } = this.user.purchased.plan.consecutive;
|
||||
const blocks = subscriptionBlocks[this.subscription.key].months / capIncrementThreshold;
|
||||
const flooredBlocks = Math.floor(blocks);
|
||||
|
||||
const userTotalDropCap = baseCap + gemCapExtra + flooredBlocks * gemCapIncrement;
|
||||
const maxDropCap = 50;
|
||||
|
||||
return [userTotalDropCap, maxDropCap];
|
||||
gemCap () {
|
||||
return planGemLimits.convCap
|
||||
+ this.user.purchased.plan.consecutive.gemCapExtra;
|
||||
},
|
||||
numberOfMysticHourglasses () {
|
||||
const numberOfHourglasses = subscriptionBlocks[this.subscription.key].months / 3;
|
||||
@@ -719,6 +751,16 @@ export default {
|
||||
subscriptionEndDate () {
|
||||
return moment(this.user.purchased.plan.dateTerminated).format('MM/DD/YYYY');
|
||||
},
|
||||
nextHourGlassDate () {
|
||||
const currentPlanContext = getPlanContext(this.user, new Date());
|
||||
|
||||
return currentPlanContext.nextHourglassDate;
|
||||
},
|
||||
nextHourGlass () {
|
||||
const nextHourglassMonth = this.nextHourGlassDate.format('MMM');
|
||||
|
||||
return nextHourglassMonth;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<button
|
||||
title="close dialog"
|
||||
@click="$emit('click', $event)"
|
||||
:style="{
|
||||
'--icon-color': iconColor,
|
||||
'--icon-color-hover': iconColorHover,
|
||||
}"
|
||||
:class="{'purple': purple}"
|
||||
@click="$emit('click', $event)"
|
||||
>
|
||||
<div
|
||||
v-once
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<span v-if="user">
|
||||
<br>
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<p>
|
||||
HabitRPG, Inc. (“HabitRPG,” “we,” “us,” or “our”) welcomes you. This privacy notice (the “Privacy
|
||||
Notice”) describes how we process the information we collect about or from you through our Website
|
||||
located at <a href='https://habitica.com/static/home'>https://habitica.com/static/home</a> and/or our Apps
|
||||
located at <a href="https://habitica.com/static/home">https://habitica.com/static/home</a> and/or our Apps
|
||||
(our “Digital Platforms”), from our users, subscribers, visitors and other users of our technology and
|
||||
platforms (together with our Digital Platforms, the “Habitica Service” or the “Service”), and when you
|
||||
otherwise interact with us. This Privacy Notice may be updated by us from time to time without notice to
|
||||
@@ -65,11 +65,36 @@
|
||||
policies linked to below:
|
||||
</p>
|
||||
<ul>
|
||||
<li>For Stripe, visit: <a href='https://stripe.com/privacy' target='_blank'>https://stripe.com/privacy</a></li>
|
||||
<li>For Amazon Pay, visit: <a href='https://pay.amazon.com/help/201751600' target='_blank'>https://pay.amazon.com/help/201751600</a></li>
|
||||
<li>For PayPal, visit: <a href='https://www.paypal.com/us/webapps/mpp/ua/privacy-full' target='_blank'>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a></li>
|
||||
<li>For Apple Pay, visit: <a href='https://www.apple.com/legal/privacy/data/en/apple-pay/' target='_blank'>https://www.apple.com/legal/privacy/data/en/apple-pay/</a></li>
|
||||
<li>For Google Pay, visit: <a href='https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid' target='_blank'>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a></li>
|
||||
<li>
|
||||
For Stripe, visit: <a
|
||||
href="https://stripe.com/privacy"
|
||||
target="_blank"
|
||||
>https://stripe.com/privacy</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amazon Pay, visit: <a
|
||||
href="https://pay.amazon.com/help/201751600"
|
||||
target="_blank"
|
||||
>https://pay.amazon.com/help/201751600</a>
|
||||
</li>
|
||||
<li>
|
||||
For PayPal, visit: <a
|
||||
href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full"
|
||||
target="_blank"
|
||||
>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a>
|
||||
</li>
|
||||
<li>
|
||||
For Apple Pay, visit: <a
|
||||
href="https://www.apple.com/legal/privacy/data/en/apple-pay/"
|
||||
target="_blank"
|
||||
>https://www.apple.com/legal/privacy/data/en/apple-pay/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Google Pay, visit: <a
|
||||
href="https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid"
|
||||
target="_blank"
|
||||
>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
We reserve the right to change our payment vendors at any time, or to use additional payment vendors, at
|
||||
@@ -95,22 +120,32 @@
|
||||
see the information regarding analytics providers discussed further below.
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
|
||||
session ID cookie expires when you close the Service.</li>
|
||||
<li><strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
|
||||
<li>
|
||||
<strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
|
||||
session ID cookie expires when you close the Service.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
|
||||
until you delete it. Persistent cookies enable us to better understand how you interact with the Service and to
|
||||
provide visitors with a better and more personalized experience by retaining information about their identity and
|
||||
preferences, including but not limited to keeping them logged in even if the browser is closed.</li>
|
||||
preferences, including but not limited to keeping them logged in even if the browser is closed.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
If you do not want us to place a cookie on your device, you may be able to turn that feature off on your
|
||||
device. You may refuse to accept cookies from the Service at any time by activating the setting on your
|
||||
browser which allows you to refuse cookies. Further information about the procedure to follow in order to
|
||||
disable cookies can be found on your Internet browser provider’s website via your help screen. You may
|
||||
wish to refer to <a href='http://www.allaboutcookies.org/manage-cookies/index.html' target='_blank'>
|
||||
http://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
|
||||
wish to refer to <a
|
||||
href="http://www.allaboutcookies.org/manage-cookies/index.html"
|
||||
target="_blank"
|
||||
>
|
||||
http://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
|
||||
For more information about targeting and advertising cookies and how you can opt out, you can also visit
|
||||
<a href='http://optout.aboutads.info' target='_blank'>http://optout.aboutads.info</a>. Please be aware
|
||||
<a
|
||||
href="http://optout.aboutads.info"
|
||||
target="_blank"
|
||||
>http://optout.aboutads.info</a>. Please be aware
|
||||
that if cookies are disabled, not all features of the Service may operate properly or as intended.
|
||||
</p>
|
||||
<h3>Third-Party Analytics Providers</h3>
|
||||
@@ -129,8 +164,18 @@
|
||||
advised that if you opt out of any service, you may not be able to use the full functionality of the Service.
|
||||
</p>
|
||||
<ul>
|
||||
<li>For Google Analytics, visit: <a href='https://marketingplatform.google.com/about/analytics/' target='_blank'>https://marketingplatform.google.com/about/analytics/</a></li>
|
||||
<li>For Amplitude, visit: <a href='https://amplitude.com/privacy' target='_blank'>https://amplitude.com/privacy</a></li>
|
||||
<li>
|
||||
For Google Analytics, visit: <a
|
||||
href="https://marketingplatform.google.com/about/analytics/"
|
||||
target="_blank"
|
||||
>https://marketingplatform.google.com/about/analytics/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amplitude, visit: <a
|
||||
href="https://amplitude.com/privacy"
|
||||
target="_blank"
|
||||
>https://amplitude.com/privacy</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Third-Party Advertisers/Remarketers</h3>
|
||||
<p>
|
||||
@@ -150,7 +195,9 @@
|
||||
</p>
|
||||
<p>
|
||||
For more information on our advertising partner Google AdMob, please visit <a
|
||||
href='https://policies.google.com/privacy?hl=en' target='_blank'>https://policies.google.com/privacy?hl=en</a>.
|
||||
href="https://policies.google.com/privacy?hl=en"
|
||||
target="_blank"
|
||||
>https://policies.google.com/privacy?hl=en</a>.
|
||||
</p>
|
||||
<h3>Geolocation Information</h3>
|
||||
<p>
|
||||
@@ -229,7 +276,7 @@
|
||||
</p>
|
||||
<p>
|
||||
You may opt out at any time from the use of your personal information for direct marketing purposes by
|
||||
emailing the instructions to <a href='mailto:admin@habitica.com'>admin@habitica.com</a> or by clicking
|
||||
emailing the instructions to <a href="mailto:admin@habitica.com">admin@habitica.com</a> or by clicking
|
||||
on the “Unsubscribe” link located on the bottom of any HabitRPG marketing email and following the
|
||||
instructions found on the page to which the link takes you. Please allow us a reasonable time to process
|
||||
your request. You cannot opt out of receiving transactional e-mails related to the Service.
|
||||
@@ -274,7 +321,7 @@
|
||||
direct marketing purposes during the preceding calendar year, including the names and addresses of those
|
||||
third parties, and examples of the types of Service or products marketed by those third parties. If you wish
|
||||
to submit a request pursuant to Section 1798.83, please contact HabitRPG via email at
|
||||
<a href='mailto:admin@habitica.com'>admin@habitica.com</a>.
|
||||
<a href="mailto:admin@habitica.com">admin@habitica.com</a>.
|
||||
</p>
|
||||
<h2>NEVADA PRIVACY RIGHTS</h2>
|
||||
<p>
|
||||
@@ -291,7 +338,7 @@
|
||||
<h2>LINKS TO EXTERNAL WEBSITES</h2>
|
||||
<p>
|
||||
The Service may contain links to third-party websites (“<span style="text-decoration: underline;">External
|
||||
Sites</span>”). HabitRPG has no control over the privacy practices or the content of any such External Sites.
|
||||
Sites</span>”). HabitRPG has no control over the privacy practices or the content of any such External Sites.
|
||||
As such, we are not responsible for the content or the privacy policies of such External Sites. You should
|
||||
check the applicable privacy notice or privacy policy and terms of use when visiting any such External Sites.
|
||||
</p>
|
||||
@@ -306,8 +353,8 @@
|
||||
</p>
|
||||
<h2>HOW TO CONTACT US</h2>
|
||||
<p>
|
||||
If you have questions about this Privacy Notice, please e-mail us at <a href='mailto:admin@habitica.com'>
|
||||
admin@habitica.com</a> with “Privacy Notice” in the subject line.
|
||||
If you have questions about this Privacy Notice, please e-mail us at <a href="mailto:admin@habitica.com">
|
||||
admin@habitica.com</a> with “Privacy Notice” in the subject line.
|
||||
</p>
|
||||
<address>
|
||||
<strong>HabitRPG, Inc.</strong>
|
||||
|
||||
@@ -2,11 +2,20 @@
|
||||
<!-- eslint-disable max-len -->
|
||||
<div class="container-fluid">
|
||||
<h1>Terms of Service</h1>
|
||||
<p class="strong pagemeta">Last Updated: December 14, 2021</p>
|
||||
<p class="strong pagemeta">
|
||||
Last Updated: December 14, 2021
|
||||
</p>
|
||||
<p>Thanks for choosing Habitica!</p>
|
||||
<p>Our Service is provided by HabitRPG, Inc. ("HabitRPG"). By accepting these Terms of Service and our Privacy Policy located at: <a href="https://habitica.com/static/privacy" target="_blank">https://habitica.com/static/privacy</a> (collectively, the "Agreement"), registering for the Service (as defined below), accessing or using any part of the Service, or otherwise manifesting your assent to the Agreement, you acknowledge that you have read, understood, and agree to be legally bound by the Agreement. If you do not agree to (or cannot comply with) the Agreement, you are not permitted to access or use the Service.</p>
|
||||
<p>
|
||||
Our Service is provided by HabitRPG, Inc. ("HabitRPG"). By accepting these Terms of Service and our Privacy Policy located at: <a
|
||||
href="https://habitica.com/static/privacy"
|
||||
target="_blank"
|
||||
>https://habitica.com/static/privacy</a> (collectively, the "Agreement"), registering for the Service (as defined below), accessing or using any part of the Service, or otherwise manifesting your assent to the Agreement, you acknowledge that you have read, understood, and agree to be legally bound by the Agreement. If you do not agree to (or cannot comply with) the Agreement, you are not permitted to access or use the Service.
|
||||
</p>
|
||||
<p>By accepting or agreeing to this Agreement on behalf of a company or other legal entity, you represent and warrant that you have the authority to bind that company or other legal entity to the Agreement and, in such event, "you" and "your" will refer and apply to that company or other legal entity.</p>
|
||||
<p class="strong">THE SECTIONS BELOW TITLED "BINDING ARBITRATION," AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM.</p>
|
||||
<p class="strong">
|
||||
THE SECTIONS BELOW TITLED "BINDING ARBITRATION," AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM.
|
||||
</p>
|
||||
<h2>Changes to the Terms of Service</h2>
|
||||
<p>These Terms of Service are effective as of the last updated date stated at the top of this page. We may change these Terms of Service from time to time with or without notice to you. By accessing the Service after we make any such changes to this Terms of Service, you are deemed to have accepted such changes. Please be aware that, to the extent permitted by applicable law, our use of the information collected is governed by the Terms of Service in effect at the time we collect the information. Please refer back to this Terms of Service on a regular basis.</p>
|
||||
<p>Our Service allows you to upload, store, send, download, or receive content, including but not limited to information, text, graphics, artwork, or other material ("Content"). You retain ownership of any intellectual property rights that you have in your Content. You hereby grant HabitRPG a worldwide, perpetual, irrevocable, sublicenseable, transferable, assignable, non-exclusive, and royalty-free right and license to use, reproduce, distribute, adapt, modify, translate, create derivative works of, publicly perform, publicly display, digitally perform, make, have made, sell, offer for sale, and import your Content, including all intellectual property rights therein. You represent, warrant, and agree that your Content does not and will not violate any third-party intellectual property, privacy, or other rights, and that you have all right, title and interest in and to your Content required to grant us the license above. We reserve the right at all times, but have no obligation, to delete or refuse to use or distribute any Content on or through the Service, including your Content.</p>
|
||||
@@ -22,9 +31,9 @@
|
||||
<p>HabitRPG reserves the right, in its sole discretion, to add, modify, or remove functionalities or features from the Service, and improve, change and/or update the Service. We may also suspend or terminate the Service at any time, with or without notice to you.</p>
|
||||
<p>You can choose to stop using our Service at any time. We may suspend or cease providing the Service to you at any time, including if we determine in our sole discretion, that:</p>
|
||||
<ul>
|
||||
<li>You have violated any part of this Agreement, the Privacy Policy, or the Community Guidelines;</li>
|
||||
<li>We have stopped offering the Service in your region; or</li>
|
||||
<li>Doing so would be in the best interests of our community, the Service, or the rights of a third party.</li>
|
||||
<li>You have violated any part of this Agreement, the Privacy Policy, or the Community Guidelines;</li>
|
||||
<li>We have stopped offering the Service in your region; or</li>
|
||||
<li>Doing so would be in the best interests of our community, the Service, or the rights of a third party.</li>
|
||||
</ul>
|
||||
<p>If your account is terminated, you will no longer have access to it, including to any of the associated data or Content. You will not be entitled to any refunds and we will have no liability to you. We also reserve the right to terminate any other accounts you may have created, as well as access to any other HabitRPG Service (also without refunds or liability to you).</p>
|
||||
<p>You understand and agree that using the Service comes with the risk that your account may be terminated or suspended at our discretion and at any time. Please keep this risk in mind and comport yourself appropriately.</p>
|
||||
@@ -35,31 +44,36 @@
|
||||
<p>Using our Service does not grant you ownership of any intellectual property rights in our Service or the content you may have access to. You may not use any copyrighted content in our Service unless you obtain permission from the content owner and/or are otherwise permitted by law. The Terms do not grant you the right to use any branding or logos used in our Service. Our Service may display some logos, trademarks, or branding materials that are not the property of HabitRPG. Such content is the sole responsibility of the entity that makes it available.</p>
|
||||
<p>You may not abuse and/or misuse our Service, including but not limited to the following actions:</p>
|
||||
<ul>
|
||||
<li>Using the Service for any unlawful purposes or activities;</li>
|
||||
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws and publicity laws;</li>
|
||||
<li>Sending unsolicited promotions or advertisements;</li>
|
||||
<li>Accessing or tampering with the Service's server systems;</li>
|
||||
<li>Interfering with or disrupting the access of any user, host, or network;</li>
|
||||
<li>Abusing or submitting excessively frequent requests to the Service via the API</li>
|
||||
<li>Spamming chat, whether for personal or commercial purposes, by disrupting the flow of conversation with repeated postings;</li>
|
||||
<li>Impersonating any person, business, or entity, including an employee of HabitRPG, or member of the Habitica moderation team, or communicating in any way that makes it appear that the communication originates from Habitica staff or HabitRPG;</li>
|
||||
<li>Transmitting or communicating any content which, in the sole and exclusive discretion of HabitRPG, is deemed offensive, including language that is unlawful, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, sexually explicit, or racially, ethically, or otherwise objectionable,</li>
|
||||
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Game, including by scamming or social engineering; or</li>
|
||||
<li>Inducing or encouraging others to violate the Community Guidelines or the Agreement.</li>
|
||||
<li>Using the Service for any unlawful purposes or activities;</li>
|
||||
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws and publicity laws;</li>
|
||||
<li>Sending unsolicited promotions or advertisements;</li>
|
||||
<li>Accessing or tampering with the Service's server systems;</li>
|
||||
<li>Interfering with or disrupting the access of any user, host, or network;</li>
|
||||
<li>Abusing or submitting excessively frequent requests to the Service via the API</li>
|
||||
<li>Spamming chat, whether for personal or commercial purposes, by disrupting the flow of conversation with repeated postings;</li>
|
||||
<li>Impersonating any person, business, or entity, including an employee of HabitRPG, or member of the Habitica moderation team, or communicating in any way that makes it appear that the communication originates from Habitica staff or HabitRPG;</li>
|
||||
<li>Transmitting or communicating any content which, in the sole and exclusive discretion of HabitRPG, is deemed offensive, including language that is unlawful, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, sexually explicit, or racially, ethically, or otherwise objectionable,</li>
|
||||
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Game, including by scamming or social engineering; or</li>
|
||||
<li>Inducing or encouraging others to violate the Community Guidelines or the Agreement.</li>
|
||||
</ul>
|
||||
<p>HabitRPG, in its sole discretion, will determine what constitutes abuse and/or misuse of our Service.</p>
|
||||
<h2>Premium Service and Payments</h2>
|
||||
<p>You may choose our free Service or paid Service ("Premium") depending on your needs. We do not guarantee when, if ever, Premium features will be available in the free Service. You may upgrade from free Service to Premium at any time by any of the following methods:</p>
|
||||
<ul>
|
||||
<li>Web: Selecting the user icon in the top right corner and selecting "Subscription" from the dropdown menu,</li>
|
||||
<li>Web: Clicking the green gem icon in the navigation bar at the top of the screen and following instructions to Subscribe or Buy Gems,</li>
|
||||
<li>Android: Tap the menu icon in the top left corner of the main screen and select "Gems & Subscription". Follow the instructions to make a purchase.</li>
|
||||
<li>iOS: Tap the menu icon in the lower right and select "Gems & Subscriptions". Follow the instructions to make a purchase.</li>
|
||||
<li>Web: Selecting the user icon in the top right corner and selecting "Subscription" from the dropdown menu,</li>
|
||||
<li>Web: Clicking the green gem icon in the navigation bar at the top of the screen and following instructions to Subscribe or Buy Gems,</li>
|
||||
<li>Android: Tap the menu icon in the top left corner of the main screen and select "Gems & Subscription". Follow the instructions to make a purchase.</li>
|
||||
<li>iOS: Tap the menu icon in the lower right and select "Gems & Subscriptions". Follow the instructions to make a purchase.</li>
|
||||
</ul>
|
||||
<p>You will be charged the amount shown on Pricing before you can access Premium Service. All prices shown on Pricing are inclusive of any applicable sales taxes, levies, value-added taxes, or duties imposed by taxing authorities, and you are responsible for payment of all such taxes, levies, or duties. We may revise the Pricing at any time and may, from time to time, modify, amend, or supplement our fees and fee-billing methods. Such changes shall be effective upon posting on the Pricing page or elsewhere in the Service. If there is a dispute regarding payment of fees to us, we reserve the right to terminate or suspend your account at our sole discretion.</p>
|
||||
<p>BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:</p>
|
||||
<p>WITHIN THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE AS SHOWN ON YOUR PAYMENT BILL, YOU CAN REQUEST A FULL REFUND BY CONTACTING US AT ADMIN@HABITICA.COM. AFTER THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE, ANY PAYMENT REFUND IS SOLELY SUBJECT TO OUR DISCRETION. THE REFUND SHALL BE YOUR SOLE AND EXCLUSIVE REMEDY.</p>
|
||||
<p>FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a href="http://reportaproblem.apple.com" target="_blank">http://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.</p>
|
||||
<p>
|
||||
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
|
||||
href="http://reportaproblem.apple.com"
|
||||
target="_blank"
|
||||
>http://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.
|
||||
</p>
|
||||
<h2>Warranty Disclaimer</h2>
|
||||
<p>THE SERVICE AND ANY CONTENT MADE AVAILABLE BY HABITRPG VIA THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT ANY WARRANTIES OF ANY KIND, INCLUDING, WITHOUT LIMITATION, THAT THE SERVICE OR CONTENT WILL OPERATE ERROR-FREE OR THAT THE SERVICE OR CONTENT OR ITS SERVERS ARE FREE OF COMPUTER VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES.</p>
|
||||
<p>WE DISCLAIM ALL WARRANTIES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, MERCHANTABILITY, NON-INFRINGEMENT OF THIRD PARTIES' RIGHTS, AND FITNESS FOR PARTICULAR PURPOSE AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE.</p>
|
||||
@@ -71,7 +85,12 @@
|
||||
<h2>Compliance with Applicable Laws</h2>
|
||||
<p>The Service is based in the United States. We make no claims concerning whether the Service or posted content may be downloaded, viewed, or be appropriate for use outside of the United States. If you access the Service or such content from outside of the United States, you do so at your own risk. Whether inside or outside of the United States, you are solely responsible for ensuring compliance with the laws of your specific jurisdiction.</p>
|
||||
<h2>Binding Arbitration</h2>
|
||||
<p>In the event of a dispute arising under or relating to this Agreement or the Service (each, a "<u>Dispute</u>"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("<u>FAA</u>"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION. All disputes will be resolved before a neutral arbitrator selected jointly by the parties, whose decision will be final, except for a limited right of appeal under the FAA. The arbitration shall be commenced and conducted by JAMS pursuant to its then current Comprehensive Arbitration Rules and Procedures and in accordance with the Expedited Procedures in those rules, or, where appropriate, pursuant to JAMS' Streamlined Arbitration Rules and Procedures. All applicable JAMS' rules and procedures are available at the JAMS website <a href="https://www.jamsadr.com" target="_blank">www.jamsadr.com</a>. Each party will be responsible for paying any JAMS filing, administrative, and arbitrator fees in accordance with JAMS rules. Judgment on the arbitrator's award may be entered in any court having jurisdiction. This clause shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. The arbitration may be conducted in person, through the submission of documents, by phone, or online. If conducted in person, the arbitration shall take place in the United States county where you reside. The parties may litigate in court to compel arbitration, to stay a proceeding pending arbitration, or to confirm, modify, vacate, or enter judgment on the award entered by the arbitrator. The parties shall cooperate in good faith in the voluntary and informal exchange of all non-privileged documents and other information (including electronically stored information) relevant to the Dispute immediately after commencement of the arbitration. As set forth below, nothing in this Agreement will prevent us from seeking injunctive relief in any court of competent jurisdiction as necessary to protect our proprietary interests.</p>
|
||||
<p>
|
||||
In the event of a dispute arising under or relating to this Agreement or the Service (each, a "<u>Dispute</u>"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("<u>FAA</u>"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION. All disputes will be resolved before a neutral arbitrator selected jointly by the parties, whose decision will be final, except for a limited right of appeal under the FAA. The arbitration shall be commenced and conducted by JAMS pursuant to its then current Comprehensive Arbitration Rules and Procedures and in accordance with the Expedited Procedures in those rules, or, where appropriate, pursuant to JAMS' Streamlined Arbitration Rules and Procedures. All applicable JAMS' rules and procedures are available at the JAMS website <a
|
||||
href="https://www.jamsadr.com"
|
||||
target="_blank"
|
||||
>www.jamsadr.com</a>. Each party will be responsible for paying any JAMS filing, administrative, and arbitrator fees in accordance with JAMS rules. Judgment on the arbitrator's award may be entered in any court having jurisdiction. This clause shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. The arbitration may be conducted in person, through the submission of documents, by phone, or online. If conducted in person, the arbitration shall take place in the United States county where you reside. The parties may litigate in court to compel arbitration, to stay a proceeding pending arbitration, or to confirm, modify, vacate, or enter judgment on the award entered by the arbitrator. The parties shall cooperate in good faith in the voluntary and informal exchange of all non-privileged documents and other information (including electronically stored information) relevant to the Dispute immediately after commencement of the arbitration. As set forth below, nothing in this Agreement will prevent us from seeking injunctive relief in any court of competent jurisdiction as necessary to protect our proprietary interests.
|
||||
</p>
|
||||
<p>ANY CLAIMS, ACTIONS OR PROCEEDINGS BY YOU MUST BE COMMENCED WITHIN ONE YEAR AFTER THE EVENT THAT GAVE RISE TO YOUR CLAIM OCCURS. ALL OTHER CLAIMS YOU MAY HAVE ARE PERMANENTLY BARRED.</p>
|
||||
<h2>Class Action Waiver</h2>
|
||||
<p>You agree that any arbitration or proceeding shall be limited to the Dispute between us and you individually. To the full extent permitted by law, (i) no arbitration or proceeding shall be joined with any other; (ii) there is no right or authority for any Dispute to be arbitrated or resolved on a class action-basis or to utilize class action procedures; and (iii) there is no right or authority for any Dispute to be brought in a purported representative capacity on behalf of the general public or any other persons. YOU AGREE THAT YOU MAY BRING CLAIMS AGAINST US ONLY IN YOUR INDIVIDUAL CAPACITY AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING.</p>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import includes from 'lodash/includes';
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
foolPet (pet) {
|
||||
const SPECIAL_PETS = [
|
||||
'Wolf-Veteran',
|
||||
'Wolf-Cerberus',
|
||||
'Dragon-Hydra',
|
||||
'Turkey-Base',
|
||||
'BearCub-Polar',
|
||||
'MantisShrimp-Base',
|
||||
'JackOLantern-Base',
|
||||
'Mammoth-Base',
|
||||
'Tiger-Veteran',
|
||||
'Phoenix-Base',
|
||||
'Turkey-Gilded',
|
||||
'MagicalBee-Base',
|
||||
'Lion-Veteran',
|
||||
'Gryphon-RoyalPurple',
|
||||
'JackOLantern-Ghost',
|
||||
'Jackalope-RoyalPurple',
|
||||
'Orca-Base',
|
||||
'Bear-Veteran',
|
||||
'Hippogriff-Hopeful',
|
||||
'Fox-Veteran',
|
||||
'JackOLantern-Glow',
|
||||
'Gryphon-Gryphatrice',
|
||||
'JackOLantern-RoyalPurple',
|
||||
];
|
||||
const BASE_PETS = [
|
||||
'Wolf',
|
||||
'TigerCub',
|
||||
'PandaCub',
|
||||
'LionCub',
|
||||
'Fox',
|
||||
'FlyingPig',
|
||||
'BearCub',
|
||||
'Dragon',
|
||||
'Cactus',
|
||||
];
|
||||
if (!pet) return 'Pet-Cactus-Virtual';
|
||||
if (SPECIAL_PETS.indexOf(pet) !== -1) {
|
||||
return 'Pet-Wolf-Virtual';
|
||||
}
|
||||
const species = pet.slice(0, pet.indexOf('-'));
|
||||
if (includes(BASE_PETS, species)) {
|
||||
return `Pet-${species}-Virtual`;
|
||||
}
|
||||
return 'Pet-Fox-Virtual';
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -117,5 +117,7 @@
|
||||
"achievementKickstarter2019Text": "من مساهمي حملة كيك-ستارتر للدبابيس",
|
||||
"achievementDomesticatedModalText": "لقد جمعت كل الحيوانات الأليفة المستأنسة!",
|
||||
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو"
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو",
|
||||
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!"
|
||||
}
|
||||
|
||||
@@ -408,5 +408,6 @@
|
||||
"backgroundArchaeologicalDigText": "Archaeological Dig",
|
||||
"backgroundArchaeologicalDigNotes": "Unearth secrets of the ancient past at an Archaeological Dig.",
|
||||
"backgroundScribesWorkshopText": "Scribe's Workshop",
|
||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop."
|
||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop.",
|
||||
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019"
|
||||
}
|
||||
|
||||
@@ -118,5 +118,8 @@
|
||||
"welcome3": "تقدم في الحياة واللعبة!",
|
||||
"welcome3notes": "As you improve your life, your avatar will level up and unlock pets, quests, equipment, and more!",
|
||||
"imReady": "ادخل Habitica",
|
||||
"limitedOffer": "Available until <%= date %>"
|
||||
"limitedOffer": "Available until <%= date %>",
|
||||
"nGemsGift": "<%= nGems %> الماس (هدية)",
|
||||
"amountExp": "<%= amount %> خبرة",
|
||||
"nGems": "<%= nGems %> الماس"
|
||||
}
|
||||
|
||||
@@ -68,5 +68,13 @@
|
||||
"petsFound": "إنشاء حيوانات أليفة",
|
||||
"keyToPets": "مفتاح بيوت الحيوانات",
|
||||
"noActiveMount": "لا يوجد تثبيت نشط",
|
||||
"questPets": "بحث الحيوانات"
|
||||
"questPets": "بحث الحيوانات",
|
||||
"releasePetsConfirm": "هل أنت متأكد أنك تريد إطلاق سراح حيوانك الأليف القياسي؟",
|
||||
"keyToMounts": "مفتاح بيت الحيوان",
|
||||
"petsReleased": "أفرج عن الحيوانات الأليفة",
|
||||
"keyToPetsDesc": "حرر جميع الحيوانات المسموح بها حتى تتمكن من جمعها مرة أخرى. (لا تتأثر بالحيوانات الأليفة والحيوانات الأليفة الغريبة.)",
|
||||
"petName": "<%= potion(locale) %> <%= egg(locale) %>",
|
||||
"keyToMountsDesc": "حرر جميع العينات القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر عمليات تثبيت المهام وعمليات التثبيت النادرة.)",
|
||||
"keyToBoth": "مفاتيح رئيسية لبيوت الكلاب",
|
||||
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!"
|
||||
}
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
"achievementShadyCustomerText": "Hat alle Schatten-Haustiere gesammelt.",
|
||||
"achievementShadyCustomer": "Der Schatten in Dir",
|
||||
"achievementZodiacZookeeper": "Tierkreiszeichen-Pfleger",
|
||||
"achievementZodiacZookeeperText": "Hat alle Tierkreiszeichen-Tiere ausgebrütet: Ratte, Kalb, Kaninchen, Schlange, Fohlen, Schaf, Affe, Hahn, Wolf, Tiger, Fliegendes Ferkel, und Drache!",
|
||||
"achievementZodiacZookeeperText": "Hat alle Standardfarben der Tierkreiszeichen-Tiere ausgebrütet: Ratte, Kalb, Kaninchen, Schlange, Fohlen, Schaf, Affe, Hahn, Wolf, Tiger, Fliegendes Ferkel, und Drache!",
|
||||
"achievementZodiacZookeeperModalText": "Du hast alle Tierkreiszeichen-Tiere gesammelt!",
|
||||
"achievementBirdsOfAFeather": "Fliegende Freunde",
|
||||
"achievementBirdsOfAFeatherText": "Hat alle fliegenden Haustiere ausgebrütet: Fliegendes Ferkel, Eule, Papagei, Pterodactylus, Greif, und Falke.",
|
||||
"achievementBirdsOfAFeatherText": "Hat alle Standardfarben der fliegenden Haustiere ausgebrütet: Fliegendes Ferkel, Eule, Papagei, Pterodactylus, Greif, Falke, Pfau, und Hahn.",
|
||||
"achievementBirdsOfAFeatherModalText": "Du hast alle fliegenden Haustiere gesammelt!"
|
||||
}
|
||||
|
||||
@@ -685,5 +685,10 @@
|
||||
"backgroundFloweringPrairieText": "Blühende Prärie",
|
||||
"backgroundFloweringPrairieNotes": "Tolle durch eine blühende Prärie.",
|
||||
"backgroundAnimalsDenNotes": "Mach es Dir im Bau eines Waldtieres gemütlich.",
|
||||
"backgroundBrickWallWithIvyNotes": "Bewundere eine efeubewachsene Ziegelmauer."
|
||||
"backgroundBrickWallWithIvyNotes": "Bewundere eine efeubewachsene Ziegelmauer.",
|
||||
"backgroundBlossomingTreesText": "Blühende Bäume",
|
||||
"backgrounds042022": "SET 95: Veröffentlicht im April 2022",
|
||||
"backgroundBlossomingTreesNotes": "Verweile unter blühenden Bäumen.",
|
||||
"backgroundFlowerShopText": "Blumenladen",
|
||||
"backgroundFlowerShopNotes": "Genieße den süßen Duft eines Blumenladens."
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
"commGuideList09C": "Der Aufstieg in höhere Mitwirkendenstufen kann dauerhaft verwehrt (\"eingefroren\") werden",
|
||||
"commGuideHeadingModerateConsequences": "Beispiele für mittlere Konsequenzen",
|
||||
"commGuideList10A": "Beschränkte öffentliche und/oder private Chat-Berechtigungen",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wieder hergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und Nutzungsbediengungen zu halten.",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wiederhergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und Nutzungsbedingungen zu halten.",
|
||||
"commGuideList10C": "Beschränkte Berechtigung, Gilden/Herausforderungen zu gründen",
|
||||
"commGuideList10D": "Der Aufstieg in höhere Mitwirkendenstufen kann temporär verwehrt (\"eingefroren\") werden",
|
||||
"commGuideList10E": "Herabstufung von Mitwirkenden",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"companyDonate": "Spenden",
|
||||
"forgotPassword": "Passwort vergessen?",
|
||||
"emailNewPass": "Einen Link per E-Mail senden, um das Passwort zurückzusetzen",
|
||||
"forgotPasswordSteps": "Trage die E-Mail-Adresse ein, mit der Du Deinen Habitica-Account aktiviert hast.",
|
||||
"forgotPasswordSteps": "Trage deinen Benutzernamen oder die E-Mail-Adresse ein, mit der Du Deinen Habitica-Account aktiviert hast.",
|
||||
"sendLink": "Link senden",
|
||||
"featuredIn": "Vorgestellt in",
|
||||
"footerDevs": "Entwickler",
|
||||
@@ -129,7 +129,7 @@
|
||||
"passwordConfirmationMatch": "Die Passwörter stimmen nicht überein.",
|
||||
"invalidLoginCredentials": "Falscher Benutzername und/oder E-Mail und/oder Passwort.",
|
||||
"passwordResetPage": "Passwort zurücksetzen",
|
||||
"passwordReset": "Wenn wir Deine E-Mail-Adresse kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
||||
"passwordReset": "Wenn wir Deine E-Mail-Adresse oder Deinen Benutzernamen kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
||||
"passwordResetEmailSubject": "Passwort-Reset für Habitica",
|
||||
"passwordResetEmailText": "Wenn Du das Passwort für <%= username %> zurücksetzen möchtest, folge bitte dem Link <%= passwordResetLink %>, um ein neues zu setzen. Dieser Link wird in 24 Stunden ungültig. Wenn Du keinen Passwort-Reset angefordert hast, kannst Du diese E-Mail ignorieren.",
|
||||
"passwordResetEmailHtml": "Wenn Du das Passwort für <strong><%= username %></strong> auf Habitica zurücksetzen möchtest, folge bitte <a href=\"<%= passwordResetLink %>\">diesem Link </a>, um ein neues zu setzen. Dieser Link wird in 24 Stunden ungültig.<br/><br>Wenn Du keinen Passwort-Reset angefordert hast, kannst Du diese E-Mail ignorieren.",
|
||||
@@ -150,7 +150,7 @@
|
||||
"confirmPassword": "Passwort bestätigen",
|
||||
"usernameLimitations": "Der Benutzername muss zwischen 1 und 20 Buchstaben lang sein und darf nur die Buchstaben von A bis Z, Nummern von 0 bis 9, Bindestriche und Unterstriche beinhalten und darf keine unangemessenen Begriffe enthalten.",
|
||||
"usernamePlaceholder": "z.B., HabitRabbit",
|
||||
"emailPlaceholder": "z.B., rabbit@beispiel.com",
|
||||
"emailPlaceholder": "z.B., gryphon@beispiel.com",
|
||||
"passwordPlaceholder": "z.B., ******************",
|
||||
"confirmPasswordPlaceholder": "Stelle sicher, dass es das gleiche Passwort ist!",
|
||||
"joinHabitica": "Habitica beitreten",
|
||||
@@ -186,5 +186,6 @@
|
||||
"communityInstagram": "Instagram",
|
||||
"minPasswordLength": "Das Passwort muss mindestens 8 Zeichen haben.",
|
||||
"enterHabitica": "Tritt ein in Habitica",
|
||||
"socialAlreadyExists": "Diese Social-Media-Zugangsdaten sind bereits mit einem schon bestehenden Habitica-Konto verknüpft."
|
||||
"socialAlreadyExists": "Diese Social-Media-Zugangsdaten sind bereits mit einem schon bestehenden Habitica-Konto verknüpft.",
|
||||
"emailUsernamePlaceholder": "z.B., habitrabbit oder gryphon@beispiel.com"
|
||||
}
|
||||
|
||||
@@ -2588,11 +2588,33 @@
|
||||
"headSpecialSpring2022RogueText": "Elster-Maske",
|
||||
"headSpecialSpring2022RogueNotes": "Wenn Du diese Maske trägst wirst Du so einfallsreich wie eine Elster erscheinen. Vielleicht kannst Du dann sogar ähnlich gut pfeifen, tirilieren, und imitieren. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022WarriorText": "Umgestülpter Regenschirm",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Uff! Es sieht so aus als wäre der Wind doch stärker als gedacht. Erhöht Stärke um <%= str %>, Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Uff! Es sieht so aus als wäre der Wind doch stärker als gedacht. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022WarriorText": "Regenmantel",
|
||||
"armorSpecialSpring2022WarriorNotes": "Diese Regenausrüstung ist so beeindruckend, Du kannst im Regen singen und in jede Pfütze springen, und bleibst trotzdem warm und trocken! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2022WarriorText": "Regenmantelkapuze",
|
||||
"headSpecialSpring2022WarriorNotes": "Huch, es sieht nach Regen aus! Steh auf und zieh Dir die Kapuze über, um trocken zu bleiben. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"shieldSpecialSpring2022WarriorText": "Regenwolke",
|
||||
"shieldSpecialSpring2022WarriorNotes": "Kennst Du diese Tage, an denen es sich anfühlt, als würde Dir eine Regenwolke auf Schritt und Tritt folgen? Tja, Du kannst Dich glücklich schätzen, denn schon bald werden die schönsten Blumen zu Deinen Füßen blühen! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung."
|
||||
"shieldSpecialSpring2022WarriorNotes": "Kennst Du diese Tage, an denen es sich anfühlt, als würde Dir eine Regenwolke auf Schritt und Tritt folgen? Tja, Du kannst Dich glücklich schätzen, denn schon bald werden die schönsten Blumen zu Deinen Füßen blühen! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022MageText": "Forsythienstab",
|
||||
"weaponSpecialSpring2022MageNotes": "Diese strahlend gelben Glocken sind bereit, Deine mächtige Frühlingsmagie zu lenken. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022MageText": "Forsythienrobe",
|
||||
"headSpecialSpring2022MageText": "Forsythienhelm",
|
||||
"headSpecialSpring2022MageNotes": "Mithilfe dieses Helms aus umgedrehten Blüten bleibst Du bei jedem Frühlingsgewitter trocken. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022MageNotes": "Diese mit Forsythienblüten geschmückte Robe zeigt allen, dass Du bereit bist, flink und federleicht in den Frühling zu fliegen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022HealerText": "Abendsmaragd-Zauberstab",
|
||||
"weaponSpecialSpring2022HealerNotes": "Benutze diesen Zauberstab, um die Heilkräfte des Abendsmaragds zu entfalten – mögen sie Dir Ruhe, Zufriedenheit und Güte bringen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022HealerText": "Abendsmaragd-Rüstung",
|
||||
"armorSpecialSpring2022HealerNotes": "Vertreibe Angst und Alpträume mit diesem grünen Edelstein-Gewand. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2022HealerText": "Abendsmaragd-Helm",
|
||||
"headSpecialSpring2022HealerNotes": "Dieser geheimnisvolle Helm bewahrt Deine Privatsphäre während Du diverse Aufgaben anpackst. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"shieldSpecialSpring2022HealerText": "Abendsmaragd-Schild",
|
||||
"shieldSpecialSpring2022HealerNotes": "Aus geschmolzenem Stein aus der Erdkruste geformt, kann dieses Schild jedem noch so harten Schlag widerstehen, der ihm in den Weg kommt. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorMystery202204Text": "Virtuelle Abenteurer Kapsel",
|
||||
"armorMystery202204Notes": "Es sieht so aus, als müsstest Du, um Deine Aufgaben zu erledigen, nun diese mysteriösen Knöpfe drücken! Was sie wohl machen? Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand.",
|
||||
"eyewearMystery202204AText": "Virtuelles Gesicht",
|
||||
"headArmoireStrawRainHatNotes": "Du wirst jedes Hindernis auf Deinem Weg erkennen können, wenn Du diesen wasserfesten, kegelförmigen Hut trägst. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Stroh Regenmantel Set (Gegenstand 2 von 2).",
|
||||
"eyewearMystery202204BText": "Virtuelles Gesicht",
|
||||
"eyewearMystery202204ANotes": "Wie fühlst Du Dich heute? Drücke Deine Stimmung mit diesen lustigen Bildschirmen aus. Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand.",
|
||||
"eyewearMystery202204BNotes": "Wie fühlst Du Dich heute? Drücke Deine Stimmung mit diesen lustigen Bildschirmen aus. Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand.",
|
||||
"armorArmoireStrawRaincoatText": "Stroh-Regenmantel"
|
||||
}
|
||||
|
||||
@@ -218,5 +218,8 @@
|
||||
"winter2022PomegranateMageSet": "Granatapfel (Magier)",
|
||||
"januaryYYYY": "Januar <%= year %>",
|
||||
"spring2022MagpieRogueSet": "Elster (Schurke)",
|
||||
"spring2022RainstormWarriorSet": "Gewitterregen (Krieger)"
|
||||
"spring2022RainstormWarriorSet": "Gewitterregen (Krieger)",
|
||||
"spring2022ForsythiaMageSet": "Forsythie (Magier)",
|
||||
"spring2022PeridotHealerSet": "Abendsmaragd (Heiler)",
|
||||
"aprilYYYY": "April <%= year %>"
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"sureChangeCustomDayStartTime": "Bist Du sicher, dass Du Deinen individuellen Tageswechsel umstellen willst? Deine Tagesaufgaben werden das nächste Mal zurückgesetzt, wenn Du Habitica nach <%= time %> verwendest. Stelle sicher, dass Du bis dahin Deine Aufgaben erledigt hast!",
|
||||
"customDayStartHasChanged": "Dein persönlicher Tagesstart wurde geändert.",
|
||||
"nextCron": "Deine Tagesaufgaben werden das nächste Mal überprüft und zurückgesetzt, wenn Du Habitica das erste Mal nach <%= time %> nutzt. Stelle sicher, dass Du Deine Tagesaufgaben vor diesem Zeitpunkt erledigt hast!",
|
||||
"customDayStartInfo1": "Normalerweise werden Deine Tagesaufgaben jeden Tag um Mitternacht Deiner Ortszeit von Habitica überprüft und zurückgesetzt. Du kannst diesen Zeitpunkt hier ändern.",
|
||||
"customDayStartInfo1": "Deine Tagesaufgaben werden jeden Tag um Mitternacht Deiner Ortszeit von Habitica überprüft und zurückgesetzt. Du kannst hier ändern, wenn das zu einem anderen Zeitpunkt geschehen soll.",
|
||||
"misc": "Verschiedenes",
|
||||
"showHeader": "Header anzeigen",
|
||||
"changePass": "Passwort ändern",
|
||||
@@ -55,7 +55,7 @@
|
||||
"newUsername": "Neuer Benutzername",
|
||||
"dangerZone": "Gefahrenzone",
|
||||
"resetText1": "WARNUNG! Es werden große Teile Deines Accounts zurückgesetzt. Wir raten dringend davon ab. Jedoch finden einige Spieler diese Funktion sinnvoll, um nach einem anfänglichen Testen der Seite neu beginnen zu können.",
|
||||
"resetText2": "Du verlierst alle Deine Level, Gold- und Erfahrungspunkte. Alle Deine Aufgaben (außer Aufgaben aus Herausforderungen) werden permanent gelöscht, und Du verlierst alle ihre historischen Daten. Du verlierst Deine gesamte Ausrüstung außer Abonnement-Überraschungsgegenstände und gratis Erinnerungsgegenstände. Du wirst die Möglichkeit haben, alle gelöschten Gegenstände zurückzukaufen, inklusive allen Gegenständen limitierter Ausgabe (Du musst für klassenspezifische Ausrüstung der richtigen Klasse angehören, um sie zurückzukaufen). Du behältst Deine aktuelle Klasse, Deine Erfolge, und Deine Haus- und Reittiere. Möglicherweise möchtest Du lieber die Sphäre der Wiedergeburt nutzen, die eine weit sicherere Option darstellt und Deine Aufgaben und Ausrüstung beibehält.",
|
||||
"resetText2": "Du verlierst alle Deine Level, Dein Gold und Deine Erfahrungspunkte. Alle Deine Aufgaben (außer Aufgaben aus Herausforderungen) werden permanent gelöscht, und Du verlierst alle ihre historischen Daten. Du verlierst Deine gesamte Ausrüstung außer Abonnement-Überraschungsgegenstände und gratis Erinnerungsgegenstände. Du wirst die Möglichkeit haben, alle gelöschten Gegenstände zurückzukaufen, inklusive allen Gegenständen limitierter Ausgabe (Du musst für klassenspezifische Ausrüstung der richtigen Klasse angehören, um sie zurückzukaufen). Du behältst Deine aktuelle Klasse, Deine Erfolge, und Deine Haus- und Reittiere. Möglicherweise möchtest Du lieber die Sphäre der Wiedergeburt nutzen, die eine weit sicherere Option darstellt und Deine Aufgaben und Ausrüstung beibehält.",
|
||||
"deleteLocalAccountText": "Bist Du sicher? Dies wird Dein Konto für immer löschen und es kann nicht wiederhergestellt werden! Wenn Du Habitica wieder verwenden möchtest, musst Du ein neues Konto registrieren. Gesparte oder verbrauchte Edelsteine werden nicht ersetzt. Wenn Du absolut sicher bist, dann tippe Dein Passwort in das Textfeld unten ein.",
|
||||
"deleteSocialAccountText": "Bist Du sicher? Dies wird Dein Konto für immer löschen und es kann nicht wiederhergestellt werden! Wenn Du Habitica wieder verwenden möchtest, musst Du ein neues Konto registrieren. Gesparte oder verbrauchte Edelsteine werden nicht ersetzt. Wenn Du absolut sicher bist, dann tippe \"<%= magicWord %>\" in das Textfeld unten ein.",
|
||||
"API": "API",
|
||||
@@ -159,7 +159,7 @@
|
||||
"amazonPayments": "Amazon-Zahlungen",
|
||||
"amazonPaymentsRecurring": "Die untenstehende Checkbox muss abgehakt werden, um Dein Abo zu erstellen. Dies ermöglicht, Deinen Amazon-Account für wiederkehrende Zahlungen für <strong>dieses</strong> Abo zu benutzen. Es führt nicht dazu, dass Dein Amazon-Account automatisch auch für zukünftige Einkäufe benutzt wird.",
|
||||
"timezone": "Zeitzone",
|
||||
"timezoneUTC": "Habitica verwendet die Zeitzone, welche an Deinem PC eingestellt ist: <strong><%= utc %></strong>",
|
||||
"timezoneUTC": "Deine Zeitzone wird von Deinem PC festgelegt, und ist: <strong><%= utc %></strong>",
|
||||
"timezoneInfo": "Wenn diese Zeitzone falsch ist, lade die Seite mit Hilfe Deines Browsers erneut, um sicherzustellen, dass Habitica die aktuellen Informationen darstellt. Ist diese immer noch falsch, passe die Zeitzone Deines PCs an und lade die Seite erneut.<br><br> <strong>Wenn Du Habitica auf anderen PCs oder Mobilgeräten verwendest, muss die Zeitzone auf allen übereinstimmen.</strong> Wenn Deine Tagesaufgaben zur falschen Zeit zurückgesetzt werden, wiederhole diese Prüfung auf allen anderen PCs und in einem Browser Deiner Mobilgeräte.",
|
||||
"push": "Push",
|
||||
"about": "Über",
|
||||
@@ -209,5 +209,11 @@
|
||||
"transaction_debug": "Debug-Aktion",
|
||||
"transaction_contribution": "Durch Beiträge",
|
||||
"transaction_release_pets": "Haustiere freigelassen",
|
||||
"transaction_release_mounts": "Reittiere freigelassen"
|
||||
"transaction_release_mounts": "Reittiere freigelassen",
|
||||
"addPasswordAuth": "Passwort hinzufügen",
|
||||
"nextHourglassDescription": "Abonnierende erhalten Mystische Sanduhren\ninnerhalb der ersten drei Tages des Monats.",
|
||||
"gemCap": "Edelsteinobergrenze",
|
||||
"nextHourglass": "Nächste Sanduhr",
|
||||
"adjustment": "Änderung",
|
||||
"dayStartAdjustment": "Änderung des Tageswechsel"
|
||||
}
|
||||
|
||||
@@ -202,5 +202,6 @@
|
||||
"mysterySet202112": "Antarktisches Undinen Set",
|
||||
"mysterySet202201": "Mitternächtliches Spaßvogel Set",
|
||||
"mysterySet202202": "Türkises Rattenschwänzchen Set",
|
||||
"mysterySet202203": "Furchtlose Libelle-Set"
|
||||
"mysterySet202203": "Furchtlose Libelle-Set",
|
||||
"mysterySet202204": "Virtuelles Abenteurer Set"
|
||||
}
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
"addedLocalAuth": "Successfully added local authentication",
|
||||
"data": "Δεδομένα",
|
||||
"email": "Email",
|
||||
"emailOrUsername": "Username or Email",
|
||||
"registerWithSocial": "Register with <%= network %>",
|
||||
"registeredWithSocial": "Registered with <%= network %>",
|
||||
"emailNotifications": "Ειδοποιήσεις email",
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
"achievementShadeOfItAllText": "Has tamed all Shade Mounts.",
|
||||
"achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!",
|
||||
"achievementZodiacZookeeper": "Zodiac Zookeeper",
|
||||
"achievementZodiacZookeeperText": "Has hatched all the zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!",
|
||||
"achievementZodiacZookeeperText": "Has hatched all standard colors of zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!",
|
||||
"achievementZodiacZookeeperModalText": "You collected all the zodiac pets!",
|
||||
"achievementBirdsOfAFeather": "Birds of a Feather",
|
||||
"achievementBirdsOfAFeatherText": "Has hatched all the flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.",
|
||||
"achievementBirdsOfAFeatherText": "Has hatched all standard colors of flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.",
|
||||
"achievementBirdsOfAFeatherModalText":"You collected all the flying pets!"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"background": "Background",
|
||||
"backgroundShop": "Background Shop",
|
||||
"noBackground": "No Background Selected",
|
||||
"hideLockedBackgrounds": "Hide locked backgrounds",
|
||||
|
||||
"backgrounds062014": "SET 1: Released June 2014",
|
||||
"backgroundBeachText": "Beach",
|
||||
@@ -770,6 +771,14 @@
|
||||
"backgroundFloweringPrairieText": "Flowering Prairie",
|
||||
"backgroundFloweringPrairieNotes": "Frolic through a Flowering Prairie.",
|
||||
|
||||
"backgrounds042022": "SET 95: Released April 2022",
|
||||
"backgroundBlossomingTreesText": "Blossoming Trees",
|
||||
"backgroundBlossomingTreesNotes": "Dally beneath Blossoming Trees.",
|
||||
"backgroundFlowerShopText": "Flower Shop",
|
||||
"backgroundFlowerShopNotes": "Enjoy the sweet scent of a Flower Shop.",
|
||||
"backgroundSpringtimeLakeText": "Springtime Lake",
|
||||
"backgroundSpringtimeLakeNotes": "Take in the sights along the shores of a Springtime Lake.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -308,6 +308,7 @@
|
||||
"hatchingPotionMoonglow": "Moonglow",
|
||||
"hatchingPotionSolarSystem": "Solar System",
|
||||
"hatchingPotionOnyx": "Onyx",
|
||||
"hatchingPotionVirtualPet": "Virtual Pet",
|
||||
|
||||
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.",
|
||||
"premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"companyDonate": "Donate",
|
||||
"forgotPassword": "Forgot Password?",
|
||||
"emailNewPass": "Email a Password Reset Link",
|
||||
"forgotPasswordSteps": "Enter the email address you used to register your Habitica account.",
|
||||
"forgotPasswordSteps": "Enter your username or the email address you used to register your Habitica account.",
|
||||
"sendLink": "Send Link",
|
||||
"footerDevs": "Developers",
|
||||
"footerCommunity": "Community",
|
||||
@@ -125,7 +125,7 @@
|
||||
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
|
||||
"minPasswordLength": "Password must be 8 characters or more.",
|
||||
"passwordResetPage": "Reset Password",
|
||||
"passwordReset": "If we have your email on file, instructions for setting a new password have been sent to your email.",
|
||||
"passwordReset": "If we have your email or username on file, instructions for setting a new password have been sent to your email.",
|
||||
"invalidLoginCredentialsLong": "Uh-oh - your email address / username or password is incorrect.\n- Make sure they are typed correctly. Your username and password are case-sensitive.\n- You may have signed up with Facebook or Google-sign-in, not email so double-check by trying them.\n- If you forgot your password, click \"Forgot Password\".",
|
||||
"invalidCredentials": "There is no account that uses those credentials.",
|
||||
"accountSuspended": "This account, User ID \"<%= userId %>\", has been blocked for breaking the Community Guidelines (https://habitica.com/static/community-guidelines) or Terms of Service (https://habitica.com/static/terms). For details or to ask to be unblocked, please email our Community Manager at <%= communityManagerEmail %> or ask your parent or guardian to email them. Please include your @Username in the email.",
|
||||
@@ -133,6 +133,7 @@
|
||||
"unsupportedNetwork": "This network is not currently supported.",
|
||||
"cantDetachSocial": "Account lacks another authentication method; can't detach this authentication method.",
|
||||
"onlySocialAttachLocal": "Local authentication can be added to only a social account.",
|
||||
"socialAlreadyExists": "This social login is already linked to an existing Habitica account.",
|
||||
"invalidReqParams": "Invalid request parameters.",
|
||||
"memberIdRequired": "\"member\" must be a valid UUID.",
|
||||
"heroIdRequired": "\"heroId\" must be a valid UUID.",
|
||||
@@ -143,7 +144,8 @@
|
||||
"confirmPassword": "Confirm Password",
|
||||
"usernameLimitations": "Username must be 1 to 20 characters, containing only letters a to z, numbers 0 to 9, hyphens, or underscores, and cannot include any inappropriate terms.",
|
||||
"usernamePlaceholder": "e.g., HabitRabbit",
|
||||
"emailPlaceholder": "e.g., rabbit@example.com",
|
||||
"emailPlaceholder": "e.g., gryphon@example.com",
|
||||
"emailUsernamePlaceholder": "e.g., habitrabbit or gryphon@example.com",
|
||||
"passwordPlaceholder": "e.g., ******************",
|
||||
"confirmPasswordPlaceholder": "Make sure it's the same password!",
|
||||
"joinHabitica": "Join Habitica",
|
||||
|
||||
@@ -431,7 +431,7 @@
|
||||
"weaponSpecialSpring2022RogueText": "Giant Earring Stud",
|
||||
"weaponSpecialSpring2022RogueNotes": "A shiny! It’s so shiny and gleaming and pretty and nice and all yours! Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022WarriorText": "Inside-Out Umbrella",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Yikes! Guess that wind was a little stronger than you thought, huh? Increases Strength by <%= str %>, Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Yikes! Guess that wind was a little stronger than you thought, huh? Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022MageText": "Forsythia Staff",
|
||||
"weaponSpecialSpring2022MageNotes": "These bright yellow bells are ready to channel your powerful springtime magic. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022HealerText": "Peridot Wand",
|
||||
@@ -1042,9 +1042,9 @@
|
||||
"armorSpecialSpring2022WarriorText": "Rain Slicker",
|
||||
"armorSpecialSpring2022WarriorNotes": "This slicker and boots are so formidable you could sing in the rain or jump in every puddle but still be warm and dry! Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022MageText": "Forsythia Robe",
|
||||
"armorSpecialSpring2022MageNotes": "Show you’re ready to spring forward into the season with this robe adorned with forsythia flower petals. Intelligence by <%= int %>.Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022MageNotes": "Show you’re ready to spring forward into the season with this robe adorned with forsythia flower petals. Increases Intelligence by <%= int %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022HealerText": "Peridot Armor",
|
||||
"armorSpecialSpring2022HealerNotes": " Drive away fears and nightmares simply by wearing this green gem garment. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022HealerNotes": "Drive away fears and nightmares simply by wearing this green gem garment. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
@@ -1326,7 +1326,9 @@
|
||||
"armorArmoireSoftVioletSuitText": "Soft Violet Suit",
|
||||
"armorArmoireSoftVioletSuitNotes": "Purple is a luxurious color. Relax in style after you’ve accomplished all your daily tasks. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Violet Loungewear Set (Item 2 of 3).",
|
||||
"armorArmoireGardenersOverallsText": "Gardener's Overalls",
|
||||
"armorArmoireGardenersOverallsNotes": "Don’t be afraid to work down in the dirt when you’re wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
|
||||
"armorArmoireGardenersOverallsNotes": "Don’t be afraid to work down in the dirt when you’re wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
|
||||
"armorArmoireStrawRaincoatText": "Straw Raincoat",
|
||||
"armorArmoireStrawRaincoatNotes":"This woven straw cape will keep you dry and your armor from rusting while on your quest. Just don’t venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -1737,7 +1739,7 @@
|
||||
"headSpecialSpring2022WarriorText": "Rain Slicker Hood",
|
||||
"headSpecialSpring2022WarriorNotes": "Tut tut, it looks like rain! Stand tall and pull up your hood to stay dry. Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022MageText": "Forsythia Helmet",
|
||||
"headSpecialSpring2022MageNotes": "Stay dry during a rainstorm with this protective helmet of downturned petals.Increases Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022MageNotes": "Stay dry during a rainstorm with this protective helmet of downturned petals. Increases Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022HealerText": "Peridot Helmet",
|
||||
"headSpecialSpring2022HealerNotes": "This mysterious helmet preserves your privacy as you tackle your tasks. Increases Intelligence by <%= int %>. Limited Edition 2022 Spring Gear.",
|
||||
|
||||
@@ -2044,7 +2046,9 @@
|
||||
"headArmoireShootingStarCrownText": "Star Crown",
|
||||
"headArmoireShootingStarCrownNotes": "With this brightly shining headpiece, you will literally be the star of your own adventure! Increases Perception by <%= per %>. Enchanted Armoire: Stardust Set (Item 1 of 3).",
|
||||
"headArmoireGardenersSunHatText": "Gardener's Sun Hat",
|
||||
"headArmoireGardenersSunHatNotes": "The bright light of the day star won’t shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
|
||||
"headArmoireGardenersSunHatNotes": "The bright light of the day star won’t shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
|
||||
"headArmoireStrawRainHatText": "Straw Rain Hat",
|
||||
"headArmoireStrawRainHatNotes": "You’ll be able to spot every obstacle in your path when you wear this water-resistant, conical hat. Increases Perception by <%= per %>. Enchanted Armoire: Straw Raincoat Set (Item 2 of 2).",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -2484,6 +2488,8 @@
|
||||
"backMystery202109Notes": "Glide softly through the twilight air without a sound. Confers no benefit. September 2021 Subscriber Item.",
|
||||
"backMystery202203Text": "Dauntless Dragonfly Wings",
|
||||
"backMystery202203Notes": "Outrace all the other creatures of the sky with these shimmering wings. Confers no benefit. March 2022 Subscriber Item.",
|
||||
"backMystery202205Text": "Dusk Wings",
|
||||
"backMystery202205Notes": "The mighty flap of these vast wings can be heard echoing among the dunes. Confers no benefit. May 2022 Subscriber Item.",
|
||||
|
||||
"backSpecialWonderconRedText": "Mighty Cape",
|
||||
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
|
||||
@@ -2684,6 +2690,8 @@
|
||||
"headAccessoryMystery202109Notes": "Catch the scent of flowers on the breeze or the scent of change on the wind. Confers no benefit. September 2021 Subscriber Item.",
|
||||
"headAccessoryMystery202203Text": "Dauntless Dragonfly Circlet",
|
||||
"headAccessoryMystery202203Notes": "Need an extra boost of speed? The tiny decorative wings on this circlet are more powerful than they look! Confers no benefit. March 2022 Subscriber Item.",
|
||||
"headAccessoryMystery202205Text": "Dusk-Winged Dragon Horns",
|
||||
"headAccessoryMystery202205Notes": "These dazzling horns are as bright as a desert sunset. Confers no benefit. May 2022 Subscriber Item.",
|
||||
"headAccessoryMystery301405Text": "Headwear Goggles",
|
||||
"headAccessoryMystery301405Notes": "\"Goggles are for your eyes,\" they said. \"Nobody wants goggles that you can only wear on your head,\" they said. Hah! You sure showed them! Confers no benefit. August 3015 Subscriber Item.",
|
||||
|
||||
|
||||
@@ -193,6 +193,7 @@
|
||||
"septemberYYYY": "September <%= year %>",
|
||||
"decemberYYYY": "December <%= year %>",
|
||||
"marchYYYY": "March <%= year %>",
|
||||
"aprilYYYY": "April <%= year %>",
|
||||
"mayYYYY": "May <%= year %>",
|
||||
"juneYYYY": "June <%= year %>",
|
||||
"novemberYYYY": "November <%= year %>",
|
||||
|
||||
@@ -867,5 +867,15 @@
|
||||
"questOnyxCollectLeoRunes": "Leo Runes",
|
||||
"questOnyxCollectOnyxStones": "Onyx Stones",
|
||||
"questOnyxDropOnyxPotion": "Onyx Hatching Potion",
|
||||
"questOnyxUnlockText": "Unlocks Onyx Hatching Potions for purchase in the Market"
|
||||
"questOnyxUnlockText": "Unlocks Onyx Hatching Potions for purchase in the Market",
|
||||
|
||||
"questVirtualPetText": "Virtual Mayhem with the April Fool: The Beepening",
|
||||
"questVirtualPetNotes": "It’s a quiet and pleasant spring morning in Habitica, a week past a memorable April Fool’s Day. You and @Beffymaroo are at the stables tending to your pets (who are still a bit confused from their time spent virtually!).<br><br>In the distance you hear a rumble and a beeping noise, soft at first but increasing in volume as if it’s getting closer. An egg-shape appears on the horizon and as it nears, beeping ever louder, you see that it is a gigantic virtual pet!<br><br>“Oh no,” @Beffymaroo exclaims, “I think the April Fool left some unfinished business with this big fella here, he seems to want attention!”<br><br>The virtual pet beeps angrily, throwing a virtual tantrum and whomping ever closer.",
|
||||
"questVirtualPetCompletion": "Some careful button pushing seems to have fulfilled the virtual pet’s mysterious needs, and finally it has quieted down and appears content.<br><br>Suddenly in a burst of confetti, the April Fool appears with a basket full of strange potions emitting soft beeps.<br><br>“What timing, April Fool,” @Beffymaroo says with a wry smile. “I suspect this large beeping fellow is an acquaintance of yours.”<br><br>“Uh, yes,” the Fool says, sheepishly. “So sorry about that, and thank you both for taking care of Wotchimon! Take these potions in the way of thanks, they can bring your Virtual pets back anytime you like!”<br><br>You’re not 100% sure you’re on board with all the beeping, but they’re sure cute so it’s worth a shot!",
|
||||
"questVirtualPetBoss": "Wotchimon",
|
||||
"questVirtualPetRageTitle": "The Beepening",
|
||||
"questVirtualPetRageDescription": "This bar fills when you don't complete your Dailies. When it is full, the Wotchimon will take away some of your party's pending damage!",
|
||||
"questVirtualPetRageEffect": "`Wotchimon uses Bothersome Beep!` Wotchimon sounds a bothersome beep, and its happiness bar suddenly disappears! Pending damage reduced.",
|
||||
"questVirtualPetDropVirtualPetPotion": "Virtual Pet Hatching Potion",
|
||||
"questVirtualPetUnlockText": "Unlocks Virtual Pet Hatching Potion for purchase in the Market"
|
||||
}
|
||||
|
||||
@@ -40,10 +40,12 @@
|
||||
"xml": "(XML)",
|
||||
"json": "(JSON)",
|
||||
"customDayStart": "Custom Day Start",
|
||||
"adjustment": "Adjustment",
|
||||
"dayStartAdjustment": "Day Start Adjustment",
|
||||
"sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!",
|
||||
"customDayStartHasChanged": "Your custom day start has changed.",
|
||||
"nextCron": "Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before this time!",
|
||||
"customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.",
|
||||
"customDayStartInfo1": "Habitica checks and resets your Dailies at midnight in your own time zone each day. You can adjust when that happens past the default time here.",
|
||||
"misc": "Misc",
|
||||
"showHeader": "Show Header",
|
||||
"changePass": "Change Password",
|
||||
@@ -56,7 +58,7 @@
|
||||
"newUsername": "New Username",
|
||||
"dangerZone": "Danger Zone",
|
||||
"resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.",
|
||||
"resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment except Subscriber Mystery Items and free commemorative items. You will be able to buy the deleted items back, including all limited edition equipment (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class, achievements and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
||||
"resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment except Subscriber Mystery Items and free commemorative items. You will be able to buy the deleted items back, including all limited edition equipment (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class, achievements and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
||||
"deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.",
|
||||
"deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.",
|
||||
"API": "API",
|
||||
@@ -134,6 +136,7 @@
|
||||
"saveCustomDayStart": "Save Custom Day Start",
|
||||
"registration": "Registration",
|
||||
"addLocalAuth": "Add Email and Password Login",
|
||||
"addPasswordAuth": "Add Password",
|
||||
"generateCodes": "Generate Codes",
|
||||
"generate": "Generate",
|
||||
"getCodes": "Get Codes",
|
||||
@@ -155,14 +158,17 @@
|
||||
"purchasedPlanExtraMonths": "You have <strong><%= months %> months</strong> of extra subscription credit.",
|
||||
"consecutiveSubscription": "Consecutive Subscription",
|
||||
"consecutiveMonths": "Consecutive Months:",
|
||||
"gemCap": "Gem Cap",
|
||||
"gemCapExtra": "Gem Cap Bonus",
|
||||
"mysticHourglasses": "Mystic Hourglasses:",
|
||||
"mysticHourglassesTooltip": "Mystic Hourglasses",
|
||||
"nextHourglass": "Next Hourglass",
|
||||
"nextHourglassDescription": "Subscribers receive Mystic Hourglasses within\nthe first three days of the month.",
|
||||
"paypal": "PayPal",
|
||||
"amazonPayments": "Amazon Payments",
|
||||
"amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for <strong>this</strong> subscription. It will not cause your Amazon account to be automatically used for any future purchases.",
|
||||
"timezone": "Time Zone",
|
||||
"timezoneUTC": "Habitica uses the time zone set on your PC, which is: <strong><%= utc %></strong>",
|
||||
"timezoneUTC": "Your time zone is set by your computer, which is: <strong><%= utc %></strong>",
|
||||
"timezoneInfo": "If that time zone is wrong, first reload this page using your browser's reload or refresh button to ensure that Habitica has the most recent information. If it is still wrong, adjust the time zone on your PC and then reload this page again.<br><br> <strong>If you use Habitica on other PCs or mobile devices, the time zone must be the same on them all.</strong> If your Dailies have been resetting at the wrong time, repeat this check on all other PCs and on a browser on your mobile devices.",
|
||||
"push": "Push",
|
||||
"about": "About",
|
||||
@@ -200,9 +206,9 @@
|
||||
"transaction_create_challenge": "Created challenge",
|
||||
"transaction_create_guild": "Created guild",
|
||||
"transaction_change_class": "Changed class",
|
||||
"transaction_rebirth": "Used orb of rebirth",
|
||||
"transaction_rebirth": "Used Orb of Rebirth",
|
||||
"transaction_release_pets": "Released pets",
|
||||
"transaction_release_mounts": "Released mounts",
|
||||
"transaction_reroll": "Used fortify potion",
|
||||
"transaction_reroll": "Used Fortify Potion",
|
||||
"transaction_subscription_perks": "From subscription perk"
|
||||
}
|
||||
|
||||
@@ -133,6 +133,7 @@
|
||||
"mysterySet202202": "Turquoise Twintails Set",
|
||||
"mysterySet202203": "Dauntless Dragonfly Set",
|
||||
"mysterySet202204": "Virtual Adventurer Set",
|
||||
"mysterySet202205": "Dusk-Winged Dragon Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
||||
@@ -124,9 +124,10 @@
|
||||
"achievementShadeOfItAllModalText": "¡Has domado todas las monturas sombrías!",
|
||||
"achievementShadyCustomerText": "Ha conseguido todas las mascotas sombrías.",
|
||||
"achievementShadyCustomer": "Cliente sombrío",
|
||||
"achievementZodiacZookeeper": "Cuidador del Zodíaco",
|
||||
"achievementZodiacZookeeperText": "¡Has eclosionado todas las mascotas del zodíaco: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
|
||||
"achievementZodiacZookeeper": "Cuidador del Zodiaco",
|
||||
"achievementZodiacZookeeperText": "¡Ha eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
|
||||
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!",
|
||||
"achievementBirdsOfAFeatherText": "Has eclosionado todas las mascotas voladoras: Cerdo volador, Búho, Loro, Pterodáctilo, Grifo y Halcón.",
|
||||
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!"
|
||||
"achievementBirdsOfAFeatherText": "Ha eclosionado todas las mascotas voladoras de color básico: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo.",
|
||||
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!",
|
||||
"achievementBirdsOfAFeather": "Aves de Pluma"
|
||||
}
|
||||
|
||||
@@ -643,8 +643,8 @@
|
||||
"backgroundCrypticCandlesText": "Velas crípticas",
|
||||
"backgroundCrypticCandlesNotes": "Invoca fuerzas arcanas entre estas velas crípticas.",
|
||||
"backgroundHauntedPhotoText": "Foto encantada",
|
||||
"backgroundUndeadHandsText": "Mano no-muertas",
|
||||
"backgroundUndeadHandsNotes": "Intenta escapar de las garras de estas manos no-muertas.",
|
||||
"backgroundUndeadHandsText": "Manos muertas vivientes",
|
||||
"backgroundUndeadHandsNotes": "Intenta escapar de las garras de estas Manos muertas vivientes.",
|
||||
"backgrounds102021": "89.ª Serie: publicada en octubre de 2021",
|
||||
"backgroundHauntedPhotoNotes": "Te ves atrapado en el monocromático mundo de una foto encantada.",
|
||||
"backgroundIcePalaceNotes": "Reina desde el Palacio de Hielo.",
|
||||
@@ -677,5 +677,16 @@
|
||||
"backgrounds022022": "93.ª serie: publicada en febrero de 2022",
|
||||
"backgrounds032022": "94.ª serie: publiccada en marzo de 2022",
|
||||
"backgroundBrickWallWithIvyText": "Pared de Ladrillo con Hiedra",
|
||||
"backgroundBrickWallWithIvyNotes": "Admira una Pared de Ladrillo con Hiedra."
|
||||
"backgroundBrickWallWithIvyNotes": "Admira una Pared de Ladrillo con Hiedra.",
|
||||
"backgrounds042022": "95ª. serie: publicada en abril de 2022",
|
||||
"backgroundBlossomingTreesText": "Árboles Florecidos",
|
||||
"backgroundFlowerShopText": "Tienda de Flores",
|
||||
"backgroundFlowerShopNotes": "Disfruta el suave aroma de una Tienda de Flores.",
|
||||
"backgroundBlossomingTreesNotes": "Entretente bajo Árboles Florecidos.",
|
||||
"backgroundAnimalsDenText": "Cubil de una Criatura del Bosque",
|
||||
"backgroundAnimalsDenNotes": "Ponte Cómodo en el Cubil de una Criatura del Bosque.",
|
||||
"backgroundFloweringPrairieNotes": "Brinca por una pradera floreciente.",
|
||||
"backgroundFloweringPrairieText": "Pradera floreciente",
|
||||
"backgroundSpringtimeLakeText": "Lago de Primavera",
|
||||
"backgroundSpringtimeLakeNotes": "Disfruta las vistas a orillas de un Lago de Primavera."
|
||||
}
|
||||
|
||||
@@ -370,5 +370,6 @@
|
||||
"hatchingPotionSunset": "Atardecer",
|
||||
"hatchingPotionMoonglow": "Brillolunar",
|
||||
"hatchingPotionSolarSystem": "Sistema solar",
|
||||
"hatchingPotionOnyx": "Ónice"
|
||||
"hatchingPotionOnyx": "Ónice",
|
||||
"hatchingPotionVirtualPet": "Mascota virtual"
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"companyDonate": "Donar",
|
||||
"forgotPassword": "¿Has olvidado la contraseña?",
|
||||
"emailNewPass": "Enviar un link de cambio de contraseña",
|
||||
"forgotPasswordSteps": "Introduce la dirección de correo electrónico que utilizaste para registrarte en Habitica.",
|
||||
"forgotPasswordSteps": "Introduce tu nombre de usuario o la dirección de correo electrónico que utilizaste para registrarte en Habitica.",
|
||||
"sendLink": "Enviar link",
|
||||
"featuredIn": "Hablan de nosotros en",
|
||||
"footerDevs": "Desarrolladores",
|
||||
@@ -129,7 +129,7 @@
|
||||
"passwordConfirmationMatch": "Las contraseñas no coinciden.",
|
||||
"invalidLoginCredentials": "El nombre de usuario y/o correo electrónico y/o conseña no son correctos.",
|
||||
"passwordResetPage": "Restablecer Contraseña",
|
||||
"passwordReset": "Si tenemos constancia de tu correo electrónico, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
|
||||
"passwordReset": "Si tenemos constancia de tu correo electrónico o nombre de usuario, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
|
||||
"passwordResetEmailSubject": "Restablecer contraseña para Habitica",
|
||||
"passwordResetEmailText": "Si has solicitado restablecer la contraseña del usuario <%= username %> en Habitica, entra en <%= passwordResetLink %> para establecer una nueva. El enlace expira tras 24 horas. Si no has solicitado restablecer una contraseña, por favor ignora este mensaje.",
|
||||
"passwordResetEmailHtml": "Si has solicitado restablecer la contraseña del usuario <strong><%= username %></strong> en Habitica, <a href=\"<%= passwordResetLink %>\">haz clic aquí</a> para establecer una nueva. El enlace expira tras 24 horas.<br/><br>Si no has solicitado restablecer una contraseña, por favor ignora este mensaje.",
|
||||
@@ -150,7 +150,7 @@
|
||||
"confirmPassword": "Confirmar contraseña",
|
||||
"usernameLimitations": "El nombre de usuario debe tener entre 1 y 20 caracteres, que tengan solo letras entre la a y la z, números del 0 al 9, guiones o barras bajas, y no pueden incluir términos inapropiados.",
|
||||
"usernamePlaceholder": "p.e., HabitRabbit",
|
||||
"emailPlaceholder": "p.e., rabbit@example.com",
|
||||
"emailPlaceholder": "p.e., gryphon@example.com",
|
||||
"passwordPlaceholder": "p.e., ******************",
|
||||
"confirmPasswordPlaceholder": "¡Asegúrate de que es la misma contraseña!",
|
||||
"joinHabitica": "Únete a Habitica",
|
||||
@@ -185,5 +185,6 @@
|
||||
"learnMore": "Saber más",
|
||||
"communityInstagram": "Instagram",
|
||||
"minPasswordLength": "La contraseña debe contener 8 caracteres o más.",
|
||||
"enterHabitica": "Adéntrate en Habitica"
|
||||
"enterHabitica": "Adéntrate en Habitica",
|
||||
"emailUsernamePlaceholder": "p.e., habitrabbit o gryphon@example.com"
|
||||
}
|
||||
|
||||
@@ -2572,5 +2572,25 @@
|
||||
"backMystery202203Notes": "Gana la carrera a todas las demás criaturas del cielo gracias a estas alas brillantes. No otorga ningún beneficio. Artículo de suscriptor de marzo 2022.",
|
||||
"headAccessoryMystery202203Text": "Diadema de Libélula Intrépida",
|
||||
"armorArmoireSoftVioletSuitNotes": "El morado es un color de lujo. Relájate con clase después de terminar tus tareas diarias. Aumenta la Constitución y la Fuerza en <%= attrs %> . Armario encantado: Conjunto Ropa de casa violeta (Artículo 2 de 3).",
|
||||
"headAccessoryMystery202203Notes": "¿Necesitas un impulso de velocidad?¡Las alitas decorativas de esta diadema son más poderosas de lo que parecen! No otorga ningún beneficio. Artículo de suscriptor de marzo 2022."
|
||||
"headAccessoryMystery202203Notes": "¿Necesitas un impulso de velocidad?¡Las alitas decorativas de esta diadema son más poderosas de lo que parecen! No otorga ningún beneficio. Artículo de suscriptor de marzo 2022.",
|
||||
"weaponSpecialSpring2022WarriorText": "Paraguas del Revés",
|
||||
"weaponSpecialSpring2022WarriorNotes": "¡Ostras! Supongo que ese viento era un poco más fuerte de lo que pensabas, ¿eh? Aumenta la fuerza en <%= str %>. Equipamiento de Edición Limitada de Primavera 2022.",
|
||||
"weaponArmoireGardenersWateringCanNotes": "¡No puedes llegar lejos sin agua! Ten un suministro infinto a mano con esta regadera mágica que se rellena. Aumenta la Inteligencia por <%= int %>. Armario encantado: Conjunto de Jardinería (Artículo 4 de 4).",
|
||||
"armorSpecialSpring2022RogueText": "Disfraz de Urraca",
|
||||
"armorSpecialSpring2022RogueNotes": "¡Con un azul grisáceo iridiscente y manchas más claras en tus plumas, serás el mejor amigo volador en la fiesta de la primavera! Aumenta la percepción en <%= per %>. Equipamiento de Edición Limitada de Primavera 2022.",
|
||||
"headSpecialSpring2022RogueText": "Máscara de Urraca",
|
||||
"headSpecialSpring2022RogueNotes": "Sé tan inteligente como una urraca cuando lleves esta máscara. Quizá incluso podrás silbar, trinar e imitar tan bien como una, también. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2022.",
|
||||
"armorMystery202204Text": "Cápsula de Aventurero Virtual",
|
||||
"armorMystery202204Notes": "¡Parece que hacer tus tareas ahora requiere pulsar estos botones misteriosos! ¿Qué podrían hacer? No otorga ninún beneficio. Artículo de suscriptor de abril 2021.",
|
||||
"weaponArmoireGardenersWateringCanText": "Regadera",
|
||||
"armorArmoireStrawRaincoatText": "Chubasquero de Paja",
|
||||
"weaponSpecialSpring2022MageText": "Bastón de Forsitia",
|
||||
"weaponSpecialSpring2022MageNotes": "Estas campanillas amarillas brillantes son listas para canalizar tu magia poderosa primaveral. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamento de edición limitada de primavera.",
|
||||
"armorSpecialSpring2022MageText": "Túnica de Forsitia",
|
||||
"armorSpecialSpring2022MageNotes": "Muestra que estás preparado para entrar en la temporada de primavera con esta túnica adornada con pétalos de flor de forsitia. Aumenta la Inteligencia en <%= int %>. Equipamiento de Edición Limitada de Primavera 2022.",
|
||||
"armorSpecialSpring2022HealerText": "Armadura de Peridoto",
|
||||
"armorSpecialSpring2022HealerNotes": "Ahuyenta los miedos y pesadillas simplemente llevando esta prenda de gema verde.Aumenta la constitución en <%= con %>.Aumenta la constitución en <%= con %>. Equipamiento de Edición Limitada de Primavera 2022.",
|
||||
"armorArmoireGardenersOverallsText": "Mono de Jardinero",
|
||||
"armorArmoireGardenersOverallsNotes": "No tengas miedo de trabajar en la tierra cuando estés llevando estos monos duraderos. Aumenta la constitución en <%= con %>. Armario Encantado: Conjunto de Jardinería (Artículo 1 de 4).",
|
||||
"weaponSpecialSpring2022RogueText": "Pendiente de Botón Gigante"
|
||||
}
|
||||
|
||||
@@ -211,10 +211,14 @@
|
||||
"fall2021BrainEaterMageSet": "Comecerebros (Mago)",
|
||||
"fall2021FlameSummonerHealerSet": "Invocador de la llama (Sanador)",
|
||||
"fall2021HeadlessWarriorSet": "Acéfalo (Guerrero)",
|
||||
"fall2021OozeRogueSet": "Rezumar (Pícaro)",
|
||||
"fall2021OozeRogueSet": "Cieno (Pícaro)",
|
||||
"januaryYYYY": "Enero <%= year %>",
|
||||
"winter2022FireworksRogueSet": "Fuegos Artificiales (Pícaro)",
|
||||
"winter2022StockingWarriorSet": "Calcetín (Guerrero)",
|
||||
"winter2022PomegranateMageSet": "Granada (Mago)",
|
||||
"winter2022IceCrystalHealerSet": "Cristal de Hielo (Sanador)"
|
||||
"winter2022IceCrystalHealerSet": "Cristal de Hielo (Sanador)",
|
||||
"spring2022MagpieRogueSet": "Urraca (Pícaro)",
|
||||
"spring2022RainstormWarriorSet": "Tempestad (Guerrero)",
|
||||
"spring2022ForsythiaMageSet": "Forsitia (Mago)",
|
||||
"spring2022PeridotHealerSet": "Peridoto (Sanador)"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"unlockedReward": "Has recibido <%= reward %>",
|
||||
"earnedRewardForDevotion": "Has ganado <%= reward %> por siendo committed por mejorado su vida.",
|
||||
"earnedRewardForDevotion": "Has ganado <%= reward %> por haberte comprometido a mejorar tu vida.",
|
||||
"nextRewardUnlocksIn": "Registros hasta tu próximo premio: <%= numberOfCheckinsLeft %>",
|
||||
"awesome": "¡Genial!",
|
||||
"countLeft": "Registros hasta la próxima recompensa: <%= count %>",
|
||||
|
||||
@@ -602,7 +602,7 @@
|
||||
"questSquirrelDropSquirrelEgg": "Ardilla (huevo)",
|
||||
"questSquirrelUnlockText": "Desbloquea la compra de huevos de ardilla en el Mercado",
|
||||
"cuddleBuddiesText": "Lote de Misiones Compañeros Abrazados",
|
||||
"cuddleBuddiesNotes": "Contiene \"El Conejito Asesino\", \"El Hurón Malvado\", y \"La Pandilla de Cobayas\". Disponible hasta el 31 de mayo.",
|
||||
"cuddleBuddiesNotes": "Contiene \"El Conejito Asesino\", \"El Hurón Malvado\", y \"La Pandilla de Cobayas\". Disponible hasta el 31 de marzo.",
|
||||
"aquaticAmigosText": "Lote de Misiones de Amigos Acuáticos",
|
||||
"aquaticAmigosNotes": "Contiene 'El ajolote mágico', 'El Kraken del Inkompleto' y 'La llamada de Octothulu'. Disponible hasta el 31 de agosto.",
|
||||
"questSeaSerpentText": "Peligro en las profundidades: ¡Ataque de la serpiente marina!",
|
||||
|
||||
@@ -200,14 +200,17 @@
|
||||
"transaction_create_challenge": "Desafío creado",
|
||||
"transaction_create_guild": "Gremio creado",
|
||||
"transaction_change_class": "Clase cambiada",
|
||||
"transaction_rebirth": "Orbe de renacimiento usado",
|
||||
"transaction_rebirth": "Orbe de Renacimiento usado",
|
||||
"transaction_release_pets": "Mascotas soltadas",
|
||||
"transaction_reroll": "Poción de fortalecimiento usada",
|
||||
"transaction_reroll": "Poción de Fortalecimiento usada",
|
||||
"hourglassTransactions": "Transacciones de Relojes de Arena",
|
||||
"transaction_gift_receive": "Recibido de",
|
||||
"transaction_debug": "Depuración",
|
||||
"transaction_contribution": "A través de contribuciones",
|
||||
"transaction_spend": "Gastado en",
|
||||
"transaction_release_mounts": "Monturas sueltas",
|
||||
"transaction_subscription_perks": "Beneficio de la suscripción"
|
||||
"transaction_subscription_perks": "Beneficio de la suscripción",
|
||||
"addPasswordAuth": "Añadir contraseña",
|
||||
"gemCap": "Límite de Gemas",
|
||||
"nextHourglass": "Siguiente Reloj de Arena"
|
||||
}
|
||||
|
||||
@@ -200,5 +200,6 @@
|
||||
"mysterySet202112": "Conjunto de Ondina Antártica",
|
||||
"mysterySet202201": "Conjunto de Juerguista de Medianoche",
|
||||
"mysterySet202202": "Conjunto de Coletas Turquesas",
|
||||
"mysterySet202203": "Conjunto de Libélula Intrépida"
|
||||
"mysterySet202203": "Conjunto de Libélula Intrépida",
|
||||
"mysterySet202204": "Conjunto de Aventurero Virtual"
|
||||
}
|
||||
|
||||
@@ -116,5 +116,18 @@
|
||||
"achievementVioletsAreBlueModalText": "¡Lograste obtener todas las mascotas de algodón de azúcar azul!",
|
||||
"achievementVioletsAreBlueText": "Ha obtenido todas las mascotas de algodón de azúcar azul.",
|
||||
"achievementDomesticatedText": "¡Has eclosionado todos los colores base de mascotas domesticas: hurón, cobaya, gallo, cerdo volador, ratón, conejo, caballo y vaca!",
|
||||
"achievementDomesticatedModalText": "¡Has eclosionado todas las mascotas domésticas!"
|
||||
"achievementDomesticatedModalText": "¡Has eclosionado todas las mascotas domésticas!",
|
||||
"achievementDomesticated": "I-A-I-A-O",
|
||||
"achievementBirdsOfAFeather": "Aves de Pluma",
|
||||
"achievementBirdsOfAFeatherText": "Has eclosionado todas las mascotas voladoras: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo.",
|
||||
"achievementZodiacZookeeper": "Cuidador del Zodíaco",
|
||||
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!",
|
||||
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!",
|
||||
"achievementShadeOfItAll": "La sombra de todo ello",
|
||||
"achievementShadeOfItAllText": "Ha domado todas las monturas sombrías.",
|
||||
"achievementShadyCustomer": "Cliente sombrío",
|
||||
"achievementShadyCustomerText": "Ha conseguido todas las mascotas sombrías.",
|
||||
"achievementShadyCustomerModalText": "¡Has conseguido todas las mascotas sombrías!",
|
||||
"achievementShadeOfItAllModalText": "¡Has domado todas las monturas sombrías!",
|
||||
"achievementZodiacZookeeperText": "¡Has eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!"
|
||||
}
|
||||
|
||||
@@ -497,8 +497,8 @@
|
||||
"backgroundPotionShopText": "Tienda de Pociones",
|
||||
"backgroundFlyingInAThunderstormNotes": "Persigue una Tormenta Tumultuosa tan cerca como te atrevas.",
|
||||
"backgroundFlyingInAThunderstormText": "Tormenta Tumultuosa",
|
||||
"backgroundFarmersMarketNotes": "Compra los víveres más frescos en el Mercado del Granjero.",
|
||||
"backgroundFarmersMarketText": "Mercado del Granjero",
|
||||
"backgroundFarmersMarketNotes": "Compra los víveres más frescos en el Mercado Agrícola.",
|
||||
"backgroundFarmersMarketText": "Mercado Agrícola",
|
||||
"backgrounds112019": "CONJUNTO 66: Lanzado en Noviembre 2019",
|
||||
"backgroundTeaPartyNotes": "Participa en una sofisticada Fiesta de Té.",
|
||||
"backgroundHallOfHeroesNotes": "Acércate al salón de los héroes con apreciación y veneración.",
|
||||
@@ -625,5 +625,42 @@
|
||||
"backgroundGhostShipText": "Barco Fantasma",
|
||||
"backgroundUnderwaterAmongKoiNotes": "Deslumbra y deslúmbrate por las carpas brillantes, Bajo el Agua Entre Kois.",
|
||||
"backgroundUnderwaterAmongKoiText": "Bajo el Agua Entre Kois",
|
||||
"backgrounds072021": "CONJUNTO 86: Lanzado en Julio 2021"
|
||||
"backgrounds072021": "CONJUNTO 86: Lanzado en Julio 2021",
|
||||
"backgroundRopeBridgeNotes": "Demuestra a los escépticos que este Puente de Cuerda es perfectamente seguro.",
|
||||
"backgrounds092021": "CONJUNTO 88: Publicado en septiembre de 2021",
|
||||
"backgrounds082021": "CONJUNTO 87: Publicado en agosto de 2021",
|
||||
"backgroundDaytimeMistyForestText": "Bosque Brumoso",
|
||||
"backgroundVineyardText": "Viñedo",
|
||||
"backgroundDaytimeMistyForestNotes": "Bañate en el resplandor del la luz del día que fluye a través del Bosque Brumoso.",
|
||||
"backgroundStoneTowerNotes": "Mira desde los parapetos de una Torre de Piedra a otra.",
|
||||
"backgroundStoneTowerText": "Torre de Piedra",
|
||||
"backgroundRopeBridgeText": "Puente de Cuerda",
|
||||
"backgroundVineyardNotes": "Explora la extensión de un fértil viñedo.",
|
||||
"backgroundAutumnPoplarsText": "Bosque de álamos otoñales",
|
||||
"backgroundAutumnLakeshoreText": "Orilla de lago otoñal",
|
||||
"backgroundAutumnLakeshoreNotes": "Párate un momento en la orilla de un lago otoñal para apreciar el reflejo del bosque en sus aguas.",
|
||||
"backgroundAutumnPoplarsNotes": "Regocíjate en los brillantes tonos marrones y dorados de un bosque de álamos otoñales.",
|
||||
"backgroundFloweringPrairieText": "Pradera floreciente",
|
||||
"backgrounds112021": "CONJUNTO 90: Lanzado en Noviembre 2021",
|
||||
"backgroundCrypticCandlesNotes": "Invoca fuerzas arcanas entre estas velas crípticas.",
|
||||
"backgroundHauntedPhotoText": "Foto encantada",
|
||||
"backgrounds102021": "CONJUNTO 89: Lanzado en Octubre 2021",
|
||||
"backgroundCrypticCandlesText": "Velas crípticas",
|
||||
"backgroundHauntedPhotoNotes": "Te ves atrapado en el mundo monocromático de una foto encantada.",
|
||||
"backgroundUndeadHandsText": "Manos muertas vivientes",
|
||||
"backgroundUndeadHandsNotes": "Intenta escapar de las garras de estas Manos muertas vivientes.",
|
||||
"backgrounds122021": "CONJUNTO 91: Lanzado en Diciembre 2021",
|
||||
"backgroundFortuneTellersShopText": "Tienda de Vidente",
|
||||
"backgroundInsideAPotionBottleNotes": "Observa a través del cristal mientras esperas el rescate del interior del frasco de una poción.",
|
||||
"backgroundSpiralStaircaseText": "Escalera de Caracol",
|
||||
"backgroundSpiralStaircaseNotes": "Sube, baja y da vueltas y vueltas en esta Escalera de Caracol.",
|
||||
"backgroundFortuneTellersShopNotes": "Busca pistas tentadoras sobre tu futuro en una Tienda de Vidente.",
|
||||
"backgroundInsideAPotionBottleText": "Dentro del Frasco de una Poción",
|
||||
"backgroundFrozenPolarWatersText": "Aguas Polares Heladas",
|
||||
"backgroundFrozenPolarWatersNotes": "Explora las heladas aguas polares.",
|
||||
"backgroundWinterCanyonNotes": "¡Vive una aventura en un cañón invernal!",
|
||||
"backgroundWinterCanyonText": "Cañón Invernal",
|
||||
"backgroundIcePalaceText": "Palacio de Hielo",
|
||||
"backgroundIcePalaceNotes": "Reina desde el Palacio de Hielo.",
|
||||
"backgrounds012022": "CONJUNTO 92: Lanzado en Enero 2022"
|
||||
}
|
||||
|
||||