From 068632b11753f58e8142608db3dc139d0c84f93f Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Sat, 11 Jan 2020 22:02:12 +0100 Subject: [PATCH] feat: well known files --- .gitignore | 5 +- .gitlab-ci.yml | 2 +- config/favicon.json | 77 ++ config/mimetypes | 2 + {static => config}/robots.txt | 0 config/settings.yml | 4 +- messages/uniworx/de-de-formal.msg | 3 +- messages/uniworx/en-eu.msg | 3 +- package-lock.json | 1964 ++++++--------------------- package.json | 4 +- routes | 5 +- shell.nix | 2 +- src/Application.hs | 1 - src/Foundation.hs | 5 +- src/Handler/Common.hs | 29 - src/Import/NoFoundation.hs | 5 +- src/Settings.hs | 6 +- src/Settings/StaticFiles.hs | 14 +- src/Settings/StaticFiles/Favicon.hs | 38 - src/Settings/WellKnownFiles.hs | 11 + src/Settings/WellKnownFiles/TH.hs | 192 +++ src/Utils.hs | 4 +- static/favicon.ico | Bin 101484 -> 0 bytes webpack.config.js | 96 +- 24 files changed, 830 insertions(+), 1642 deletions(-) create mode 100644 config/favicon.json rename {static => config}/robots.txt (100%) delete mode 100644 src/Handler/Common.hs delete mode 100644 src/Settings/StaticFiles/Favicon.hs create mode 100644 src/Settings/WellKnownFiles.hs create mode 100644 src/Settings/WellKnownFiles/TH.hs delete mode 100644 static/favicon.ico diff --git a/.gitignore b/.gitignore index 681d12b11..878dea26a 100644 --- a/.gitignore +++ b/.gitignore @@ -35,5 +35,6 @@ test.log /.stack-work.lock /.npmrc /config/webpack.yml -static/wp-*/ -/config/favicon.json +/static +/well-known +/**/tmp-* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb4d41b19..fa414baa8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -33,7 +33,7 @@ npm install: - n stable - npm install -g npm - hash -r - - apt-get install openssh-client -y + - apt-get -y install openssh-client exiftool - install -v -m 0700 -d ~/.ssh - install -v -T -m 0644 ${SSH_KNOWN_HOSTS} ~/.ssh/known_hosts - install -v -T -m 0400 ${SSH_DEPLOY_KEY} ~/.ssh/deploy && echo "IdentityFile ~/.ssh/deploy" >> ~/.ssh/config; diff --git a/config/favicon.json b/config/favicon.json new file mode 100644 index 000000000..2bb896654 --- /dev/null +++ b/config/favicon.json @@ -0,0 +1,77 @@ +{ + "masterPicture": "assets/favicon.svg", + "design": { + "desktop_browser": {}, + "ios": { + "picture_aspect": "background_and_margin", + "margin": "5%", + "background_color": "#ffffff", + "startup_image": { + "background_color": "#ffffff" + }, + "app_name": "Uni2work", + "assets": { + "ios6_and_prior_icons": false, + "ios7_and_later_icons": true, + "precomposed_icons": true, + "declare_only_default_icon": true + } + }, + "windows": { + "picture_aspect": "white_silhouette", + "background_color": "#0a9342", + "app_name": "Uni2work" + }, + "firefox_app": { + "picture_aspect": "circle", + "keep_picture_in_circle": false, + "circle_inner_margin": "5%", + "background_color": "#ffffff", + "overlay": false, + "manifest": { + "app_name": "Uni2work", + "app_description": { + "_i18n": true, + "de-de-formal": "Ein webbasiertes Lehrverwaltungssystem der LMU München", + "en-eu": "A web based teaching management system at LMU Munich" + }, + "developer_name": "Uni2work-Team", + "developer_url": "https://uni2work.ifi.lmu.de/info", + "display": "browser", + "start_url": "/" + } + }, + "android_chrome": { + "picture_aspect": "shadow", + "manifest": { + "name": "Uni2work", + "display": "browser", + "orientation": "portrait", + "start_url": "/" + }, + "assets": { + "legacy_icon": true, + "low_resolution_icons": false + } + }, + "safari_pinned_tab": { + "picture_aspect": "silhouette", + "theme_color": "#0a9342" + }, + "coast": { + "picture_aspect": "background_and_margin", + "background_color": "#ffffff", + "margin": "10%" + }, + "open_graph": { + "picture_aspect": "background_and_margin", + "background_color": "#ffffff", + "margin": "10%", + "ratio": "square" + } + }, + "settings": { + "html_code_file": true + }, + "versioning": false +} diff --git a/config/mimetypes b/config/mimetypes index 29bc4291f..5d3158e6e 100644 --- a/config/mimetypes +++ b/config/mimetypes @@ -43,6 +43,8 @@ application/java-vm class application/javascript js application/json json application/jsonml+json jsonml +application/manifest+json webmanifest +application/x-web-app-manifest+json webapp application/lost+xml lostxml application/mac-binhex40 hqx application/mac-compactpro cpt diff --git a/static/robots.txt b/config/robots.txt similarity index 100% rename from static/robots.txt rename to config/robots.txt diff --git a/config/settings.yml b/config/settings.yml index 9bdb23939..e348b6e91 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -4,8 +4,10 @@ # See https://github.com/yesodweb/yesod/wiki/Configuration#parsing-numeric-values-as-strings static-dir: "_env:STATIC_DIR:static" +well-known-dir: "_env:WELL_KNOWN_DIR:well-known" +well-known-link-file: "html_code.html" + webpack-manifest: "_env:WEBPACK_MANIFEST:config/webpack.yml" -favicon-stats: "_env:FAVICON_STATS:config/favicon.json" host: "_env:HOST:*4" # any IPv4 host port: "_env:PORT:3000" ip-from-header: "_env:IP_FROM_HEADER:false" diff --git a/messages/uniworx/de-de-formal.msg b/messages/uniworx/de-de-formal.msg index 92b612528..07248ce88 100644 --- a/messages/uniworx/de-de-formal.msg +++ b/messages/uniworx/de-de-formal.msg @@ -1208,8 +1208,7 @@ BreadcrumbTerm: Semester BreadcrumbSchool: Institut BreadcrumbUser: Benutzer BreadcrumbStatic: Statische Resource -BreadcrumbFavicon: Favicon -BreadcrumbRobots: robots.txt +BreadcrumbWellKnown: Benannte statische Resource BreadcrumbMetrics: Metriken BreadcrumbLecturerInvite: Einladung zum Kursverwalter BreadcrumbExamOfficeUserInvite: Einladung bzgl. Prüfungsleistungen diff --git a/messages/uniworx/en-eu.msg b/messages/uniworx/en-eu.msg index 824c95333..f071b9dae 100644 --- a/messages/uniworx/en-eu.msg +++ b/messages/uniworx/en-eu.msg @@ -1207,8 +1207,7 @@ BreadcrumbTerm: Semester BreadcrumbSchool: Department BreadcrumbUser: User BreadcrumbStatic: Static resource -BreadcrumbFavicon: Favicon -BreadcrumbRobots: robots.txt +BreadcrumbWellKnown: Named static resource BreadcrumbMetrics: Metrics BreadcrumbLecturerInvite: Invitation to be a course administrator BreadcrumbExamOfficeUserInvite: Invitation regarding exam achievements diff --git a/package-lock.json b/package-lock.json index 772738a45..f76bb83f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2567,351 +2567,6 @@ "integrity": "sha512-EKKR4p0higjsIPKjSSkGqtweUwo/GgR/zKL4rCwzF5Z/BZ/ebJZaS8ZjGE7YUNEN63SYk2WhpJVI+l9dwfU7RQ==", "dev": true }, - "@jimp/bmp": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.9.3.tgz", - "integrity": "sha512-wXZYccgGQAsIK8DZX0wZE3gbSd2mL2+eheSJMts6I5hQjxhVRZd1Gwu425nUQGzfKCOgKYTW0nLv7/8OoOTTkw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "bmp-js": "^0.1.0", - "core-js": "^3.4.1" - } - }, - "@jimp/core": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.9.3.tgz", - "integrity": "sha512-kB9lvst1QhgYOC963SAuPgv+DdVfxTProphrSffAAoo5eLeQab/Ca3ZUeX1E/SnLSr+NGVnNCd8c9gyuKDiENg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "core-js": "^3.4.1", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - }, - "dependencies": { - "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - } - } - }, - "@jimp/custom": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.9.3.tgz", - "integrity": "sha512-2E7yabQMeqjcK8+ZFu3Ja5cWyrB0zv/pmzNSDg/BBPJ59HE0fj/qcERAz6VklcjHUYRUfmE5uODsb+4DE0o/YQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/gif": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.9.3.tgz", - "integrity": "sha512-DshKgMQ8lXorI/xTRyeRkZqZ3JqgnL2aGYAhx0SkAunyHgXji27chmrOGj/6KVDBucrDf/6mSexnSoUDnlWrfA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1", - "omggif": "^1.0.9" - } - }, - "@jimp/jpeg": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.9.3.tgz", - "integrity": "sha512-AJzcTJXfN9BHtpzAbICwR3+GoH0pSr6OYXbAS6yuKwz+xVn9UHrEjQb74CIzIRqrT/VWcIKg29cMQxgokzWY7w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1", - "jpeg-js": "^0.3.4" - } - }, - "@jimp/plugin-blit": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.9.3.tgz", - "integrity": "sha512-+UxCsJ3XkRSdpigpTBJ9WkdwUc3OtBlhVZdU6OL6M9ldume5Gj3rTyWvMCqytOK1tZ/+7HmxoWe4IWX31hz9qA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-blur": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.9.3.tgz", - "integrity": "sha512-RADcYjZ5vbk5ZrUiK7qv0G4xOpHtu19HWVVX9JTDbm4VByWTxPboVKlgiYLA6l+IxIXNtEqDclsADIM0s9FQhA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-color": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.9.3.tgz", - "integrity": "sha512-gHDA5GVx4/R4fitEACKmWH7hNy0aU48MZWYRxmATvuqY39KidJ0fjwp+brQ3Ivgb35AgFVc2jQYc3U/JXv4RxQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1", - "tinycolor2": "^1.4.1" - } - }, - "@jimp/plugin-contain": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.9.3.tgz", - "integrity": "sha512-vdYAtp65LNDT/hMctow5o0a/SbD41/y7Z9AO7MGsfUIK92Woq90SNTWx7JplDl4HSZGrqaBONnfiEhRiYlDrdg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-cover": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.9.3.tgz", - "integrity": "sha512-yOwsvakgyS2/C4iZF1a1wg63QKfYvqb2d6k+rgY/0vaAe44JtEx+Gbg+7iOt4EaMm5BDlxRwmcA2Q8Pef8TvAQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-crop": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.9.3.tgz", - "integrity": "sha512-kqMXSyY8hrfo0idr6qY2USOWPrNqpDWs+D6Vwa+kV6SGJhj3rMTIcptQDaamIETSxbjkE8rwUu3K4Q5UD69D7w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-displace": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.9.3.tgz", - "integrity": "sha512-0AdwxYRWDmJ2wIRIj2RR3sRmNjMhcy5Kwt9Jbi/RRnzxkRScZAiyzkNZhBul23EM7ClfjrUrZufuUvRMHxZRDw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-dither": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.9.3.tgz", - "integrity": "sha512-8OE+Xak9xepiCwSV+oAsb/gupTnttG3aDKxtpSZjwHebnr+k1VG8NgICbMSFATTVJqqZ18oj6LC+5726qHUJ9w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-flip": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.9.3.tgz", - "integrity": "sha512-w+lzE1ZF/UOjB8qJdeIm+dLQtOK1obZwGYdCIbgxZxw4SfkkjAftJdY8o8RNOXhHDZqGu+cYQZbMKP1zcoNkyQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-gaussian": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.9.3.tgz", - "integrity": "sha512-RPrWwzlZsbWC2opSgeyWt30JU9Uwg1+GwBnoNpEMLKeqm0Dv6snASASa4zVtviGWAIq//p3Jrap7g57hKqL0Cg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-invert": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.9.3.tgz", - "integrity": "sha512-0lRsh7IPkzyYqExrZDT50h38xdlB/+KrdiDcuxWwWyIlKauLMR0kInjwf8sPeb3elPLeETmze7uwPAxrIAtsGQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-mask": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.9.3.tgz", - "integrity": "sha512-nZ0J62Hly9JtMZctlSDVgnTd8Fg2XGikzAYilSTCjzIRtbXL5Be/qSAZrMfLD3CZ8exTxdlEGRkEJI3RZKXYCw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-normalize": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.9.3.tgz", - "integrity": "sha512-0IvgTt4R15QJnoCHvvqlK56zOtCsQV7Mkx757kdNah8uyPGjadTcFBuqCaOMK943X36IIv+o7Ix7yvNUJZt4aw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-print": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.9.3.tgz", - "integrity": "sha512-pV6oX5Bhe9O/dbgrotz46Bv6u1M+/n9G0kRUunDjwzXrvON5raBFEJHQDPcTXiqPT25Gc9Ba4/Akfo/Zl6+wgQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1", - "load-bmfont": "^1.4.0" - } - }, - "@jimp/plugin-resize": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.9.3.tgz", - "integrity": "sha512-YzqVE8QoDIZpVuI52v+WejwEjEEiJfNFviQfprfm5af7uSSseZgDw1sJ0koqAu+liMSY+Ewp79v2SDrKoJKqtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-rotate": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.9.3.tgz", - "integrity": "sha512-kADY2pI3/yMyHbuyvKB4nqPoKf8DPQBU1b4zz2K7SxcwKh1krFf4Fa9mmhhDLoFwuNSy0SPb1JCMUO4BtFCFLA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugin-scale": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.9.3.tgz", - "integrity": "sha512-vZaiL5Qc+WrgGEfUe4Y0vG+qbT6pe2TW68/mu124E1tKVcZjHKZUeFN0Wr/hP2myN6nqTYj0/sord2OS/04JpA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1" - } - }, - "@jimp/plugins": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.9.3.tgz", - "integrity": "sha512-KYCSgFGoZBNC0224X5yUnMHCZnCdUVrsu2Yo67o3XZfUgDjO81J+vdzZ0twpPQ6qLLVAP+nQ8hkRV/QzEUstMw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.9.3", - "@jimp/plugin-blur": "^0.9.3", - "@jimp/plugin-color": "^0.9.3", - "@jimp/plugin-contain": "^0.9.3", - "@jimp/plugin-cover": "^0.9.3", - "@jimp/plugin-crop": "^0.9.3", - "@jimp/plugin-displace": "^0.9.3", - "@jimp/plugin-dither": "^0.9.3", - "@jimp/plugin-flip": "^0.9.3", - "@jimp/plugin-gaussian": "^0.9.3", - "@jimp/plugin-invert": "^0.9.3", - "@jimp/plugin-mask": "^0.9.3", - "@jimp/plugin-normalize": "^0.9.3", - "@jimp/plugin-print": "^0.9.3", - "@jimp/plugin-resize": "^0.9.3", - "@jimp/plugin-rotate": "^0.9.3", - "@jimp/plugin-scale": "^0.9.3", - "core-js": "^3.4.1", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.9.3.tgz", - "integrity": "sha512-LJXUemDTSbTGAGEp9hNQH0uTRSB8gYeE6FsfT3M00oZincu6/WzDzl0P8E95rMjNxZqAihdTyOP3+kcrbbqX+w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.9.3", - "core-js": "^3.4.1", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.9.3.tgz", - "integrity": "sha512-w9H6dT+GDHN//Srsv27JhRn7R2byzUahOGfFw7KpIn95jg0ogcxjKTo/RAGQC56sr4U092e4Npl7E85Lt934WQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "core-js": "^3.4.1", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.9.3.tgz", - "integrity": "sha512-hUJKoT2IhnbO/trxNWzN19n8g+p7aKbM1R+71n4wMZnD41PzrVtz+sBBCdB+JCjBJs/i7fJt4d9z0i3Xe8m7Zw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.9.3", - "@jimp/gif": "^0.9.3", - "@jimp/jpeg": "^0.9.3", - "@jimp/png": "^0.9.3", - "@jimp/tiff": "^0.9.3", - "core-js": "^3.4.1", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.9.3.tgz", - "integrity": "sha512-9D2Of6BcjYONtl77YfmU2y5aRMLe0/O2e2aQvfCxdNwD33jRdwNdN4i3m73dpiClNquApIjL4nYGhTixA4UstA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "core-js": "^3.4.1" - } - }, "@juggle/resize-observer": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-2.5.0.tgz", @@ -3406,12 +3061,6 @@ "color-convert": "^1.9.0" } }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", - "dev": true - }, "any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", @@ -3439,32 +3088,12 @@ } } }, - "app-manifest-webpack-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/app-manifest-webpack-plugin/-/app-manifest-webpack-plugin-1.2.0.tgz", - "integrity": "sha512-u2C27waOrBwlaQTrJfuDvsSuaMMPIB7gdBkYAjXzETzzl0GXJA4adbraXxHYKANsp8+W+3izvPlCXD8L0Q7GQg==", - "dev": true, - "requires": { - "favicons": "^5.1.1", - "loader-utils": "^1.1.0" - } - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3561,15 +3190,6 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -3608,12 +3228,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -3647,12 +3261,6 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -3708,17 +3316,41 @@ } } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", - "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", - "dev": true + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } }, "babel-code-frame": { "version": "6.26.0", @@ -4565,15 +4197,6 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -4589,11 +4212,15 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=", - "dev": true + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } }, "binary-extensions": { "version": "1.13.1", @@ -4601,28 +4228,6 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", - "dev": true, - "requires": { - "readable-stream": "^3.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -4635,12 +4240,6 @@ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", - "dev": true - }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -4825,12 +4424,6 @@ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -4849,6 +4442,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -5045,11 +4644,14 @@ "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } }, "chalk": { "version": "2.4.2", @@ -5068,6 +4670,76 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -5275,18 +4947,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -5298,23 +4958,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -5383,15 +5026,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -5477,12 +5111,6 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -7132,15 +6760,6 @@ "number-is-nan": "^1.0.0" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", @@ -7190,27 +6809,12 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -7289,18 +6893,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -7332,12 +6924,6 @@ "repeating": "^2.0.0" } }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, "detect-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz", @@ -7435,12 +7021,6 @@ } } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -7503,16 +7083,6 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7747,12 +7317,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, "es6-symbol": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", @@ -7976,12 +7540,6 @@ "strip-eof": "^1.0.0" } }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", - "dev": true - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -8017,12 +7575,6 @@ } } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -8068,6 +7620,17 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } } }, "extglob": { @@ -8135,12 +7698,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -8159,39 +7716,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "favicons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/favicons/-/favicons-5.5.0.tgz", - "integrity": "sha512-xZ4B+fZDuq2y999iorrYq4KuBT3OIZHU+CVfjOWQbjOC1OiU0xbf6pp4Ju/yAfJn7W74RVrC3Cv0oqR5CLvviw==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "colors": "^1.4.0", - "core-js": "^3.4.5", - "image-size": "^0.8.3", - "jimp": "^0.9.3", - "jsontoxml": "^1.0.1", - "lodash.defaultsdeep": "^4.6.1", - "require-directory": "^2.1.1", - "sharp": "^0.23.3", - "through2": "^3.0.1", - "tinycolor2": "^1.4.1", - "to-ico": "^1.1.5", - "vinyl": "^2.2.0", - "xml2js": "^0.4.22" - }, - "dependencies": { - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - } - } - }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -8256,12 +7780,6 @@ } } }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", - "dev": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -8403,23 +7921,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -8448,12 +7949,6 @@ "null-check": "^1.0.0" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -9046,6 +8541,18 @@ } } }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -9069,44 +8576,6 @@ "simple-git": "^1.85.0" } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "get-own-enumerable-property-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", @@ -9147,15 +8616,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-raw-commits": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", @@ -9546,16 +9006,10 @@ "ini": "^1.3.2" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -9587,24 +9041,6 @@ } } }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } - } - }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -9702,22 +9138,6 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9771,12 +9191,6 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -10046,17 +9460,6 @@ "requires-port": "^1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -10176,15 +9579,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "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==", - "dev": true, - "requires": { - "queue": "6.0.1" - } - }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -10336,12 +9730,6 @@ "loose-envify": "^1.0.0" } }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -10496,12 +9884,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -10645,12 +10027,6 @@ "text-extensions": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -10696,12 +10072,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "jasmine-core": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", @@ -10729,34 +10099,6 @@ } } }, - "jimp": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.9.3.tgz", - "integrity": "sha512-dIxvT1OMRkd3+B18XUhJ5WZ2Dw7Hp8mvjaTqfi945zZ7fga6LT22h3NLYDorHHAiy9z30KjfNnOgpBoxrdjDZg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.9.3", - "@jimp/plugins": "^0.9.3", - "@jimp/types": "^0.9.3", - "core-js": "^3.4.1", - "regenerator-runtime": "^0.13.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true - } - } - }, - "jpeg-js": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.6.tgz", - "integrity": "sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==", - "dev": true - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -10779,12 +10121,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10797,12 +10133,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10859,24 +10189,6 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "jsontoxml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", - "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "karma": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", @@ -11007,6 +10319,15 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11286,30 +10607,6 @@ "figures": "^2.0.0" } }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -11396,16 +10693,46 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", "dev": true }, "lodash.ismatch": { @@ -11414,12 +10741,48 @@ "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", "dev": true }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "dev": true + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, "lodash.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -11599,6 +10962,42 @@ "object-visit": "^1.0.0" } }, + "match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "matcher": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", @@ -11698,6 +11097,18 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "metaparser": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/metaparser/-/metaparser-1.0.7.tgz", + "integrity": "sha1-wGmaZoageovOGsBrYulGLC5mqso=", + "dev": true, + "requires": { + "async": "*", + "cheerio": "*", + "mkdirp": "*", + "underscore": "*" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -11756,21 +11167,6 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, - "mimic-response": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", - "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, "mini-css-extract-plugin": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", @@ -11864,24 +11260,6 @@ "minipass": "^3.0.0" } }, - "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -11971,7 +11349,8 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "dev": true, + "optional": true }, "nanomatch": { "version": "1.2.13", @@ -11992,12 +11371,6 @@ "to-regex": "^3.0.1" } }, - "napi-build-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12037,23 +11410,6 @@ "lower-case": "^1.1.1" } }, - "node-abi": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.13.0.tgz", - "integrity": "sha512-9HrZGFVTR5SOu3PZAnAY2hLO36aW1wmA+FDsVkr85BTST32TLCA1H/AEcatVRAsWLyXS3bqUDYCAjq5/QGuSTA==", - "dev": true, - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -12110,11 +11466,45 @@ } } }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true + "node-unzip-2": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/node-unzip-2/-/node-unzip-2-0.2.8.tgz", + "integrity": "sha512-fmJi73zTRW7RSo/1wyrKc2srKMwb3L6Ppke/7elzQ0QRt6sUjfiIcVsWdrqO5uEHAdvRKXjoySuo4HYe5BB0rw==", + "dev": true, + "requires": { + "binary": "~0.3.0", + "fstream": "~1.0.12", + "match-stream": "~0.0.2", + "pullstream": "~0.4.0", + "readable-stream": "~1.0.0", + "setimmediate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } }, "normalize-package-data": { "version": "2.5.0", @@ -15313,18 +14703,6 @@ "which": "^1.2.10" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -15362,12 +14740,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -15569,12 +14941,6 @@ } } }, - "omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", - "dev": true - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -15668,6 +15034,12 @@ "integrity": "sha512-Ue462G+UIFoyQmOzapGIKWS3d/9NHeD/018WGEDZIhN2/VaQpVXbofMcZX0socv1fw4/tmEn7Vd3McOdPZfKzQ==", "dev": true }, + "over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -15765,40 +15137,12 @@ "safe-buffer": "^5.1.1" } }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", - "dev": true - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", - "dev": true - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dev": true, - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", "dev": true }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", - "dev": true - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -15815,15 +15159,6 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, - "parse-png": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", - "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", - "dev": true, - "requires": { - "pngjs": "^3.2.0" - } - }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -15928,18 +15263,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, "picomatch": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", @@ -15973,15 +15296,6 @@ "pinkie": "^2.0.0" } }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "dev": true, - "requires": { - "pngjs": "^3.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -16000,12 +15314,6 @@ "semver-compare": "^1.0.0" } }, - "pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -16974,37 +16282,6 @@ "uniq": "^1.0.1" } }, - "prebuild-install": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", - "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -17075,12 +16352,6 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, - "psl": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", - "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -17095,6 +16366,44 @@ "safe-buffer": "^5.1.2" } }, + "pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", + "dev": true, + "requires": { + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -17174,15 +16483,6 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "queue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", - "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", - "dev": true, - "requires": { - "inherits": "~2.0.3" - } - }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", @@ -17226,32 +16526,6 @@ "unpipe": "1.0.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -17346,6 +16620,15 @@ "readable-stream": "^2.0.2" } }, + "real-favicon-webpack-plugin": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/real-favicon-webpack-plugin/-/real-favicon-webpack-plugin-0.2.3.tgz", + "integrity": "sha512-w9CS4DdISimLk+hD1qAqVstWfkAXLpnU7a7UOmArHR1pDnmB4SYBO/fwfuu+ObWEcWtIkfsAhJaD6eKSN4Bq6A==", + "dev": true, + "requires": { + "rfg-api": "^0.5.0" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -17538,48 +16821,6 @@ "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17592,94 +16833,6 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "resize-img": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", - "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", - "dev": true, - "requires": { - "bmp-js": "0.0.1", - "file-type": "^3.8.0", - "get-stream": "^2.0.0", - "jimp": "^0.2.21", - "jpeg-js": "^0.1.1", - "parse-png": "^1.1.1" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", - "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=", - "dev": true - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "dev": true, - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - }, - "dependencies": { - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=", - "dev": true - }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=", - "dev": true - } - } - }, - "jpeg-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", - "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, "resolve": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", @@ -17851,6 +17004,19 @@ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, + "rfg-api": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/rfg-api/-/rfg-api-0.5.0.tgz", + "integrity": "sha512-wd6BcVoBsEHlbfsaB1WD4Z/Xis4uEP+Qctd3u2jxXR5yTkCYENaB/m3Jsk0G2qToKgAeE+6tbsN6T0n8DHcSaw==", + "dev": true, + "requires": { + "axios": "^0.18.0", + "fstream": "^1.0.2", + "metaparser": "^1.0.7", + "mkdirp": "^0.5.0", + "node-unzip-2": "^0.2.7" + } + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -18055,23 +17221,6 @@ "kind-of": "^6.0.2" } }, - "sharp": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", - "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", - "dev": true, - "requires": { - "color": "^3.1.2", - "detect-libc": "^1.0.3", - "nan": "^2.14.0", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.3", - "semver": "^6.3.0", - "simple-get": "^3.1.0", - "tar": "^5.0.5", - "tunnel-agent": "^0.6.0" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -18105,23 +17254,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "simple-git": { "version": "1.115.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.115.0.tgz", @@ -18182,6 +17314,41 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", + "dev": true, + "requires": { + "readable-stream": "~1.0.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -18507,23 +17674,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -18848,21 +17998,6 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=", - "dev": true - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "dev": true, - "requires": { - "stream-to": "~0.2.0" - } - }, "streamroller": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", @@ -19171,72 +18306,6 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "tar": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", - "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", - "dev": true, - "requires": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^0.5.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tar-fs": { - "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": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", - "dev": true, - "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "terser": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.2.tgz", @@ -19440,31 +18509,19 @@ "setimmediate": "^1.0.4" } }, - "timm": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz", - "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==", - "dev": true - }, "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", - "dev": true - }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^2.6.3" } }, "to-array": { @@ -19485,27 +18542,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-ico": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", - "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "buffer-alloc": "^1.1.0", - "image-size": "^0.5.0", - "parse-png": "^1.0.0", - "resize-img": "^1.1.0" - }, - "dependencies": { - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true - } - } - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -19560,23 +18596,11 @@ "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true }, "trim-newlines": { "version": "1.0.0", @@ -19608,21 +18632,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -19692,6 +18701,12 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -19871,15 +18886,6 @@ "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", "dev": true }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -19894,15 +18900,17 @@ "requires": { "lru-cache": "4.1.x", "tmp": "0.0.x" - } - }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dev": true, - "requires": { - "pako": "^1.0.5" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } } }, "util": { @@ -19970,31 +18978,6 @@ "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -20406,21 +19389,6 @@ "isexe": "^2.0.0" } }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -20489,40 +19457,6 @@ "ultron": "~1.1.0" } }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/package.json b/package.json index 6bea4e881..3b247c56d 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,6 @@ "@commitlint/cli": "^8.2.0", "@commitlint/config-conventional": "^8.2.0", "@fortawesome/fontawesome-pro": "^5.12.0", - "app-manifest-webpack-plugin": "^1.2.0", "autoprefixer": "^9.7.3", "babel-core": "^6.26.3", "babel-eslint": "^10.0.3", @@ -73,6 +72,7 @@ "css-loader": "^2.1.1", "eslint": "^5.16.0", "file-loader": "^5.0.2", + "glob": "^7.1.6", "html-webpack-plugin": "^3.2.0", "husky": "^2.7.0", "jasmine-core": "^3.5.0", @@ -92,6 +92,7 @@ "optimize-css-assets-webpack-plugin": "^5.0.3", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", + "real-favicon-webpack-plugin": "^0.2.3", "remove-files-webpack-plugin": "^1.1.3", "resolve-url-loader": "^3.1.1", "sass": "^1.23.7", @@ -100,6 +101,7 @@ "standard-version": "^6.0.1", "style-loader": "^0.23.1", "terser-webpack-plugin": "^2.2.3", + "tmp": "^0.1.0", "typeface-roboto": "0.0.75", "typeface-source-sans-pro": "0.0.75", "webpack": "^4.41.2", diff --git a/routes b/routes index bb73c541a..24e863319 100644 --- a/routes +++ b/routes @@ -39,8 +39,6 @@ /static StaticR EmbeddedStatic appStatic !free /auth AuthR Auth getAuth !free -/favicon.ico FaviconR GET !free -/robots.txt RobotsR GET !free /metrics MetricsR GET / HomeR GET !free @@ -204,6 +202,7 @@ /msgs MessageListR GET POST /msg/#{CryptoUUIDSystemMessage} MessageR GET POST !timeANDreadANDauthentication - !/#UUID CryptoUUIDDispatchR GET !free -- just redirect -- !/*{CI FilePath} CryptoFileNameDispatchR GET !free -- Disabled until preliminary check for valid cID exists + +!/*WellKnownFileName WellKnownR GET !free \ No newline at end of file diff --git a/shell.nix b/shell.nix index 7079bd42a..76e71b9ec 100644 --- a/shell.nix +++ b/shell.nix @@ -19,7 +19,7 @@ let ''; override = oldAttrs: { - nativeBuildInputs = oldAttrs.nativeBuildInputs ++ (with pkgs; [ nodejs-12_x postgresql openldap google-chrome ]) ++ (with haskellPackages; [ stack yesod-bin hlint cabal-install weeder ]); + nativeBuildInputs = oldAttrs.nativeBuildInputs ++ (with pkgs; [ nodejs-12_x postgresql openldap google-chrome exiftool ]) ++ (with haskellPackages; [ stack yesod-bin hlint cabal-install weeder ]); shellHook = '' export PROMPT_INFO="${oldAttrs.name}" diff --git a/src/Application.hs b/src/Application.hs index 7ae3d5397..3f4fa2e66 100644 --- a/src/Application.hs +++ b/src/Application.hs @@ -101,7 +101,6 @@ import Data.List (cycle) -- Import all relevant handler modules here. -- (HPack takes care to add new modules to our cabal file nowadays.) -import Handler.Common import Handler.Home import Handler.Info import Handler.Help diff --git a/src/Foundation.hs b/src/Foundation.hs index 1e8f535bc..050b6d1aa 100644 --- a/src/Foundation.hs +++ b/src/Foundation.hs @@ -1575,8 +1575,8 @@ siteLayout' headingOverride widget = do pc <- widgetToPageContent $ do webpackLinks_main StaticR - faviconLinks toWidget $(juliusFile "templates/i18n.julius") + wellKnownHtmlLinks $(widgetFile "default-layout") withUrlRenderer $(hamletFile "templates/default-layout-wrapper.hamlet") @@ -1627,8 +1627,7 @@ i18nCrumb msg mbR = do instance YesodBreadcrumbs UniWorX where breadcrumb (AuthR _) = i18nCrumb MsgMenuLogin $ Just HomeR breadcrumb (StaticR _) = i18nCrumb MsgBreadcrumbStatic Nothing - breadcrumb FaviconR = i18nCrumb MsgBreadcrumbFavicon Nothing - breadcrumb RobotsR = i18nCrumb MsgBreadcrumbRobots Nothing + breadcrumb (WellKnownR _) = i18nCrumb MsgBreadcrumbWellKnown Nothing breadcrumb MetricsR = i18nCrumb MsgBreadcrumbMetrics Nothing breadcrumb HomeR = i18nCrumb MsgMenuHome Nothing diff --git a/src/Handler/Common.hs b/src/Handler/Common.hs deleted file mode 100644 index da1330be9..000000000 --- a/src/Handler/Common.hs +++ /dev/null @@ -1,29 +0,0 @@ --- | Common handler functions. -module Handler.Common - ( getFaviconR - , getRobotsR - ) where - -import Data.FileEmbed (embedFile) -import Import hiding (embedFile) - --- These handlers embed files in the executable at compile time to avoid a --- runtime dependency, and for efficiency. - -getFaviconR :: Handler TypedContent -getFaviconR = do - let content = $(embedFile "static/favicon.ico") - - setEtagHashable content - - return $ TypedContent "image/x-icon" - $ toContent content - -getRobotsR :: Handler TypedContent -getRobotsR = do - let content = $(embedFile "static/robots.txt") - - setEtagHashable content - - return $ TypedContent typePlain - $ toContent content diff --git a/src/Import/NoFoundation.hs b/src/Import/NoFoundation.hs index f71b0c662..b722fb338 100644 --- a/src/Import/NoFoundation.hs +++ b/src/Import/NoFoundation.hs @@ -12,8 +12,9 @@ import Utils.Tokens as Import import Utils.Frontend.Modal as Import import Utils.Lens as Import -import Settings as Import -import Settings.StaticFiles as Import +import Settings as Import +import Settings.StaticFiles as Import +import Settings.WellKnownFiles as Import import CryptoID as Import import Audit as Import diff --git a/src/Settings.hs b/src/Settings.hs index 284173eee..76dea50e7 100644 --- a/src/Settings.hs +++ b/src/Settings.hs @@ -78,7 +78,8 @@ data AppSettings = AppSettings { appStaticDir :: FilePath -- ^ Directory from which to serve static files. , appWebpackEntrypoints :: FilePath - , appFaviconStats :: FilePath + , appWellKnownDir :: FilePath + , appWellKnownLinkFile :: FilePath , appDatabaseConf :: PostgresConf -- ^ Configuration settings for accessing the database. , appAutoDbMigrate :: Bool @@ -370,8 +371,9 @@ instance FromJSON AppSettings where False #endif appStaticDir <- o .: "static-dir" + appWellKnownDir <- o .: "well-known-dir" + appWellKnownLinkFile <- o .: "well-known-link-file" appWebpackEntrypoints <- o .: "webpack-manifest" - appFaviconStats <- o .: "favicon-stats" appDatabaseConf <- o .: "database" appAutoDbMigrate <- o .: "auto-db-migrate" let nonEmptyHost LdapConf{..} = case ldapHost of diff --git a/src/Settings/StaticFiles.hs b/src/Settings/StaticFiles.hs index 4c9f711ab..a4138d193 100644 --- a/src/Settings/StaticFiles.hs +++ b/src/Settings/StaticFiles.hs @@ -1,14 +1,19 @@ +{-# OPTIONS_GHC -fno-warn-unused-top-binds #-} +-- Listing only files directly used by consumers of this module +-- prevents rebuilds if files change, that are not directly used (like +-- webpack bundles) module Settings.StaticFiles - ( module Settings.StaticFiles + ( img_lmu_sigillum_svg + , webpackLinks_main + , embeddedStatic , module Yesod.EmbeddedStatic ) where import ClassyPrelude.Yesod -import Settings (appStaticDir, appWebpackEntrypoints, appFaviconStats, compileTimeAppSettings) +import Settings (appStaticDir, appWebpackEntrypoints, compileTimeAppSettings) import Settings.StaticFiles.Generator import Settings.StaticFiles.Webpack -import Settings.StaticFiles.Favicon import Yesod.EmbeddedStatic -- This generates easy references to files in the static directory at compile time, @@ -28,6 +33,3 @@ import Yesod.EmbeddedStatic mkEmbeddedStatic DEV_BOOL "embeddedStatic" . pure . staticGenerator $ appStaticDir compileTimeAppSettings mkWebpackEntrypoints (appWebpackEntrypoints compileTimeAppSettings) (pure staticGenerator) $ appStaticDir compileTimeAppSettings - -faviconLinks :: MonadWidget m => m () -faviconLinks = $(mkFaviconLinks $ appFaviconStats compileTimeAppSettings) diff --git a/src/Settings/StaticFiles/Favicon.hs b/src/Settings/StaticFiles/Favicon.hs deleted file mode 100644 index a530cf69a..000000000 --- a/src/Settings/StaticFiles/Favicon.hs +++ /dev/null @@ -1,38 +0,0 @@ -module Settings.StaticFiles.Favicon - ( mkFaviconLinks - ) where - -import ClassyPrelude.Yesod - -import Language.Haskell.TH -import Language.Haskell.TH.Syntax hiding (Lift(..)) -import qualified Language.Haskell.TH.Syntax as TH (Lift(..)) - -import qualified Data.Aeson as JSON - -import qualified Data.Map as Map - -import Text.Blaze.Html (preEscapedToHtml) - - -mkFaviconLinks :: FilePath -- ^ Path to JSON-manifest - -> ExpQ -mkFaviconLinks manifest = do - addDependentFile manifest - htmlFragments <- decodeManifest manifest - - doE $ map (\frag -> noBindS [e|toWidgetHead $ preEscapedToHtml $(TH.lift frag)|]) htmlFragments - where - decodeManifest :: FilePath -> Q [Text] - decodeManifest manifest' = do - res <- liftIO $ JSON.eitherDecodeFileStrict' manifest' - case res of - Left err -> fail err - Right res' - | Just frags' <- res' Map.!? ("html" :: Text) - , JSON.Success frags <- JSON.fromJSON frags' - -> return frags - | otherwise - -> fail "Could not parse favicon stats" - - diff --git a/src/Settings/WellKnownFiles.hs b/src/Settings/WellKnownFiles.hs new file mode 100644 index 000000000..2e6d416a2 --- /dev/null +++ b/src/Settings/WellKnownFiles.hs @@ -0,0 +1,11 @@ +module Settings.WellKnownFiles + ( WellKnownFileName + , getWellKnownR + , wellKnownHtmlLinks + ) where + +import Settings.WellKnownFiles.TH + +import Settings (appWellKnownDir, appWellKnownLinkFile, compileTimeAppSettings) + +mkWellKnown "de-de-formal" (appWellKnownDir compileTimeAppSettings) (appWellKnownLinkFile compileTimeAppSettings) diff --git a/src/Settings/WellKnownFiles/TH.hs b/src/Settings/WellKnownFiles/TH.hs new file mode 100644 index 000000000..890184588 --- /dev/null +++ b/src/Settings/WellKnownFiles/TH.hs @@ -0,0 +1,192 @@ +module Settings.WellKnownFiles.TH + ( mkWellKnown + ) where + +import ClassyPrelude.Yesod +import Utils + +import Language.Haskell.TH +import Language.Haskell.TH.Syntax hiding (Lift(..)) +import qualified Language.Haskell.TH.Syntax as TH (Lift(..)) + +import System.Directory.Tree + +import qualified Data.ByteString as BS + +import Utils.Lens.TH +import Control.Lens +import Data.Set.Lens + +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text +import Data.Char as Char (isAlphaNum, toUpper) + +import qualified Data.Map as Map +import qualified Data.Set as Set + +import Data.List.NonEmpty (NonEmpty(..)) + +import Data.HashMap.Strict (HashMap) +import qualified Data.HashMap.Strict as HashMap + +import qualified Data.HashSet as HashSet + +import System.FilePath ((), splitDirectories, makeRelative) + +import Settings.Mime + +import Text.Blaze.Html (preEscapedToHtml) + +nWellKnownFileName :: Name +nWellKnownFileName = mkName "WellKnownFileName" + +nwellKnownFileNames :: Name +nwellKnownFileNames = mkName "wellKnownFileNames" + +ngetWellKnownR :: Name +ngetWellKnownR = mkName "getWellKnownR" + +nwellKnownHtmlLinks :: Name +nwellKnownHtmlLinks = mkName "wellKnownHtmlLinks" + + + +mkWellKnown :: Lang -- ^ Default language + -> FilePath -- ^ Base directory + -> FilePath -- ^ Link file (@html_code.html@) + -> DecsQ +mkWellKnown defLang wellKnownBase wellKnownLinks = do + inputFiles <- fmap dirTree . liftIO $ readDirectoryWith (\f -> (f, ) <$> BS.readFile f) wellKnownBase + + mapM_ qAddDependentFile $ inputFiles ^.. folded . _1 + + -- languageFiles :: Map Lang [(FilePath, ByteString)] + languageFiles <- if + | Dir{contents} <- inputFiles + -> return . Map.fromList $ do + (language, lContents) <- contents ^.. folded . $(multifocusL 2) _name id + Dir{} <- pure lContents + let + lContents' :: [(FilePath, ByteString)] + lContents' = flip mapMaybe (flattenDir lContents) $ \pFile -> do + File{..} <- pure pFile + guard $ name /= wellKnownLinks + return $ file & _1 %~ makeRelative (wellKnownBase language) + return (Text.pack language, lContents') + | otherwise + -> fail "wellKnownBase is not a directory" + + fLanguages <- if + | defLang `Set.member` Map.keysSet languageFiles + , let languages' = Set.delete defLang $ Map.keysSet languageFiles + -> return $ defLang :| Set.toList languages' + | otherwise + -> fail "default language is missing in wellKnownBase" + + -- languageLinks :: Map Lang ByteString + languageLinks <- if + | Dir{contents} <- inputFiles + -> return . Map.fromList $ do + (language, lContents) <- contents ^.. folded . $(multifocusL 2) _name id + Dir{} <- pure lContents + let + lContents' :: [ByteString] + lContents' = flip mapMaybe (flattenDir lContents) $ \pFile -> do + File{..} <- pure pFile + guard $ name == wellKnownLinks + return $ file ^. _2 + c <- lContents' + return (Text.pack language, c) + | otherwise + -> fail "wellKnownBase is not a directory" + + lLanguages <- if + | defLang `Set.member` Map.keysSet languageLinks + , let languages' = Set.delete defLang $ Map.keysSet languageLinks + -> return $ defLang :| Set.toList languages' + | otherwise + -> fail "default language is missing in wellKnownBase" + + + fVar <- newName "f" + hVar <- newName "h" + lVar <- newName "l" + + let fileNames = setOf (folded . folded . _1) languageFiles + fileContents = Map.fromListWith (<>) $ do + (lang, fs) <- Map.toList languageFiles + (fName, fContent) <- fs + return ((fContent, mimeLookup $ Text.pack fName), Set.singleton (lang, fName)) + + wellKnownFileName = dataD + (cxt []) + nWellKnownFileName + [] + Nothing + [ normalC (mkName $ fNameManip fName) [] + | fName <- Set.toList fileNames + ] + (pure $ derivClause Nothing [[t|Eq|], [t|Ord|], [t|Bounded|], [t|Enum|], [t|Read|], [t|Show|], [t|Generic|], [t|Typeable|]]) + wellKnownFileNameMapSig = sigD + nwellKnownFileNames + [t|HashMap [Text] $(conT nWellKnownFileName)|] + wellKnownFileNameMap = funD + nwellKnownFileNames + [ clause [] (normalB $ [e|HashMap.fromList|] `appE` listE [ [e|($(TH.lift . map Text.pack $ splitDirectories fName), $(conE . mkName $ fNameManip fName))|] | fName <- Set.toList fileNames ]) [] + ] + wellKnownFileNamePathMultiPiece = instanceD + (cxt []) + (conT ''PathMultiPiece `appT` conT nWellKnownFileName) + [ funD 'toPathMultiPiece + [ clause [conP (mkName $ fNameManip fName) []] (normalB . TH.lift . map Text.pack $ splitDirectories fName) [] + | fName <- Set.toList fileNames + ] + , funD 'fromPathMultiPiece $ + [ clause [] (normalB [e|flip HashMap.lookup $(varE nwellKnownFileNames)|]) [] + ] + ] + wellKnownFileNameHashable = instanceD + (cxt []) + (conT ''Hashable `appT` conT nWellKnownFileName) + [] + + getWellKnownRSig = sigD + ngetWellKnownR + [t|forall m. MonadHandler m => $(conT nWellKnownFileName) -> m TypedContent|] + getWellKnownR = funD + ngetWellKnownR + [ clause [varP fVar] (normalB [e|$(varE hVar) =<< selectLanguage fLanguages|]) + [ funD hVar $ + [ clause [varP lVar] (guardedB + [ (,) <$> normalG [e|HashSet.member ($(varE lVar), $(varE fVar)) $ HashSet.fromList $(listE [ tupE [TH.lift l, conE . mkName $ fNameManip fName] | (l, fName) <- Set.toList xs ])|] + <*> [e|TypedContent mime (toContent fContent) <$ setEtag $(TH.lift $ hashToText (mime, fContent))|] + ]) [] + | ((fContent, mime), xs) <- Map.toList fileContents + ] ++ pure (clause [wildP] (normalB [e|notFound|]) []) + ] + ] + + wellKnownHtmlLinksSig = sigD + nwellKnownHtmlLinks + [t|forall m. MonadWidget m => m ()|] + wellKnownHtmlLinks = funD + nwellKnownHtmlLinks + [ clause [] (normalB [e|toWidgetHead . preEscapedToHtml . $(varE hVar) =<< selectLanguage lLanguages|]) + [ sigD hVar [t|Text -> Text|] + , funD hVar $ + [ clause [varP lVar] (guardedB + [ (,) <$> normalG [|$(varE lVar) == lang|] + <*> TH.lift (Text.filter (`notElem` ['\r', '\n']) $ Text.decodeUtf8 c) + ]) [] + | (lang, c) <- Map.toList languageLinks + ] ++ pure (clause [wildP] (normalB [e|mempty|]) []) + ] + ] + + sequence + [ wellKnownFileName, wellKnownFileNameMapSig, wellKnownFileNameMap, wellKnownFileNamePathMultiPiece, wellKnownFileNameHashable + , getWellKnownRSig, getWellKnownR + , wellKnownHtmlLinksSig, wellKnownHtmlLinks + ] + where + fNameManip = Text.unpack . mconcat . over (traverse . _head) Char.toUpper . filter (not . null) . Text.split (not . isAlphaNum) . Text.pack diff --git a/src/Utils.hs b/src/Utils.hs index 6b15e3fd9..f266cece4 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -913,11 +913,11 @@ cachedHereBinary = do [e| \k -> cachedByBinary (loc, k) |] hashToText :: Hashable a => a -> Text -hashToText = decodeUtf8 . Base64.encode . toStrict . Binary.encode . hash +hashToText = Text.dropWhileEnd (== '=') . decodeUtf8 . Base64.encode . toStrict . Binary.encode . hash setEtagHashable, setWeakEtagHashable :: (MonadHandler m, Hashable a) => a -> m () setEtagHashable = setEtag . hashToText -setWeakEtagHashable = setEtag . hashToText +setWeakEtagHashable = setWeakEtag . hashToText setLastModified :: MonadHandler m => UTCTime -> m () setLastModified lastModified = do diff --git a/static/favicon.ico b/static/favicon.ico deleted file mode 100644 index 85f9e0d7af640a7f64e6956416a1926e1bef22f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101484 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 diff --git a/webpack.config.js b/webpack.config.js index 3cc5b8379..cc8b9918d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,11 @@ const webpack = require('webpack'); const path = require('path'); +const tmp = require('tmp'); +tmp.setGracefulCleanup(); +const fs = require('fs'); +const glob = require('glob'); +const { execSync } = require('child_process'); + const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); @@ -9,8 +15,8 @@ const TerserPlugin = require('terser-webpack-plugin'); const yaml = require('js-yaml'); const HashOutput = require('webpack-plugin-hash-output'); const postcssPresetEnv = require('postcss-preset-env'); -const AppManifestWebpackPlugin = require('app-manifest-webpack-plugin'); const RemovePlugin = require('remove-files-webpack-plugin'); +const RealFaviconPlugin = require('real-favicon-webpack-plugin'); const webpackVersion = require('webpack/package.json').version.split('.').slice(0, 2).join('.'); const packageVersion = require('./package.json').version; @@ -116,7 +122,9 @@ module.exports = { serialize: yaml.safeDump }), new CleanWebpackPlugin({ - cleanOnceBeforeBuildPatterns: path.resolve(__dirname, 'static', 'wp-*') + cleanOnceBeforeBuildPatterns: [ path.resolve(__dirname, 'static'), + path.resolve(__dirname, 'well-known'), + ] }), new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new CopyPlugin([ @@ -125,38 +133,64 @@ module.exports = { new webpack.DefinePlugin({ VERSION: JSON.stringify(packageVersion) }), - new AppManifestWebpackPlugin({ - logo: path.resolve(__dirname, 'assets/favicon.svg'), - output: '/[hash]-icons/', - prefix: `/static/res/wp-${webpackVersion}/`, - inject: false, - emitStats: true, - statsFilename: path.resolve(__dirname, 'config/favicon.json'), - persistentCache: false, - config: { - background: '#fff', - icons: { - android: false, - appleIcon: false, - appleStartup: false, - coast: false, - favicons: true, - firefox: false, - windows: false, - yandex: false + ...(() => { + const faviconJson = require('./config/favicon.json'); + const langs = new Set(); + function findLangs(json) { + if (json && json._i18n) { + Object.keys(json).forEach(key => { + if (key !== '_i18n') { + langs.add(key); + } + }) + } else if (Array.isArray(json)) { + json.forEach(elem => findLangs(elem)); + } else if (typeof json === 'object') { + Object.keys(json).forEach(key => findLangs(json[key])); } } - }), - new RemovePlugin({ - after: { - test: [ - { folder: path.resolve(__dirname, `static/wp-${webpackVersion}`), - method: (filePath) => { return new RegExp(/\/.*-icons\/.*\.(xml|json|webapp)$/, 'm').test(filePath); }, - recursive: true - } - ] + findLangs(faviconJson); + + function selectLang(lang, json) { + if (json && json._i18n) { + return json[lang]; + } else if (Array.isArray(json)) { + return json.map(elem => selectLang(lang, elem)); + } else if (typeof json === 'object') { + return Object.fromEntries(Object.entries(json).map(([k, v]) => [k, selectLang(lang, v)])); + } else { + return json; + } } - }) + + const langJsons = {}; + Array.from(langs).forEach(lang => { + langJsons[lang] = selectLang(lang, faviconJson); + }); + + return Array.from(langs).map(lang => { + const tmpobj = tmp.fileSync({ dir: ".", postfix: ".json" }); + fs.writeSync(tmpobj.fd, JSON.stringify(langJsons[lang])); + fs.close(tmpobj.fd); + + return [ + new RealFaviconPlugin({ + faviconJson: `./${tmpobj.name}`, + outputPath: path.resolve(__dirname, 'well-known', lang), + inject: false + }), + new CopyPlugin([ + { from: 'config/robots.txt', to: path.resolve(__dirname, 'well-known', lang, 'robots.txt') }, + ]) + ]; + }).flat(1); + })(), + { apply: compiler => compiler.hooks.afterEmit.tap('AfterEmitPlugin', compilation => { + Array.from(glob.sync(path.resolve(__dirname, 'well-known', '**', '*.@(png)'))).forEach(imageFile => { + execSync(`exiftool -overwrite_original -all= ${imageFile}`, { stdio: 'inherit' }); + }); + }) + } ], output: {