diff --git a/cards/card_component.js b/cards/card_component.js index 78a1a01b0..e0ff7c38b 100644 --- a/cards/card_component.js +++ b/cards/card_component.js @@ -16,6 +16,10 @@ BaseCard["{{componentName}}"] = class extends ANSWERS.Component { * only if such a toggle is present in the DOM. */ onMount() { + //polyfill for image styling (object-fit) in ie11 + const images = document.querySelectorAll('.HitchhikerProductProminentImage-img'); + HitchhikerJS.objectFitImages(images); + const showExcessDetailsToggleEls = this._container.querySelectorAll('.js-HitchhikerCard-detailsToggle'); const excessDetailsEls = this._container.querySelectorAll('.js-HitchhikerCard-detailsText'); if (showExcessDetailsToggleEls && excessDetailsEls) { diff --git a/cards/multilang-product-prominentvideo/template.hbs b/cards/multilang-product-prominentvideo/template.hbs index d01f4a9d3..c89099678 100644 --- a/cards/multilang-product-prominentvideo/template.hbs +++ b/cards/multilang-product-prominentvideo/template.hbs @@ -1,10 +1,10 @@
-
+ {{> video }} +
{{> title }} {{> subtitle }} + {{> content }}
- {{> video }} - {{> content }}
{{#*inline 'title'}} diff --git a/cards/product-prominentvideo/template.hbs b/cards/product-prominentvideo/template.hbs index d01f4a9d3..c89099678 100644 --- a/cards/product-prominentvideo/template.hbs +++ b/cards/product-prominentvideo/template.hbs @@ -1,10 +1,10 @@
-
+ {{> video }} +
{{> title }} {{> subtitle }} + {{> content }}
- {{> video }} - {{> content }}
{{#*inline 'title'}} diff --git a/commands/helpers/utils/jamboconfigutils.js b/commands/helpers/utils/jamboconfigutils.js index c356cba95..e1e19423a 100644 --- a/commands/helpers/utils/jamboconfigutils.js +++ b/commands/helpers/utils/jamboconfigutils.js @@ -41,7 +41,7 @@ exports.parseJamboConfig = function () { * @param {string} partialsPath The local path to the set of partials. */ exports.addToPartials = function (partialsPath) { - const jamboConfig = parseJamboConfig(); + const jamboConfig = exports.parseJamboConfig(); const existingPartials = jamboConfig.dirs.partials; const shouldAddNewPartialsPath = diff --git a/directanswercards/documentsearch-standard/component.js b/directanswercards/documentsearch-standard/component.js index 2dee30bcb..c03380e5c 100644 --- a/directanswercards/documentsearch-standard/component.js +++ b/directanswercards/documentsearch-standard/component.js @@ -20,12 +20,13 @@ class documentsearch_standardComponent extends BaseDirectAnswerCard['documentsea } else if (snippet) { snippetValue = Formatter.highlightField(snippet.value, snippet.matchedSubstrings); } + const viewDetailsUrl = relatedItemData.website || (relatedItemData.fieldValues && relatedItemData.fieldValues.landingPageUrl); return { value: answer.value, snippet: snippetValue, // Text snippet to include alongside the answer viewDetailsText: relatedItemData.fieldValues && relatedItemData.fieldValues.name, // Text below the direct answer and snippet - viewDetailsLink: relatedItemData.website || (relatedItemData.fieldValues && relatedItemData.fieldValues.landingPageUrl), // Link for the "view details" text + viewDetailsLink: Formatter.getUrlWithTextHighlight(snippet, viewDetailsUrl), // Link for the "view details" text viewDetailsEventOptions: this.addDefaultEventOptions({ ctaLabel: 'VIEW_DETAILS', fieldName: 'snippet' diff --git a/layouts/html.hbs b/layouts/html.hbs index d8e547d0f..2abe7f518 100644 --- a/layouts/html.hbs +++ b/layouts/html.hbs @@ -6,6 +6,7 @@ if (window.name == 'overlay') { window.isOverlay = true; } + {{> script/translations}} {{/babel}} {{> layouts/headincludes }} diff --git a/package-lock.json b/package-lock.json index 051d585cf..0ae130cbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.1", + "version": "1.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2127,17 +2127,6 @@ "minimist": "^1.2.0" } }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "dev": true, - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, "@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", @@ -2738,93 +2727,42 @@ "fastq": "^1.6.0" } }, - "@oclif/color": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.1.2.tgz", - "integrity": "sha512-M9o+DOrb8l603qvgz1FogJBUGLqcMFL1aFg2ZEL0FbXJofiNTLOWIeB4faeZTLwE6dt0xH9GpCVpzksMMzGbmA==", + "@oclif/command": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.0.tgz", + "integrity": "sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^3.0.0", - "strip-ansi": "^5.2.0", - "supports-color": "^5.4.0", - "tslib": "^1" + "@oclif/config": "^1.15.1", + "@oclif/errors": "^1.3.3", + "@oclif/parser": "^3.8.3", + "@oclif/plugin-help": "^3", + "debug": "^4.1.1", + "semver": "^7.3.2" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "yallist": "^4.0.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "lru-cache": "^6.0.0" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@oclif/command": { - "version": "1.5.19", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.19.tgz", - "integrity": "sha512-6+iaCMh/JXJaB2QWikqvGE9//wLEVYYwZd5sud8aLoLKog1Q75naZh2vlGVtg5Mq/NqpqGQvdIjJb3Bm+64AUQ==", - "dev": true, - "requires": { - "@oclif/config": "^1", - "@oclif/errors": "^1.2.2", - "@oclif/parser": "^3.8.3", - "@oclif/plugin-help": "^2", - "debug": "^4.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } @@ -2844,9 +2782,9 @@ }, "dependencies": { "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -2860,9 +2798,9 @@ } }, "@oclif/errors": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.4.tgz", - "integrity": "sha512-pJKXyEqwdfRTUdM8n5FIHiQQHg5ETM0Wlso8bF9GodczO40mF5Z3HufnYWJE7z8sGKxOeJCdbAVZbS8Y+d5GCw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz", + "integrity": "sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==", "dev": true, "requires": { "clean-stack": "^3.0.0", @@ -2870,19 +2808,6 @@ "indent-string": "^4.0.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } } }, "@oclif/linewrap": { @@ -2962,39 +2887,37 @@ } }, "@oclif/plugin-help": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.3.tgz", - "integrity": "sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-3.2.3.tgz", + "integrity": "sha512-l2Pd0lbOMq4u/7xsl9hqISFqyR9gWEz/8+05xmrXFr67jXyS6EUCQB+mFBa0wepltrmJu0sAFg9AvA2mLaMMqQ==", "dev": true, "requires": { - "@oclif/command": "^1.5.13", - "chalk": "^2.4.1", + "@oclif/command": "^1.5.20", + "@oclif/config": "^1.15.1", + "@oclif/errors": "^1.2.2", + "chalk": "^4.1.0", "indent-string": "^4.0.0", "lodash.template": "^4.4.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0", - "widest-line": "^2.0.1", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "widest-line": "^3.1.0", "wrap-ansi": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "color-convert": { @@ -3012,51 +2935,19 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "string-width": { + "widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "string-width": "^4.0.0" } }, "wrap-ansi": { @@ -3070,11 +2961,14 @@ "strip-ansi": "^4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "string-width": { "version": "2.1.1", @@ -3099,216 +2993,300 @@ } } }, - "@oclif/plugin-not-found": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.4.tgz", - "integrity": "sha512-G440PCuMi/OT8b71aWkR+kCWikngGtyRjOR24sPMDbpUFV4+B3r51fz1fcqeUiiEOYqUpr0Uy/sneUe1O/NfBg==", + "@percy/cli": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli/-/cli-1.0.0-beta.67.tgz", + "integrity": "sha512-8XCCqpkheuB44s8IhAQt/jpjJTwLwqYAaPv33NyjwFfgJMfsENgwuGyqUYoukvCaSIEMkOc5zF6PlNyhayOm9Q==", "dev": true, "requires": { - "@oclif/color": "^0.x", - "@oclif/command": "^1.6.0", - "cli-ux": "^4.9.0", - "fast-levenshtein": "^2.0.6", - "lodash": "^4.17.13" + "@oclif/plugin-help": "^3.2.0", + "@percy/cli-build": "1.0.0-beta.67", + "@percy/cli-config": "1.0.0-beta.67", + "@percy/cli-exec": "1.0.0-beta.67", + "@percy/cli-snapshot": "1.0.0-beta.67", + "@percy/cli-upload": "1.0.0-beta.67" + } + }, + "@percy/cli-build": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-build/-/cli-build-1.0.0-beta.67.tgz", + "integrity": "sha512-sUyTuXK6jMWydpSLE3vLq8kb32HMv5B+am2RjA4ymTf/TSHjXfjsoOUsPapJZODfvJNlKc37J/vX9h0/WloSHA==", + "dev": true, + "requires": { + "@percy/cli-command": "1.0.0-beta.67", + "@percy/client": "1.0.0-beta.67", + "@percy/env": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67" }, "dependencies": { - "@oclif/command": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.0.tgz", - "integrity": "sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw==", - "dev": true, - "requires": { - "@oclif/config": "^1.15.1", - "@oclif/errors": "^1.3.3", - "@oclif/parser": "^3.8.3", - "@oclif/plugin-help": "^3", - "debug": "^4.1.1", - "semver": "^7.3.2" - } - }, - "@oclif/plugin-help": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-3.2.1.tgz", - "integrity": "sha512-vq7rn16TrQmjX3Al/k1Z5iBZWZ3HE8fDXs52OmDJmmTqryPSNvURH9WCAsqr0PODYCSR17Hy1VTzS0x7vVVLEQ==", - "dev": true, - "requires": { - "@oclif/command": "^1.5.20", - "@oclif/config": "^1.15.1", - "@oclif/errors": "^1.2.2", - "chalk": "^2.4.1", - "indent-string": "^4.0.0", - "lodash.template": "^4.4.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^4.0.0" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + } + } + }, + "@percy/cli-command": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-command/-/cli-command-1.0.0-beta.67.tgz", + "integrity": "sha512-sBfOn/B6P5CLahykpimQ8lNe52SG37jlWBvhgBk+mqdB1LHp7W3ld5JPt/us5YXoDtEDMe/GHno8vN7P5wF2QA==", + "dev": true, + "requires": { + "@oclif/command": "^1.8.0", + "@oclif/config": "^1.17.0", + "@oclif/plugin-help": "^3.2.0", + "@percy/config": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + } + } + }, + "@percy/cli-config": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-config/-/cli-config-1.0.0-beta.67.tgz", + "integrity": "sha512-JGACgSgIg1gc+WxL2FdDKiG4BQm7mzilrieO7kuGJnMlo4EO5tR8aAH5eQXf9T5q6XqkCGsaUrWPl1OsD69tVg==", + "dev": true, + "requires": { + "@oclif/command": "^1.8.0", + "@oclif/config": "^1.17.0", + "@percy/config": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + } + } + }, + "@percy/cli-exec": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-exec/-/cli-exec-1.0.0-beta.67.tgz", + "integrity": "sha512-XAes5O9tMGIQC59qpCP4zRDowvAv2MPKOnTHv0iJlsTNhky3Py4j9+pJIyS+GdUYVeJl0pUXsF2nYxR5As6BGg==", + "dev": true, + "requires": { + "@percy/cli-command": "1.0.0-beta.67", + "@percy/core": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67", + "cross-spawn": "^7.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "color-name": "1.1.3" + "shebang-regex": "^3.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { + "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + } + } + }, + "@percy/cli-snapshot": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-snapshot/-/cli-snapshot-1.0.0-beta.67.tgz", + "integrity": "sha512-MgiBNwHRxKEjOedDTJu4S97LnOQS897l5o2aWFke0bj0RCntfXykkGUQQiFByF+3rjxyagvd0X5boHiReTsh5A==", + "dev": true, + "requires": { + "@percy/cli-command": "1.0.0-beta.67", + "@percy/config": "1.0.0-beta.67", + "@percy/core": "1.0.0-beta.67", + "@percy/dom": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67", + "globby": "^11.0.4", + "path-to-regexp": "^6.2.0", + "picomatch": "^2.3.0", + "serve-handler": "^6.1.3", + "yaml": "^1.10.0" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", "dev": true }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "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==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + } + } + }, + "@percy/cli-upload": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/cli-upload/-/cli-upload-1.0.0-beta.67.tgz", + "integrity": "sha512-7AC08hbw3e1ATOQpDlxwEll0VLePJmV+jd+NHToZVpMXoF/ZbNKS+aIrQNB3js0cE/fh+DktWVFTBRR3kMFbZg==", + "dev": true, + "requires": { + "@percy/cli-command": "1.0.0-beta.67", + "@percy/client": "1.0.0-beta.67", + "@percy/config": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67", + "globby": "^11.0.4", + "image-size": "^1.0.0" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { - "string-width": "^4.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } + } + } + }, + "@percy/client": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/client/-/client-1.0.0-beta.67.tgz", + "integrity": "sha512-8IWfN+uaqS3j6atKjqjN5kOlplrC/kaSFir/ZCwsK9tgjbBvQ0zhNzkG63H5Ym5bbF6Cxovnzo7g3ehJ2WIIHA==", + "dev": true, + "requires": { + "@percy/env": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + } + } + }, + "@percy/config": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/config/-/config-1.0.0-beta.67.tgz", + "integrity": "sha512-hvrsyIsLk8eU9w9IYeyRbgZ2y0PVF/FvieeFthHqWP42enCHxP7lItgkEfFGIMcxMnREHdFCZu9o1UE5nv0Oug==", + "dev": true, + "requires": { + "@percy/logger": "1.0.0-beta.67", + "ajv": "^8.6.2", + "cosmiconfig": "^7.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true }, - "wrap-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", - "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } }, - "@oclif/screen": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", - "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==", - "dev": true - }, - "@percy/agent": { - "version": "0.28.6", - "resolved": "https://registry.npmjs.org/@percy/agent/-/agent-0.28.6.tgz", - "integrity": "sha512-SDAyBiUmfQMVTayjvEjQ0IJIA7Y3AoeyWn0jmUxNOMRRIJWo4lQJghfhFCgzCkhXDCm67NMN2nAQAsvXrlIdkQ==", - "dev": true, - "requires": { - "@oclif/command": "1.5.19", - "@oclif/config": "^1", - "@oclif/plugin-help": "^2", - "@oclif/plugin-not-found": "^1.2", - "axios": "^0.21.1", - "body-parser": "^1.18.3", - "colors": "^1.3.2", - "cors": "^2.8.4", - "cosmiconfig": "^5.2.1", - "cross-spawn": "^7.0.2", - "deepmerge": "^4.0.0", - "express": "^4.16.3", - "follow-redirects": "1.12.1", - "generic-pool": "^3.7.1", - "globby": "^10.0.1", - "image-size": "^0.8.2", - "js-yaml": "^3.13.1", - "percy-client": "^3.2.0", - "puppeteer": "^5.3.1", - "retry-axios": "^1.0.1", - "which": "^2.0.1", - "winston": "^3.0.0" + "@percy/core": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/core/-/core-1.0.0-beta.67.tgz", + "integrity": "sha512-rPpRxfBkk3xQPfXPiWbPclDrXDskoOLHl8dPAmsikTnFE9XeUlkTTmSgI++LDy8LNyoyj491heLLxoPiQrq0vw==", + "dev": true, + "requires": { + "@percy/client": "1.0.0-beta.67", + "@percy/config": "1.0.0-beta.67", + "@percy/dom": "1.0.0-beta.67", + "@percy/logger": "1.0.0-beta.67", + "cross-spawn": "^7.0.3", + "extract-zip": "^2.0.1", + "rimraf": "^3.0.2", + "ws": "^8.0.0" }, "dependencies": { + "@percy/logger": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.67.tgz", + "integrity": "sha512-I8CQfHn9eL7TSvxXedS7g22A1aGjhBeUJv2k65W4yBxLCJXalXNObWgYMs6dZn/AbISbssebzk6bbsbiC5sCuA==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3340,16 +3318,49 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "ws": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", + "integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", + "dev": true } } }, - "@percy/script": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@percy/script/-/script-1.1.0.tgz", - "integrity": "sha512-ZocGi2Kf921FzN5ASViWy21L8rRN2aO+JokVoRqPGd49Ykks5KVx8FRPV49lIKKeBIv9wnrL147ZqrkRGI4tkQ==", + "@percy/dom": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/dom/-/dom-1.0.0-beta.67.tgz", + "integrity": "sha512-IWGn/59Yixjo/j7/k+8SPbu/pD6EmAfr1qFcSUWJ+9Y5jCVS1hRjRyP94Zc+vZTDoEtP6h688yvQGB1L7AZE9g==", + "dev": true + }, + "@percy/env": { + "version": "1.0.0-beta.67", + "resolved": "https://registry.npmjs.org/@percy/env/-/env-1.0.0-beta.67.tgz", + "integrity": "sha512-DrXYFIJM38CriYPMuPEC6FxAtwUGUCea2Utv2PbZjABXzZe/oNEm66rcFoIGxNGiVZVUk6ZtSGe36cCAQbPM1g==", + "dev": true + }, + "@percy/logger": { + "version": "1.0.0-beta.63", + "resolved": "https://registry.npmjs.org/@percy/logger/-/logger-1.0.0-beta.63.tgz", + "integrity": "sha512-iumIt1JjrZQiD9fPShbqaUtyqgRBA1crJzwhh6MPZz4s0XJLxcEzhawKzqhtOoiB8Wr5AxVygswLOkTfPcVuFg==", + "dev": true + }, + "@percy/puppeteer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@percy/puppeteer/-/puppeteer-2.0.0.tgz", + "integrity": "sha512-AAErUA1NEELBmOIscHBJB064+6x7N2ZIA9EisBfB6ff1HJK58t2x7VGRNQjGsXvq/RP0wrLzmUY3uSSb2gQhVQ==", + "dev": true, + "requires": { + "@percy/sdk-utils": "^1.0.0-beta.32" + } + }, + "@percy/sdk-utils": { + "version": "1.0.0-beta.63", + "resolved": "https://registry.npmjs.org/@percy/sdk-utils/-/sdk-utils-1.0.0-beta.63.tgz", + "integrity": "sha512-3sLAUzh0BfXcD8qWt6dvjCDo2VqBTJVTNuxPWFj5UyPvK7B3+09wU7RWnY/crLbnBEhnYCW2Az97HHWmPHGA7Q==", "dev": true, "requires": { - "@percy/agent": "~0" + "@percy/logger": "1.0.0-beta.63" } }, "@sinonjs/commons": { @@ -3580,6 +3591,12 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", @@ -3813,12 +3830,6 @@ "color-convert": "^2.0.1" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, "any-base": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", @@ -4138,12 +4149,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, "async-exit-hook": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-1.1.2.tgz", @@ -4174,15 +4179,6 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dev": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, "babel-jest": { "version": "25.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", @@ -4506,9 +4502,9 @@ "dev": true }, "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -4522,12 +4518,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "bluebird-retry": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/bluebird-retry/-/bluebird-retry-0.11.0.tgz", - "integrity": "sha1-EomrIsu8OgJYe6rTVZU1HdDBwEc=", - "dev": true - }, "bmp-js": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", @@ -4848,32 +4838,6 @@ "unset-value": "^1.0.0" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -4975,16 +4939,6 @@ "rsvp": "^4.8.4" } }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -5099,164 +5053,9 @@ }, "cli-boxes": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-ux": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", - "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", - "dev": true, - "requires": { - "@oclif/errors": "^1.2.2", - "@oclif/linewrap": "^1.0.0", - "@oclif/screen": "^1.0.3", - "ansi-escapes": "^3.1.0", - "ansi-styles": "^3.2.1", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "clean-stack": "^2.0.0", - "extract-stack": "^1.0.0", - "fs-extra": "^7.0.0", - "hyperlinker": "^1.0.0", - "indent-string": "^3.2.0", - "is-wsl": "^1.1.0", - "lodash": "^4.17.11", - "password-prompt": "^1.0.7", - "semver": "^5.6.0", - "strip-ansi": "^5.0.0", - "supports-color": "^5.5.0", - "supports-hyperlinks": "^1.0.1", - "treeify": "^1.1.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dev": true, - "requires": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "clipboardy": { "version": "1.2.3", @@ -5356,33 +5155,6 @@ "object-visit": "^1.0.0" } }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - } - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5398,38 +5170,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "colorette": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "dev": true, - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5627,38 +5373,17 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "crc": { @@ -5843,6 +5568,12 @@ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", "dev": true }, + "currency-symbol-map": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-5.0.1.tgz", + "integrity": "sha512-2yHvoVBPIS9Dx7fjritu9l7UHWo4Z3D2oQnQj8AYwUee2j/PAcoHB4issCqwabfbipISZ/iG6vVYsfrAoks2eA==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6074,9 +5805,9 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "version": "0.0.901419", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "dev": true }, "diff": { @@ -6115,12 +5846,6 @@ "webidl-conversions": "^4.0.2" } }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6173,12 +5898,6 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -6259,12 +5978,6 @@ "stackframe": "^0.3.1" } }, - "es6-promise-pool": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz", - "integrity": "sha1-FHxhKza0fxBQJ/nSv1SlmKmdnMs=", - "dev": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6615,12 +6328,6 @@ } } }, - "extract-stack": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", - "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=", - "dev": true - }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -6682,12 +6389,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, "fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", @@ -6732,12 +6433,6 @@ "pend": "~1.2.0" } }, - "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==", - "dev": true - }, "file-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", @@ -6879,30 +6574,12 @@ } } }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true - }, - "follow-redirects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", - "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", - "dev": true - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6981,7 +6658,10 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/full-icu/-/full-icu-1.3.1.tgz", "integrity": "sha512-VMtK//85QJomhk3cXOCksNwOYaw1KWnYTS37GYGgyf7A3ajdBoPGhaJuJWAH2S2kq8GZeXkdKn+3Mfmgy11cVw==", - "dev": true + "dev": true, + "requires": { + "icu4c-data": "^0.67.2" + } }, "function-bind": { "version": "1.1.1", @@ -7042,12 +6722,6 @@ } } }, - "generic-pool": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.7.1.tgz", - "integrity": "sha512-ug6DAZoNgWm6q5KhPFA+hzXfBLFQu5sTXxPpv44DmE0A2g+CiHoq9LTVdkXpZMkYVMoGw83F6W+WT0h0MFMK/w==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -7479,12 +7153,6 @@ "integrity": "sha512-qLo/08cNc3Tb0uD7jK0jAcU5cnqCM0n568918E7R2XhMr/+7F37p4EY062W/stg7tmzvknNn9b/1+UhVRzsYrQ==", "dev": true }, - "hyperlinker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", - "dev": true - }, "i18next": { "version": "19.9.2", "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.9.2.tgz", @@ -7552,6 +7220,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icu4c-data": { + "version": "0.67.2", + "resolved": "https://registry.npmjs.org/icu4c-data/-/icu4c-data-0.67.2.tgz", + "integrity": "sha512-OIRiop+k1IVf4TBLEOj910duoO9NKwtJLwp++qWT6KT5gRziHNt+5gwhcGuTqRy++RTK2gLoAIbk8KYCNxW++g==", + "dev": true + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7571,28 +7245,28 @@ "dev": true }, "image-size": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", - "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", + "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", "dev": true, "requires": { - "queue": "6.0.1" + "queue": "6.0.2" } }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "dependencies": { "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } @@ -7754,12 +7428,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -8813,12 +8481,6 @@ "verror": "1.10.0" } }, - "jssha": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jssha/-/jssha-2.4.2.tgz", - "integrity": "sha512-/jsi/9C0S70zfkT/4UlKQa5E1xKurDnXcQizcww9JSR/Fv+uIbWM2btG+bFcL3iNoK9jIGS0ls9HWLr1iw0kFg==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8831,12 +8493,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true - }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -8945,6 +8601,12 @@ "json5": "^2.1.2" } }, + "locale-currency": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/locale-currency/-/locale-currency-0.0.2.tgz", + "integrity": "sha1-4skGB1Y85HpZ+VWeRacOJOTbS20=", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9089,19 +8751,6 @@ } } }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "dev": true, - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } - }, "lolex": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", @@ -9308,12 +8957,6 @@ "minimist": "^1.2.5" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -9614,15 +9257,6 @@ "wrappy": "1" } }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "requires": { - "fn.name": "1.x.x" - } - }, "onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", @@ -9706,6 +9340,15 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", @@ -9764,24 +9407,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "password-prompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", - "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.1.0", - "cross-spawn": "^6.0.5" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - } - } - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9845,23 +9470,6 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "percy-client": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/percy-client/-/percy-client-3.8.0.tgz", - "integrity": "sha512-6SVEpnPteN9mR4fq/FCW7M0KDHWbNAyiiyj9igTpHSv2oBjgyNnDA2y0S+o8U+AN7QDRbh40JbAWi72M+cfOJg==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "bluebird-retry": "^0.11.0", - "dotenv": "^8.1.0", - "es6-promise-pool": "^2.5.0", - "jssha": "^2.1.0", - "regenerator-runtime": "^0.13.1", - "request": "^2.87.0", - "request-promise": "^4.2.2", - "walk": "^2.3.14" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -10074,9 +9682,9 @@ "dev": true }, "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", + "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", "dev": true }, "promisify-event": { @@ -10152,23 +9760,59 @@ "dev": true }, "puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.2.0.tgz", + "integrity": "sha512-OR2CCHRashF+f30+LBOtAjK6sNtz2HEyTr5FqAvhf8lR/qB3uBRoIZOwQKgwoyZnMBsxX7ZdazlyBgGjpnkiMw==", "dev": true, "requires": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } } }, "qrcode-terminal": { @@ -10184,9 +9828,9 @@ "dev": true }, "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dev": true, "requires": { "inherits": "~2.0.3" @@ -10293,15 +9937,6 @@ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -10549,6 +10184,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -10597,12 +10238,6 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "retry-axios": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-1.0.2.tgz", - "integrity": "sha512-PeR6ZVYscfOHrbN3A6EiP8M6UlseHpDkwVDsT6YMcZH0qyMubuFIq6gwydn+ZkvBzry3xmAZwZ3pW1zmJbvLOA==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11091,23 +10726,6 @@ } } }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -11356,12 +10974,6 @@ "tweetnacl": "~0.14.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", @@ -11532,15 +11144,15 @@ "dev": true }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", "dev": true, "requires": { "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", + "mkdirp": "^0.5.1", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^2.0.0" } }, "tar-stream": { @@ -13335,12 +12947,6 @@ "integrity": "sha1-5tZsVyzhWvJmcGrw/WELKoQd1EM=", "dev": true }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true - }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -13501,18 +13107,6 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", - "dev": true - }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -13523,9 +13117,9 @@ } }, "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, "tunnel-agent": { @@ -13597,9 +13191,9 @@ "optional": true }, "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", "dev": true, "requires": { "buffer": "^5.2.1", @@ -13856,15 +13450,6 @@ "xml-name-validator": "^3.0.0" } }, - "walk": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", - "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", - "dev": true, - "requires": { - "foreachasync": "^3.0.0" - } - }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -14048,67 +13633,6 @@ } } }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "dev": true, - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - } - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "dev": true, - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -14220,6 +13744,12 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, "yargs": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", diff --git a/package.json b/package.json index e3d096a7f..7348ea5eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.1", + "version": "1.24.0", "description": "A starter answers theme for hitchhikers", "scripts": { "test": "cross-env NODE_ICU_DATA=node_modules/full-icu jest --verbose", @@ -22,12 +22,14 @@ "devDependencies": { "@babel/core": "^7.9.6", "@babel/preset-env": "^7.9.6", - "@percy/script": "^1.1.0", + "@percy/cli": "^1.0.0-beta.67", + "@percy/puppeteer": "^2.0.0", "@types/jest": "^26.0.19", "@yext/cta-formatter": "^1.0.0", "babel-jest": "^25.5.1", "comment-json": "^4.1.1", "cross-env": "^7.0.2", + "currency-symbol-map": "^5.0.1", "express": "^4.17.1", "file-system": "^2.2.2", "full-icu": "^1.3.1", @@ -36,8 +38,10 @@ "jest": "^25.5.2", "libphonenumber-js": "^1.9.6", "loader-utils": "^2.0.0", + "locale-currency": "0.0.2", "lodash.clonedeep": "^4.5.0", "postcss": "^8.2.1", + "puppeteer": "^10.2.0", "serve": "^11.3.2", "simple-git": "^2.24.0", "testcafe": "^1.15.0", diff --git a/script/translations.js b/script/translations.js new file mode 100644 index 000000000..8e2033f14 --- /dev/null +++ b/script/translations.js @@ -0,0 +1,18 @@ +window.hitchhiker_theme_translations = { + "Closed": {{ translateJS phrase="Closed" context="Indicates that a store is closed" }}, + "Open 24 Hours": {{ translateJS phrase="Open 24 Hours" context="The hours that a store is open" }}, + "Opens at": {{ translateJS phrase="Opens at" context="Indicates the time a store will open" }}, + "Open Now": {{ translateJS phrase="Open Now" context="Indicates that a store is open" }}, + "Closes at": {{ translateJS phrase="Closes at" context="Indicates the time a store will close" }}, + "Day of the Week": {{ translateJS phrase="Day of the Week"}}, + "Hours": {{ translateJS phrase="Hours"}}, + "Yes": {{ translateJS phrase="Yes" }}, + "No": {{ translateJS phrase="No" }}, + "Monday": {{ translateJS phrase="Monday" }}, + "Tuesday": {{ translateJS phrase="Tuesday" }}, + "Wednesday": {{ translateJS phrase="Wednesday" }}, + "Thursday": {{ translateJS phrase="Thursday" }}, + "Friday": {{ translateJS phrase="Friday" }}, + "Saturday": {{ translateJS phrase="Saturday" }}, + "Sunday": {{ translateJS phrase="Sunday" }} +} diff --git a/static/js/HitchhikerJS.js b/static/js/HitchhikerJS.js index 65554705d..869dd5705 100644 --- a/static/js/HitchhikerJS.js +++ b/static/js/HitchhikerJS.js @@ -9,6 +9,11 @@ export { isMobile } from 'is-mobile'; export { getInjectedProp } from './get-injected-prop'; export { isHighlighted } from './is-highlighted'; + +//polyfill for ie11 styling +import objectFitImages from 'object-fit-images'; +export { objectFitImages } + // Used to transfigure the page for the Overlay import Overlay from './overlay/answers-frame/overlay'; window.Overlay = new Overlay(); diff --git a/static/js/formatters-internal.js b/static/js/formatters-internal.js index 610687da0..fbdc7fb5f 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -7,9 +7,11 @@ import HoursStringsLocalizer from './hours/stringslocalizer.js'; import HoursTableBuilder from './hours/table/builder.js'; import { DayNames } from './hours/constants.js'; import { generateCTAFieldTypeLink } from './formatters/generate-cta-field-type-link'; +import { isChrome } from './useragent.js'; +import LocaleCurrency from 'locale-currency' +import getSymbolFromCurrency from 'currency-symbol-map' import { parseLocale } from './utils.js'; - export function address(profile) { if (!profile.address) { return ''; @@ -240,7 +242,7 @@ export function prettyPrintObject(obj, locale) { case 'bigint': return obj.toLocaleString(locale); case 'boolean': - return _prettyPrintBoolean(obj, locale) + return _prettyPrintBoolean(obj); case 'object': // check for null if (!obj) { @@ -261,47 +263,11 @@ export function prettyPrintObject(obj, locale) { * in English, it would return either 'Yes' for True or 'No' for False. * * @param {boolean} value The boolean value. - * @param {string} locale The locale indicating which language to use. * @returns {string} The localized affirmative or negative. */ -function _prettyPrintBoolean(value, locale) { - const { language, modifier } = parseLocale(locale); - const languageAndModifier = modifier ? `${language}-${modifier}` : language; - - switch (languageAndModifier) { - case 'es': - return value ? 'Sí' : 'No'; - case 'fr': - return value ? 'Oui' : 'Non'; - case 'it': - return value ? 'Sì' : 'No'; - case 'de': - return value ? 'Ja' : 'Nein'; - case 'ja': - return value ? 'はい' : '番号'; - case 'ar': - return value ? 'نعم' : 'رقم'; - case 'hi': - return value ? 'हाँ' : 'नहीं'; - case 'ko': - return value ? '예' : '아니요'; - case 'nl': - return value ? 'Ja' : 'Nee'; - case 'pl': - return value ? 'TAk' : 'Nie'; - case 'pt': - return value ? 'Sim' : 'Não'; - case 'ru': - return value ? 'да' : 'Нет'; - case 'sv': - return value ? 'Ja' : 'Nej'; - case 'zh-Hans': - return value ? '是的' : '不'; - case 'zh-Hant': - return value ? '是的' : '不'; - default: - return value ? 'Yes' : 'No'; - } +function _prettyPrintBoolean(value) { + const text = value ? 'Yes' : 'No'; + return window.translations[text]; } export function joinList(list, separator) { @@ -559,6 +525,35 @@ export function price(fieldValue = {}, locale) { return price.toLocaleString(localeForFormatting, { style: 'currency', currency: currencyCode }); } +/** + * Returns a localized price range string for the given price range ($-$$$$) and country code (ISO format). + * If country code is invalid or undefined, use locale of the site to determine the currency symbol. + * If all else fails, use the default priceRange with dollar sign. + * @param {string} defaultPriceRange The price range from LiveAPI entity + * @param {string} countrycode The country code from LiveAPI entity (e.g. profile.address.countryCode) + * @return {string} The price range with correct currency symbol formatting according to country code + */ +export function priceRange(defaultPriceRange, countryCode) { + if (!defaultPriceRange) { + console.warn(`Price range is not provided.`); + return ''; + } + if (countryCode) { + const currencySymbol = getSymbolFromCurrency(LocaleCurrency.getCurrency(countryCode)); + if (currencySymbol) { + return defaultPriceRange.replace(/\$/g, currencySymbol); + } + } + const { region, language } = parseLocale(_getDocumentLocale()); + const currencySymbol = getSymbolFromCurrency(LocaleCurrency.getCurrency(region || language)); + if (currencySymbol) { + return defaultPriceRange.replace(/\$/g, currencySymbol); + } + console.warn('Unable to determine currency symbol from ' + + `ISO country code "${countryCode}" or locale "${_getDocumentLocale()}".`); + return defaultPriceRange; +} + /** * Highlights snippets of the provided fieldValue according to the matched substrings. * Each match will be wrapped in tags. @@ -603,3 +598,50 @@ export function getYoutubeUrl(videos = []) { : null; return youtubeVideoUrl; } + +/** + * construct a URL that links to a specific portion of a page, using a text snippet provided in the URL. + * This feature is only available in Chrome. + * @param {Object} snippet the snippet for the document search direct answer + * @param {string} baseUrl website or landingPageURL from the entity related to the snippet + * @returns a URL with text fragment URI component attached + */ +export function getUrlWithTextHighlight(snippet, baseUrl) { + if (!isChrome() || !snippet || snippet.matchedSubstrings.length === 0) { + return baseUrl; + } + //Find the surrounding sentence of the snippet + let sentenceStart = snippet.matchedSubstrings[0].offset; + let sentenceEnd = sentenceStart + snippet.matchedSubstrings[0].length; + const sentenceEnderRegex = /[.\n!\?]/; + while (!sentenceEnderRegex.test(snippet.value[sentenceStart]) && sentenceStart > 0) { + sentenceStart -= 1; + } + while (!sentenceEnderRegex.test(snippet.value[sentenceEnd]) && sentenceEnd < snippet.value.length) { + sentenceEnd += 1; + } + sentenceStart = sentenceStart === 0 ? sentenceStart : sentenceStart + 2; + const sentence = snippet.value.slice(sentenceStart, sentenceEnd); + return baseUrl + `#:~:text=${encodeURIComponent(sentence)}`; +} + +/** + * construct a list of displayable category names based on given category ids from liveAPI + * and a mapping of category ids to names. + * + * @param {string[]} categoryIds category ids from liveAPI + * @param {Object[]} categoryMap mapping of category ids to names + * @param {string} categoryMap[].id id of a category entry + * @param {string} categoryMap[].category name of a category entry + * @returns {string[]} a list of category names + */ +export function getCategoryNames(categoryIds, categoryMap) { + if (!categoryIds || !categoryMap) { + return []; + } + return categoryIds.reduce((list, id) => { + const categoryEntry = categoryMap.find(category => category.id === id); + categoryEntry ? list.push(categoryEntry.category) : console.error(`Unable to find category name for id ${id}.`); + return list; + }, []); +} diff --git a/static/js/formatters.js b/static/js/formatters.js index 1d1084929..5a2741fe2 100644 --- a/static/js/formatters.js +++ b/static/js/formatters.js @@ -28,8 +28,11 @@ import { hoursList, generateCTAFieldTypeLink, price, + priceRange, highlightField, - getYoutubeUrl + getYoutubeUrl, + getUrlWithTextHighlight, + getCategoryNames } from './formatters-internal.js'; import * as CustomFormatters from './formatters-custom.js'; @@ -61,8 +64,11 @@ let Formatters = { hoursList, generateCTAFieldTypeLink, price, + priceRange, highlightField, - getYoutubeUrl + getYoutubeUrl, + getUrlWithTextHighlight, + getCategoryNames }; Formatters = Object.assign(Formatters, CustomFormatters); diff --git a/static/js/hours/constants.js b/static/js/hours/constants.js index 64215f196..f7438cff4 100644 --- a/static/js/hours/constants.js +++ b/static/js/hours/constants.js @@ -1,11 +1,11 @@ export const DayNames = { - SUNDAY: 'SUNDAY', - MONDAY: 'MONDAY', - TUESDAY: 'TUESDAY', - WEDNESDAY: 'WEDNESDAY', - THURSDAY: 'THURSDAY', - FRIDAY: 'FRIDAY', - SATURDAY: 'SATURDAY' + SUNDAY: 'Sunday', + MONDAY: 'Monday', + TUESDAY: 'Tuesday', + WEDNESDAY: 'Wednesday', + THURSDAY: 'Thursday', + FRIDAY: 'Friday', + SATURDAY: 'Saturday' }; export const TableHeaders = { diff --git a/static/js/hours/open-status/constants.js b/static/js/hours/open-status/constants.js index ed1324ced..f09b20c34 100644 --- a/static/js/hours/open-status/constants.js +++ b/static/js/hours/open-status/constants.js @@ -11,6 +11,6 @@ export const OpenStatusStrings = { OPEN_24_HOURS: 'Open 24 Hours', CLOSED: 'Closed', OPENS_AT: 'Opens at', - OPEN_NOW: 'Open now', + OPEN_NOW: 'Open Now', CLOSES_AT: 'Closes at' }; \ No newline at end of file diff --git a/static/js/hours/stringslocalizer.js b/static/js/hours/stringslocalizer.js index 301afecb2..61d4989df 100644 --- a/static/js/hours/stringslocalizer.js +++ b/static/js/hours/stringslocalizer.js @@ -1,6 +1,3 @@ -import provideOpenStatusTranslation from '../open-status-i18n'; -import provideTableHeadersTranslation from './table/table-strings-i18n'; - /** * HoursStringsLocalizer is responsible for returning localized hours strings for * the current locale @@ -16,14 +13,6 @@ export default class HoursStringsLocalizer { * @type {boolean} */ this._isTwentyFourHourClock = isTwentyFourHourClock; - - /** - * @type {Object} translationData - */ - this._translationData = { - ...provideOpenStatusTranslation(locale), - ...provideTableHeadersTranslation(locale) - } } /** @@ -35,11 +24,11 @@ export default class HoursStringsLocalizer { * @returns {string} */ getTranslation(text) { - if (!this._translationData.hasOwnProperty(text)) { + if (!window.hitchhiker_theme_translations.hasOwnProperty(text)) { console.error(`Could not translate "${text}".`); return text; } - return this._translationData[text]; + return window.hitchhiker_theme_translations[text]; } /** diff --git a/static/js/hours/table/table-strings-i18n.js b/static/js/hours/table/table-strings-i18n.js deleted file mode 100644 index d40fd293f..000000000 --- a/static/js/hours/table/table-strings-i18n.js +++ /dev/null @@ -1,90 +0,0 @@ -import { TableHeaders } from '../constants'; -import { parseLocale } from '../../utils'; - -export default function provideTableHeadersTranslation(locale) { - const { language, modifier } = parseLocale(locale); - const languageAndModifier = modifier ? `${language}-${modifier}` : language; - - switch (languageAndModifier) { - case 'fr': - return { - [TableHeaders.DAY_OF_WEEK]: 'Jour de la semaine', - [TableHeaders.HOURS]: 'Horaires' - } - case 'de': - return { - [TableHeaders.DAY_OF_WEEK]: 'Wochentag', - [TableHeaders.HOURS]: 'Zeiten' - } - case 'es': - return { - [TableHeaders.DAY_OF_WEEK]: 'Día de la semana', - [TableHeaders.HOURS]: 'Horarios' - } - case 'it': - return { - [TableHeaders.DAY_OF_WEEK]: 'Giorno della settimana', - [TableHeaders.HOURS]: 'Orari' - } - case 'ja': - return { - [TableHeaders.DAY_OF_WEEK]: '曜日', - [TableHeaders.HOURS]: '営業時間' - } - case 'ar': - return { - [TableHeaders.DAY_OF_WEEK]: 'يوم من الأسبوع', - [TableHeaders.HOURS]: 'ساعات' - } - case 'hi': - return { - [TableHeaders.DAY_OF_WEEK]: 'सप्ताह का दिन', - [TableHeaders.HOURS]: 'घंटे' - } - case 'ko': - return { - [TableHeaders.DAY_OF_WEEK]: '요일', - [TableHeaders.HOURS]: '시간' - } - case 'nl': - return { - [TableHeaders.DAY_OF_WEEK]: 'dag van de week', - [TableHeaders.HOURS]: 'uur' - } - case 'pl': - return { - [TableHeaders.DAY_OF_WEEK]: 'Dzień tygodnia', - [TableHeaders.HOURS]: 'godziny' - } - case 'pt': - return { - [TableHeaders.DAY_OF_WEEK]: 'Dia da semana', - [TableHeaders.HOURS]: 'Horas' - } - case 'ru': - return { - [TableHeaders.DAY_OF_WEEK]: 'День недели', - [TableHeaders.HOURS]: 'Часы' - } - case 'sv': - return { - [TableHeaders.DAY_OF_WEEK]: 'Veckodag', - [TableHeaders.HOURS]: 'Timmar' - } - case 'zh-Hans': - return { - [TableHeaders.DAY_OF_WEEK]: '一周中的天', - [TableHeaders.HOURS]: '小时' - } - case 'zh-Hant': - return { - [TableHeaders.DAY_OF_WEEK]: '一週中的天', - [TableHeaders.HOURS]: '小時' - } - default: - return { - [TableHeaders.DAY_OF_WEEK]: 'Day of the Week', - [TableHeaders.HOURS]: 'Hours' - } - } -} \ No newline at end of file diff --git a/static/js/hours/transformer.js b/static/js/hours/transformer.js index 3e1db1c97..05d236096 100644 --- a/static/js/hours/transformer.js +++ b/static/js/hours/transformer.js @@ -198,7 +198,7 @@ export default class HoursTransformer { return Object.entries(days) .filter(([day]) => day !== 'holidayHours' && day !== 'reopenDate') .reduce((formattedDays, [day, dayInfo]) => { - const currentDayName = day.toUpperCase(); + const currentDayName = day.charAt(0).toUpperCase() + day.slice(1).toLowerCase(); const numberTimezone = this._convertTimezoneToNumber(timezone); const userDate = this._getDateWithUTCOffset(numberTimezone); const nextDayOfWeek = this._getNextDayOfWeek(userDate, daysOfWeek.indexOf(currentDayName)); diff --git a/static/js/open-status-i18n.js b/static/js/open-status-i18n.js deleted file mode 100644 index 9d590222b..000000000 --- a/static/js/open-status-i18n.js +++ /dev/null @@ -1,315 +0,0 @@ -import { DayNames } from './hours/constants.js'; -import { OpenStatusStrings } from './hours/open-status/constants.js'; -import { parseLocale } from './utils'; - -/** - * Provides translation data for the openStatus formatter. - * @param {string} locale - */ -export default function provideOpenStatusTranslation (locale) { - const { language, modifier } = parseLocale(locale); - const languageAndModifier = modifier ? `${language}-${modifier}` : language; - - return { - ...provideTodaysMessageTranslation(languageAndModifier), - ...provideDayTranslation(languageAndModifier) - } -} - -function provideTodaysMessageTranslation(languageAndModifier) { - switch (languageAndModifier) { - case 'fr': - return { - [OpenStatusStrings.CLOSED]: 'Fermé', - [OpenStatusStrings.OPEN_24_HOURS]: 'Ouvert 24h/24', - [OpenStatusStrings.OPENS_AT]: 'Ouvre à', - [OpenStatusStrings.OPEN_NOW]: 'Ouvert maintenant', - [OpenStatusStrings.CLOSES_AT]: 'Ferme à', - } - case 'de': - return { - [OpenStatusStrings.CLOSED]: 'Geschlossen', - [OpenStatusStrings.OPEN_24_HOURS]: '24 Stunden geöffnet', - [OpenStatusStrings.OPENS_AT]: 'Öffnet um', - [OpenStatusStrings.OPEN_NOW]: 'Jetzt geöffnet', - [OpenStatusStrings.CLOSES_AT]: 'Schließt um', - } - case 'es': - return { - [OpenStatusStrings.CLOSED]: 'Cerrado', - [OpenStatusStrings.OPEN_24_HOURS]: 'Abierto las 24 horas', - [OpenStatusStrings.OPENS_AT]: 'Abre a las', - [OpenStatusStrings.OPEN_NOW]: 'Abierto ahora', - [OpenStatusStrings.CLOSES_AT]: 'Cierra a las', - } - case 'it': - return { - [OpenStatusStrings.CLOSED]: 'Chiuso', - [OpenStatusStrings.OPEN_24_HOURS]: 'Aperto 24 ore su 24', - [OpenStatusStrings.OPENS_AT]: 'Apre alle', - [OpenStatusStrings.OPEN_NOW]: 'Aperto ora', - [OpenStatusStrings.CLOSES_AT]: 'Chiude alle', - } - case 'ja': - return { - [OpenStatusStrings.CLOSED]: '休業', - [OpenStatusStrings.OPEN_24_HOURS]: '24時間営業', - [OpenStatusStrings.OPENS_AT]: '営業開始', - [OpenStatusStrings.OPEN_NOW]: '現在営業中', - [OpenStatusStrings.CLOSES_AT]: '営業終了', - } - case 'ar': - return { - [OpenStatusStrings.CLOSED]: 'مغلق', - [OpenStatusStrings.OPEN_24_HOURS]: 'مفتوح على مدار 24 ساعة', - [OpenStatusStrings.OPENS_AT]: 'يُفتح في', - [OpenStatusStrings.OPEN_NOW]: 'مفتوح الآن', - [OpenStatusStrings.CLOSES_AT]: 'يُغلق في', - } - case 'hi': - return { - [OpenStatusStrings.CLOSED]: 'बंद हो गया', - [OpenStatusStrings.OPEN_24_HOURS]: '24 घंटे खुला रहता है', - [OpenStatusStrings.OPENS_AT]: 'इस समय खुलता है', - [OpenStatusStrings.OPEN_NOW]: 'अभी खुला है', - [OpenStatusStrings.CLOSES_AT]: 'इस समय बंद होता है', - } - case 'ko': - return { - [OpenStatusStrings.CLOSED]: '닫힘', - [OpenStatusStrings.OPEN_24_HOURS]: '24시간 영업', - [OpenStatusStrings.OPENS_AT]: '개장 시간:', - [OpenStatusStrings.OPEN_NOW]: 'अ지금 열기', - [OpenStatusStrings.CLOSES_AT]: '종료 시간:', - } - case 'nl': - return { - [OpenStatusStrings.CLOSED]: 'Gesloten', - [OpenStatusStrings.OPEN_24_HOURS]: '24 uur geopend', - [OpenStatusStrings.OPENS_AT]: 'Geopend vanaf', - [OpenStatusStrings.OPEN_NOW]: 'Nu geopend', - [OpenStatusStrings.CLOSES_AT]: 'Gesloten vanaf', - } - case 'pl': - return { - [OpenStatusStrings.CLOSED]: 'Zamknięte', - [OpenStatusStrings.OPEN_24_HOURS]: 'Otwarte całodobowo', - [OpenStatusStrings.OPENS_AT]: 'Zamknięcie', - [OpenStatusStrings.OPEN_NOW]: 'Czynne teraz', - [OpenStatusStrings.CLOSES_AT]: 'Otwarcie', - } - case 'pt': - return { - [OpenStatusStrings.CLOSED]: 'Fechado', - [OpenStatusStrings.OPEN_24_HOURS]: 'Aberto 24 horas', - [OpenStatusStrings.OPENS_AT]: 'Abre às', - [OpenStatusStrings.OPEN_NOW]: 'Aberto agora', - [OpenStatusStrings.CLOSES_AT]: 'Fecha às', - } - case 'ru': - return { - [OpenStatusStrings.CLOSED]: 'Закрыто', - [OpenStatusStrings.OPEN_24_HOURS]: 'Открыто круглосуточно', - [OpenStatusStrings.OPENS_AT]: 'Открывается в', - [OpenStatusStrings.OPEN_NOW]: 'Открыто', - [OpenStatusStrings.CLOSES_AT]: 'Закрывается в', - } - case 'sv': - return { - [OpenStatusStrings.CLOSED]: 'Stängt', - [OpenStatusStrings.OPEN_24_HOURS]: 'Öppet 24 timmar om dygnet', - [OpenStatusStrings.OPENS_AT]: 'Öppnar kl.', - [OpenStatusStrings.OPEN_NOW]: 'Öppet nu', - [OpenStatusStrings.CLOSES_AT]: 'Stänger kl.', - } - case 'zh-Hans': - return { - [OpenStatusStrings.CLOSED]: '休业中', - [OpenStatusStrings.OPEN_24_HOURS]: '24 小时营业', - [OpenStatusStrings.OPENS_AT]: '开店时间:', - [OpenStatusStrings.OPEN_NOW]: '现正营业', - [OpenStatusStrings.CLOSES_AT]: '闭店时间:', - } - case 'zh-Hant': - return { - [OpenStatusStrings.CLOSED]: '休息', - [OpenStatusStrings.OPEN_24_HOURS]: '24 小時營業', - [OpenStatusStrings.OPENS_AT]: '營業時間:', - [OpenStatusStrings.OPEN_NOW]: '營業中', - [OpenStatusStrings.CLOSES_AT]: '休息時間:', - } - default: - return { - [OpenStatusStrings.CLOSED]: 'Closed', - [OpenStatusStrings.OPEN_24_HOURS]: 'Open 24 Hours', - [OpenStatusStrings.OPENS_AT]: 'Opens at', - [OpenStatusStrings.OPEN_NOW]: 'Open Now', - [OpenStatusStrings.CLOSES_AT]: 'Closes at', - } - } -} - -function provideDayTranslation(languageAndModifier) { - switch (languageAndModifier) { - case 'fr': - return { - [DayNames.MONDAY]: 'Lundi', - [DayNames.TUESDAY]: 'Mardi', - [DayNames.WEDNESDAY]: 'Mercredi', - [DayNames.THURSDAY]: 'Jeudi', - [DayNames.FRIDAY]: 'Vendredi', - [DayNames.SATURDAY]: 'Samedi', - [DayNames.SUNDAY]: 'Dimanche', - } - case 'de': - return { - [DayNames.MONDAY]: 'Montag', - [DayNames.TUESDAY]: 'Dienstag', - [DayNames.WEDNESDAY]: 'Mittwoch', - [DayNames.THURSDAY]: 'Donnerstag', - [DayNames.FRIDAY]: 'Freitag', - [DayNames.SATURDAY]: 'Samstag', - [DayNames.SUNDAY]: 'Sonntag', - } - case 'es': - return { - [DayNames.MONDAY]: 'Lunes', - [DayNames.TUESDAY]: 'Martes', - [DayNames.WEDNESDAY]: 'Miércoles', - [DayNames.THURSDAY]: 'Jueves', - [DayNames.FRIDAY]: 'Viernes', - [DayNames.SATURDAY]: 'Sabado', - [DayNames.SUNDAY]: 'Domingo', - } - case 'it': - return { - [DayNames.MONDAY]: 'Lunedí', - [DayNames.TUESDAY]: 'Martedí', - [DayNames.WEDNESDAY]: 'Mercoledí', - [DayNames.THURSDAY]: 'Giovedí', - [DayNames.FRIDAY]: 'Venerdí', - [DayNames.SATURDAY]: 'Sabato', - [DayNames.SUNDAY]: 'Domenica', - } - case 'ja': - return { - [DayNames.MONDAY]: '月曜日', - [DayNames.TUESDAY]: '火曜日', - [DayNames.WEDNESDAY]: '水曜日', - [DayNames.THURSDAY]: '木曜日', - [DayNames.FRIDAY]: '金曜日', - [DayNames.SATURDAY]: '土曜日', - [DayNames.SUNDAY]: '日曜日', - } - case 'ar': - return { - [DayNames.MONDAY]: 'الاثنين', - [DayNames.TUESDAY]: 'يوم الثلاثاء', - [DayNames.WEDNESDAY]: 'الأربعاء', - [DayNames.THURSDAY]: 'يوم الخميس', - [DayNames.FRIDAY]: 'يوم الجمعة', - [DayNames.SATURDAY]: 'يوم السبت', - [DayNames.SUNDAY]: 'يوم الأحد', - } - case 'hi': - return { - [DayNames.MONDAY]: 'सोमवार', - [DayNames.TUESDAY]: 'मंगलवार', - [DayNames.WEDNESDAY]: 'बुधवार', - [DayNames.THURSDAY]: 'गुरुवार', - [DayNames.FRIDAY]: 'शुक्रवार', - [DayNames.SATURDAY]: 'शनिवार', - [DayNames.SUNDAY]: 'रविवार का दिन', - } - case 'ko': - return { - [DayNames.MONDAY]: '월요일', - [DayNames.TUESDAY]: '화요일', - [DayNames.WEDNESDAY]: '수요일', - [DayNames.THURSDAY]: '목요일', - [DayNames.FRIDAY]: '금요일', - [DayNames.SATURDAY]: '토요일', - [DayNames.SUNDAY]: '일요일', - } - case 'nl': - return { - [DayNames.MONDAY]: 'Maandag', - [DayNames.TUESDAY]: 'Dinsdag', - [DayNames.WEDNESDAY]: 'Woensdag', - [DayNames.THURSDAY]: 'Donderdag', - [DayNames.FRIDAY]: 'Vrijdag', - [DayNames.SATURDAY]: 'Zaterdag', - [DayNames.SUNDAY]: 'Zondag', - } - case 'pl': - return { - [DayNames.MONDAY]: 'Poniedziałek', - [DayNames.TUESDAY]: 'Wtorek', - [DayNames.WEDNESDAY]: 'Środa', - [DayNames.THURSDAY]: 'Czwartek', - [DayNames.FRIDAY]: 'Piątek', - [DayNames.SATURDAY]: 'Sobota', - [DayNames.SUNDAY]: 'Niedziela', - } - case 'pt': - return { - [DayNames.MONDAY]: 'Segunda-feira', - [DayNames.TUESDAY]: 'Terça-feira', - [DayNames.WEDNESDAY]: 'Quarta-feira', - [DayNames.THURSDAY]: 'quinta-feira', - [DayNames.FRIDAY]: 'Sexta-feira', - [DayNames.SATURDAY]: 'Sábado', - [DayNames.SUNDAY]: 'Domingo', - } - case 'ru': - return { - [DayNames.MONDAY]: 'понедельник', - [DayNames.TUESDAY]: 'вторник', - [DayNames.WEDNESDAY]: 'среда', - [DayNames.THURSDAY]: 'четверг', - [DayNames.FRIDAY]: 'Пятница', - [DayNames.SATURDAY]: 'Суббота', - [DayNames.SUNDAY]: 'Воскресенье', - } - case 'sv': - return { - [DayNames.MONDAY]: 'Måndag', - [DayNames.TUESDAY]: 'Tisdag', - [DayNames.WEDNESDAY]: 'Onsdag', - [DayNames.THURSDAY]: 'Torsdag', - [DayNames.FRIDAY]: 'Fredag', - [DayNames.SATURDAY]: 'Lördag', - [DayNames.SUNDAY]: 'Söndag', - } - case 'zh-Hans': - return { - [DayNames.MONDAY]: '周一', - [DayNames.TUESDAY]: '周二', - [DayNames.WEDNESDAY]: '周三', - [DayNames.THURSDAY]: '周四', - [DayNames.FRIDAY]: '星期五', - [DayNames.SATURDAY]: '周六', - [DayNames.SUNDAY]: '星期日', - } - case 'zh-Hant': - return { - [DayNames.MONDAY]: '週一', - [DayNames.TUESDAY]: '週二', - [DayNames.WEDNESDAY]: '週三', - [DayNames.THURSDAY]: '週四', - [DayNames.FRIDAY]: '星期五', - [DayNames.SATURDAY]: '週六', - [DayNames.SUNDAY]: '星期日', - } - default: - return { - [DayNames.MONDAY]: 'Monday', - [DayNames.TUESDAY]: 'Tuesday', - [DayNames.WEDNESDAY]: 'Wednesday', - [DayNames.THURSDAY]: 'Thursday', - [DayNames.FRIDAY]: 'Friday', - [DayNames.SATURDAY]: 'Saturday', - [DayNames.SUNDAY]: 'Sunday', - } - } -} \ No newline at end of file diff --git a/static/js/useragent.js b/static/js/useragent.js new file mode 100644 index 000000000..61e2555f6 --- /dev/null +++ b/static/js/useragent.js @@ -0,0 +1,51 @@ +/** + * Returns whether the current browser is Microsoft Edge. + * Tries to use User-Agent clients hints, and defaults to + * using the User-Agent string if clients hints are not supported. + * + * @returns {boolean} + */ +export function isMicrosoftEdge () { + const brands = navigator.userAgentData?.brands; + if (brands && brands.length > 0) { + return !!brands.find(b => b.brand === 'Microsoft Edge'); + } else if (navigator.userAgent) { + return navigator.userAgent.includes('Edg'); + } +} + +/** + * Returns whether the current browser is Safari. + * Currently, Safari does not support User-Agent clients hints (userAgentData). + * Chrome likes to pretend that it's Safari. + * Edge also likes to pretend that it's Safari. + * + * @returns {boolean} + */ +export function isSafari () { + if (isChrome()) { + return false; + } + if (isMicrosoftEdge()) { + return false; + } + return navigator.userAgent.includes('Safari'); +} + +/** + * Returns whether the current browser is Chrome. + * Edge likes to pretend that it is Chrome. + * + * @returns {boolean} + */ +export function isChrome () { + if (isMicrosoftEdge()) { + return false; + } + const brands = navigator.userAgentData?.brands; + if (brands && brands.length > 0) { + return !!brands.find(b => b.brand === 'Google Chrome'); + } else if (navigator.userAgent) { + return navigator.userAgent.includes('Chrome'); + } +} diff --git a/static/package-lock.json b/static/package-lock.json index 0929c23c4..ed2a2d14a 100644 --- a/static/package-lock.json +++ b/static/package-lock.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.1", + "version": "1.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -667,15 +667,206 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz", + "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", + "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "dev": true + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", + "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-modules-systemjs": { @@ -2293,6 +2484,12 @@ } } }, + "currency-symbol-map": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/currency-symbol-map/-/currency-symbol-map-5.0.1.tgz", + "integrity": "sha512-2yHvoVBPIS9Dx7fjritu9l7UHWo4Z3D2oQnQj8AYwUee2j/PAcoHB4issCqwabfbipISZ/iG6vVYsfrAoks2eA==", + "dev": true + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -4385,6 +4582,12 @@ } } }, + "locale-currency": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/locale-currency/-/locale-currency-0.0.2.tgz", + "integrity": "sha1-4skGB1Y85HpZ+VWeRacOJOTbS20=", + "dev": true + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -4780,6 +4983,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-fit-images": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/object-fit-images/-/object-fit-images-3.2.4.tgz", + "integrity": "sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg==" + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", diff --git a/static/package.json b/static/package.json index 9f3dfa15b..1817dee1f 100644 --- a/static/package.json +++ b/static/package.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.1", + "version": "1.24.0", "description": "Toolchain for use with the HH Theme", "main": "Gruntfile.js", "scripts": { @@ -22,6 +22,7 @@ "babel-loader": "^8.1.0", "comment-json": "^4.1.1", "css-loader": "^3.4.2", + "currency-symbol-map": "^5.0.1", "esbuild-loader": "^2.13.1", "file-system": "^2.2.2", "fs-extra": "^9.0.1", @@ -32,6 +33,7 @@ "html-webpack-plugin": "^5.3.1", "jambo": "^1.12.0", "jsdom": "^16.4.0", + "locale-currency": "0.0.2", "mini-css-extract-plugin": "^1.6.0", "postcss": "^8.3.1", "resolve-url-loader": "^3.1.1", @@ -54,6 +56,7 @@ "libphonenumber-js": "^1.7.51", "lodash.clonedeep": "^4.5.0", "merge-options": "^2.0.0", + "object-fit-images": "^3.2.4", "remove-files-webpack-plugin": "^1.4.3", "underscore.string": "3.3.5" }, diff --git a/static/scss/answers-variables.scss b/static/scss/answers-variables.scss index 7c598d480..fadd2233c 100644 --- a/static/scss/answers-variables.scss +++ b/static/scss/answers-variables.scss @@ -56,6 +56,7 @@ $container-width: 1000px; --yxt-text-snippet-font-color: var(--yxt-color-text-primary); --yxt-direct-answer-view-details-font-weight: var(--yxt-font-weight-normal); --yxt-search-loading-opacity: 0.5; + --yxt-product-prominentimage-height: 300px; // interactive map variables --yxt-maps-search-this-area-background-color: white; diff --git a/static/scss/answers/answers-variables-default.scss b/static/scss/answers/answers-variables-default.scss index 499c9205c..6d64ebee8 100644 --- a/static/scss/answers/answers-variables-default.scss +++ b/static/scss/answers/answers-variables-default.scss @@ -55,6 +55,7 @@ $container-width: 1000px; --yxt-text-snippet-font-color: var(--yxt-color-text-primary); --yxt-direct-answer-view-details-font-weight: var(--yxt-font-weight-normal); --yxt-search-loading-opacity: 0.5; + --yxt-product-prominentimage-height: 300px; // interactive map variables --yxt-maps-search-this-area-background-color: white; diff --git a/static/scss/answers/cards/product-prominentimage-clickable.scss b/static/scss/answers/cards/product-prominentimage-clickable.scss index 16d5787aa..922eba9db 100644 --- a/static/scss/answers/cards/product-prominentimage-clickable.scss +++ b/static/scss/answers/cards/product-prominentimage-clickable.scss @@ -78,6 +78,7 @@ { display: flex; align-items: flex-start; + justify-content: center; width: 100%; flex-shrink: 0; } @@ -85,7 +86,9 @@ &-img { width: 100%; - height: auto; + height: var(--yxt-product-prominentimage-height); + object-fit: cover; + font-family: 'object-fit: cover;'; //polyfill css for ie11 } &-title diff --git a/static/scss/answers/cards/product-prominentimage.scss b/static/scss/answers/cards/product-prominentimage.scss index 63a051dc7..308a2d5df 100644 --- a/static/scss/answers/cards/product-prominentimage.scss +++ b/static/scss/answers/cards/product-prominentimage.scss @@ -55,6 +55,7 @@ { display: flex; align-items: flex-start; + justify-content: center; width: 100%; flex-shrink: 0; } @@ -62,7 +63,9 @@ &-img { width: 100%; - height: auto; + height: var(--yxt-product-prominentimage-height); + object-fit: cover; + font-family: 'object-fit: cover;'; //polyfill css for ie11 } &-title diff --git a/static/scss/answers/cards/product-prominentvideo.scss b/static/scss/answers/cards/product-prominentvideo.scss index e341222f1..a07f58f9b 100644 --- a/static/scss/answers/cards/product-prominentvideo.scss +++ b/static/scss/answers/cards/product-prominentvideo.scss @@ -8,10 +8,8 @@ width: 100%; height: 100%; - &-header + &-body { - display: flex; - flex-direction: column; padding: calc(var(--yxt-base-spacing) * 3/4) var(--yxt-base-spacing); } @@ -20,7 +18,6 @@ display: flex; flex-direction: column; justify-content: space-between; - padding: calc(var(--yxt-base-spacing) * 3/4) var(--yxt-base-spacing); } &-title @@ -66,6 +63,11 @@ @include rich_text_formatting; } + &-cardDetails + { + margin-top: calc(var(--yxt-base-spacing) / 2); + } + &-ctasWrapper { text-transform: uppercase; diff --git a/static/webpack/webpack.prod.js b/static/webpack/webpack.prod.js index 56789b453..36c6dc065 100644 --- a/static/webpack/webpack.prod.js +++ b/static/webpack/webpack.prod.js @@ -17,7 +17,7 @@ module.exports = (jamboConfig) => { { test: /\.js$/, exclude: [ - /node_modules\// + /node_modules\/(?!(currency-symbol-map)\/).*/ ], loader: 'babel-loader', options: { diff --git a/templates/common-partials/script/filterbox.hbs b/templates/common-partials/script/filterbox.hbs index bac8e4007..deed31847 100644 --- a/templates/common-partials/script/filterbox.hbs +++ b/templates/common-partials/script/filterbox.hbs @@ -10,4 +10,4 @@ ANSWERS.addComponent("FilterBox", {{{json componentSettings.FilterBox}}} ] {{/shallowMergeConfig}} -)); \ No newline at end of file +); \ No newline at end of file diff --git a/test-site/config-overrides/healthcare_professionals.json b/test-site/config-overrides/healthcare_professionals.json new file mode 100644 index 000000000..bc9fbaecc --- /dev/null +++ b/test-site/config-overrides/healthcare_professionals.json @@ -0,0 +1,69 @@ +{ + "componentSettings": { + "Facets": { + "searchable": true, + "searchLabelText": "Search for a filter option" + }, + "SortOptions": { + "options": [ + { + "type": "FIELD", + "field": "c_popularity", + "direction": "ASC", + "label": "Popularity" + }, + { + "type": "ENTITY_DISTANCE", + "label": "Distance" + } + ] + }, + "FilterBox": { + "filters": [ + { + "type": "FilterOptions", + "control": "multioption", + "options": [ + { + "label": "Open Now", + "field": "c_openNow", + "value": true + }, + { + "label": "Dog Friendly", + "field": "c_dogFriendly", + "value": true + } + ] + } + ] + }, + "AppliedFilters": { + "removable": true + }, + "VerticalResults": { + "noResults": { + "displayAllResults": true // Optional, whether to display all results in the vertical when no results are found. + }, + "hideResultsHeader": true + }, + "SearchBar": { + "placeholderText": "Search", // The placeholder text in the answers search bar + "allowEmptySearch": true, // Allows users to submit an empty search in the searchbar + "loadingIndicator": { + "display": true //Optional, whether to include a loading indicator on seachbar + // "iconUrl": "" //Optional, use custom icon url instead of the default loading indicator animation + }, + "voiceSearch": { + "enabled": false // Whether or not voice search is enabled + // "customMicIconUrl": "", // Path to override the voice start icon + // "customListeningIconUrl": "" // Path to override the voice stop icon + } + }, + "Pagination": { + "noResults": { + "visible": true + } + } + } +} diff --git a/test-site/pages-patches/healthcare_professionals.html.hbs.patch b/test-site/pages-patches/healthcare_professionals.html.hbs.patch new file mode 100644 index 000000000..b70e5ea60 --- /dev/null +++ b/test-site/pages-patches/healthcare_professionals.html.hbs.patch @@ -0,0 +1,32 @@ +--- templates/vertical-grid/page.html.hbs 2021-07-27 11:14:10.000000000 -0400 ++++ test-site/pages/healthcare_professionals.html.hbs 2021-09-10 15:33:05.000000000 -0400 +@@ -10,9 +10,9 @@ + {{> templates/vertical-grid/script/verticalresults }} + {{> templates/vertical-grid/script/pagination }} + {{> templates/vertical-grid/script/locationbias }} +- {{!-- {{> templates/vertical-grid/script/sortoptions }} --}} +- {{!-- {{> templates/vertical-grid/script/facets }} --}} +- {{!-- {{> templates/vertical-grid/script/filterbox }} --}} ++ {{> templates/vertical-grid/script/sortoptions }} ++ {{> templates/vertical-grid/script/facets }} ++ {{> templates/vertical-grid/script/filterbox }} + {{!-- {{> templates/vertical-grid/script/qasubmission }} --}} + {{/script/core }} +
+@@ -34,11 +34,11 @@ + {{!-- {{> templates/vertical-grid/collapsible-filters/markup/viewresultsbutton }} --}} +
+ +- {{!--
--}} +- {{!-- {{> templates/vertical-grid/markup/sortoptions }} --}} +- {{!-- {{> templates/vertical-grid/markup/filterbox }} --}} +- {{!-- {{> templates/vertical-grid/markup/facets }} --}} +- {{!--
--}} ++
++ {{> templates/vertical-grid/markup/sortoptions }} ++ {{> templates/vertical-grid/markup/filterbox }} ++ {{> templates/vertical-grid/markup/facets }} ++
+
+ {{> templates/vertical-grid/markup/spellcheck }} + {{> templates/vertical-grid/markup/verticalresults }} diff --git a/tests/percy/camera.js b/tests/percy/camera.js index cf2a127fc..0a9d46ded 100644 --- a/tests/percy/camera.js +++ b/tests/percy/camera.js @@ -6,11 +6,13 @@ const { SnapshotWidths } = require('./constants'); class Camera { /** * @param {function} percySnapshot The percy snapshot function + * @param {import('puppeteer').Page} page A Pupeteer Page * @param {boolean} iframeMode Enables capturing iframe snapshots * @param {string} locale Enables capturing locale specific snapshots */ - constructor(percySnapshot, iframeMode, locale='en') { + constructor(percySnapshot, page, iframeMode, locale='en') { this._percySnapshot = percySnapshot; + this._page = page; this._iframeMode = iframeMode; this._locale = locale; } @@ -31,7 +33,7 @@ class Camera { */ async snapshot(snapshotName) { const updatedSnapshotName = this._getSnapshotName(snapshotName); - await this._percySnapshot(updatedSnapshotName); + await this._percySnapshot(this._page, updatedSnapshotName); } /** @@ -41,7 +43,7 @@ class Camera { */ async snapshotDesktopOnly(snapshotName) { const updatedSnapshotName = this._getSnapshotName(snapshotName); - await this._percySnapshot(updatedSnapshotName, { widths: [SnapshotWidths.Desktop] }); + await this._percySnapshot(this._page, updatedSnapshotName, { widths: [SnapshotWidths.Desktop] }); } /** @@ -51,7 +53,7 @@ class Camera { */ async snapshotMobileOnly(snapshotName) { const updatedSnapshotName = this._getSnapshotName(snapshotName); - await this._percySnapshot(updatedSnapshotName, { widths: [SnapshotWidths.Mobile] }); + await this._percySnapshot(this._page, updatedSnapshotName, { widths: [SnapshotWidths.Mobile] }); } /** diff --git a/tests/percy/index.js b/tests/percy/index.js index c6b1728b3..6bea783a2 100644 --- a/tests/percy/index.js +++ b/tests/percy/index.js @@ -1,4 +1,3 @@ -const PercyScript = require('@percy/script'); const HttpServer = require('../test-utils/server'); const Photographer = require('./photographer'); const MultilangPhotographer = require('./multilangphotographer'); @@ -6,22 +5,25 @@ const StandardPageNavigator = require('./standardpagenavigator'); const IframePageNavigator = require('./iframepagenavigator'); const Camera = require('./camera'); const queryConfig = require('./queries.json'); - +const puppeteer = require('puppeteer'); +const percySnapshot = require('@percy/puppeteer'); const PORT = 5042; -PercyScript.run(async (page, percySnapshot) => { +(async ()=> { const server = new HttpServer({ dir: 'test-site/public', port: PORT - }) - + }); server.start(); + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + const standardPageNavigator = new StandardPageNavigator(page, `http://localhost:${PORT}`); const iframePageNavigator = new IframePageNavigator(page, `http://localhost:${PORT}`, 'iframe_test'); - const standardCamera = new Camera(percySnapshot); - const iframeCamera = new Camera(percySnapshot, true); + const standardCamera = new Camera(percySnapshot, page); + const iframeCamera = new Camera(percySnapshot, page, true); await (new Photographer(standardPageNavigator, standardCamera).captureSnapshots()); await (new Photographer(iframePageNavigator, iframeCamera).captureSnapshots()); @@ -31,5 +33,6 @@ PercyScript.run(async (page, percySnapshot) => { await (new MultilangPhotographer(standardPageNavigator, standardCamera, queryConfig.es).captureSnapshots()); + await browser.close(); server.shutdown(); -}); +})(); diff --git a/tests/percy/photographer.js b/tests/percy/photographer.js index 4769bbdb9..3ad306f20 100644 --- a/tests/percy/photographer.js +++ b/tests/percy/photographer.js @@ -58,6 +58,9 @@ class Photographer { await this._pageNavigator.gotoVerticalPage('financial_professionals', { query: 'connor' }); await this._camera.snapshot('vertical-search--financial-professional-location'); + + await this._pageNavigator.gotoVerticalPage('healthcare_professionals', { query: 'bob' }); + await this._camera.snapshot('vertical-search--healthcare-professional-location'); await this._pageNavigator.gotoVerticalPage('jobs', { query: 'job' }); await this._camera.snapshot('vertical-search--job-standard'); diff --git a/tests/static/js/formatters.js b/tests/static/js/formatters.js index 601a46cb3..da57bbc16 100644 --- a/tests/static/js/formatters.js +++ b/tests/static/js/formatters.js @@ -1,4 +1,5 @@ import Formatters from 'static/js/formatters.js'; +import * as useragent from 'static/js/useragent.js'; describe('Formatters', () => { describe('toLocalizedDistance', () => { @@ -108,6 +109,54 @@ describe('Formatters', () => { }); }); + describe('priceRange', () => { + it('Formats a price range in USD', () => { + const price = Formatters.priceRange('$', 'US'); + expect(price).toEqual('$'); + }); + + it('Formats a price range in EUR', () => { + const price = Formatters.priceRange('$$', 'BE'); + expect(price).toEqual('€€'); + }); + + it('Formats a price range in JPY', () => { + const price = Formatters.priceRange('$$$', 'JP'); + expect(price).toEqual('¥¥¥'); + }); + + it('Formats a price range in KRW', () => { + const price = Formatters.priceRange('$$$$', 'KR'); + expect(price).toEqual('₩₩₩₩'); + }); + + it('Formats a price range in GBP', () => { + const price = Formatters.priceRange('$', 'GB'); + expect(price).toEqual('£'); + }); + + it('Formats a price range in invalid country code, use page\'s locale', () => { + document.documentElement.lang = 'jp' + const price = Formatters.priceRange('$$$', 'IDK'); + expect(price).toEqual('¥¥¥'); + }); + + it('Formats a price range in undefined country code, use page\'s locale', () => { + document.documentElement.lang = 'zh-CN' + let price = Formatters.priceRange('$$$', undefined); + expect(price).toEqual('¥¥¥'); + document.documentElement.lang = 'zh-Hant_TW' + price = Formatters.priceRange('$$$', undefined); + expect(price).toEqual('NT$NT$NT$'); + }); + + it('Formats a price range in invalid country code and invalid page\'s locale', () => { + document.documentElement.lang = 'IDKK' + const price = Formatters.priceRange('$', 'IDK'); + expect(price).toEqual('$'); + }); + }); + describe('highlightField', () => { it('Behaves correctly when there are no matchedSubstrings', () => { const plainText = 'No more straws'; @@ -153,4 +202,159 @@ describe('Formatters', () => { expect(actual).toEqual(expected); }); }); + + describe('getUrlWithTextHighlight', () => { + const link = 'www.dummy-link.com/test' + const isChrome = jest.spyOn(useragent, 'isChrome'); + isChrome.mockReturnValue(true); + + it('Behaves correctly when there is no matchedSubstring', () => { + const snippet = { + value: 'this is a sentence, for testing purposes.', + matchedSubstrings: [] + }; + const actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(link); + }); + + it('Behaves correctly when there is a matchedSubstring with a surrounding sentence', () => { + const snippet = { + value: 'this is a sentence, for testing purposes.', + matchedSubstrings: [ + { + offset: 5, + length: 10 + } + ] + }; + const url = link + '#:~:text=this%20is%20a%20sentence%2C%20for%20testing%20purposes' + const actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + }); + + it('Behaves correctly when there is a matchedSubstring with a surrounding' + + ' sentence end with different punctuation marks', () => { + const matchedSubstrings = [{offset: 5, length: 10}]; + let snippet = { + value: 'this is a sentence for testing purposes? more text', + matchedSubstrings: matchedSubstrings + }; + const url = link + '#:~:text=this%20is%20a%20sentence%20for%20testing%20purposes' + let actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + + snippet = { + value: 'this is a sentence for testing purposes! and more', + matchedSubstrings: matchedSubstrings + }; + actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + + snippet = { + value: 'this is a sentence for testing purposes\n some more text', + matchedSubstrings: matchedSubstrings + }; + actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + }); + + + it('Behaves correctly when there is a matchedSubstring at beginning of the string', () => { + const snippet = { + value: 'this is a sentence for testing purposes. and more more text', + matchedSubstrings: [ + { + offset: 0, + length: 10 + } + ] + }; + const url = link + '#:~:text=this%20is%20a%20sentence%20for%20testing%20purposes' + const actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + }); + + it('Behaves correctly when there is a matchedSubstring with no ending punctuation in string', () => { + const snippet = { + value: 'this is a sentence for testing purpo', + matchedSubstrings: [ + { + offset: 0, + length: 10 + } + ] + }; + const url = link + '#:~:text=this%20is%20a%20sentence%20for%20testing%20purpo' + const actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + }); + + it('Behaves correctly when there is a matchedSubstring that contain parts of multiple sentences', () => { + const snippet = { + value: 'more more. This is a sentence for testing purposes. and more random text! some more?', + matchedSubstrings: [ + { + offset: 30, + length: 30 + } + ] + }; + const url = link + '#:~:text=This%20is%20a%20sentence%20for%20testing%20purposes.%20and%20more%20random%20text' + const actual = Formatters.getUrlWithTextHighlight(snippet, link); + expect(actual).toEqual(url); + }); + }); + + describe('getCategoryNames', () => { + const categoryMap = [ + { + "id": "1", + "category": "Neurology" + }, + { + "id": "2", + "category": "Dermatology" + }, + { + "id": "3", + "category": "Psychiatry" + }, + { + "id": "4", + "category": "Surgery" + } + ]; + + it('Handle undefined categoryIds and categoryMap', () => { + let categoryNames = Formatters.getCategoryNames(null, categoryMap); + expect(categoryNames).toEqual([]); + categoryNames = Formatters.getCategoryNames(['1'], null); + expect(categoryNames).toEqual([]); + }); + + it('return empty list for no matching category names', () => { + const categoryIds = ['5', '0']; + const consoleWarn = jest.spyOn(console, 'error') + .mockImplementation(); + const categoryNames = Formatters.getCategoryNames(categoryIds, categoryMap); + expect(categoryNames).toEqual([]); + expect(consoleWarn).toHaveBeenCalledTimes(2); + console.error.mockClear(); + }); + + it('return a list of matching category names', () => { + const categoryIds = ['1', '3']; + const categoryNames = Formatters.getCategoryNames(categoryIds, categoryMap); + expect(categoryNames).toEqual(['Neurology', 'Psychiatry']); + }); + + it('return a list of category names given non-matching and matching ids', () => { + const categoryIds = ['1', '10', '4']; + const consoleWarn = jest.spyOn(console, 'error') + .mockImplementation(); + const categoryNames = Formatters.getCategoryNames(categoryIds, categoryMap); + expect(categoryNames).toEqual(['Neurology', 'Surgery']); + expect(consoleWarn).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/tests/static/js/hours/table/builder.js b/tests/static/js/hours/table/builder.js index 02c577606..0163a98ee 100644 --- a/tests/static/js/hours/table/builder.js +++ b/tests/static/js/hours/table/builder.js @@ -244,7 +244,7 @@ describe('HoursTableBuilder properly builds hours table', () => { it('works with all config specified', () => { const config = { disableOpenStatus: true, - firstDayInList: 'SUNDAY', + firstDayInList: DayNames.SUNDAY, }; const hoursTable = new HoursTableBuilder(localizer).build(new Hours({ days: days, @@ -394,7 +394,7 @@ describe('HoursTableBuilder properly builds hours table', () => { it('handles split hours properly', () => { const config = { disableOpenStatus: false, - firstDayInList: 'WEDNESDAY', + firstDayInList: DayNames.WEDNESDAY, }; const hoursTable = new HoursTableBuilder(localizer).build(new Hours({ days: days, diff --git a/tests/templates/script/fixtures/filterbox.hbs.js b/tests/templates/script/fixtures/filterbox.hbs.js index e61ccc8f4..3f1148b41 100644 --- a/tests/templates/script/fixtures/filterbox.hbs.js +++ b/tests/templates/script/fixtures/filterbox.hbs.js @@ -1,2 +1,2 @@ ANSWERS.addComponent("FilterBox", -{"container":"#js-answersFilterBox","verticalKey":"testKey","a":"testFB"})); \ No newline at end of file +{"container":"#js-answersFilterBox","verticalKey":"testKey","a":"testFB"}); \ No newline at end of file diff --git a/translations/ar.po b/translations/ar.po index b9ccb6523..6624bc33a 100755 --- a/translations/ar.po +++ b/translations/ar.po @@ -193,3 +193,56 @@ msgstr "الخريطة" msgctxt "View is a verb" msgid "View All" msgstr "عرض الكل" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "مغلق" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "مفتوح على مدار 24 ساعة" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "يُفتح في" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "مفتوح الآن" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "يُغلق في" + +msgid "Monday" +msgstr "الاثنين" + +msgid "Tuesday" +msgstr "يوم الثلاثاء" + +msgid "Wednesday" +msgstr "الأربعاء" + +msgid "Thursday" +msgstr "يوم الخميس" + +msgid "Friday" +msgstr "يوم الجمعة" + +msgid "Saturday" +msgstr "يوم السبت" + +msgid "Sunday" +msgstr "يوم الأحد" + +msgid "Day of the Week" +msgstr "يوم من الأسبوع" + +msgid "Hours" +msgstr "ساعات" + +msgid "Yes" +msgstr "رقم" + +msgid "No" +msgstr "نعم" diff --git a/translations/de.po b/translations/de.po index 58da9d90a..c97bb5eeb 100755 --- a/translations/de.po +++ b/translations/de.po @@ -177,3 +177,56 @@ msgstr[1] "[[resultsCount]] Ergebnisse" #: theme-components/vertical-full-page-map-alternative-verticals/alternativeverticals.hbs:43 msgid "Alternatively, you can view results across all search categories." msgstr "Sehen Sie alternativ Ergebnisse aus allen Kategorien." + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Geschlossen" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24 Stunden geöffnet" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Öffnet um" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Jetzt geöffnet" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Schließt um" + +msgid "Monday" +msgstr "Montag" + +msgid "Tuesday" +msgstr "Dienstag" + +msgid "Wednesday" +msgstr "Mittwoch" + +msgid "Thursday" +msgstr "Donnerstag" + +msgid "Friday" +msgstr "Freitag" + +msgid "Saturday" +msgstr "Samstag" + +msgid "Sunday" +msgstr "Sonntag" + +msgid "Day of the Week" +msgstr "Wochentag" + +msgid "Hours" +msgstr "Zeiten" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nein" diff --git a/translations/es.po b/translations/es.po index 2147550ab..099bccdb8 100755 --- a/translations/es.po +++ b/translations/es.po @@ -177,3 +177,61 @@ msgstr[1] "[[resultsCount]] resultados" #: theme-components/vertical-full-page-map-alternative-verticals/alternativeverticals.hbs:43 msgid "Alternatively, you can view results across all search categories." msgstr "En su defecto, puede ver los resultados para todas las categorías de búsqueda." + +msgctxt "some other translations" +msgid "testing" +msgstr "pruebas" + + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Cerrado" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Abierto las 24 horas" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Abre a las" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Abierto ahora" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Cierra a las" + +msgid "Monday" +msgstr "Lunes" + +msgid "Tuesday" +msgstr "Martes" + +msgid "Wednesday" +msgstr "Miércoles" + +msgid "Thursday" +msgstr "Jueves" + +msgid "Friday" +msgstr "Viernes" + +msgid "Saturday" +msgstr "Sabado" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Day of the Week" +msgstr "Día de la semana" + +msgid "Hours" +msgstr "Horarios" + +msgid "Yes" +msgstr "Sí" + +msgid "No" +msgstr "No" diff --git a/translations/fr.po b/translations/fr.po index 4ea37a52f..2770480ec 100755 --- a/translations/fr.po +++ b/translations/fr.po @@ -177,3 +177,56 @@ msgstr[1] "([[resultsCount]] résultats)" #: theme-components/vertical-full-page-map-alternative-verticals/alternativeverticals.hbs:43 msgid "Alternatively, you can view results across all search categories." msgstr "Autrement, vous pouvez voir les résultats à travers toutes les catégories." + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Fermé" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Ouvert 24h/24" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Ouvre à" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Ouvert maintenant" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Ferme à" + +msgid "Monday" +msgstr "Lundi" + +msgid "Tuesday" +msgstr "Mardi" + +msgid "Wednesday" +msgstr "Mercredi" + +msgid "Thursday" +msgstr "Jeudi" + +msgid "Friday" +msgstr "Vendredi" + +msgid "Saturday" +msgstr "Samedi" + +msgid "Sunday" +msgstr "Dimanche" + +msgid "Day of the Week" +msgstr "Jour de la semaine" + +msgid "Hours" +msgstr "Horaires" + +msgid "Yes" +msgstr "Oui" + +msgid "No" +msgstr "Non" diff --git a/translations/hi.po b/translations/hi.po index b5267562c..91e5cef12 100755 --- a/translations/hi.po +++ b/translations/hi.po @@ -181,3 +181,56 @@ msgstr "मैप" msgctxt "View is a verb" msgid "View All" msgstr "सब देखें" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "बंद हो गया" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24 घंटे खुला रहता है" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "इस समय खुलता है" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "अभी खुला है" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "इस समय बंद होता है" + +msgid "Monday" +msgstr "सोमवार" + +msgid "Tuesday" +msgstr "मंगलवार" + +msgid "Wednesday" +msgstr "बुधवार" + +msgid "Thursday" +msgstr "गुरुवार" + +msgid "Friday" +msgstr "शुक्रवार" + +msgid "Saturday" +msgstr "शनिवार" + +msgid "Sunday" +msgstr "रविवार का दिन" + +msgid "Day of the Week" +msgstr "सप्ताह का दिन" + +msgid "Hours" +msgstr "घंटे" + +msgid "Yes" +msgstr "हाँ" + +msgid "No" +msgstr "नहीं" diff --git a/translations/it.po b/translations/it.po index 6e77b218d..a9571a617 100755 --- a/translations/it.po +++ b/translations/it.po @@ -177,3 +177,56 @@ msgstr[1] "[[resultsCount]] risultati" #: theme-components/vertical-full-page-map-alternative-verticals/alternativeverticals.hbs:43 msgid "Alternatively, you can view results across all search categories." msgstr "Altrimenti, può vedere i risultati su tutte le categorie di ricerca." + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Chiuso" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Aperto 24 ore su 24" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Apre alle" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Aperto ora" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Chiude alle" + +msgid "Monday" +msgstr "Lunedí" + +msgid "Tuesday" +msgstr "Martedí" + +msgid "Wednesday" +msgstr "Mercoledí" + +msgid "Thursday" +msgstr "Giovedí" + +msgid "Friday" +msgstr "Venerdí" + +msgid "Saturday" +msgstr "Sabato" + +msgid "Sunday" +msgstr "Domenica" + +msgid "Day of the Week" +msgstr "Giorno della settimana" + +msgid "Hours" +msgstr "Orari" + +msgid "Yes" +msgstr "Sì" + +msgid "No" +msgstr "No" diff --git a/translations/ja.po b/translations/ja.po index eefb67130..6279605b8 100755 --- a/translations/ja.po +++ b/translations/ja.po @@ -174,3 +174,56 @@ msgstr[0] "([[resultsCount]]件の結果)" #: theme-components/vertical-full-page-map-alternative-verticals/alternativeverticals.hbs:43 msgid "Alternatively, you can view results across all search categories." msgstr "代わりにすべての検索カテゴリーの結果を表示することもできます。" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "休業" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24時間営業" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "営業開始" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "現在営業中" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "営業終了" + +msgid "Monday" +msgstr "月曜日" + +msgid "Tuesday" +msgstr "火曜日" + +msgid "Wednesday" +msgstr "水曜日" + +msgid "Thursday" +msgstr "木曜日" + +msgid "Friday" +msgstr "金曜日" + +msgid "Saturday" +msgstr "土曜日" + +msgid "Sunday" +msgstr "日曜日" + +msgid "Day of the Week" +msgstr "曜日" + +msgid "Hours" +msgstr "営業時間" + +msgid "Yes" +msgstr "はい" + +msgid "No" +msgstr "番号" diff --git a/translations/ko.po b/translations/ko.po index 340fe0cd7..f33683697 100755 --- a/translations/ko.po +++ b/translations/ko.po @@ -178,3 +178,56 @@ msgstr "지도" msgctxt "View is a verb" msgid "View All" msgstr "전체 보기" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "닫힘" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24시간 영업" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "개장 시간:" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "अ지금 열기" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "종료 시간:" + +msgid "Monday" +msgstr "월요일" + +msgid "Tuesday" +msgstr "화요일" + +msgid "Wednesday" +msgstr "수요일" + +msgid "Thursday" +msgstr "목요일" + +msgid "Friday" +msgstr "금요일" + +msgid "Saturday" +msgstr "토요일" + +msgid "Sunday" +msgstr "일요일" + +msgid "Day of the Week" +msgstr "요일" + +msgid "Hours" +msgstr "시간" + +msgid "Yes" +msgstr "예" + +msgid "No" +msgstr "아니요" diff --git a/translations/messages.pot b/translations/messages.pot index 71b17c446..16c7cee7d 100644 --- a/translations/messages.pot +++ b/translations/messages.pot @@ -32,14 +32,26 @@ msgstr "" msgid "clear search" msgstr "" +#: script/translations.js:7 +msgid "Day of the Week" +msgstr "" + #: cards/multilang-event-standard/component.js:44 msgid "Directions" msgstr "" +#: script/translations.js:15 +msgid "Friday" +msgstr "" + #: cards/multilang-location-standard/component.js:49 msgid "Get Directions" msgstr "" +#: script/translations.js:8 +msgid "Hours" +msgstr "" + #: templates/vertical-full-page-map/page.html.hbs:23 msgid "Main location search" msgstr "" @@ -52,6 +64,14 @@ msgstr "" msgid "Map controls" msgstr "" +#: script/translations.js:11 +msgid "Monday" +msgstr "" + +#: script/translations.js:10 +msgid "No" +msgstr "" + #: theme-components/collapsible-filters/view-results-button/template.hbs:3 msgid "No results found." msgstr "" @@ -64,6 +84,10 @@ msgstr "" msgid "reset filters" msgstr "" +#: script/translations.js:16 +msgid "Saturday" +msgstr "" + #: cards/multilang-location-standard/template.hbs:140 msgid "Services:" msgstr "" @@ -104,6 +128,10 @@ msgstr "" msgid "sorts and filters" msgstr "" +#: script/translations.js:17 +msgid "Sunday" +msgstr "" + #: directanswercards/multilang-allfields-standard/component.js:188 msgid "Thank you for your feedback!" msgstr "" @@ -122,6 +150,14 @@ msgstr "" msgid "This did not answer my question" msgstr "" +#: script/translations.js:14 +msgid "Thursday" +msgstr "" + +#: script/translations.js:12 +msgid "Tuesday" +msgstr "" + #: theme-components/collapsible-filters/view-results-button/template.hbs:5 msgid "View 1 Result" msgid_plural "View [[resultsCount]] Results" @@ -140,6 +176,14 @@ msgstr "" msgid "Was this the answer you were looking for?" msgstr "" +#: script/translations.js:13 +msgid "Wednesday" +msgstr "" + +#: script/translations.js:9 +msgid "Yes" +msgstr "" + #: templates/vertical-full-page-map/markup/searchthisareatoggle.hbs:10 msgctxt "A button that conducts a search in the current map area" msgid "Search When Map Moves" @@ -162,11 +206,36 @@ msgctxt "Close is a verb" msgid "Close Card" msgstr "" +#: script/translations.js:2 +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "" + +#: script/translations.js:5 +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "" + +#: script/translations.js:6 +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "" + +#: script/translations.js:4 +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "" + #: cards/multilang-event-standard/component.js:34 msgctxt "RSVP is a verb" msgid "RSVP" msgstr "" +#: script/translations.js:3 +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "" + #: templates/vertical-full-page-map/markup/mobilelisttoggles.hbs:5 msgctxt "The label of a toggle for displaying a list of results" msgid "List" diff --git a/translations/nl.po b/translations/nl.po index 334fb6a40..de6608904 100755 --- a/translations/nl.po +++ b/translations/nl.po @@ -181,3 +181,56 @@ msgstr "Kaart" msgctxt "View is a verb" msgid "View All" msgstr "Alles bekijken" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Gesloten" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24 uur geopend" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Geopend vanaf" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Nu geopend" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Gesloten vanaf" + +msgid "Monday" +msgstr "Maandag" + +msgid "Tuesday" +msgstr "Dinsdag" + +msgid "Wednesday" +msgstr "Woensdag" + +msgid "Thursday" +msgstr "Donderdag" + +msgid "Friday" +msgstr "Vrijdag" + +msgid "Saturday" +msgstr "Zaterdag" + +msgid "Sunday" +msgstr "Zondag" + +msgid "Day of the Week" +msgstr "dag van de week" + +msgid "Hours" +msgstr "uur" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nee" diff --git a/translations/open-status.pot b/translations/open-status.pot deleted file mode 100644 index 2663e5b6d..000000000 --- a/translations/open-status.pot +++ /dev/null @@ -1,23 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" - -msgctxt "The hours that a store is open" -msgid "Open 24 Hours" -msgstr "" - -msgctxt "Indicates that a store is closed" -msgid "Closed" -msgstr "" - -msgctxt "Indicates the time a store will open" -msgid "Opens at" -msgstr "" - -msgctxt "Indicates that a store is open" -msgid "Open now" -msgstr "" - -msgctxt "Indicates the time a store will close" -msgid "Closes at" -msgstr "" diff --git a/translations/pl.po b/translations/pl.po index cfa2d488d..ec29e58e5 100755 --- a/translations/pl.po +++ b/translations/pl.po @@ -184,3 +184,56 @@ msgstr "Mapa" msgctxt "View is a verb" msgid "View All" msgstr "Wyświetl wszystkie" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Zamknięte" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Otwarte całodobowo" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Zamknięcie" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Czynne teraz" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Otwarcie" + +msgid "Monday" +msgstr "Poniedziałek" + +msgid "Tuesday" +msgstr "Wtorek" + +msgid "Wednesday" +msgstr "Środa" + +msgid "Thursday" +msgstr "Czwartek" + +msgid "Friday" +msgstr "Piątek" + +msgid "Saturday" +msgstr "Sobota" + +msgid "Sunday" +msgstr "Niedziela" + +msgid "Day of the Week" +msgstr "Dzień tygodnia" + +msgid "Hours" +msgstr "godziny" + +msgid "Yes" +msgstr "Sí" + +msgid "TAk" +msgstr "Nie" diff --git a/translations/pt.po b/translations/pt.po index 356447f05..53f62d064 100755 --- a/translations/pt.po +++ b/translations/pt.po @@ -181,3 +181,56 @@ msgstr "Mapa" msgctxt "View is a verb" msgid "View All" msgstr "Ver tudo" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Fechado" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Aberto 24 horas" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Abre às" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Aberto agora" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Fecha às" + +msgid "Monday" +msgstr "Segunda-feira" + +msgid "Tuesday" +msgstr "Terça-feira" + +msgid "Wednesday" +msgstr "Quarta-feira" + +msgid "Thursday" +msgstr "quinta-feira" + +msgid "Friday" +msgstr "Sexta-feira" + +msgid "Saturday" +msgstr "Sábado" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Day of the Week" +msgstr "Dia da semana" + +msgid "Hours" +msgstr "Horas" + +msgid "Yes" +msgstr "Sim" + +msgid "No" +msgstr "Não" diff --git a/translations/ru.po b/translations/ru.po index 671770420..11a2dc169 100755 --- a/translations/ru.po +++ b/translations/ru.po @@ -184,3 +184,56 @@ msgstr "Карта" msgctxt "View is a verb" msgid "View All" msgstr "Смотреть все" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Закрыто" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Открыто круглосуточно" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Открывается в" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Открыто" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Закрывается в" + +msgid "Monday" +msgstr "понедельник" + +msgid "Tuesday" +msgstr "вторник" + +msgid "Wednesday" +msgstr "среда" + +msgid "Thursday" +msgstr "четверг" + +msgid "Friday" +msgstr "Пятница" + +msgid "Saturday" +msgstr "Суббота" + +msgid "Sunday" +msgstr "Воскресенье" + +msgid "Day of the Week" +msgstr "День недели" + +msgid "Hours" +msgstr "Часы" + +msgid "Yes" +msgstr "да" + +msgid "No" +msgstr "Нет" diff --git a/translations/sv.po b/translations/sv.po index fc1805e9d..3565a7a0f 100755 --- a/translations/sv.po +++ b/translations/sv.po @@ -181,3 +181,56 @@ msgstr "Karta" msgctxt "View is a verb" msgid "View All" msgstr "Visa alla" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "Stängt" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "Öppet 24 timmar om dygnet" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "Öppnar kl." + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "Öppet nu" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "Stänger kl." + +msgid "Monday" +msgstr "Måndag" + +msgid "Tuesday" +msgstr "Tisdag" + +msgid "Wednesday" +msgstr "Onsdag" + +msgid "Thursday" +msgstr "Torsdag" + +msgid "Friday" +msgstr "Fredag" + +msgid "Saturday" +msgstr "Lördag" + +msgid "Sunday" +msgstr "Söndag" + +msgid "Day of the Week" +msgstr "Veckodag" + +msgid "Hours" +msgstr "Timmar" + +msgid "Yes" +msgstr "Ja" + +msgid "No" +msgstr "Nej" diff --git a/translations/zh-Hans.po b/translations/zh-Hans.po index 073e282bd..969ec41ef 100755 --- a/translations/zh-Hans.po +++ b/translations/zh-Hans.po @@ -178,3 +178,56 @@ msgstr "地图" msgctxt "View is a verb" msgid "View All" msgstr "查看全部" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "休业中" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24 小时营业" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "开店时间:" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "现正营业" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "闭店时间:" + +msgid "Monday" +msgstr "周一" + +msgid "Tuesday" +msgstr "周二" + +msgid "Wednesday" +msgstr "周三" + +msgid "Thursday" +msgstr "周四" + +msgid "Friday" +msgstr "星期五" + +msgid "Saturday" +msgstr "周六" + +msgid "Sunday" +msgstr "星期日" + +msgid "Day of the Week" +msgstr "一周中的天" + +msgid "Hours" +msgstr "小时" + +msgid "Yes" +msgstr "是的" + +msgid "No" +msgstr "不" diff --git a/translations/zh-Hant.po b/translations/zh-Hant.po index 6256f4d6a..3309f540f 100755 --- a/translations/zh-Hant.po +++ b/translations/zh-Hant.po @@ -178,3 +178,56 @@ msgstr "地圖" msgctxt "View is a verb" msgid "View All" msgstr "檢視所有" + +msgctxt "Indicates that a store is closed" +msgid "Closed" +msgstr "休息" + +msgctxt "The hours that a store is open" +msgid "Open 24 Hours" +msgstr "24 小時營業" + +msgctxt "Indicates the time a store will open" +msgid "Opens at" +msgstr "營業時間:" + +msgctxt "Indicates that a store is open" +msgid "Open Now" +msgstr "營業中" + +msgctxt "Indicates the time a store will close" +msgid "Closes at" +msgstr "休息時間:" + +msgid "Monday" +msgstr "週一" + +msgid "Tuesday" +msgstr "週二" + +msgid "Wednesday" +msgstr "週三" + +msgid "Thursday" +msgstr "週四" + +msgid "Friday" +msgstr "星期五" + +msgid "Saturday" +msgstr "週六" + +msgid "Sunday" +msgstr "星期日" + +msgid "Day of the Week" +msgstr "一週中的天" + +msgid "Hours" +msgstr "小時" + +msgid "Yes" +msgstr "是的" + +msgid "No" +msgstr "不"