Compare commits

..

134 Commits

Author SHA1 Message Date
SabreCat 1d68a95b64 4.229.0 2022-04-29 14:24:24 -05:00
SabreCat 88999a0751 Merge branch 'develop' into release 2022-04-29 14:22:07 -05:00
SabreCat 2666c93e5f chore(css): compile images 2022-04-29 14:21:53 -05:00
CuriousMagpie 5faa49d032 2022-05 Subscriber Items 2022-04-28 15:54:09 -04:00
dependabot[bot] 55c800cb4b build(deps): bump stripe from 8.217.0 to 8.219.0 (#13949)
Bumps [stripe](https://github.com/stripe/stripe-node) from 8.217.0 to 8.219.0.
- [Release notes](https://github.com/stripe/stripe-node/releases)
- [Changelog](https://github.com/stripe/stripe-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-node/compare/v8.217.0...v8.219.0)

---
updated-dependencies:
- dependency-name: stripe
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-25 12:53:12 -04:00
Natalie L deee147928 Corrected spelling of Wotchimon and description of rage effect. (#13943) 2022-04-21 16:39:54 -05:00
SabreCat a9cd36c109 Merge branch 'background-toggle' into develop 2022-04-21 16:24:04 -05:00
SabreCat 4c1c00b0a3 fix(bgs): revert wording change and tokenize 2022-04-21 16:22:36 -05:00
SabreCat 245e135be8 4.228.4 2022-04-21 14:09:48 -05:00
Weblate 978c707e17 Translated using Weblate (German)
Currently translated at 99.7% (687 of 689 strings)

Translated using Weblate (German)

Currently translated at 99.5% (686 of 689 strings)

Translated using Weblate (German)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (German)

Currently translated at 99.9% (2581 of 2583 strings)

Translated using Weblate (German)

Currently translated at 99.2% (684 of 689 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (210 of 214 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (210 of 214 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (180 of 180 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.5% (2494 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (180 of 180 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 91.5% (194 of 212 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.0% (2456 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 96.2% (663 of 689 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (364 of 365 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.8% (2450 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 97.6% (207 of 212 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 95.2% (656 of 689 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 93.7% (2422 of 2583 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (220 of 220 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.7% (215 of 220 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.0% (2533 of 2583 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Filipino)

Currently translated at 90.0% (191 of 212 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (129 of 129 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (61 of 61 strings)

Translated using Weblate (Japanese)

Currently translated at 99.5% (219 of 220 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (365 of 365 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.0% (2533 of 2583 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (214 of 214 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (180 of 180 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 97.6% (207 of 212 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (372 of 373 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2583 of 2583 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2583 of 2583 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 93.8% (199 of 212 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 96.8% (212 of 219 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 99.0% (748 of 755 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (752 of 755 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (752 of 755 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (373 of 373 strings)

Co-authored-by: Chap <chalda82+nogravatar@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Heitor Menezes Gomes <heitorgmenezes@gmail.com>
Co-authored-by: Hexe des Windes (she/her) <krausanna1@gmail.com>
Co-authored-by: Ike Osenberg <ike.osenberg@gmail.com>
Co-authored-by: Jerry Chen <minecjraft@qq.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Sciuridae <sweetvshoney@163.com>
Co-authored-by: Vince Vilan <vincemorel.vilan.889@my.csun.edu>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: blacksheep47 <1760906326@qq.com>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Co-authored-by: そら <comi4work@gmail.com>
Co-authored-by: 普通学生何某人 <hewei5002@hotmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/it/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fil/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/zh_Hans/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2022-04-21 21:08:52 +02:00
SabreCat 623d38f281 feat(nav): clicking "Group" goes to first group 2022-04-19 15:38:15 -05:00
dependabot[bot] c88e458a97 build(deps-dev): bump sinon from 13.0.1 to 13.0.2 (#13940)
Bumps [sinon](https://github.com/sinonjs/sinon) from 13.0.1 to 13.0.2.
- [Release notes](https://github.com/sinonjs/sinon/releases)
- [Changelog](https://github.com/sinonjs/sinon/blob/main/docs/changelog.md)
- [Commits](https://github.com/sinonjs/sinon/compare/v13.0.1...v13.0.2)

---
updated-dependencies:
- dependency-name: sinon
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 16:27:57 -04:00
dependabot[bot] 9957db0669 build(deps): bump nconf from 0.11.4 to 0.12.0 (#13939)
Bumps [nconf](https://github.com/flatiron/nconf) from 0.11.4 to 0.12.0.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.11.4...v0.12.0)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 16:21:35 -04:00
dependabot[bot] 2e21f58ae5 build(deps): bump moment from 2.29.2 to 2.29.3 (#13936)
Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.3.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.3)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 16:20:39 -04:00
dependabot[bot] 04be6d0744 build(deps): bump stripe from 8.216.0 to 8.217.0 (#13935)
Bumps [stripe](https://github.com/stripe/stripe-node) from 8.216.0 to 8.217.0.
- [Release notes](https://github.com/stripe/stripe-node/releases)
- [Changelog](https://github.com/stripe/stripe-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-node/compare/v8.216.0...v8.217.0)

---
updated-dependencies:
- dependency-name: stripe
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 16:19:48 -04:00
dependabot[bot] 8c43164e60 build(deps): bump apidoc from 0.51.0 to 0.51.1 (#13934)
Bumps [apidoc](https://github.com/apidoc/apidoc) from 0.51.0 to 0.51.1.
- [Release notes](https://github.com/apidoc/apidoc/releases)
- [Changelog](https://github.com/apidoc/apidoc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/apidoc/apidoc/compare/0.51.0...0.51.1)

---
updated-dependencies:
- dependency-name: apidoc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-18 16:19:28 -04:00
SabreCat 3fa940bdfd Merge remote-tracking branch 'CuriousMagpie/quest-refactors' into develop 2022-04-15 16:35:27 -05:00
Natalie L 3492549081 changed update to updateOne (#13932) 2022-04-15 16:20:37 -05:00
SabreCat b7a6dd9706 4.228.3 2022-04-15 14:24:08 -05:00
SabreCat 78bdb52f8f Merge branch 'develop' into release 2022-04-15 14:24:02 -05:00
SabreCat d80aaf3ab0 Merge branch 'develop' into release 2022-04-15 14:23:46 -05:00
negue 31cac936c8 Sprites: re-add previous offsets to sprites (#13933)
* Sprites: re-add previous offsets to sprites

* fix lint
2022-04-15 14:14:48 -05:00
Weblate 3b54064a1f Merge branch 'origin/develop' into Weblate. 2022-04-14 22:34:46 +02:00
Weblate 8b46df757f Translated using Weblate (Spanish (Latin America))
Currently translated at 94.1% (649 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Tagalog)

Currently translated at 1.1% (2 of 179 strings)

Translated using Weblate (Malayalam)

Currently translated at 60.9% (420 of 689 strings)

Translated using Weblate (Malayalam)

Currently translated at 38.1% (50 of 131 strings)

Translated using Weblate (Tagalog)

Currently translated at 87.5% (7 of 8 strings)

Translated using Weblate (Tagalog)

Currently translated at 76.4% (162 of 212 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.0% (2533 of 2583 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.0% (2533 of 2583 strings)

Translated using Weblate (Tagalog)

Currently translated at 75.9% (161 of 212 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 93.0% (641 of 689 strings)

Translated using Weblate (French)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (687 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (687 of 689 strings)

Translated using Weblate (Tagalog)

Currently translated at 75.9% (161 of 212 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.9% (747 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (755 of 755 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (373 of 373 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.8% (746 of 755 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (752 of 755 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 87.2% (185 of 212 strings)

Co-authored-by: Chap <chalda82+nogravatar@gmail.com>
Co-authored-by: Ike Osenberg <ike.osenberg@gmail.com>
Co-authored-by: JoanZeppeli <x17501668978@163.com>
Co-authored-by: Linda Li <wli62442@gmail.com>
Co-authored-by: Salman Mujeeb <kingleopard22@gmail.com>
Co-authored-by: Sara López <sarayupy@gmail.com>
Co-authored-by: Sealeo Wu <anitayuanli@gmail.com>
Co-authored-by: Thiago Monteiro <thiagoasmonteiro@gmail.com>
Co-authored-by: Vince Vilan <vincemorel.vilan.889@my.csun.edu>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ml/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ml/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/it/
Translate-URL: https://translate.habitica.com/projects/habitica/front/tl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/tl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/tl/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Content
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Inventory
Translation: Habitica/Questscontent
Translation: Habitica/Settings
2022-04-14 22:30:28 +02:00
SabreCat 4a9040aefb 4.228.2 2022-04-14 15:28:51 -05:00
SabreCat 723249e60d Merge branch 'develop' into release 2022-04-14 15:28:47 -05:00
SabreCat 8b17ebd1f1 fix(settings): don't show email change without email, refresh page 2022-04-14 14:51:11 -05:00
SabreCat 1c4c7b9f1e fix(settings): correct show/hide for email and pass scenarios 2022-04-14 14:21:39 -05:00
SabreCat 58887d9a3c chore(build): ignore non-deployable folders 2022-04-14 13:35:30 -05:00
Phillip Thelen 664f960a8b Pull in missing changes from FB removal PR (#13931)
* fix(auth): hide post hoc Facebook reg

* Pull in missing changes

* fix(lint): whitespace

* fix(strings): missing error message

* fix(tests): update to match functionality

Co-authored-by: SabreCat <sabe@habitica.com>
2022-04-14 12:58:37 -05:00
will yang dfe53e8b68 Hide Locked Background Year Tab 2022-04-13 17:14:14 -04:00
SabreCat b608f0ad9c fix(potion): correct year 2022-04-12 16:01:27 -05:00
SabreCat d4e05835d7 4.228.1 2022-04-12 15:55:02 -05:00
SabreCat 9343c33f37 fix(string): missing April date insert 2022-04-12 15:54:56 -05:00
Weblate afd1248ea3 Merge branch 'origin/develop' into Weblate. 2022-04-12 21:43:47 +02:00
Weblate 0708829b2a Translated using Weblate (Spanish (Latin America))
Currently translated at 100.0% (214 of 214 strings)

Translated using Weblate (French)

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (372 of 372 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (372 of 372 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 93.4% (2415 of 2583 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (98 of 98 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 97.6% (207 of 212 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 92.8% (640 of 689 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.4% (2439 of 2583 strings)

Translated using Weblate (Portuguese)

Currently translated at 84.7% (111 of 131 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.2% (213 of 219 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.0% (2429 of 2583 strings)

Translated using Weblate (Malayalam)

Currently translated at 14.5% (19 of 131 strings)

Translated using Weblate (Arabic)

Currently translated at 92.3% (121 of 131 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.9% (2428 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.9% (2428 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.9% (2428 of 2583 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (744 of 746 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.7% (371 of 372 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (673 of 689 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (673 of 689 strings)

Translated using Weblate (Japanese)

Currently translated at 96.6% (205 of 212 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (673 of 689 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (688 of 689 strings)

Translated using Weblate (German)

Currently translated at 100.0% (212 of 212 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 92.1% (635 of 689 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2583 of 2583 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (2583 of 2583 strings)

Translated using Weblate (Italian)

Currently translated at 98.7% (2552 of 2583 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (179 of 179 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (689 of 689 strings)

Translated using Weblate (Italian)

Currently translated at 98.2% (677 of 689 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (210 of 210 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (Italian)

Currently translated at 99.5% (209 of 210 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (2574 of 2579 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 88.0% (185 of 210 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (673 of 689 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 93.3% (2412 of 2583 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 99.2% (130 of 131 strings)

Translated using Weblate (Spanish)

Currently translated at 98.9% (2557 of 2583 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 87.5% (7 of 8 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 96.4% (54 of 56 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 83.9% (47 of 56 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (209 of 210 strings)

Translated using Weblate (Hindi)

Currently translated at 50.4% (56 of 111 strings)

Translated using Weblate (Arabic)

Currently translated at 68.4% (76 of 111 strings)

Translated using Weblate (Arabic)

Currently translated at 87.5% (113 of 129 strings)

Translated using Weblate (Arabic)

Currently translated at 59.5% (410 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 98.9% (2556 of 2583 strings)

Translated using Weblate (Italian)

Currently translated at 96.1% (199 of 207 strings)

Translated using Weblate (Spanish)

Currently translated at 98.7% (2550 of 2583 strings)

Translated using Weblate (Spanish)

Currently translated at 99.4% (685 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (684 of 689 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (684 of 689 strings)

Translated using Weblate (Japanese)

Currently translated at 99.7% (2573 of 2579 strings)

Translated using Weblate (Malayalam)

Currently translated at 19.8% (22 of 111 strings)

Translated using Weblate (Malayalam)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (German)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (2548 of 2583 strings)

Translated using Weblate (German)

Currently translated at 99.8% (2579 of 2583 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (179 of 179 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Spanish)

Currently translated at 99.1% (683 of 689 strings)

Translated using Weblate (German)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (207 of 207 strings)

Translated using Weblate (German)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (672 of 689 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (German)

Currently translated at 99.7% (2577 of 2583 strings)

Translated using Weblate (German)

Currently translated at 100.0% (179 of 179 strings)

Translated using Weblate (German)

Currently translated at 100.0% (127 of 127 strings)

Translated using Weblate (German)

Currently translated at 100.0% (207 of 207 strings)

Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: Chap <chalda82+nogravatar@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Heitor Menezes Gomes <heitorgmenezes@gmail.com>
Co-authored-by: Hexe des Windes (she/her) <krausanna1@gmail.com>
Co-authored-by: Ike Osenberg <ike.osenberg@gmail.com>
Co-authored-by: Mara Dolichotis <marascherzer@gmail.com>
Co-authored-by: PenariaToji <tojipeh@gmail.com>
Co-authored-by: Raithe <RaitheOfDureya@gmail.com>
Co-authored-by: Salman Mujeeb <kingleopard22@gmail.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Sara López <sarayupy@gmail.com>
Co-authored-by: Vinicius Rodrigues <suburbanizar@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: citrusella <citrusellaflugpucker@yahoo.com>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Co-authored-by: sbrcrbac <fh0f0c9s9@relay.firefox.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ml/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/front/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/it/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/ml/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/it/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ar/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/hi/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ml/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/it/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/it/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Inventory
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
2022-04-12 21:43:37 +02:00
SabreCat afa9a65933 Merge branch 'release' into develop 2022-04-12 14:41:03 -05:00
SabreCat e93e91e57d 4.228.0 2022-04-12 14:39:03 -05:00
SabreCat 53569ff983 Merge branch 'sabrecat/wacky-fix' into release 2022-04-12 14:38:41 -05:00
SabreCat d0c736a7a6 fix(gala): correct dates on seeds and customizations 2022-04-12 14:36:59 -05:00
CuriousMagpie c8ee51b741 move quest constants to their own folder 2022-04-11 17:10:01 -04:00
CuriousMagpie 2bf63847c9 Merge branch 'quest-refactors' of https://github.com/CuriousMagpie/habitica into quest-refactors 2022-04-11 13:44:15 -04:00
CuriousMagpie 1d1b66d25a Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-04-11 13:44:03 -04:00
dependabot[bot] 9ce4482040 build(deps): bump winston from 3.6.0 to 3.7.2 (#13927)
Bumps [winston](https://github.com/winstonjs/winston) from 3.6.0 to 3.7.2.
- [Release notes](https://github.com/winstonjs/winston/releases)
- [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md)
- [Commits](https://github.com/winstonjs/winston/commits)

---
updated-dependencies:
- dependency-name: winston
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 12:38:23 -04:00
dependabot[bot] 28660c0bea build(deps): bump @babel/core from 7.17.8 to 7.17.9 (#13926)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.8 to 7.17.9.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.9/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 12:37:12 -04:00
dependabot[bot] bc15d530e5 build(deps): bump stripe from 8.215.0 to 8.216.0 (#13925)
Bumps [stripe](https://github.com/stripe/stripe-node) from 8.215.0 to 8.216.0.
- [Release notes](https://github.com/stripe/stripe-node/releases)
- [Changelog](https://github.com/stripe/stripe-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-node/compare/v8.215.0...v8.216.0)

---
updated-dependencies:
- dependency-name: stripe
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 12:35:01 -04:00
dependabot[bot] 34b7acb246 build(deps): bump nconf from 0.11.3 to 0.11.4 (#13924)
Bumps [nconf](https://github.com/flatiron/nconf) from 0.11.3 to 0.11.4.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.11.3...v0.11.4)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-11 12:16:00 -04:00
SabreCat 4ef369c6f5 chore(submodule): update habitica-images 2022-04-08 15:45:32 -05:00
SabreCat 405721602f fix(quests): correct events import, prod bug with seasonal availability 2022-04-07 15:51:14 -05:00
SabreCat 19cf89baec fix(pr): remove unrelated change 2022-04-07 15:29:52 -05:00
SabreCat 8a4e9888dd Merge branch 'develop' into quest-refactors 2022-04-07 15:27:19 -05:00
SabreCat e17b86a1f6 fix(bug-report): relevant change from #13922 2022-04-07 14:48:26 -05:00
negue 2181ab9713 Redesign: "Day Start Adjustment" (#13910)
* Merge Custom Day Start and Timezone into one Component

* ui changes

* change translation text

* typo
2022-04-07 14:37:07 -05:00
negue 8cb8411cc6 Show "Next Hourglass" Month (#13860)
* Show "Next Hourglass" Month

* fix lint

* lint,

* lint

* lint..

* linting bad

* ui fixes

* remove additional margin

* show next hourglass date to debug further

* WIP tests - maybe broken logic

* flex:1 doesn't work - so stats columns now at 33% width

* fix(cron): lint and short circuit

* refactor logic

* update test dates using timezone

* also check for the timezone date

* fix timezone for tests

* fixing the test dates?

* fixing the test dates?

* change nextHourglass logic + update gem cap label / value

* fix lint

* dont add gemsBought to it

* remove tooltip

Co-authored-by: SabreCat <sabe@habitica.com>
2022-04-06 16:30:13 -05:00
SabreCat da3e6f96ba fix(sprites): move more heavy assets to s3 2022-04-06 14:54:19 -05:00
SabreCat 91511746bc fix(quest): update market criterion 2022-04-06 13:36:43 -05:00
SabreCat aaba400d36 fix(quest): remove static PNG 2022-04-06 12:42:51 -05:00
CuriousMagpie 4e107d233b fix(quest): update html in questsContent.json 2022-04-06 13:26:15 -04:00
CuriousMagpie c086d7b91d update sprites 2022-04-06 12:15:39 -05:00
CuriousMagpie 5b93199f35 fix(quest): moving gif into right folder /facepalm 2022-04-06 12:15:05 -05:00
Phillip Thelen 3b82bb9494 Update sprites.css 2022-04-06 12:14:52 -05:00
CuriousMagpie 1c347fc4b8 fix(quest): virtualPet.gif to virtualpet.gig 2022-04-06 12:14:42 -05:00
CuriousMagpie 2f16fe11e1 fix(quest): virtualPet => virtualpet 2022-04-06 12:14:31 -05:00
dependabot[bot] 05cf0cb50d build(deps): bump stripe from 8.212.0 to 8.215.0 (#13919)
Bumps [stripe](https://github.com/stripe/stripe-node) from 8.212.0 to 8.215.0.
- [Release notes](https://github.com/stripe/stripe-node/releases)
- [Changelog](https://github.com/stripe/stripe-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stripe/stripe-node/compare/v8.212.0...v8.215.0)

---
updated-dependencies:
- dependency-name: stripe
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-06 11:27:13 -04:00
SabreCat fb017e1f08 fix(pets): various quest and animation corrections 2022-04-05 16:03:46 -05:00
SabreCat 1ca528eb95 Merge branch 'develop' into 2022-04-wacky-potion-quest 2022-04-05 15:08:18 -05:00
SabreCat 0ff2a8c264 4.227.0 2022-04-05 13:55:47 -05:00
Weblate eed6cfaf6d Translated using Weblate (Japanese)
Currently translated at 99.5% (2567 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 99.4% (2566 of 2579 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.0% (2528 of 2579 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.8% (2524 of 2579 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hebrew)

Currently translated at 58.9% (33 of 56 strings)

Translated using Weblate (Hebrew)

Currently translated at 84.6% (11 of 13 strings)

Translated using Weblate (Hebrew)

Currently translated at 46.8% (44 of 94 strings)

Translated using Weblate (Hebrew)

Currently translated at 57.6% (64 of 111 strings)

Translated using Weblate (Hebrew)

Currently translated at 73.7% (45 of 61 strings)

Translated using Weblate (Hebrew)

Currently translated at 18.1% (4 of 22 strings)

Translated using Weblate (Japanese)

Currently translated at 99.3% (2563 of 2579 strings)

Translated using Weblate (Hebrew)

Currently translated at 49.0% (1264 of 2579 strings)

Translated using Weblate (Hebrew)

Currently translated at 70.0% (150 of 214 strings)

Translated using Weblate (Hebrew)

Currently translated at 46.4% (59 of 127 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.9% (249 of 372 strings)

Translated using Weblate (Hebrew)

Currently translated at 71.5% (133 of 186 strings)

Translated using Weblate (Hebrew)

Currently translated at 98.9% (97 of 98 strings)

Translated using Weblate (Hebrew)

Currently translated at 45.0% (307 of 682 strings)

Translated using Weblate (Hebrew)

Currently translated at 67.9% (89 of 131 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.9% (151 of 207 strings)

Translated using Weblate (Hebrew)

Currently translated at 98.5% (132 of 134 strings)

Translated using Weblate (Hebrew)

Currently translated at 91.2% (333 of 365 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (98 of 98 strings)

Translated using Weblate (Hebrew)

Currently translated at 97.7% (131 of 134 strings)

Translated using Weblate (Hebrew)

Currently translated at 61.9% (122 of 197 strings)

Translated using Weblate (Hebrew)

Currently translated at 98.2% (55 of 56 strings)

Translated using Weblate (Hebrew)

Currently translated at 68.0% (64 of 94 strings)

Translated using Weblate (Hebrew)

Currently translated at 91.8% (102 of 111 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Hebrew)

Currently translated at 93.2% (167 of 179 strings)

Translated using Weblate (Hebrew)

Currently translated at 81.4% (44 of 54 strings)

Translated using Weblate (Hebrew)

Currently translated at 76.2% (569 of 746 strings)

Translated using Weblate (Hebrew)

Currently translated at 74.8% (95 of 127 strings)

Translated using Weblate (Hebrew)

Currently translated at 83.8% (312 of 372 strings)

Translated using Weblate (Hebrew)

Currently translated at 96.7% (180 of 186 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (98 of 98 strings)

Translated using Weblate (Hebrew)

Currently translated at 69.4% (91 of 131 strings)

Translated using Weblate (Hebrew)

Currently translated at 88.4% (183 of 207 strings)

Translated using Weblate (Japanese)

Currently translated at 99.1% (2557 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 99.1% (2556 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (179 of 179 strings)

Translated using Weblate (Japanese)

Currently translated at 99.4% (178 of 179 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (French)

Currently translated at 100.0% (179 of 179 strings)

Translated using Weblate (French)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (French)

Currently translated at 100.0% (207 of 207 strings)

Translated using Weblate (Japanese)

Currently translated at 98.9% (2551 of 2579 strings)

Translated using Weblate (French)

Currently translated at 100.0% (2579 of 2579 strings)

Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: JoanZeppeli <x17501668978@163.com>
Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
Co-authored-by: Sandra Marcial <sandramarcial80@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/he/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/it/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/he/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/he/
Translate-URL: https://translate.habitica.com/projects/habitica/character/he/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/he/
Translate-URL: https://translate.habitica.com/projects/habitica/content/he/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/he/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/he/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/he/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/he/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/he/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/he/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/he/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/he/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/he/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/he/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/he/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/he/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/he/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Defaulttasks
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Inventory
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2022-04-05 16:35:54 +02:00
CuriousMagpie 202d74b8c4 Virtual Pet animated images 2022-04-04 17:37:09 -04:00
CuriousMagpie 3498b9ccdf Virtual Pet Hatching Potion Quest Content 2022-04-04 17:29:51 -04:00
SabreCat 39b39387d3 chore(sprites): compile CSS 2022-04-04 14:54:09 -05:00
Natalie L c3278a3baf 2022-04 Backgrounds & Enchanted Armoire Items (#13915)
* 2022-04 Backgrounds & Enchanted Armoire Items

* remove spritesmith-main.css

* adding spritesmith-main.css back in

* css fix
2022-04-04 14:53:34 -05:00
CuriousMagpie df3b871dba questContent.json placeholders 2022-04-04 14:50:22 -04:00
dependabot[bot] 18af9f8b40 build(deps): bump moment from 2.29.1 to 2.29.2 (#13921)
Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-04 10:58:05 -04:00
dependabot[bot] de36afc174 build(deps): bump body-parser from 1.19.2 to 1.20.0 (#13920)
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.19.2 to 1.20.0.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.19.2...1.20.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-04 10:57:45 -04:00
dependabot[bot] fbb40c0d07 build(deps): bump superagent from 7.1.1 to 7.1.2 (#13917)
Bumps [superagent](https://github.com/visionmedia/superagent) from 7.1.1 to 7.1.2.
- [Release notes](https://github.com/visionmedia/superagent/releases)
- [Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
- [Commits](https://github.com/visionmedia/superagent/commits)

---
updated-dependencies:
- dependency-name: superagent
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-04 10:56:57 -04:00
SabreCat 34d0922bcc Merge remote-tracking branch 'rarysson/update-year-on-footer' into develop 2022-04-01 16:28:04 -05:00
Phillip Thelen 55cf2f9795 Improve flows for social auth users (#13862)
* Multiple fixes for social authentication flows

* frontend changes

* add missing computed property

* Improvements to social flows

* fix existing email error

* minor fixes

* fix space

* fix test

* fix lint

Co-authored-by: SabreCat <sabe@habitica.com>
2022-03-31 16:43:16 -05:00
Phillip Thelen 9ff0766910 Fix cron not running if previous run failed (#13892)
* catch issue where cron wouldn’t run bc previous run failed

* add some more tests for cron middleware

* fix lint
2022-03-31 16:32:59 -05:00
Natalie L 06d982401a Update: Revised text string for zodiacZookeeper and birdsOfAFeather achievements (#13884)
* updated text string for zodiacZooKeeper and birdsOfAFeather

* added peacock and rooster (oops!)
2022-03-31 15:59:36 -05:00
citrusella 140372a70d Update faceAvatar.vue so snowman ACTUALLY shows up (#13911) 2022-03-31 15:39:53 -05:00
Weblate bd9754221b Merge branch 'origin/develop' into Weblate. 2022-03-31 21:48:15 +02:00
SabreCat d58ca4c998 Merge branch 'release' into develop 2022-03-31 14:47:44 -05:00
SabreCat 7c53f9fd21 4.226.1 2022-03-31 14:47:22 -05:00
SabreCat ae6918d52e chore(event): canonical duration 2022-03-31 14:41:59 -05:00
Weblate d367060a82 Translated using Weblate (Japanese)
Currently translated at 98.6% (2543 of 2579 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (French)

Currently translated at 100.0% (197 of 197 strings)

Translated using Weblate (French)

Currently translated at 100.0% (2579 of 2579 strings)

Translated using Weblate (French)

Currently translated at 100.0% (131 of 131 strings)

Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translation: Habitica/Achievements
Translation: Habitica/Gear
Translation: Habitica/Subscriber
2022-03-31 19:36:03 +02:00
Natalie L 8e7ec46c8f Merge branch 'HabitRPG:develop' into develop 2022-03-31 11:58:23 -04:00
Natalie L d0d32c0b58 fix: Spring Fling Strings (#13902)
* fix: spring fling string fixes

* fix: additional spring fling string fixes
2022-03-30 16:46:35 -05:00
Natalie L 1dd3bc188e Merge branch 'HabitRPG:develop' into develop 2022-03-30 17:04:21 -04:00
SabreCat 608ae5fc43 feat(event): April Fooly 2022 2022-03-30 15:31:17 -05:00
Weblate 391fa541ef Merge branch 'origin/develop' into Weblate. 2022-03-30 16:47:45 +02:00
SabreCat bc87e8b400 Merge branch 'release' into develop 2022-03-30 09:46:11 -05:00
Weblate 976e8cf242 Translated using Weblate (Spanish)
Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (206 of 206 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (German)

Currently translated at 100.0% (206 of 206 strings)

Co-authored-by: Mara Dolichotis <marascherzer@gmail.com>
Co-authored-by: Pardinus <artemisadlg@gmail.com>
Co-authored-by: Sara López <sarayupy@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translation: Habitica/Achievements
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Settings
2022-03-30 12:18:52 +02:00
Natalie L 2c566cb9e3 Merge branch 'HabitRPG:develop' into develop 2022-03-29 16:26:27 -04:00
CuriousMagpie 89d7f94fc3 habitica-images 2022-03-29 16:21:38 -04:00
Natalie L 7a15bfc140 Merge branch 'HabitRPG:develop' into develop 2022-03-29 16:12:11 -04:00
Weblate 59bd135e44 Merge branch 'origin/develop' into Weblate. 2022-03-29 21:08:20 +02:00
SabreCat cf04d9d0be Merge branch 'release' into develop 2022-03-29 14:07:57 -05:00
Weblate f918b4a68c Translated using Weblate (Japanese)
Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (German)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (French)

Currently translated at 100.0% (131 of 131 strings)

Translated using Weblate (French)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (French)

Currently translated at 99.9% (2572 of 2573 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.2% (130 of 131 strings)

Translated using Weblate (German)

Currently translated at 100.0% (2573 of 2573 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.4% (185 of 219 strings)

Translated using Weblate (German)

Currently translated at 100.0% (219 of 219 strings)

Translated using Weblate (German)

Currently translated at 99.9% (2572 of 2573 strings)

Translated using Weblate (Ukrainian)

Currently translated at 72.1% (158 of 219 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (365 of 365 strings)

Translated using Weblate (Ukrainian)

Currently translated at 96.0% (171 of 178 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.9% (634 of 746 strings)

Translated using Weblate (German)

Currently translated at 99.5% (218 of 219 strings)

Translated using Weblate (Ukrainian)

Currently translated at 79.5% (2048 of 2573 strings)

Translated using Weblate (German)

Currently translated at 99.6% (2565 of 2573 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.9% (634 of 746 strings)

Translated using Weblate (Ukrainian)

Currently translated at 84.9% (634 of 746 strings)

Co-authored-by: Benoit Hetru <me+hbtc@gahanka.net>
Co-authored-by: Mara Dolichotis <marascherzer@gmail.com>
Co-authored-by: Nazar Paruna <nazarparuna@gmail.com>
Co-authored-by: Sciuridae <sweetvshoney@163.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translation: Habitica/Achievements
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Questscontent
2022-03-29 19:41:35 +02:00
Natalie L 4070dd7754 Merge branch 'HabitRPG:develop' into develop 2022-03-29 13:15:39 -04:00
Basrara d44b2fe785 Minor fixes (#13909)
Updated "resetText2", "transaction_rebirth", and "transaction_reroll" to correct capitalization and eliminate a double space.
2022-03-29 12:30:16 -04:00
Natalie L 57cf669a86 Merge branch 'HabitRPG:develop' into develop 2022-03-28 15:01:07 -04:00
CuriousMagpie f87bb7593e Merge branch 'develop' of https://github.com/CuriousMagpie/habitica into develop 2022-03-25 18:50:14 -04:00
CuriousMagpie b54f185d1f laptop puked, had to reset everything, joy 2022-03-22 21:02:00 -04:00
CuriousMagpie 1785ac8226 added Birds of a Feather achievement 2022-03-09 15:39:42 -05:00
CuriousMagpie 77179d1ff1 Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-02-10 11:49:31 -05:00
Rarysson Guilherme 492824ac90 Add automatic year detection on appFooter 2022-02-05 12:26:17 -03:00
CuriousMagpie 55443ecc23 revert files to develop 2022-02-03 12:10:16 -05:00
CuriousMagpie 98b43c681a use spread operator to combine multiple quest objects into one 2022-02-02 16:48:48 -05:00
CuriousMagpie 40f8c049ab concatenate quest constant arrays into a single quests variable 2022-02-02 16:25:28 -05:00
CuriousMagpie b5a7b58b57 Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-02-02 16:24:42 -05:00
CuriousMagpie 006aad76d2 first pass on refactoring 2022-01-27 16:59:29 -05:00
CuriousMagpie 1a4af6d6bd Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-01-27 14:57:41 -05:00
CuriousMagpie a0b0d1d855 submodule commit 2022-01-27 14:53:52 -05:00
CuriousMagpie 3fb1241010 Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-01-21 11:55:07 -05:00
CuriousMagpie f1d70dec18 Merge remote-tracking branch 'upstream/develop' into quest-refactors 2022-01-19 16:59:08 -05:00
Natalie L c7e7071998 Merge branch 'HabitRPG:develop' into quest-unlocks 2022-01-14 13:58:43 -05:00
CuriousMagpie b4f699b7c4 added item.locked to buy functions 2022-01-14 13:54:41 -05:00
CuriousMagpie 874954b16b quest unlock logic updates, starting on actually locking quests in shop 2022-01-13 16:36:43 -05:00
CuriousMagpie 120b2e9ade removed a bunch of commented code 2022-01-12 17:07:49 -05:00
CuriousMagpie 7d00fe1ecb more quest logic attempts 2022-01-11 15:42:48 -05:00
CuriousMagpie 29ab8856ca linter fix 2022-01-10 15:21:17 -05:00
CuriousMagpie 1eb8ee4dc6 added a comment re Masterclasser 2022-01-07 21:44:57 -05:00
Natalie L 96c0c12c49 Merge branch 'HabitRPG:develop' into quest-unlocks 2022-01-07 17:37:23 -05:00
CuriousMagpie 3eb9225b8b and more quest logic things to try 2022-01-07 17:36:47 -05:00
CuriousMagpie 73a29f94a6 Merge branch 'quest-unlocks' of https://github.com/CuriousMagpie/habitica into quest-unlocks 2022-01-07 17:34:49 -05:00
CuriousMagpie 7bd190930f more quest logic 2022-01-07 17:33:37 -05:00
CuriousMagpie d0e9339d3b more quest logic 2022-01-07 17:29:27 -05:00
CuriousMagpie d45122ce06 lockQuest logic updates 2022-01-07 16:25:31 -05:00
CuriousMagpie f3f5d6bb70 Merge remote-tracking branch 'upstream/develop' into quest-unlocks 2022-01-07 15:25:08 -05:00
CuriousMagpie 9b849e095c working on quest logic 2022-01-07 15:20:21 -05:00
CuriousMagpie 55ec42678e quest series refactor started 2021-12-31 16:28:04 -05:00
CuriousMagpie adc7a6ee85 organized quests by type and alphabetically within type 2021-12-31 13:43:59 -05:00
CuriousMagpie ccc1d5b26e code from abandoned PR #13382 2021-12-29 16:33:11 -05:00
230 changed files with 9760 additions and 6501 deletions
+4
View File
@@ -1,3 +1,7 @@
# Files not included in deployments to Heroku, to save on file size.
/habitica-images
/test
/migrations
/scripts
/database_reports
+12 -4
View File
@@ -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
}
}
}
+288 -237
View File
@@ -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",
+10 -10
View File
@@ -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"
},
+1 -1
View File
@@ -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;
});
});
+10
View File
@@ -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
+60 -1
View File
@@ -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,
},
};
}
+36 -26
View File
@@ -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!!
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 872 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 759 B

+6 -1
View File
@@ -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;
}
+6 -2
View File
@@ -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">
+6 -4
View File
@@ -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"
+1 -1
View File
@@ -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">
+28 -108
View File
@@ -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 providers 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>
+42 -23
View File
@@ -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>
+53
View File
@@ -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';
},
},
};
+3 -1
View File
@@ -117,5 +117,7 @@
"achievementKickstarter2019Text": "من مساهمي حملة كيك-ستارتر للدبابيس",
"achievementDomesticatedModalText": "لقد جمعت كل الحيوانات الأليفة المستأنسة!",
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
"achievementDomesticated": "ا-يا-ا-يا-يو"
"achievementDomesticated": "ا-يا-ا-يا-يو",
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!"
}
+2 -1
View File
@@ -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"
}
+4 -1
View File
@@ -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 %> الماس"
}
+9 -1
View File
@@ -68,5 +68,13 @@
"petsFound": "إنشاء حيوانات أليفة",
"keyToPets": "مفتاح بيوت الحيوانات",
"noActiveMount": "لا يوجد تثبيت نشط",
"questPets": "بحث الحيوانات"
"questPets": "بحث الحيوانات",
"releasePetsConfirm": "هل أنت متأكد أنك تريد إطلاق سراح حيوانك الأليف القياسي؟",
"keyToMounts": "مفتاح بيت الحيوان",
"petsReleased": "أفرج عن الحيوانات الأليفة",
"keyToPetsDesc": "حرر جميع الحيوانات المسموح بها حتى تتمكن من جمعها مرة أخرى. (لا تتأثر بالحيوانات الأليفة والحيوانات الأليفة الغريبة.)",
"petName": "<%= potion(locale) %> <%= egg(locale) %>",
"keyToMountsDesc": "حرر جميع العينات القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر عمليات تثبيت المهام وعمليات التثبيت النادرة.)",
"keyToBoth": "مفاتيح رئيسية لبيوت الكلاب",
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!"
}
+2 -2
View File
@@ -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!"
}
+6 -1
View File
@@ -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",
+5 -4
View File
@@ -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"
}
+24 -2
View File
@@ -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"
}
+4 -1
View File
@@ -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 %>"
}
+10 -4
View File
@@ -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"
}
+2 -1
View File
@@ -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"
}
+1
View File
@@ -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",
+2 -2
View File
@@ -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.",
+1
View File
@@ -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) %>.",
+5 -3
View File
@@ -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",
+14 -6
View File
@@ -431,7 +431,7 @@
"weaponSpecialSpring2022RogueText": "Giant Earring Stud",
"weaponSpecialSpring2022RogueNotes": "A shiny! Its 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 youre 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 youre 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 youve 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": "Dont be afraid to work down in the dirt when youre wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
"armorArmoireGardenersOverallsNotes": "Dont be afraid to work down in the dirt when youre 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 dont 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 wont 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 wont 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": "Youll 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.",
+1
View File
@@ -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 %>",
+11 -1
View File
@@ -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": "Its a quiet and pleasant spring morning in Habitica, a week past a memorable April Fools 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 its 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 pets 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>Youre not 100% sure youre on board with all the beeping, but theyre sure cute so its 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"
}
+11 -5
View File
@@ -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",
+5 -4
View File
@@ -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"
}
+14 -3
View File
@@ -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."
}
+2 -1
View File
@@ -370,5 +370,6 @@
"hatchingPotionSunset": "Atardecer",
"hatchingPotionMoonglow": "Brillolunar",
"hatchingPotionSolarSystem": "Sistema solar",
"hatchingPotionOnyx": "Ónice"
"hatchingPotionOnyx": "Ónice",
"hatchingPotionVirtualPet": "Mascota virtual"
}
+5 -4
View File
@@ -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"
}
+21 -1
View File
@@ -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"
}
+6 -2
View File
@@ -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 %>",
+1 -1
View File
@@ -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!",
+6 -3
View File
@@ -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"
}
+2 -1
View File
@@ -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!"
}
+40 -3
View File
@@ -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"
}

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