From 0285c5e6fc4bb520ed0abd8bd95ddb261540ccab Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Thu, 26 Aug 2021 09:05:21 -0400 Subject: [PATCH 01/14] Update theme's percy snapshots to user puppeteer (#909) - update package.json to include puppeteer packages, remove percyScript. - update index.js and camera to use puppeteer and its percySnapshot function J=SLAP-1470 TEST=auto --- package-lock.json | 1471 ++++++++++++++--------------------------- package.json | 4 +- tests/percy/camera.js | 10 +- tests/percy/index.js | 19 +- 4 files changed, 510 insertions(+), 994 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4b7a304b..318f9fcfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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==", + "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": { - "yallist": "^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" } }, - "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" - } + "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 }, - "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" - } + "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 }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "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", @@ -5085,179 +5039,24 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", "dev": true, - "requires": { - "escape-string-regexp": "4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - } - } - }, - "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==", + "requires": { + "escape-string-regexp": "4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true } } }, + "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 + }, "clipboardy": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", @@ -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": { @@ -6074,9 +5799,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 +5840,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 +5892,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 +5972,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 +6322,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 +6383,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 +6427,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 +6568,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", @@ -7042,12 +6713,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 +7144,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", @@ -7571,28 +7230,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 +7413,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 +8466,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 +8478,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", @@ -9089,19 +8730,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 +8936,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 +9236,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 +9319,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 +9386,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 +9449,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 +9661,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 +9739,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 +9807,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 +9916,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 +10163,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 +10217,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 +10705,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 +10953,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 +11123,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 +12926,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 +13086,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 +13096,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 +13170,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 +13429,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 +13612,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 +13723,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 7074738bc..c08a8536b 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "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", @@ -38,6 +39,7 @@ "loader-utils": "^2.0.0", "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/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(); -}); +})(); From ff0114d3c686594249990ce5966fc937ed9e5025 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Thu, 26 Aug 2021 11:12:56 -0400 Subject: [PATCH 02/14] Automation process for static translations (#935) Automate translation process for static translations using jambo translation helper functionality - move translations from static folder to a partial. This include open-status, headers, and prettyPrintBoolean strings. - use the translations partial in html.hbs layout to put translations in window - access window.translations in `stringlocalizer.js` and formatters-internal.js` to pull the appropriate translated string - remove now unused translations js files J=SLAP-1477 TEST=compile & manual launched test site with en and es locales, see that the text in KM page is translated propertly. See that window.hitchhiker_theme_translations in inspector console contains the translated strings --- layouts/html.hbs | 1 + script/translations.js | 18 ++ static/js/formatters-internal.js | 45 +-- static/js/hours/constants.js | 14 +- static/js/hours/open-status/constants.js | 2 +- static/js/hours/stringslocalizer.js | 15 +- static/js/hours/table/table-strings-i18n.js | 90 ------ static/js/hours/transformer.js | 2 +- static/js/open-status-i18n.js | 315 -------------------- tests/static/js/hours/table/builder.js | 4 +- translations/ar.po | 53 ++++ translations/de.po | 53 ++++ translations/es.po | 58 ++++ translations/fr.po | 53 ++++ translations/hi.po | 53 ++++ translations/it.po | 53 ++++ translations/ja.po | 53 ++++ translations/ko.po | 53 ++++ translations/messages.pot | 69 +++++ translations/nl.po | 53 ++++ translations/open-status.pot | 23 -- translations/pl.po | 53 ++++ translations/pt.po | 53 ++++ translations/ru.po | 53 ++++ translations/sv.po | 53 ++++ translations/zh-Hans.po | 53 ++++ translations/zh-Hant.po | 53 ++++ 27 files changed, 905 insertions(+), 493 deletions(-) create mode 100644 script/translations.js delete mode 100644 static/js/hours/table/table-strings-i18n.js delete mode 100644 static/js/open-status-i18n.js delete mode 100644 translations/open-status.pot 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/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/formatters-internal.js b/static/js/formatters-internal.js index 610687da0..85e1d1d88 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -7,7 +7,6 @@ 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 { parseLocale } from './utils.js'; export function address(profile) { @@ -240,7 +239,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 +260,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) { 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 c06dee585..e15b96cd5 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/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/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 "不" From df97c5d3b4c3fae157d77d8fe5a545808df0e5c4 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Mon, 30 Aug 2021 14:01:46 -0400 Subject: [PATCH 03/14] return correct formatted time for given locale (#936) use the defined field `this._locale` instead of `this.locale`. This will cause some changes in percy snapshots launched test site and see that es pages use h24 format and en use h12 format Co-authored-by: Yen Truong --- static/js/hours/stringslocalizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/js/hours/stringslocalizer.js b/static/js/hours/stringslocalizer.js index e15b96cd5..61d4989df 100644 --- a/static/js/hours/stringslocalizer.js +++ b/static/js/hours/stringslocalizer.js @@ -42,7 +42,7 @@ export default class HoursStringsLocalizer { time.setHours(Math.floor(yextTime / 100)); time.setMinutes(yextTime % 100); - return time.toLocaleString(this.locale, { + return time.toLocaleString(this._locale, { hour: 'numeric', minute: 'numeric', ...this._isTwentyFourHourClock && { hourCycle: this._isTwentyFourHourClock ? 'h24' : 'h12' } From a426812b1a57b9c800d9f964608cfa5f17d619aa Mon Sep 17 00:00:00 2001 From: Oliver Shi Date: Wed, 8 Sep 2021 10:42:13 -0400 Subject: [PATCH 04/14] remove usage of jambo's internal global.parseJamboConfig() (#942) Unfortunately a number of jambo's internal helpers are defined on the global namespace. https://github.com/yext/jambo/pull/19/files Then, when custom commands were added to the theme, a number of these helpers were copy pasted from jambo. However, they were slightly modifier to NOT reassign the helpers that were on the global namespace, while still using the global parseJamboConfig() inside addToPartials(). i.e., when you write javascript like the below, WITHOUT using a declaration like let or const ```js myFunction = function() {} ``` what you are doing is creating a GLOBAL variable. Using the var declaration also does this. This bug was found when trying to migrate to typescript, which does not allow for this syntax. J=SLAP-1493 TEST=manual ran the custom card command saw it add to the jambo.json partials list and create a custom card --- commands/helpers/utils/jamboconfigutils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 = From dd9a6164c5debfa52298f07c53ef4e54490df661 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Thu, 9 Sep 2021 09:35:37 -0400 Subject: [PATCH 05/14] currency pricerange formatter (#943) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added Formatter.priceRange() function that utilize `locale-currency` and `currency-symbol-map` npm library to retrieve currency symbol based on location's country code (ISO format), and construct the price range accordingly. - exclude `currency-symbol-map` from the node_modules exclusion in webpack babel for production build so it can be transpile to es5 J=SLAP-1552 TEST=manual&auto - added jest test for Formatter.priceRange - add priceRange for a UK location entity. Launched test site and see that it's displayed in £ instead of default $ --- package-lock.json | 23 +++- package.json | 2 + static/js/formatters-internal.js | 25 +++- static/js/formatters.js | 2 + static/package-lock.json | 215 ++++++++++++++++++++++++++++++- static/package.json | 2 + static/webpack/webpack.prod.js | 2 +- tests/static/js/formatters.js | 32 +++++ 8 files changed, 294 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 318f9fcfb..122f420ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5568,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", @@ -6652,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", @@ -7211,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", @@ -8586,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", diff --git a/package.json b/package.json index c08a8536b..753631922 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "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", @@ -37,6 +38,7 @@ "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", diff --git a/static/js/formatters-internal.js b/static/js/formatters-internal.js index 85e1d1d88..29fb2ab9b 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -7,7 +7,8 @@ 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 LocaleCurrency from 'locale-currency' +import getSymbolFromCurrency from 'currency-symbol-map' export function address(profile) { if (!profile.address) { @@ -522,6 +523,28 @@ 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) + * @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 || !countryCode) { + console.warn(`No price range or country code given.`); + return ''; + } + const currencyCode = LocaleCurrency.getCurrency(countryCode); + if (currencyCode) { + const currencySymbol = getSymbolFromCurrency(currencyCode); + if (currencySymbol) { + return defaultPriceRange.replace(/\$/g, currencySymbol); + } + } + console.warn(`Unable to determine currency symbol from ISO country code ${countryCode}.`); + return defaultPriceRange; +} + /** * Highlights snippets of the provided fieldValue according to the matched substrings. * Each match will be wrapped in tags. diff --git a/static/js/formatters.js b/static/js/formatters.js index 1d1084929..c4e054fbd 100644 --- a/static/js/formatters.js +++ b/static/js/formatters.js @@ -28,6 +28,7 @@ import { hoursList, generateCTAFieldTypeLink, price, + priceRange, highlightField, getYoutubeUrl } from './formatters-internal.js'; @@ -61,6 +62,7 @@ let Formatters = { hoursList, generateCTAFieldTypeLink, price, + priceRange, highlightField, getYoutubeUrl }; diff --git a/static/package-lock.json b/static/package-lock.json index 305a2c38f..c16fbc21a 100644 --- a/static/package-lock.json +++ b/static/package-lock.json @@ -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", diff --git a/static/package.json b/static/package.json index 137ff2e0d..ef9ed1aac 100644 --- a/static/package.json +++ b/static/package.json @@ -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", 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/tests/static/js/formatters.js b/tests/static/js/formatters.js index 601a46cb3..b2c662001 100644 --- a/tests/static/js/formatters.js +++ b/tests/static/js/formatters.js @@ -108,6 +108,38 @@ 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 input', () => { + const price = Formatters.priceRange('$', 'IDK'); + expect(price).toEqual('$'); + }); + }); + describe('highlightField', () => { it('Behaves correctly when there are no matchedSubstrings', () => { const plainText = 'No more straws'; From e9ffd0c31088e428f240f3b5a18ae9175d54f75f Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Thu, 9 Sep 2021 16:50:40 -0400 Subject: [PATCH 06/14] uniform product image size (#941) - update css for product-prominentimage-clickable and product-prominentimage cards to have fixed height of 300px that fill the whole width (maintain its aspect ratio, clipped to fit) - the height is a customizable css variable - since object-fit doesn't work in ie11, a polyfill library (object-fit-images) is used to adjust the image. J=SLAP-1553 TEST=manual - add product entities with different image sizes, launched test site and see that all images are properly sized. tested in IE11, chome, and safari --- cards/card_component.js | 4 ++++ static/js/HitchhikerJS.js | 5 +++++ static/package-lock.json | 5 +++++ static/package.json | 1 + static/scss/answers-variables.scss | 1 + static/scss/answers/answers-variables-default.scss | 1 + .../scss/answers/cards/product-prominentimage-clickable.scss | 5 ++++- static/scss/answers/cards/product-prominentimage.scss | 5 ++++- 8 files changed, 25 insertions(+), 2 deletions(-) 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/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/package-lock.json b/static/package-lock.json index c16fbc21a..c875790d8 100644 --- a/static/package-lock.json +++ b/static/package-lock.json @@ -4983,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 ef9ed1aac..ec59640e5 100644 --- a/static/package.json +++ b/static/package.json @@ -56,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 From 483ef1e5ec2628b97ead5db6cad390a29eee86c5 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Fri, 10 Sep 2021 11:56:40 -0400 Subject: [PATCH 07/14] Formatter for printing categories (#946) - add a formatter getCategoryNames that will return a list of category names based on the list of category ids and HH supplied map of id to display name J=SLAP-823 TEST=auto add jest test and see that it passed successfully --- static/js/formatters-internal.js | 21 +++++++++++++ static/js/formatters.js | 6 ++-- tests/static/js/formatters.js | 53 ++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/static/js/formatters-internal.js b/static/js/formatters-internal.js index 29fb2ab9b..1741dbfc5 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -589,3 +589,24 @@ export function getYoutubeUrl(videos = []) { : null; return youtubeVideoUrl; } + +/** + * 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 c4e054fbd..833ae3278 100644 --- a/static/js/formatters.js +++ b/static/js/formatters.js @@ -30,7 +30,8 @@ import { price, priceRange, highlightField, - getYoutubeUrl + getYoutubeUrl, + getCategoryNames } from './formatters-internal.js'; import * as CustomFormatters from './formatters-custom.js'; @@ -64,7 +65,8 @@ let Formatters = { price, priceRange, highlightField, - getYoutubeUrl + getYoutubeUrl, + getCategoryNames }; Formatters = Object.assign(Formatters, CustomFormatters); diff --git a/tests/static/js/formatters.js b/tests/static/js/formatters.js index b2c662001..ff66c787f 100644 --- a/tests/static/js/formatters.js +++ b/tests/static/js/formatters.js @@ -185,4 +185,57 @@ describe('Formatters', () => { expect(actual).toEqual(expected); }); }); + + 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); + }); + }); }); From d41cd32f8589cc6cb677dddb7a46a1459dda1b00 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Fri, 10 Sep 2021 12:20:03 -0400 Subject: [PATCH 08/14] Add google's text highlighting on DA view details link (#945) - update documentsearch-card to modify a given website/landingpage url from the snippet to tag on a text fragment URI component - use useragent.js from SDK to determine if it's Chrome J=SLAP-1553 TEST=manual search 'who is mario?' and see that the link from direct answer provide proper text highlight from the snippet --- .../documentsearch-standard/component.js | 3 +- static/js/formatters-internal.js | 29 +++++- static/js/formatters.js | 2 + static/js/useragent.js | 51 ++++++++++ tests/static/js/formatters.js | 94 +++++++++++++++++++ 5 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 static/js/useragent.js 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/static/js/formatters-internal.js b/static/js/formatters-internal.js index 1741dbfc5..1cd32c5ac 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -7,6 +7,7 @@ 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' @@ -590,6 +591,32 @@ export function getYoutubeUrl(videos = []) { 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()) { + 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. @@ -600,7 +627,7 @@ export function getYoutubeUrl(videos = []) { * @param {string} categoryMap[].category name of a category entry * @returns {string[]} a list of category names */ - export function getCategoryNames(categoryIds, categoryMap) { +export function getCategoryNames(categoryIds, categoryMap) { if (!categoryIds || !categoryMap) { return []; } diff --git a/static/js/formatters.js b/static/js/formatters.js index 833ae3278..5a2741fe2 100644 --- a/static/js/formatters.js +++ b/static/js/formatters.js @@ -31,6 +31,7 @@ import { priceRange, highlightField, getYoutubeUrl, + getUrlWithTextHighlight, getCategoryNames } from './formatters-internal.js'; import * as CustomFormatters from './formatters-custom.js'; @@ -66,6 +67,7 @@ let Formatters = { priceRange, highlightField, getYoutubeUrl, + getUrlWithTextHighlight, getCategoryNames }; Formatters = Object.assign(Formatters, CustomFormatters); 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/tests/static/js/formatters.js b/tests/static/js/formatters.js index ff66c787f..0a8b19f03 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', () => { @@ -186,6 +187,99 @@ describe('Formatters', () => { }); }); + describe('getUrlWithTextHighlight', () => { + const link = 'www.dummy-link.com/test' + const isChrome = jest.spyOn(useragent, 'isChrome'); + isChrome.mockReturnValue(true); + + 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 = [ { From 8c86fc8684f8c1401c8ba36a3dbb785aec8340ef Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Mon, 13 Sep 2021 11:01:10 -0400 Subject: [PATCH 09/14] fix partial extra parenthesis (#947) - check common-partial scripts, remove extra parenthesis from filterbox - update test: fix fiterbox fixture, add static filters to healthcare vertical page and add a percy snapshot to test them --- .../common-partials/script/filterbox.hbs | 2 +- .../healthcare_professionals.json | 69 +++++++++++++++++++ .../healthcare_professionals.html.hbs.patch | 32 +++++++++ tests/percy/photographer.js | 3 + .../script/fixtures/filterbox.hbs.js | 2 +- 5 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 test-site/config-overrides/healthcare_professionals.json create mode 100644 test-site/pages-patches/healthcare_professionals.html.hbs.patch 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/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/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 From 13a59282e38664d1125d91894fb392de6280fb63 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Mon, 13 Sep 2021 11:08:57 -0400 Subject: [PATCH 10/14] error with getUrlWithTextHighlight (#948) direct answer may return a snippet with no matchSubstring, add a check for that before constructing url with text highlighting TEST=manual&auto - test a query that return a Direct answer without any matched substrings, see that no error occur and url is still working - add jest test --- static/js/formatters-internal.js | 2 +- tests/static/js/formatters.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/static/js/formatters-internal.js b/static/js/formatters-internal.js index 1cd32c5ac..d8f121ad0 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -599,7 +599,7 @@ export function getYoutubeUrl(videos = []) { * @returns a URL with text fragment URI component attached */ export function getUrlWithTextHighlight(snippet, baseUrl) { - if (!isChrome()) { + if (!isChrome() || !snippet || snippet.matchedSubstrings.length === 0) { return baseUrl; } //Find the surrounding sentence of the snippet diff --git a/tests/static/js/formatters.js b/tests/static/js/formatters.js index 0a8b19f03..def3d361d 100644 --- a/tests/static/js/formatters.js +++ b/tests/static/js/formatters.js @@ -192,6 +192,15 @@ describe('Formatters', () => { 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.', From 72e3c0fc88f8a68a68328dfb8dfb9684a09d5e57 Mon Sep 17 00:00:00 2001 From: Yen Truong <36055303+yen-tt@users.noreply.github.com> Date: Tue, 14 Sep 2021 10:31:29 -0400 Subject: [PATCH 11/14] QA item: use site locale for price range as default (#949) - update priceRange formatter function to determined the price range string in following order: - use provided country code to determine the currency symbol - if country code is invalid or undefined, use site locale to determine the currency symbol - if all else fails, return the default price range, which is in $ TEST=auto add more cases in jest test, all passed --- static/js/formatters-internal.js | 22 +++++++++++++++------- tests/static/js/formatters.js | 18 +++++++++++++++++- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/static/js/formatters-internal.js b/static/js/formatters-internal.js index d8f121ad0..fbdc7fb5f 100644 --- a/static/js/formatters-internal.js +++ b/static/js/formatters-internal.js @@ -10,6 +10,7 @@ import { generateCTAFieldTypeLink } from './formatters/generate-cta-field-type-l 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) { @@ -525,24 +526,31 @@ export function price(fieldValue = {}, locale) { } /** - * Returns a localized price range string for the given price range ($-$$$$) and country code (ISO format) + * 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 || !countryCode) { - console.warn(`No price range or country code given.`); + if (!defaultPriceRange) { + console.warn(`Price range is not provided.`); return ''; } - const currencyCode = LocaleCurrency.getCurrency(countryCode); - if (currencyCode) { - const currencySymbol = getSymbolFromCurrency(currencyCode); + if (countryCode) { + const currencySymbol = getSymbolFromCurrency(LocaleCurrency.getCurrency(countryCode)); if (currencySymbol) { return defaultPriceRange.replace(/\$/g, currencySymbol); } } - console.warn(`Unable to determine currency symbol from ISO country code ${countryCode}.`); + 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; } diff --git a/tests/static/js/formatters.js b/tests/static/js/formatters.js index def3d361d..da57bbc16 100644 --- a/tests/static/js/formatters.js +++ b/tests/static/js/formatters.js @@ -135,7 +135,23 @@ describe('Formatters', () => { expect(price).toEqual('£'); }); - it('Formats a price range in invalid input', () => { + 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('$'); }); From 6dce9f19b0d3168f89f58d8ae15606e946e37794 Mon Sep 17 00:00:00 2001 From: cea2aj <42848445+cea2aj@users.noreply.github.com> Date: Tue, 14 Sep 2021 11:34:15 -0400 Subject: [PATCH 12/14] Move video to top of video cards (#950) Move the videos in the video cards to the top so that the videos are aligned By moving the videos to the top of the card, we match the layout of the product image cards. The original video card spec has the video below the title, however this causes alignment issues when the card title overflows onto the next line since the videos are now out of alignment. CSS Subgrid is the proper way to align content across cards, (https://www.smashingmagazine.com/2018/07/css-grid-2/) however currently it's only supported on firefox so we can't go that route yet. For now, we simply move the video to the top of the cards. J=none TEST=manual Test the card locally and confirm the layout looks the same as the product image cards. Add CTAs and subtitles locally and confirm they look good as well --- cards/multilang-product-prominentvideo/template.hbs | 6 +++--- cards/product-prominentvideo/template.hbs | 6 +++--- static/scss/answers/cards/product-prominentvideo.scss | 10 ++++++---- 3 files changed, 12 insertions(+), 10 deletions(-) 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/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; From f5791b3e609b7d1ee8cf71452488363a7e4e7a64 Mon Sep 17 00:00:00 2001 From: Tom Meyer Date: Tue, 14 Sep 2021 14:23:54 -0400 Subject: [PATCH 13/14] Update version to v1.24. --- package-lock.json | 2 +- package.json | 2 +- static/package-lock.json | 2 +- static/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 122f420ef..0ae130cbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.0", + "version": "1.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 753631922..7348ea5eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.0", + "version": "1.24.0", "description": "A starter answers theme for hitchhikers", "scripts": { "test": "cross-env NODE_ICU_DATA=node_modules/full-icu jest --verbose", diff --git a/static/package-lock.json b/static/package-lock.json index c875790d8..ed2a2d14a 100644 --- a/static/package-lock.json +++ b/static/package-lock.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.0", + "version": "1.24.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/static/package.json b/static/package.json index ec59640e5..1817dee1f 100644 --- a/static/package.json +++ b/static/package.json @@ -1,6 +1,6 @@ { "name": "answers-hitchhiker-theme", - "version": "1.23.0", + "version": "1.24.0", "description": "Toolchain for use with the HH Theme", "main": "Gruntfile.js", "scripts": { From 6a06abf2be232b0c0ff400893f78a49468bc9c0c Mon Sep 17 00:00:00 2001 From: Tom Meyer Date: Tue, 14 Sep 2021 14:23:54 -0400 Subject: [PATCH 14/14] Update version to v1.24. --- package-lock.json | 2 +- package.json | 2 +- static/package-lock.json | 2 +- static/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4f0c51c1..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": { diff --git a/package.json b/package.json index 65b71d3ae..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", diff --git a/static/package-lock.json b/static/package-lock.json index a5b047b89..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": { diff --git a/static/package.json b/static/package.json index e6c494b4f..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": {