diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..5950171 --- /dev/null +++ b/.npmignore @@ -0,0 +1,6 @@ +src +docs +postcss.config.js +tailwind.config.js +.editorconfig +.github diff --git a/CHANGELOG.md b/CHANGELOG.md index c7d34b2..379ce39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All notable changes to `h-bar` will be documented in this file. +# 1.1.0 - 2020-05-15 + +***Changes*** + +- Only headers can be passed to the fetch function configs. + - only doing get requests basically. +- changed the names of the options values to not be so odd + +__FIX__ + +- the fetch options config cleared all defaults + +# 1.0.1 - 2020-04-09 + +__FIX__ + +The styling broke in firefox as sizing was missing the prefix. + # 1.0.0 - 2020-03-13 First initial major version of h-bar :) diff --git a/README.md b/README.md index 75b8eb9..44d4f18 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,8 @@ The initialization object currently has this structure and defaults: { url: "https://your.blog/api/....", onCompleted: "callback function", - postLink: "The link url, can be force and no need to fetch from API", - postTitle: "The link url, can be force and no need to fetch from API", + link: "The link url, can be force and no need to fetch from API", + title: "The link url, can be force and no need to fetch from API", secondaryLinks: [ { title: "Docs", @@ -99,20 +99,10 @@ The initialization object currently has this structure and defaults: ], parser: (data) => {/** Parser function */} dismissible: false, // dismissible banner flag - dismissFor: new Date('2020-03-30'), // would dismiss it till end of march 30th - options: { - theme: "gray", - secondaryLinks: [], - onCompleted: null, - fetchOptions: { - "method": "GET", - "mode": "cors", - "cache": "no-cache", - "headers": { - "Accept": "application/json" - }, - "redirect": "follow" - } + dismissFor: new Date('2020-03-30'), // would dismiss it till end of March 30th 2020 + theme: "gray", + headers: { + "Authorization": "Bearer {TOKEN}" }, customStyles: { wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row sm:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", @@ -200,11 +190,11 @@ When you set this and the banner is dismissed, the UTC milliseconds are stored i If you fail to set the value properly, it won't dismiss and the banner will show by default. -### Testing +## Testing _to come_ please make a PR if you know how to do it on JS. -### Changelog +## Changelog Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. @@ -212,9 +202,9 @@ Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed re Please see [CONTRIBUTING](CONTRIBUTING.md) for details. -### Security +## Security -If you discover any security related issues, please email zsh.rce@gmail.com instead of using the issue tracker. +If you discover any security related issues, please email zsh.rce@gmail.com instead of using the issue tracker. You can also use the [SECURITY](SECURITY.md) doc. ## Credits diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..5395517 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,115 @@ +# Security Policy + +**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).** + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 1.0.x | :white_check_mark: | +| < 0.3 | :x: | + +## Reporting a Vulnerability + +If you discover a security vulnerability, please send an email to Reece at zsh.rce@gmail.com. +All security vulnerabilities will be promptly addressed. + +As the vulnerability is addressed and checked out I will attempt to keep you updated as things are sorted. + +Please provide a proof of concept for what you did to find the vulnerability as well as any possible real world exploits that could lead to actual leakage of data or exploit + +## Communication + +Once you have made initial contact via email, now public issues, if they are opened it will be if it is deemed alright. + +Please allow upto 24 Hours for a response. + +## Credits + +If you have found a vulnerability and it is found to be valid and is fixed, you will be credited with the discovery of the issue. + +Obviously, this being open-source, there wouldn't be any payment for discovering vulnerabilities. + +### Public PGP Key + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: OpenPGP v2.0.8 +Comment: https://sela.io/pgp/ + +xsFNBF5sBTMBEACf9OoEsOBGVGJ1q3wKnJXYfsLZMyYzDXkrWZ70Jvxfvls1sbu5 +BJ7efrBzekgZ1aIoOjjZ2qXMaGHv0FCJLRqL3Wiv7kiMlc59q0Zr7ZMMU5FGASNl +f8iw1craew5bRfEqD6zcXR0MQbjoCLfpIVa8YJhe5k/NZhexybPNlevkYD0CTRqv +5alnFu2gEkx+sOlWUvCOfMbqo+UvMIS6yBWmlhbi/gYiFwzrm2CZrgTSotPBjNyX +QU8gzP2PCW1eFWOoj/hNLPzfglK5ZCfLX6Q6keALrJzlHOLsb/wXdWg/A16Nfktz +NN3nu3JRJIZYLSUfzjNFAZmS4RY0mswufTzQ8K10da7xRIfECzGVNABv0UslVdaJ +HufZ6cbuiVOUGpRWzFt0/CJqaR3Ok4SBOxLUy/xsKerfZpNmFvxiTXvpEt0NOWRO +M3YpA2H8jfcnhSfychCvGCA11cCnyqxL4SXrqe7OLGBQgTZg4EvSM52VNwANPbNB +qNNBcC2VRw1580730mOPK3Mev7ojfEJvB6NjsHQhJu8AGrOlG+XZzfKtb/nGP9XJ +WhIoNPrJHqqgd/sjwPAvE7sooo7pubjgxn7RQVV87/jG44e50D0gpn9z6Hm0q5vG +X0jJ0VrC0obwE7BbY4o6PDTo9l2evO0BQWxLREgCa7SDwxYn5qU0plbIVwARAQAB +zRF6c2gucmNlQGdtYWlsLmNvbcLBcAQTAQoAGgUCXmwFMwIbLwMLCQcDFQoIAh4B +AheAAhkBAAoJEFiTJcq5H0SyH14P/AhjbDsG/nlfqlp4aFlHpbd7aRo1JDEYYaDe +EongUAkqRLafZRC2KCUDfbvdey8FqTKNPPiKI5ELQHnhxauBAtwmOBcN+N1LzMl4 +T3F/mx4/r6kf98TeBcIjxZmL0Q/4H0T3eSeRspreVLeXyIp0WnZYxBzgMK5ZuXxJ +ovBqXlKrRjz3HZehO2KA7IjqdH9HAyWYtK0plJrptayJN82+iqn0U+ut2DKjYUU2 +BHiDakb6zpf6S4tbjuEA7WG+vr/6JYn/fxYijfwCuoQBLt+Xk3y5LX1zAauNVRTE +i91PSDKEamYuF/P+JXQADrjk0kRZoSX6bdqd/FmxaQyIn/O53CMoqjnCzKtxncim +vZF2/A/KG5d6Fk1bwOA/652XwSvYIvO2GLISriclsnUnxGZILibJbwH4MqRFrgTq +2vKUxOHleogUj7gtRMYILRI2m+340xRdKt8DMkb31woK7WlQlGp13Ra/zla/1LpX +MIo28mv9DW1Jh9LNwWZALDlQQyX8zbrdc3jExK2dKwY0xonw1FWKi5xH+nx0+zPE +JOvYPlj+YKTPdA1oElY7CnV4qE4g4lRUkfU83z6HTVob4wEJ40VltK0YqNBHvL34 +YYU2i3RNwCNEIzWWbvoNyPOSlpk0hpLqWjKs5uWke8ktIYFi5VuX6jinYi74alN0 +FLgTwQmXzsBNBF5sBTMBCADK7/UTHgR61I47rz8YI4Ll3kXIzYc9YFPKOhUf7T0Y +j038tWsn6REcs60q/S9nbL89F5gOGDCcd2PykQXtpZCGenZ0TeFXzVSnJ0nQq9eU +6mMWUT5ODAFIgmRk/PMyJs5f08u7Yx35jNTMEeZ69X8ewDSW0/7yRH9RFwergAwP +MHmfjKcGYZew7n8dGJWvyu9vnHtZp9TbOxEZVKXJKjDJnzWSmuqVh1C+n6kYXIQX +MXFVZdfQEk6AiNTAwnzV2bKahyxq6Alw87ZVPNGnycENP+RuNWrFrAfu5UQSgnOG +st7mqqESZOnqkbv3BQbmaK6Tt1A5QcbA/Cp1G3vrxGVzABEBAAHCwoMEGAEKAA8F +Al5sBTMFCQ8JnAACGy4BKQkQWJMlyrkfRLLAXSAEGQEKAAYFAl5sBTMACgkQPMpW +wQb/Lo9XWggApEvGHt7OXN6kpQyOdUTRqsz6TibpTsQsweQW2IBnv4gjTDGTpQUU +G/oYhfcolT5h0TDTe+/AxGPGdJa1S0Yu6xUESiMmE2y24bFOzxOKdISdW89hj/6y +U+hsfv2yce6RY/UgX8GIQyXlhN0rZhL6kwCZ7uKCTqeOxEblYm2CulL3WYUjFOWG +YHDQMjp3GzspUDeYDMQ2agihbP2FD4PL+zNe989NytyxrwxVGlUSUcPyj2Jp/2+E +GVQPQv8jxcZBXRvz2irJM/eS/ckOXNfxbYg/scqocpe1Nr7F2U8dQafL8t34XKVm +g4CwLSytKtjE7TMqxVg1WgocqfjnhSAhPmIDD/jEhVGDvr4+YkoCjGWOxBP7dWw5 +xBKclMsnguG7E4cUeZ+vt8s61iikDYl/upJnT9s88w2bp8DN8yHjwCsFws5STv0G +b6wi+3IFu0Z9IL3692C2aARD44+LK9bttGhxn9eOeZk7kOni9njGSmFpJp2HHcMT +cRvj09UL0wkeenCKJTwUGbilVO+ZjldvktGSnF0UPJs7BEag587RSQT5DBfJnRqt +/ma1vJYieNWSVP3c33whKykxUnRLpn+GnUbhti7iOgCNy6xnTGTe3A9uSDi+7UHl +SqpE1GgxcY/QxrajP+eEHhARkWHR5zkjQ/MkuFr2L8MXiBP8rnlW1buCMK480/JC +igr61UJ8xB5aEXak00yBErP+3rSaI9jZp76ylo9lcf72O+KG1h0BvlAf0SNjElpx +GP3m+DpWFQ8YlpGo+QEfRdTuFbG2R3jaCXBU2DECqPTxyOWH5dzXUaUtgT9L4N5f +tCHmHugPXra7bcYf8xHMx2Vx4nMCsVisWMILv8aD4seTytGf3xX7/6UYKBsRrm6R +94HNBVAjmbeC/5Qr3OorNhtGtYu5kc2bO4S730TtuNch/kErP7aYFMtYAokOA0WU +RUK98fVV8yxq655ISxW01B3kRWYcSNmHMvbC3Yccn5OQKfB1qLHMt5/1Z0qw560L +bgfWrGES7k3bzk9/zsBNBF5sBTMBCADCzyInJ1a9wV3NAcoVGz1SkjyZ/TJnKeKN +BWHxjVrWMHuZtOHHP6bWnA7eew+Oso//hGmQ3YxMLojtwFLuyDzXeblhYmjtHaYR +93mpkoeCMaZ5+HJcUFuhWtqk2fzJ7lu0tsywzSC75dR7/bUdNlur3s2trGHJtHTU +qhFUOI8BJQ8yW4KWZm1XQejzMcKT2KHHVSOCjMDWVzmdFJtisP7V+yMrSsNxasL5 +cWHe1nmXsowsPveTqq9AsF/nLqkrwTfHSgpp3+XDTWNzxIn65Ll72yPXFdOLrlIR +RGd/d+26QkAPybWmSvAAY6JWc2+SurJ8BeYCk+c61V0SbtIWMoMhABEBAAHCwoQE +GAEKAA8FAl5sBTMFCQ8JnAACGy4BKQkQWJMlyrkfRLLAXSAEGQEKAAYFAl5sBTMA +CgkQ/IEj9o9lX167jgf/XXhL7RuYavF9ZfONIdO+Mn0Zx3WEw0WmWNZCSLA8CbHa +Vpojb7CP79p9bdE/4qlSKmLx5MpziCZuVvG1X25N1VgWden3ZDK8tWRjeh2VzAOh +Q/ioFrwiEIwhZSfqFFs8H6Pz1lDL777QOX9UrOgWmtk+/ciwXa7VVV5Fs+wdGEg5 +8fwBymY+F/TCTK/k6bMJYBOIE8iYhhSAc1daYMQ5qv5MOTCwZvCt4iqwtc/oOhvW +K7D+lgg3UrgfA2xeMgz1322k2CRNfaeHujMmXOpVNmPspARd6pI5q83aVzLqrVQX +Mo6WUj1FssHtJ4+HjOP3NNWGg9gh7cIzo22kpi5JeyCSD/9H1ozJ2INiXqpF3ydC +GdCtkQL+K3UdP0er53/kqanpfAjKlS2JDoaBesp79y9+jWpoeQx2dn0VT1eJwhdh +/eSNCOq4JeT8bIqHWX+YtmItSQ+ZQloCqSQB+9uNvGuYTzcYgEif4r6GG5TrY1nT +ksROTPa/lbWPVuatJcwHAdyb96zPNTYMYNroIbmWFmNXOpnnrjyNWnHEpVD4npZz +ULuZ6r9rGM0rjTCO2vnMgOOE7dfvWlnXMjIU8uQ8DSL7w1DgsQuB3xhSV6V55j7+ +8EElgQ7bMcI1MXOgYiVRjoon2b1Xf4hre5U49aNLkWC9sDQSBPp3jLhjKWDry2BZ +M4O1rXC9FJil/9vENOhpAelvkPduW8PjsIhkouxconQw59oYGMvgIsL/8yl06uDY +Q0DbTp4TRXkIc69Rj/nQH8M/uqOHl/2hmYinC5s548Lza11hAarSa5uYqNZoOs/e +xzSi2OCAFlsWrPIGOJVlBtGtLsDmt2PPVSsU+8PVqSndi8pERn9eTuykHkK30aHr +sBJkv5/6RbNqvbTFnMDEct95FiqE2kWAZrHHP8ueN9Io3IzyUbkpWlJE/h9Mzq7T +5kLyqq2eqoNIIXccgL1tRTCl30i8hQDc9tarJ52f/6eV2EIZr1DH/u7CZd2YcH/I +WSP9/fPhYMd+HwxBDDUCc+taPQ== +=dwpr +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/dist/hBar.js b/dist/hBar.js index 986549e..36544b6 100644 --- a/dist/hBar.js +++ b/dist/hBar.js @@ -403,7 +403,7 @@ module.exports = function (list, options) { var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(3); exports = ___CSS_LOADER_API_IMPORT___(false); // Module -exports.push([module.i, ".hb-bg-white{background-color:#fff}.hb-bg-gray-400{background-color:#cbd5e0}.hb-bg-gray-900{background-color:#1a202c}.hb-bg-red-100{background-color:#fff5f5}.hb-bg-red-400{background-color:#fc8181}.hb-bg-orange-300{background-color:#fbd38d}.hb-bg-orange-800{background-color:#9c4221}.hb-bg-yellow-100{background-color:ivory}.hb-bg-yellow-300{background-color:#faf089}.hb-bg-green-100{background-color:#f0fff4}.hb-bg-green-600{background-color:#38a169}.hb-bg-teal-500{background-color:#38b2ac}.hb-bg-teal-900{background-color:#234e52}.hb-bg-blue-100{background-color:#ebf8ff}.hb-bg-blue-900{background-color:#2a4365}.hb-bg-indigo-100{background-color:#ebf4ff}.hb-bg-indigo-800{background-color:#434190}.hb-rounded-full{border-radius:9999px}.hb-cursor-pointer{cursor:pointer}.hb-flex{display:flex}.hb-inline-flex{display:inline-flex}.hb-items-center{align-items:center}.hb-justify-between{justify-content:space-between}.hb-font-semibold{font-weight:600}.hb-leading-relaxed{line-height:1.625}.hb-mx-2{margin-left:.5rem;margin-right:.5rem}.hb-mx-5{margin-left:1.25rem;margin-right:1.25rem}.hb-px-1{padding-left:.25rem;padding-right:.25rem}.hb-py-2{padding-top:.5rem;padding-bottom:.5rem}.hb-px-2{padding-left:.5rem;padding-right:.5rem}.hb-text-gray-100{color:#f7fafc}.hb-text-gray-900{color:#1a202c}.hb-text-red-900{color:#742a2a}.hb-text-orange-100{color:#fffaf0}.hb-text-orange-900{color:#7b341e}.hb-text-yellow-900{color:#744210}.hb-text-green-100{color:#f0fff4}.hb-text-green-900{color:#22543d}.hb-text-teal-100{color:#e6fffa}.hb-text-blue-100{color:#ebf8ff}.hb-text-blue-900{color:#2a4365}.hb-text-indigo-100{color:#ebf4ff}.hb-text-indigo-900{color:#3c366b}.hover\\:hb-text-gray-300:hover{color:#e2e8f0}.hover\\:hb-text-gray-600:hover{color:#718096}.hover\\:hb-text-red-100:hover{color:#fff5f5}.hover\\:hb-text-orange-700:hover{color:#c05621}.hover\\:hb-text-yellow-700:hover{color:#b7791f}.hover\\:hb-text-green-300:hover{color:#9ae6b4}.hover\\:hb-text-teal-300:hover{color:#81e6d9}.hover\\:hb-text-blue-300:hover{color:#90cdf4}.hover\\:hb-text-indigo-300:hover{color:#a3bffa}.hb-text-xs{font-size:.75rem}.hb-text-sm{font-size:.875rem}.hb-uppercase{text-transform:uppercase}.hover\\:hb-underline:hover{text-decoration:underline}.hb-tracking-wider{letter-spacing:.05em}.hb-w-full{width:100%}a{color:inherit;text-decoration:inherit;background-color:transparent}*{box-sizing:border-box;border:0 solid #e2e8f0}.fade-in-top{-webkit-animation:fade-in-top .8s cubic-bezier(.39,.575,.565,1);animation:fade-in-top .8s cubic-bezier(.39,.575,.565,1)}@-webkit-keyframes fade-in-top{to{transform:translateY(0);opacity:1}}@keyframes fade-in-top{0%{transform:translateY(-50px);opacity:0}to{transform:translateY(0);opacity:1}}@media (min-width:640px){.sm\\:hb-flex-row{flex-direction:row}}@media (min-width:768px){.md\\:hb-flex-row{flex-direction:row}.md\\:hb-px-20{padding-left:5rem;padding-right:5rem}}", ""]); +exports.push([module.i, ".hb-bg-white{background-color:#fff}.hb-bg-gray-400{background-color:#cbd5e0}.hb-bg-gray-900{background-color:#1a202c}.hb-bg-red-100{background-color:#fff5f5}.hb-bg-red-400{background-color:#fc8181}.hb-bg-orange-300{background-color:#fbd38d}.hb-bg-orange-800{background-color:#9c4221}.hb-bg-yellow-100{background-color:ivory}.hb-bg-yellow-300{background-color:#faf089}.hb-bg-green-100{background-color:#f0fff4}.hb-bg-green-600{background-color:#38a169}.hb-bg-teal-500{background-color:#38b2ac}.hb-bg-teal-900{background-color:#234e52}.hb-bg-blue-100{background-color:#ebf8ff}.hb-bg-blue-900{background-color:#2a4365}.hb-bg-indigo-100{background-color:#ebf4ff}.hb-bg-indigo-800{background-color:#434190}.hover\\:hb-bg-gray-800:hover{background-color:#2d3748}.focus\\:hb-bg-gray-800:focus{background-color:#2d3748}.hb-rounded-md{border-radius:.375rem}.hb-rounded-full{border-radius:9999px}.hb-cursor-pointer{cursor:pointer}.hb-flex{display:flex}.hb-inline-flex{display:inline-flex}.hb-items-center{align-items:center}.hb-justify-between{justify-content:space-between}.hb-font-semibold{font-weight:600}.hb-h-3{height:.75rem}.hb-h-4{height:1rem}.hb-leading-relaxed{line-height:1.625}.hb-mx-2{margin-left:.5rem;margin-right:.5rem}.hb-mx-5{margin-left:1.25rem;margin-right:1.25rem}.hb--mr-2{margin-right:-.5rem}.focus\\:hb-outline-none:focus{outline:0}.hb-p-1{padding:.25rem}.hb-px-1{padding-left:.25rem;padding-right:.25rem}.hb-py-2{padding-top:.5rem;padding-bottom:.5rem}.hb-px-2{padding-left:.5rem;padding-right:.5rem}.hb-text-gray-100{color:#f7fafc}.hb-text-gray-800{color:#2d3748}.hb-text-gray-900{color:#1a202c}.hb-text-red-900{color:#742a2a}.hb-text-orange-100{color:#fffaf0}.hb-text-orange-900{color:#7b341e}.hb-text-yellow-900{color:#744210}.hb-text-green-100{color:#f0fff4}.hb-text-green-900{color:#22543d}.hb-text-teal-100{color:#e6fffa}.hb-text-blue-100{color:#ebf8ff}.hb-text-blue-900{color:#2a4365}.hb-text-indigo-100{color:#ebf4ff}.hb-text-indigo-900{color:#3c366b}.hover\\:hb-text-white:hover{color:#fff}.hover\\:hb-text-gray-300:hover{color:#e2e8f0}.hover\\:hb-text-gray-600:hover{color:#718096}.hover\\:hb-text-red-100:hover{color:#fff5f5}.hover\\:hb-text-orange-700:hover{color:#c05621}.hover\\:hb-text-yellow-700:hover{color:#b7791f}.hover\\:hb-text-green-300:hover{color:#9ae6b4}.hover\\:hb-text-teal-300:hover{color:#81e6d9}.hover\\:hb-text-blue-300:hover{color:#90cdf4}.hover\\:hb-text-indigo-300:hover{color:#a3bffa}.hb-text-xs{font-size:.75rem}.hb-text-sm{font-size:.875rem}.hb-uppercase{text-transform:uppercase}.hover\\:hb-underline:hover{text-decoration:underline}.hb-tracking-wider{letter-spacing:.05em}.hb-w-3{width:.75rem}.hb-w-4{width:1rem}.hb-w-full{width:100%}a{color:inherit;text-decoration:inherit;background-color:transparent}*{box-sizing:border-box;border:0 solid #e2e8f0}.fade-in-top{-webkit-animation:fade-in-top .8s cubic-bezier(.39,.575,.565,1);animation:fade-in-top .8s cubic-bezier(.39,.575,.565,1)}@-webkit-keyframes fade-in-top{to{transform:translateY(0);opacity:1}}@keyframes fade-in-top{0%{transform:translateY(-50px);opacity:0}to{transform:translateY(0);opacity:1}}@media (min-width:768px){.md\\:hb-flex-row{flex-direction:row}.md\\:hb-px-20{padding-left:5rem;padding-right:5rem}}", ""]); // Exports module.exports = exports; @@ -513,21 +513,115 @@ function toComment(sourceMap) { /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +// ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXTERNAL MODULE: ./src/styles.css var styles = __webpack_require__(0); +// CONCATENATED MODULE: ./src/banner/styling.js +/** + * The class styling configurations. + * + * Has the base styles and the themes + * + * @var {object} styling + */ +var styling = { + wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", + linkWrapper: "hb-flex hb-items-center", + badge: "hb-px-2 hb-mx-2 hb-leading-relaxed hb-tracking-wider hb-uppercase hb-font-semibold hb-rounded-full hb-text-xs", + postTitle: "hover:hb-underline hb-inline-flex hb-items-center", + secondaryLink: "hb-mx-5 hb-cursor-pointer hover:hb-underline" +}; +/** + * THe themes for the bars + * + * @var {object} themes + */ + +var themes = { + gray: { + wrapper: "hb-bg-gray-900 hb-text-gray-100", + linkWrapper: "", + badge: "hb-bg-white hb-text-gray-900", + postTitle: "hover:hb-text-gray-300", + secondaryLink: "hover:hb-text-gray-300", + dismiss: "hb-text-gray-800" + }, + lightGray: { + wrapper: "hb-bg-gray-400 hb-text-gray-900", + linkWrapper: "", + badge: "hb-bg-white hb-text-gray-900 shadow", + postTitle: "hover:hb-text-gray-600", + secondaryLink: "hover:hb-text-gray-600", + dismiss: "hb-text-gray-800" + }, + blue: { + wrapper: "hb-bg-blue-900 hb-text-blue-100", + linkWrapper: "", + badge: "hb-bg-blue-100 hb-text-blue-900 shadow", + postTitle: "hover:hb-text-blue-300", + secondaryLink: "hover:hb-text-blue-300", + dismiss: "hb-text-gray-800" + }, + green: { + wrapper: "hb-bg-green-600 hb-text-green-100", + linkWrapper: "", + badge: "hb-bg-green-100 hb-text-green-900", + postTitle: "hover:hb-text-green-300", + secondaryLink: "hover:hb-text-green-300", + dismiss: "hb-text-gray-800" + }, + indigo: { + wrapper: "hb-bg-indigo-800 hb-text-indigo-100", + linkWrapper: "", + badge: "hb-bg-indigo-100 hb-text-indigo-900 shadow", + postTitle: "hover:hb-text-indigo-300", + secondaryLink: "hover:hb-text-indigo-300", + dismiss: "hb-text-gray-800" + }, + orange: { + wrapper: "hb-bg-orange-300 hb-text-orange-900", + linkWrapper: "", + badge: "hb-bg-orange-800 hb-text-orange-100 shadow", + postTitle: "hover:hb-text-orange-700", + secondaryLink: "hover:hb-text-orange-700", + dismiss: "hb-text-gray-800" + }, + yellow: { + wrapper: "hb-bg-yellow-300 hb-text-yellow-900", + linkWrapper: "", + badge: "hb-bg-yellow-100 hb-text-yellow-900 shadow", + postTitle: "hover:hb-text-yellow-700", + secondaryLink: "hover:hb-text-yellow-700", + dismiss: "hb-text-gray-800" + }, + teal: { + wrapper: "hb-bg-teal-500 hb-text-teal-100", + linkWrapper: "", + badge: "hb-bg-teal-900 hb-text-teal-100 shadow", + postTitle: "hover:hb-text-teal-300", + secondaryLink: "hover:hb-text-teal-300", + dismiss: "hb-text-gray-800" + }, + red: { + wrapper: "hb-bg-red-400 hb-text-red-900", + linkWrapper: "", + badge: "hb-bg-red-100 hb-text-red-900 shadow", + postTitle: "hover:hb-text-red-100", + secondaryLink: "hover:hb-text-red-100", + dismiss: "hb-text-gray-800" + } +}; // CONCATENATED MODULE: ./src/config/config.js /** * The default configuration for the package * * @var {object} config + * @var {object} config.fetchOptions */ var config = { - url: '', - theme: "gray", - secondaryLinks: [], fetchOptions: { method: 'GET', mode: 'cors', @@ -608,163 +702,77 @@ function normaliser(data) { }); }); } -// CONCATENATED MODULE: ./src/config/styling.js -/** - * The class styling configurations. - * - * Has the base styles and the themes - * - * @var {object} styling - */ -var styling = { - wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row sm:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", - linkWrapper: "hb-flex hb-items-center", - badge: "hb-px-2 hb-mx-2 hb-leading-relaxed hb-tracking-wider hb-uppercase hb-font-semibold hb-rounded-full hb-text-xs", - postTitle: "hover:hb-underline hb-inline-flex hb-items-center", - secondaryLink: "hb-mx-5 hb-cursor-pointer hover:hb-underline" -}; -/** - * THe themes for the bars - * - * @var {object} themes - */ - -var themes = { - gray: { - wrapper: "hb-bg-gray-900 hb-text-gray-100", - linkWrapper: "", - badge: "hb-bg-white hb-text-gray-900", - postTitle: "hover:hb-text-gray-300", - secondaryLink: "hover:hb-text-gray-300", - dismiss: "text-white" - }, - lightGray: { - wrapper: "hb-bg-gray-400 hb-text-gray-900", - linkWrapper: "", - badge: "hb-bg-white hb-text-gray-900 shadow", - postTitle: "hover:hb-text-gray-600", - secondaryLink: "hover:hb-text-gray-600", - dismiss: "text-white" - }, - blue: { - wrapper: "hb-bg-blue-900 hb-text-blue-100", - linkWrapper: "", - badge: "hb-bg-blue-100 hb-text-blue-900 shadow", - postTitle: "hover:hb-text-blue-300", - secondaryLink: "hover:hb-text-blue-300", - dismiss: "text-white" - }, - green: { - wrapper: "hb-bg-green-600 hb-text-green-100", - linkWrapper: "", - badge: "hb-bg-green-100 hb-text-green-900", - postTitle: "hover:hb-text-green-300", - secondaryLink: "hover:hb-text-green-300", - dismiss: "text-white" - }, - indigo: { - wrapper: "hb-bg-indigo-800 hb-text-indigo-100", - linkWrapper: "", - badge: "hb-bg-indigo-100 hb-text-indigo-900 shadow", - postTitle: "hover:hb-text-indigo-300", - secondaryLink: "hover:hb-text-indigo-300", - dismiss: "text-white" - }, - orange: { - wrapper: "hb-bg-orange-300 hb-text-orange-900", - linkWrapper: "", - badge: "hb-bg-orange-800 hb-text-orange-100 shadow", - postTitle: "hover:hb-text-orange-700", - secondaryLink: "hover:hb-text-orange-700", - dismiss: "text-white" - }, - yellow: { - wrapper: "hb-bg-yellow-300 hb-text-yellow-900", - linkWrapper: "", - badge: "hb-bg-yellow-100 hb-text-yellow-900 shadow", - postTitle: "hover:hb-text-yellow-700", - secondaryLink: "hover:hb-text-yellow-700", - dismiss: "text-white" - }, - teal: { - wrapper: "hb-bg-teal-500 hb-text-teal-100", - linkWrapper: "", - badge: "hb-bg-teal-900 hb-text-teal-100 shadow", - postTitle: "hover:hb-text-teal-300", - secondaryLink: "hover:hb-text-teal-300", - dismiss: "text-white" - }, - red: { - wrapper: "hb-bg-red-400 hb-text-red-900", - linkWrapper: "", - badge: "hb-bg-red-100 hb-text-red-900 shadow", - postTitle: "hover:hb-text-red-100", - secondaryLink: "hover:hb-text-red-100", - dismiss: "text-white" - } -}; // CONCATENATED MODULE: ./src/functions/init.js /** + * Set all the configuration options for the hBar library * - * @param {object} param0 - * @param {string} param0.url - * @param {string} param0.ele The element id - * @param {boolean} param0.dismissible - * @param {Date|boolean} param0.dismissFor - * @param {string} param0.badge - * @param {array} param0.secondaryLinks - * @param {object} param0.options - * @param {object} param0.customStyles - * @param {function} param0.parser - * @param {function} param0.onCompleted - * @param {string} param0.link Manual override - * @param {string} param0.title Manual Override + * @param {object} options + * @param {string} options.el The element id + * @param {string} options.template The template id + * @param {string} options.url + * @param {boolean} options.dismissible + * @param {Date|boolean} options.dismissFor + * @param {string} options.badge + * @param {array} options.secondaryLinks + * @param {object} options.headers + * @param {object} options.customStyles + * @param {function} options.parser + * @param {function} options.onCompleted + * @param {function} options.onFailure + * @param {string} options.link Manual override + * @param {string} options.title Manual Override */ -function init(_ref) { - var url = _ref.url, - ele = _ref.ele, - dismissible = _ref.dismissible, - dismissFor = _ref.dismissFor, - badge = _ref.badge, - secondaryLinks = _ref.secondaryLinks, - options = _ref.options, - customStyles = _ref.customStyles, - onCompleted = _ref.onCompleted, - parser = _ref.parser, - link = _ref.link, - title = _ref.title; - this.url = url; - this.ele = ele || 'h-bar'; // we will default to false for this - - this.dismissible = dismissible || false; - this.dismissFor = dismissFor || false; - this.config = Object.assign(config, options); - this.styling = Object.assign(styling, customStyles); - this.secondaryLinks = secondaryLinks; - - this.onCompleted = onCompleted || function () {}; - - this.badge = badge || 'New'; - this.postLink = link; - this.postTitle = title; - this.theme = this.config.theme; - initNormalise(parser); - return this; +function init_init() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var configuration = {}; + configuration.$el = options.el; + configuration.url = options.url; // if the user has dompurify installed. It can be optional + + configuration.DOMPurify = options.DOMPurify || null; + configuration.theme = themes[options.theme] || 'grey'; + configuration.badge = options.badge || 'New'; // we will default to false for configuration + + configuration.dismissible = options.dismissible || false; + configuration.dismissFor = options.dismissFor || false; + configuration.secondaryLinks = options.secondaryLinks || []; + /** + * These will be the fallbacks if something isn't found. + */ + + configuration.title = options.title || null; + configuration.link = options.link || null; + + configuration.onCompleted = options.onCompleted || function () {}; + + configuration.onFailure = options.onFailure || function () {}; + + if (typeof options.fetch == 'function') { + configuration.fetch = options.fetch; + } + + configuration.fetchOptions = config.fetchOptions; + configuration.fetchOptions.headers = Object.assign(config.fetchOptions.headers, options.headers); + initNormalise(options.parser || null); + return configuration; } // CONCATENATED MODULE: ./src/utils.js -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } -// Thanks @stimulus: +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +// Thanks @stimulus: and I got it from @alpinejs // https://github.com/stimulusjs/stimulus/blob/master/packages/%40stimulus/core/src/application.ts function domReady() { return new Promise(function (resolve) { @@ -819,212 +827,490 @@ function addClasses(element) { return element; } -// CONCATENATED MODULE: ./src/index.js -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } +/** + * Binds all the methods on a JS Class to the `this` context of the class. + * Adapted from https://github.com/sindresorhus/auto-bind + * @param {object} self The `this` context of the class + * @return {object} The `this` context of the class + */ + +function autoBind(self) { + var keys = Object.getOwnPropertyNames(self.constructor.prototype); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var val = self[key]; + + if (key !== 'constructor' && typeof val === 'function') { + self[key] = val.bind(self); + } + } + + return self; +} /** - * h-bar announcement banner + * Gets the data-* values that area related to the config of the template options. * - * @version 1.0.0 - * @author ReeceM + * @param {HTMLElement} element + * @return {Object} */ +function getElementOptions(element) { + return { + template: element.dataset.template, + html: element.getAttribute('has-html') == "" ? true : false, + dismissFor: element.dataset.dismissFor || null + }; +} +/** + * Determines if the banner has been dismissed. + * + * @returns boolean + */ +function isDismissed() { + if (localStorage) { + var dismissDate = localStorage.getItem('h-bar_dismiss_for'); + if (!dismissDate) { + return false; + } + dismissDate = dismissDate; + var ourDate = new Date().getTime(); -var hBar = { - /** - * h-bar version number - */ - version: "1.0.0", + if (ourDate <= dismissDate) { + return true; + } + } + return false; +} +// CONCATENATED MODULE: ./src/functions/renderer.js +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var Renderer = /*#__PURE__*/function () { /** - * Initialise the hBar package + * Creates a new simple renderer for the templates * - * @inheritdoc - * @returns {hBar} + * @param {string} el the element ID that has the template data + * @param {object} data The key:value pair of the data to replace in the template + * @param {DOMPurify} DOMPurify the DOMPurify library */ - init: init, + function Renderer(el, DOMPurify) { + _classCallCheck(this, Renderer); - /** - * Fetch the data from the endpoint - */ - fetchData: function fetchData() { - var _this = this; + this.template = document.querySelector(el); + this.DOMPurify = DOMPurify; + } - if (this.isDismissed()) return; - fetch(this.url, this.config.fetchOptions).then(function (response) { - return response.json(); - }).then(function (json) { - if (_typeof(json) == "object") { - normaliser(json).then(function (_ref) { - var title = _ref.title, - link = _ref.link, - secondaryLinks = _ref.secondaryLinks; - _this.postTitle = title; - _this.postLink = link; - _this.secondaryLinks = secondaryLinks || []; - - _this.render(); - })["catch"](function (error) { - console.error(error); - - _this.destroy(); - }); - } else { - console.error("".concat(_this.url, " Did not return an object")); + _createClass(Renderer, [{ + key: "resolve", + value: function resolve(data) { + var _this = this; + + var templateHTML = this.template.innerHTML; + /** + * Don't do anything if there is a no content + */ + + if (templateHTML == undefined) { + return null; } - }); - }, + Object.keys(data).forEach(function (key) { + // skip any array things. + // make the thing recursive in x version xD + if (!Array.isArray(data[key])) { + var regex = _this.regex(key); + + templateHTML = templateHTML.replace(regex, data[key]); + } + }); + + if (this.DOMPurify) { + return this.DOMPurify.sanitize(templateHTML); + } + + return templateHTML; + } + /** + * Create the matching regex for the template tags + * + * @param {string} key The key to search in the template data + * @returns {RegExp} + */ + + }, { + key: "regex", + value: function regex(key) { + // current tag is {% value %} + return new RegExp("({%\\s*(".concat(key, ")\\s*%})"), 'g'); + } + }]); + + return Renderer; +}(); + + +// CONCATENATED MODULE: ./src/banner/banner.js +function banner_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function banner_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function banner_createClass(Constructor, protoProps, staticProps) { if (protoProps) banner_defineProperties(Constructor.prototype, protoProps); if (staticProps) banner_defineProperties(Constructor, staticProps); return Constructor; } + + + + +var banner_Banner = /*#__PURE__*/function () { + /** + * + * @param {object} param0 + */ + function Banner(_ref) { + var $el = _ref.$el, + dismissible = _ref.dismissible, + dismissFor = _ref.dismissFor, + theme = _ref.theme, + badge = _ref.badge; + + banner_classCallCheck(this, Banner); + + this.$el = $el; + this.dismissible = dismissible; + this.dismissFor = dismissFor; + this.badge = badge; + this.theme = theme; + } /** * Render the element. */ - render: function render() { - var _this2 = this; - if (this.isDismissed()) return; - domReady().then(function () { - if (!_this2.postTitle) { - console.error('[h-bar] no post data, unable to render'); - return; - } - var secondaryElement = null; + banner_createClass(Banner, [{ + key: "resolve", + value: function resolve(_ref2) { + var _this = this; - if (!_this2.dismissible) { - var secondaryLinkList = _this2.createSecondaryLinks(); + var title = _ref2.title, + link = _ref2.link, + secondaryLinks = _ref2.secondaryLinks; + if (isDismissed()) return; + domReady().then(function () { + if (!title) { + console.error('[h-bar] no post data, unable to render'); + return; + } - secondaryElement = newElement('div', { - children: secondaryLinkList, - classes: "".concat(_this2.styling.linkWrapper, " ").concat(themes[_this2.theme].linkWrapper) + var secondaryElement = null; + + if (!_this.dismissible) { + var secondaryLinkList = _this.createSecondaryLinks(secondaryLinks); + + secondaryElement = newElement('div', { + children: secondaryLinkList, + classes: "".concat(styling.linkWrapper, " ").concat(_this.theme.linkWrapper) + }); + } else { + secondaryElement = _this.dismissibleButton(); + } + + var badgeElement = newElement('span', { + classes: "".concat(styling.badge, " ").concat(_this.theme.badge) + }); + var postLink = newElement('a', { + classes: "".concat(styling.postTitle, " ").concat(_this.theme.postTitle) + }); + badgeElement.innerText = _this.badge; + postLink.href = link; + postLink.innerText = title; + postLink.innerHTML += "\n \n \n \n "; + var postElement = newElement('div', { + classes: "".concat(styling.linkWrapper, " ").concat(_this.theme.linkWrapper), + children: [badgeElement, postLink] }); - } else { - secondaryElement = _this2.dismissibleButton(); - } - var badge = newElement('span', { - classes: "".concat(_this2.styling.badge, " ").concat(themes[_this2.theme].badge) - }); - var postLink = newElement('a', { - classes: "".concat(_this2.styling.postTitle, " ").concat(themes[_this2.theme].postTitle) - }); - badge.innerText = _this2.badge; - postLink.href = _this2.postLink; - postLink.innerText = _this2.postTitle; - postLink.innerHTML += "\n \n \n \n "; - var postElement = newElement('div', { - classes: "".concat(_this2.styling.linkWrapper, " ").concat(themes[_this2.theme].linkWrapper), - children: [badge, postLink] + var _hbar = newElement('div', { + classes: "".concat(styling.wrapper, " ").concat(_this.theme.wrapper), + children: [postElement, secondaryElement] + }); + + var container = document.querySelector(_this.$el); + container.innerHTML = ""; + container.appendChild(_hbar); }); + } + /** + * Removes the element in the case of it having issues. + * Rather an aggressive option. + * + * Also used when dismissing. + */ + + }, { + key: "destroy", + value: function destroy() { + try { + document.querySelector(this.$el).innerHTML = ''; + return true; + } catch (error) { + console.error('Unable to destroy the h-bar wrapper'); + console.error(error); + } - var _hbar = newElement('div', { - classes: "".concat(_this2.styling.wrapper, " ").concat(themes[_this2.theme].wrapper), - children: [postElement, secondaryElement] + return false; + } + /** + * Creates the HTML node for a dismissible button. + * + * @returns HTMLElement + */ + + }, { + key: "dismissibleButton", + value: function dismissibleButton() { + var _this2 = this; + + var dismiss = newElement('button', { + classes: "hb--mr-2 hb-flex hb-p-1 hb-rounded-md ".concat(this.theme.dismiss, " hover:hb-text-white hover:hb-bg-gray-800 focus:hb-outline-none focus:hb-bg-gray-800") }); + dismiss.innerHTML = "\n \n "; + + dismiss.onclick = function (e) { + e.preventDefault(); // just do it early if we not logging time. + + if (!_this2.dismissFor) return _this2.destroy(); + + if (localStorage) { + localStorage.setItem('h-bar_dismiss_for', _this2.dismissFor.getTime()); + } + + return _this2.destroy(); + }; + + return dismiss; + } + /** + * Creates the secondary links for the bar. + */ + + }, { + key: "createSecondaryLinks", + value: function createSecondaryLinks(secondaryLinks) { + var _this3 = this; + + if (!secondaryLinks) return []; + return secondaryLinks.map(function (_ref3) { + var title = _ref3.title, + link = _ref3.link; + var style = "".concat(styling.secondaryLink, " ").concat(_this3.theme.secondaryLink); + var butter = newElement('a', { + classes: style + }); + butter.href = link; + butter.innerText = title; + return butter; + }, this); + } + }]); + + return Banner; +}(); + + +// CONCATENATED MODULE: ./src/index.js +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +/** + * h-bar banner and dynamic announcement library + * + * @version 2.0.0 + * @license MIT + * @copyright @ReeceM + */ + + - var container = document.getElementById(_this2.ele); - container.innerHTML = ""; - container.appendChild(_hbar); // ? what to send out - _this2.onCompleted({ - element: container, - id: _this2.ele - }); - }); - }, + + +/** + * Set all the configuration options for the hBar library + * + * @property {string} el The element id + * @property {string} url + * @property {boolean} dismissible + * @property {Date|boolean} dismissFor + * @property {string} badge + * @property {DOMPurify} DOMPurify the DOMPurify library + * @property {array} secondaryLinks + * @property {object} headers + * @property {object} customStyles + * @property {function} parser + * @property {object} renderer + * @property {function} onCompleted + * @property {function} onFailure + * @property {string} link Manual override + * @property {string} title Manual Override + */ + +var hBar = { + version: "2.0.0", + rendered: false, + fetching: false, + usingBanner: true, /** - * Removes the element in the case of it having issues. - * Rather an aggressive option. + * Set all the configuration options for the hBar library * - * Also used when dismissing. + * @param {object} options + * @param {string} options.el The element id + * @param {string} options.url + * @param {boolean} options.dismissible + * @param {Date|boolean} options.dismissFor + * @param {string} options.badge + * @param {array} options.secondaryLinks + * @param {object} options.headers + * @param {object} options.customStyles + * @param {function} options.parser + * @param {function} options.onCompleted + * @param {string} options.link Manual override + * @param {string} options.title Manual Override */ - destroy: function destroy() { - try { - document.getElementById(this.ele).remove(); - return true; - } catch (error) { - console.error('Unable to destroy the h-bar wrapper'); - console.error(error); + init: function init() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + Object.assign(this, init_init(options)); + this.$elementOpt = getElementOptions(document.querySelector(this.$el)); + + if (this.$elementOpt.template) { + this.renderer = new Renderer(this.$elementOpt.template, this.DOMPurify); + } else if (options.renderer) { + /** + * @todo this was added on a whim... bad idea possibly + */ + this.renderer = new options.renderer(this); + } else { + this.renderer = new banner_Banner(this); } - return false; + Object.defineProperties(this, { + 'renderer': { + configurable: false, + writable: false + } + }); }, /** - * Creates the HTML node for a dismissible button. + * Gets the data from the url endpoint. * - * @returns HTMLElement + * This is called by the */ - dismissibleButton: function dismissibleButton() { - var _this3 = this; - - var dismiss = newElement('button', { - classes: '-mr-1 flex p-1 rounded-md hover:bg-gray-800 focus:outline-none focus:bg-gray-800' - }); - dismiss.innerHTML = "\n \n "); + fetch: function (_fetch) { + function fetch() { + return _fetch.apply(this, arguments); + } - dismiss.onclick = function (e) { - e.preventDefault(); // just do it early if we not logging time. + fetch.toString = function () { + return _fetch.toString(); + }; - if (!_this3.dismissFor) return _this3.destroy(); + return fetch; + }(function () { + var _this = this; - if (localStorage) { - localStorage.setItem('h-bar_dismiss_for', _this3.dismissFor.getTime()); + if (this.rendered) return; + if (isDismissed()) return; + this.fetching = true; + fetch(this.url, this.fetchOptions).then(function (response) { + return response.json(); + }).then(function (json) { + if (_typeof(json) == "object") { + _this.render(json); + } else { + console.error("".concat(_this.url, " Did not return an object")); } - return _this3.destroy(); - }; - - return dismiss; - }, + _this.fetching = false; + })["catch"](function (error) { + console.error(error); + _this.fetching = false; + _this.rendered = false; + }); + }), /** - * Determines if the banner has been dismissed. + * Render the response to the actual message * - * @returns boolean + * @param {Object} result */ - isDismissed: function isDismissed() { - if (localStorage) { - var dismissDate = localStorage.getItem('h-bar_dismiss_for'); + render: function render(result) { + var _this2 = this; - if (!dismissDate) { - return false; - } + normaliser(result).then(function (result) { + var element = document.querySelector(_this2.$el); + element.innerHTML = _this2.renderer.resolve(result); + element.__hbar__ = _this2; + _this2.rendered = true; - dismissDate = dismissDate; - var ourDate = new Date().getTime(); + _this2.onCompleted({ + __hbar__: _this2, + result: element + }); + })["catch"](function (error) { + console.error(error); - if (ourDate <= dismissDate) { - return true; - } - } + _this2.destroy(); - return false; + _this2.fetching = false; + _this2.rendered = false; + + _this2.onFailure({ + __hbar__: _this2 + }); + }); }, /** - * Creates the secondary links for the bar. + * Removes the element in the case of it having issues. + * Rather an aggressive option. + * + * Also used when dismissing. */ - createSecondaryLinks: function createSecondaryLinks() { - var _this4 = this; + destroy: function destroy() { + try { + document.querySelector(this.$el).innerHTML = ''; + return true; + } catch (error) { + console.error('Unable to destroy the h-bar wrapper'); + console.error(error); + } - if (!this.secondaryLinks) return []; - return this.secondaryLinks.map(function (_ref2) { - var title = _ref2.title, - link = _ref2.link; - var style = "".concat(_this4.styling.secondaryLink, " ").concat(themes[_this4.theme].secondaryLink); - var butter = newElement('a', { - classes: style - }); - butter.href = link; - butter.innerText = title; - return butter; - }, this); + return false; } }; +Object.defineProperties(hBar, { + /** + * Config method should not be changed + */ + 'init': { + writable: false, + configurable: false + }, + 'destroy': { + writable: false, + configurable: false + }, + 'fetch': { + writable: false, + configurable: false + } +}); /* harmony default export */ var src = __webpack_exports__["default"] = (hBar); /***/ }) diff --git a/dist/hBar.min.js b/dist/hBar.min.js index ea53c8a..74df915 100644 --- a/dist/hBar.min.js +++ b/dist/hBar.min.js @@ -1 +1,8 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.hBar=t():e.hBar=t()}(window,function(){return n={},o.m=r=[function(e,t,r){var n=r(1),o=r(2);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var i={insert:"head",singleton:!1},a=(n(o,i),o.locals?o.locals:{});e.exports=a},function(e,t,i){"use strict";var r,n,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},a=(n={},function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}),d=[];function b(e){for(var t=-1,r=0;r\n \n \n ';var n=c("div",{classes:"".concat(a.styling.linkWrapper," ").concat(s[a.theme].linkWrapper),children:[t,r]}),o=c("div",{classes:"".concat(a.styling.wrapper," ").concat(s[a.theme].wrapper),children:[n,e]}),i=document.getElementById(a.ele);i.innerHTML="",i.appendChild(o),a.onCompleted({element:i,id:a.ele})}else console.error("[h-bar] no post data, unable to render")})},destroy:function(){try{return document.getElementById(this.ele).remove(),!0}catch(e){console.error("Unable to destroy the h-bar wrapper"),console.error(e)}return!1},dismissibleButton:function(){var t=this,e=c("button",{classes:"-mr-1 flex p-1 rounded-md hover:bg-gray-800 focus:outline-none focus:bg-gray-800"});return e.innerHTML='\n \n '),e.onclick=function(e){return e.preventDefault(),t.dismissFor&&localStorage&&localStorage.setItem("h-bar_dismiss_for",t.dismissFor.getTime()),t.destroy()},e},isDismissed:function(){if(localStorage){var e=localStorage.getItem("h-bar_dismiss_for");if(!e)return!1;if(e=e,(new Date).getTime()<=e)return!0}return!1},createSecondaryLinks:function(){var o=this;return this.secondaryLinks?this.secondaryLinks.map(function(e){var t=e.title,r=e.link,n=c("a",{classes:"".concat(o.styling.secondaryLink," ").concat(s[o.theme].secondaryLink)});return n.href=r,n.innerText=t,n},this):[]}};t.default=o}],o.c=n,o.d=function(e,t,r){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(o.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)o.d(r,n,function(e){return t[e]}.bind(null,n));return r},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=4).default;function o(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}var r,n}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.hBar=t():e.hBar=t()}(window,function(){return n={},o.m=r=[function(e,t,r){var n=r(1),o=r(2);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var i={insert:"head",singleton:!1},a=(n(o,i),o.locals?o.locals:{});e.exports=a},function(e,t,i){"use strict";var r,n,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},a=(n={},function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(e){t=null}n[e]=t}return n[e]}),b=[];function d(e){for(var t=-1,r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r\n \n \n ';var n=g("div",{classes:"".concat(b," ").concat(a.theme.linkWrapper),children:[t,r]}),o=g("div",{classes:"".concat(h," ").concat(a.theme.wrapper),children:[n,e]}),i=document.querySelector(a.$el);i.innerHTML="",i.appendChild(o)}else console.error("[h-bar] no post data, unable to render")})}},{key:"destroy",value:function(){try{return!(document.querySelector(this.$el).innerHTML="")}catch(e){console.error("Unable to destroy the h-bar wrapper"),console.error(e)}return!1}},{key:"dismissibleButton",value:function(){var t=this,e=g("button",{classes:"hb--mr-2 hb-flex hb-p-1 hb-rounded-md ".concat(this.theme.dismiss," hover:hb-text-white hover:hb-bg-gray-800 focus:hb-outline-none focus:hb-bg-gray-800")});return e.innerHTML='\n \n ',e.onclick=function(e){return e.preventDefault(),t.dismissFor&&localStorage&&localStorage.setItem("h-bar_dismiss_for",t.dismissFor.getTime()),t.destroy()},e}},{key:"createSecondaryLinks",value:function(e){var o=this;return e?e.map(function(e){var t=e.title,r=e.link,n=g("a",{classes:"".concat(i," ").concat(o.theme.secondaryLink)});return n.href=r,n.innerText=t,n},this):[]}}])&&v(e.prototype,t),r&&v(e,r),a}();function w(e){return(w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)} +/** + * h-bar banner and dynamic announcement library + * + * @version 2.0.0 + * @license MIT + * @copyright @ReeceM + */var k,j={version:"2.0.0",rendered:!1,fetching:!1,usingBanner:!0,init:function(e){var t,r=0 +
+ h-bar announcements +
+
+ h-bar Announcement banner +
+ + +The announcement bar uses native methods to make the library lightweight so that it can be loaded quickly, bar the webpack stuff. + +**Note** +The initial version makes use of the WordPress API to be able to get the latest post. + +i.e. it expects a json structure like so: +From a url like `http://blog.example.com/wp-json/wp/v2/posts?per_page=1&_fields=id,title,link` +```json +[ + { + "id": 175, + "link": "https:\/\/blog.example.com\/how-to-hunt-a-vole\/", + "title": { + "rendered": "How To Hunt A Vole" + } + } +] +``` + +I plan to add more options and a parser callback that can be defined to extract a standard format. + +## Installation + +You can install the package via npm: + +```bash +npm i @reecem/h-bar +``` + +Or use jsDelivr: +```html + ... + + ... +``` + +> If you are customising the styling and overriding it with your own styling then you will also need an instance of your css or a tailwindcss file installed as only the classes needed are packaged with h-bar + +## Example page + +You can view an [example page](https://reecem.github.io/h-bar/example.html) + +## Usage + +You can import it directly into your javascript app or use it in the html. + +```html + + + + +``` + +The initialization object currently has this structure and defaults: + +```javascript +{ + url: "https://your.blog/api/....", + onCompleted: "callback function", + link: "The link url, can be force and no need to fetch from API", + title: "The link url, can be force and no need to fetch from API", + secondaryLinks: [ + { + title: "Docs", + link: "http:://docs.example.com" + } + ], + parser: (data) => {/** Parser function */} + dismissible: false, // dismissible banner flag + dismissFor: new Date('2020-03-30'), // would dismiss it till end of March 30th 2020 + theme: "gray", + headers: { + "Authorization": "Bearer {TOKEN}" + }, + customStyles: { + wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row sm:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", + linkWrapper: "hb-flex hb-items-center", + badge: "hb-px-2 hb-mx-2 hb-leading-relaxed hb-tracking-wider hb-uppercase hb-font-semibold hb-rounded-full hb-text-xs", + postTitle: "hover:hb-underline", + secondaryLink: "hb-mx-5 hb-cursor-pointer hover:hb-underline", + } +} +``` + +### Parser function + +There is the availability of adding a custom parser function to override any of the default ones provided by the package. + +This is handy if you have a custom endpoint that say would return also the secondary links or has a different data structure. + +The parser function should always return an object with the structure: +```javascript +{ + title: String, + link: String, + /** the secondaryLinks is optional. + * It will also override the links parsed in the init() arguments. + */ + secondaryLinks: [ + { + title: String, + link: String, + }, + ] +} +``` + +You can define the function inside the `init()` method as follows: +```javascript + +hBar.init({ + url: "https://api.github.com/repos/ReeceM/h-bar/releases", + parser: (data) => { + // getting the first release on the list of releases from github. + const {name, html_url} = data[0]; + + return { + title: `Lateset version available ${name}`, + link: html_url + }; + } +}) +``` + +### Dismissing Notifications + +> Available from `v0.3.0`/`v1.0.0` + +**Temporary Dismissing** +To be able to dismiss a notification, please note it currently removes secondary links. It is therefore useful that you use this feature when just making announcements of a event or brief notification. + +The way to activate session based dismissal is: + +```javascript +{ + //... rest of config + dismissible: true, + //... rest of config +} +``` + +This will just disable the banner for the current page visit, if the user reloads, its back. + +**Time based dismissing** + +To dismiss the banner until another time, you can set the `dismissFor` variable, this requires a `Date()` object. + +When you set this and the banner is dismissed, the UTC milliseconds are stored in the localStorage, this is then read back when loading h-Bar. + +```javascript +{ + //... rest of config + dismissible: true, + dismissFor: new Date('2020-03-30'), // would dismiss it till end of march 30th +} +``` + +If you fail to set the value properly, it won't dismiss and the banner will show by default. + + +## Testing + +_to come_ please make a PR if you know how to do it on JS. + +## Changelog + +Please see [CHANGELOG](https://github.com/ReeceM/h-bar/blob/master/CHANGELOG.md) for more information on what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](https://github.com/ReeceM/h-bar/blob/master/CONTRIBUTING.md) for details. + +## Security + +[SECURITY](https://github.com/ReeceM/h-bar/security/policy) + +If you discover any security related issues, please email zsh.rce@gmail.com instead of using the issue tracker. + +## Credits + +- [ReeceM](https://github.com/ReeceM) +- [All Contributors](../../contributors) + +## Support + +Buy Me A Coffee + +[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/S6S7UQ66) + +## License + +The MIT License (MIT). Please see [License File](https://github.com/ReeceM/h-bar/blob/master/LICENSE.md) for more information. diff --git a/docs/_coverpage.md b/docs/_coverpage.md new file mode 100644 index 0000000..bc02aae --- /dev/null +++ b/docs/_coverpage.md @@ -0,0 +1,14 @@ + + +📣 + +# h-bar v2.0 + +> An Announcement Banner that is lightweight and customizable + +- Simple and lightweight (~5.6kB gzipped) +- Customizable with personal templates +- Multiple default themes ready to go + +[GitHub](https://github.com/reecem/h-bar/) +[Get Started](#h-bar-lightweight-announcement-bar) diff --git a/docs/example.html b/docs/example.html index 923aec0..a56d9a6 100644 --- a/docs/example.html +++ b/docs/example.html @@ -7,7 +7,7 @@ -
+
@@ -65,7 +65,39 @@

Features

- + + + + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..737637e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + An Announcement Banner that is lightweight and customizable + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 861cb41..563ab3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "h-bar", - "version": "0.0.6", + "name": "@reecem/h-bar", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,33 +14,66 @@ } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + } } }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", @@ -57,14 +90,20 @@ } }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -74,12 +113,12 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", + "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.5", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -104,38 +143,60 @@ "@babel/types": "^7.8.3" } }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", "dev": true, "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { @@ -160,14 +221,14 @@ } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { @@ -207,16 +268,17 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", "lodash": "^4.17.13" } }, @@ -258,15 +320,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { @@ -288,6 +350,12 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", @@ -301,31 +369,31 @@ } }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -369,14 +437,25 @@ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "@babel/plugin-proposal-object-rest-spread": { + "@babel/plugin-proposal-numeric-separator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz", + "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.9.5" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -390,9 +469,9 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", @@ -400,12 +479,12 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-create-regexp-features-plugin": "^7.8.8", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -445,6 +524,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", @@ -521,17 +609,17 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", + "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" } @@ -546,9 +634,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", + "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -584,9 +672,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", - "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -621,47 +709,47 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -694,12 +782,11 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", - "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", + "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.8.3", "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } @@ -714,12 +801,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", "dev": true, "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { @@ -789,27 +876,29 @@ } }, "@babel/preset-env": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", - "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.5.tgz", + "integrity": "sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-proposal-async-generator-functions": "^7.8.3", "@babel/plugin-proposal-dynamic-import": "^7.8.3", "@babel/plugin-proposal-json-strings": "^7.8.3", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.5", "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", @@ -818,26 +907,26 @@ "@babel/plugin-transform-async-to-generator": "^7.8.3", "@babel/plugin-transform-block-scoped-functions": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.5", "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", "@babel/plugin-transform-dotall-regex": "^7.8.3", "@babel/plugin-transform-duplicate-keys": "^7.8.3", "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-for-of": "^7.9.0", "@babel/plugin-transform-function-name": "^7.8.3", "@babel/plugin-transform-literals": "^7.8.3", "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", "@babel/plugin-transform-new-target": "^7.8.3", "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-parameters": "^7.9.5", "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", "@babel/plugin-transform-reserved-words": "^7.8.3", "@babel/plugin-transform-shorthand-properties": "^7.8.3", "@babel/plugin-transform-spread": "^7.8.3", @@ -845,37 +934,92 @@ "@babel/plugin-transform-template-literals": "^7.8.3", "@babel/plugin-transform-typeof-symbol": "^7.8.4", "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.5", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.5", + "browserslist": "^4.9.1", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", + "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.5", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -899,24 +1043,43 @@ } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", + "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, "@fullhuman/postcss-purgecss": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.0.6.tgz", - "integrity": "sha512-RgD05Yd1VFudo1H1b2inb+10AS1mexp1edHfdoJvoeKaoMVoi/9DWrbWOpIrDmKq1CO82oQrb5wf4V64oaNkKQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.1.2.tgz", + "integrity": "sha512-Jf34YVBK9GtXTblpu0svNUJdA7rTQoRMz+yEJe6mwTnXDIGipWLzaX/VgU/x6IPC6WvU5SY/XlawwqhxoyFPTg==", "dev": true, "requires": { - "postcss": "7.0.26", - "purgecss": "^2.0.6" + "postcss": "7.0.27", + "purgecss": "^2.1.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "@nodelib/fs.scandir": { @@ -987,178 +1150,177 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" + "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, @@ -1175,9 +1337,9 @@ "dev": true }, "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-node": { @@ -1189,14 +1351,6 @@ "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true - } } }, "acorn-walk": { @@ -1373,30 +1527,136 @@ "dev": true }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", + "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", "dev": true, "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "dependencies": { + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001040", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001040.tgz", + "integrity": "sha512-Ep0tEPeI5wCvmJNrXjE3etgfI+lkl1fTDU6Y3ZH1mhrjkPlVI9W4pcKbMo+BQLpEWKVYYp2EmYaRsqpPC3k7lQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.401.tgz", + "integrity": "sha512-9tvSOS1++0EQP0tkgyD8KJergVZsld1/UqOusZVTbx9MWZHw5NCezkOjIQ5YWeB45jKdQerDfRrt28HwidI9Ow==", + "dev": true + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dev": true, "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "pify": "^4.0.1" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } } }, "babel-plugin-dynamic-import-node": { @@ -1678,9 +1938,9 @@ "dev": true }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -2079,18 +2339,18 @@ } }, "cross-env": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.0.tgz", - "integrity": "sha512-rV6M9ldNgmwP7bx5u6rZsTbYidzwvrwIYZnT08hSGLcQCcggofgFW+sNe7IhA1SRauPS0QuLbbX+wdNtpqE5CQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", "dev": true, "requires": { "cross-spawn": "^7.0.1" }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -2179,9 +2439,9 @@ } }, "css-loader": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", - "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", + "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -2189,24 +2449,60 @@ "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.23", + "postcss": "^7.0.27", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", + "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.5", + "semver": "^6.3.0" }, "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "dev": true, "requires": { - "ajv": "^6.10.2", + "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -2931,9 +3227,9 @@ } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "file-uri-to-path": { @@ -3063,9 +3359,9 @@ "dev": true }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "dev": true, "optional": true, "requires": { @@ -3119,7 +3415,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "dev": true, "optional": true @@ -3291,7 +3587,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "dev": true, "optional": true @@ -3316,12 +3612,12 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "dev": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -3331,7 +3627,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "dev": true, "optional": true, @@ -3360,7 +3656,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "dev": true, "optional": true, @@ -3385,13 +3681,14 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -3471,18 +3768,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "dev": true, "optional": true, @@ -4425,12 +4714,6 @@ "semver": "^5.6.0" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -4558,9 +4841,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mississippi": { @@ -4603,20 +4886,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -5082,6 +5357,60 @@ "find-up": "^3.0.0" } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -5745,9 +6074,9 @@ } }, "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, "requires": { "postcss": "^7.0.6", @@ -6049,9 +6378,9 @@ } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, "pretty-hrtime": { @@ -6144,21 +6473,38 @@ "dev": true }, "purgecss": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.0.6.tgz", - "integrity": "sha512-Xab72ykpWtg+j/dTphz9HCrychRNbMebNBrI+pOU0mC7mG5OlwRksEEpNAdOLb1jg9oRHDDu6Exe+nlM9ZLp5Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.2.tgz", + "integrity": "sha512-5oDBxiT9VonwKmEMohPFRFZrj8fdSVKxHPwq7G5Rx/2pXicZFJu+D4m5bb3NuV0sSK3ooNxq5jFIwwHzifP5FA==", "dev": true, "requires": { - "commander": "^4.0.0", + "commander": "^5.0.0", "glob": "^7.0.0", - "postcss": "7.0.26", + "postcss": "7.0.27", "postcss-selector-parser": "^6.0.2" }, "dependencies": { "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -6268,21 +6614,28 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" } }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", "dev": true, "requires": { - "private": "^0.1.6" + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" } }, "regex-not": { @@ -6296,17 +6649,17 @@ } }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { @@ -6316,9 +6669,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -7096,9 +7449,9 @@ "dev": true }, "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "4.6.11", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.11.tgz", + "integrity": "sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -7219,9 +7572,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tty-browserify": { @@ -7302,15 +7655,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { @@ -7504,26 +7857,26 @@ "dev": true }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" } }, "webpack": { - "version": "4.41.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", - "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", "acorn": "^6.2.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", @@ -7535,7 +7888,7 @@ "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", @@ -7543,6 +7896,29 @@ "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "webpack-cli": { diff --git a/package.json b/package.json index 1fb5a68..8642820 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "@reecem/h-bar", - "version": "1.0.0", - "description": "Lightweight Announcement Bar with Tailwindcss, extendable too", - "main": "dist/hBar.js", + "version": "2.0.0-rc1", + "description": "Lightweight Announcement Bar", + "main": "dist/hBar.min.js", "scripts": { "dev": "cross-env NODE_ENV=development webpack --mode development --config webpack.config.js", "build": "cross-env NODE_ENV=production webpack --mode production --config webpack.config.js", @@ -24,22 +24,22 @@ "bugs": { "url": "https://github.com/ReeceM/h-bar/issues" }, - "homepage": "https://github.com/ReeceM/h-bar#readme", + "homepage": "https://reecem.github.io/h-bar", "devDependencies": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@fullhuman/postcss-purgecss": "^2.0.6", - "autoprefixer": "^9.7.4", - "babel-loader": "^8.0.6", - "cross-env": "^7.0.0", - "css-loader": "^3.4.2", + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@fullhuman/postcss-purgecss": "^2.1.2", + "autoprefixer": "^9.7.6", + "babel-loader": "^8.1.0", + "cross-env": "^7.0.2", + "css-loader": "^3.5.1", "cssnano": "^4.1.10", "postcss-cli": "^7.1.0", "postcss-loader": "^3.0.0", "style-loader": "^1.1.3", "tailwindcss": "^1.2.0", "uglifyjs-webpack-plugin": "^2.2.0", - "webpack": "^4.41.6", + "webpack": "^4.42.1", "webpack-cli": "^3.3.11" } } diff --git a/src/banner/banner.js b/src/banner/banner.js new file mode 100644 index 0000000..424ae32 --- /dev/null +++ b/src/banner/banner.js @@ -0,0 +1,135 @@ +import { domReady, newElement, isDismissed } from "../utils"; +import { styling } from './styling'; + +export default class Banner { + + /** + * + * @param {object} param0 + */ + constructor({ $el, dismissible, dismissFor, theme, badge }) { + this.$el = $el; + this.dismissible = dismissible; + this.dismissFor = dismissFor; + this.badge = badge; + this.theme = theme + } + + /** + * Render the element. + */ + resolve({ title, link, secondaryLinks}) { + if (isDismissed()) return; + + domReady().then(() => { + + if (!title) { + console.error('[h-bar] no post data, unable to render'); + return; + } + + let secondaryElement = null; + + if (!this.dismissible) { + let secondaryLinkList = this.createSecondaryLinks(secondaryLinks) + secondaryElement = newElement('div', { + children: secondaryLinkList, + classes: `${styling.linkWrapper} ${this.theme.linkWrapper}` + }) + } else { + secondaryElement = this.dismissibleButton(); + } + + let badgeElement = newElement('span', { classes: `${styling.badge} ${this.theme.badge}` }) + let postLink = newElement('a', { classes: `${styling.postTitle} ${this.theme.postTitle}` }) + + badgeElement.innerText = this.badge; + postLink.href = link; + postLink.innerText = title; + + postLink.innerHTML += ` + + + + ` + + let postElement = newElement('div', { + classes: `${styling.linkWrapper} ${this.theme.linkWrapper}`, + children: [badgeElement, postLink] + }) + + let _hbar = newElement('div', { + classes: `${styling.wrapper} ${this.theme.wrapper}`, + children: [postElement, secondaryElement] + }) + + let container = document.querySelector(this.$el); + + container.innerHTML = "" + container.appendChild(_hbar) + }) + } + + /** + * Removes the element in the case of it having issues. + * Rather an aggressive option. + * + * Also used when dismissing. + */ + destroy() { + try { + document.querySelector(this.$el).innerHTML = ''; + return true; + } catch (error) { + console.error('Unable to destroy the h-bar wrapper') + console.error(error) + } + return false; + } + + /** + * Creates the HTML node for a dismissible button. + * + * @returns HTMLElement + */ + dismissibleButton() { + let dismiss = newElement('button', { + classes: `hb--mr-2 hb-flex hb-p-1 hb-rounded-md ${this.theme.dismiss} hover:hb-text-white hover:hb-bg-gray-800 focus:hb-outline-none focus:hb-bg-gray-800`, + }); + + dismiss.innerHTML = ` + + ` + + dismiss.onclick = (e) => { + e.preventDefault(); + + // just do it early if we not logging time. + if (!this.dismissFor) return this.destroy(); + + if (localStorage) { + localStorage.setItem('h-bar_dismiss_for', this.dismissFor.getTime()); + } + + return this.destroy(); + } + + return dismiss; + } + + /** + * Creates the secondary links for the bar. + */ + createSecondaryLinks(secondaryLinks) { + if (!secondaryLinks) return []; + + return secondaryLinks.map(({ title, link }) => { + let style = `${styling.secondaryLink} ${this.theme.secondaryLink}`; + let butter = newElement('a', { classes: style }) + butter.href = link; + butter.innerText = title; + + return butter; + }, this); + } +} diff --git a/src/config/styling.js b/src/banner/styling.js similarity index 85% rename from src/config/styling.js rename to src/banner/styling.js index 3ece7be..9511ed2 100644 --- a/src/config/styling.js +++ b/src/banner/styling.js @@ -6,7 +6,7 @@ * @var {object} styling */ export const styling = { - wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row sm:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", + wrapper: "hb-flex hb-w-full hd-flex-col md:hb-flex-row hb-text-sm hb-py-2 md:hb-px-20 hb-px-1 hb-items-center hb-justify-between", linkWrapper: "hb-flex hb-items-center", badge: "hb-px-2 hb-mx-2 hb-leading-relaxed hb-tracking-wider hb-uppercase hb-font-semibold hb-rounded-full hb-text-xs", postTitle: "hover:hb-underline hb-inline-flex hb-items-center", @@ -25,7 +25,7 @@ export const themes = { badge: "hb-bg-white hb-text-gray-900", postTitle: "hover:hb-text-gray-300", secondaryLink: "hover:hb-text-gray-300", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, lightGray: { wrapper: "hb-bg-gray-400 hb-text-gray-900", @@ -33,7 +33,7 @@ export const themes = { badge: "hb-bg-white hb-text-gray-900 shadow", postTitle: "hover:hb-text-gray-600", secondaryLink: "hover:hb-text-gray-600", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, blue: { wrapper: "hb-bg-blue-900 hb-text-blue-100", @@ -41,7 +41,7 @@ export const themes = { badge: "hb-bg-blue-100 hb-text-blue-900 shadow", postTitle: "hover:hb-text-blue-300", secondaryLink: "hover:hb-text-blue-300", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, green: { wrapper: "hb-bg-green-600 hb-text-green-100", @@ -49,7 +49,7 @@ export const themes = { badge: "hb-bg-green-100 hb-text-green-900", postTitle: "hover:hb-text-green-300", secondaryLink: "hover:hb-text-green-300", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, indigo: { wrapper: "hb-bg-indigo-800 hb-text-indigo-100", @@ -57,7 +57,7 @@ export const themes = { badge: "hb-bg-indigo-100 hb-text-indigo-900 shadow", postTitle: "hover:hb-text-indigo-300", secondaryLink: "hover:hb-text-indigo-300", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, orange: { wrapper: "hb-bg-orange-300 hb-text-orange-900", @@ -65,7 +65,7 @@ export const themes = { badge: "hb-bg-orange-800 hb-text-orange-100 shadow", postTitle: "hover:hb-text-orange-700", secondaryLink: "hover:hb-text-orange-700", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, yellow: { wrapper: "hb-bg-yellow-300 hb-text-yellow-900", @@ -73,7 +73,7 @@ export const themes = { badge: "hb-bg-yellow-100 hb-text-yellow-900 shadow", postTitle: "hover:hb-text-yellow-700", secondaryLink: "hover:hb-text-yellow-700", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, teal: { wrapper: "hb-bg-teal-500 hb-text-teal-100", @@ -81,7 +81,7 @@ export const themes = { badge: "hb-bg-teal-900 hb-text-teal-100 shadow", postTitle: "hover:hb-text-teal-300", secondaryLink: "hover:hb-text-teal-300", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, red: { wrapper: "hb-bg-red-400 hb-text-red-900", @@ -89,6 +89,6 @@ export const themes = { badge: "hb-bg-red-100 hb-text-red-900 shadow", postTitle: "hover:hb-text-red-100", secondaryLink: "hover:hb-text-red-100", - dismiss: "text-white" + dismiss: "hb-text-gray-800" }, } diff --git a/src/config/config.js b/src/config/config.js index dca7747..b4a081a 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -2,11 +2,9 @@ * The default configuration for the package * * @var {object} config + * @var {object} config.fetchOptions */ export const config = { - url: '', - theme: "gray", - secondaryLinks: [], fetchOptions: { method: 'GET', mode: 'cors', // no-cors, *cors, same-origin diff --git a/src/functions/init.js b/src/functions/init.js index c774568..a99a0e4 100644 --- a/src/functions/init.js +++ b/src/functions/init.js @@ -1,60 +1,60 @@ +import { themes } from '../banner/styling'; import { config } from '../config/config' import { initNormalise } from "./normalise" -import { styling } from "../config/styling" /** + * Set all the configuration options for the hBar library * - * @param {object} param0 - * @param {string} param0.url - * @param {string} param0.ele The element id - * @param {boolean} param0.dismissible - * @param {Date|boolean} param0.dismissFor - * @param {string} param0.badge - * @param {array} param0.secondaryLinks - * @param {object} param0.options - * @param {object} param0.customStyles - * @param {function} param0.parser - * @param {function} param0.onCompleted - * @param {string} param0.link Manual override - * @param {string} param0.title Manual Override + * @param {object} options + * @param {string} options.el The element id + * @param {string} options.template The template id + * @param {string} options.url + * @param {boolean} options.dismissible + * @param {Date|boolean} options.dismissFor + * @param {string} options.badge + * @param {array} options.secondaryLinks + * @param {object} options.headers + * @param {object} options.customStyles + * @param {function} options.parser + * @param {function} options.onCompleted + * @param {function} options.onFailure + * @param {string} options.link Manual override + * @param {string} options.title Manual Override */ -export function init({ - url, /** The URL to fetch data from */ - ele, - dismissible, - dismissFor, - badge, - secondaryLinks, - options, - customStyles, - onCompleted, - parser, - link, /** The link for the new post/article, manual override */ - title, /** The title of the post/article, manual override */ -}) { - this.url = url; +export function init(options = {}) { + let configuration = {}; - this.ele = ele || 'h-bar'; + configuration.$el = options.el; - // we will default to false for this - this.dismissible = dismissible || false; + configuration.url = options.url; + // if the user has dompurify installed. It can be optional + configuration.DOMPurify = options.DOMPurify || null; - this.dismissFor = dismissFor || false; + configuration.theme = themes[options.theme] || 'grey'; + configuration.badge = options.badge || 'New'; - this.config = Object.assign(config, options); - this.styling = Object.assign(styling, customStyles); + // we will default to false for configuration + configuration.dismissible = options.dismissible || false; + configuration.dismissFor = options.dismissFor || false; - this.secondaryLinks = secondaryLinks + configuration.secondaryLinks = options.secondaryLinks || []; - this.onCompleted = onCompleted || function () { }; + /** + * These will be the fallbacks if something isn't found. + */ + configuration.title = options.title || null; + configuration.link = options.link || null; - this.badge = badge || 'New'; - this.postLink = link - this.postTitle = title + configuration.onCompleted = options.onCompleted || function () { }; + configuration.onFailure = options.onFailure || function () { }; - this.theme = this.config.theme + if (typeof options.fetch == 'function') { + configuration.fetch = options.fetch; + } + configuration.fetchOptions = config.fetchOptions; + configuration.fetchOptions.headers = Object.assign(config.fetchOptions.headers, options.headers) - initNormalise(parser) + initNormalise(options.parser || null) - return this + return configuration; } diff --git a/src/functions/renderer.js b/src/functions/renderer.js new file mode 100644 index 0000000..37649a9 --- /dev/null +++ b/src/functions/renderer.js @@ -0,0 +1,51 @@ +export default class Renderer { + /** + * Creates a new simple renderer for the templates + * + * @param {string} el the element ID that has the template data + * @param {object} data The key:value pair of the data to replace in the template + * @param {DOMPurify} DOMPurify the DOMPurify library + */ + constructor(el, DOMPurify) { + this.template = document.querySelector(el) + this.DOMPurify = DOMPurify; + } + + resolve(data) { + let templateHTML = this.template.innerHTML + + /** + * Don't do anything if there is a no content + */ + if (templateHTML == undefined) { + return null; + } + + Object.keys(data) + .forEach((key) => { + // skip any array things. + // make the thing recursive in x version xD + if (!Array.isArray(data[key])) { + var regex = this.regex(key) + templateHTML = templateHTML.replace(regex, data[key]); + } + }) + + if (this.DOMPurify) { + return this.DOMPurify.sanitize(templateHTML); + } + + return templateHTML; + } + + /** + * Create the matching regex for the template tags + * + * @param {string} key The key to search in the template data + * @returns {RegExp} + */ + regex(key) { + // current tag is {% value %} + return new RegExp(`({%\\s*(${key})\\s*%})`, 'g'); + } +} diff --git a/src/index.js b/src/index.js index 06807eb..06b6b67 100644 --- a/src/index.js +++ b/src/index.js @@ -1,114 +1,142 @@ /** - * h-bar announcement banner + * h-bar banner and dynamic announcement library * - * @version 1.0.0 - * @author ReeceM + * @version 2.0.0 + * @license MIT + * @copyright @ReeceM */ import "./styles.css" -import { init } from "./functions/init" -import { themes } from "./config/styling" -import { domReady, newElement } from "./utils" + +import { init } from './functions/init'; import { normaliser } from "./functions/normalise" +import { getElementOptions, isDismissed } from "./utils"; +import Renderer from './functions/renderer'; +import Banner from './banner/banner'; +/** + * Set all the configuration options for the hBar library + * + * @property {string} el The element id + * @property {string} url + * @property {boolean} dismissible + * @property {Date|boolean} dismissFor + * @property {string} badge + * @property {DOMPurify} DOMPurify the DOMPurify library + * @property {array} secondaryLinks + * @property {object} headers + * @property {object} customStyles + * @property {function} parser + * @property {object} renderer + * @property {function} onCompleted + * @property {function} onFailure + * @property {string} link Manual override + * @property {string} title Manual Override + */ const hBar = { - /** - * h-bar version number - */ - version: "1.0.0", + version: "2.0.0", + rendered: false, + fetching: false, + usingBanner: true, /** - * Initialise the hBar package + * Set all the configuration options for the hBar library * - * @inheritdoc - * @returns {hBar} + * @param {object} options + * @param {string} options.el The element id + * @param {string} options.url + * @param {boolean} options.dismissible + * @param {Date|boolean} options.dismissFor + * @param {string} options.badge + * @param {array} options.secondaryLinks + * @param {object} options.headers + * @param {object} options.customStyles + * @param {function} options.parser + * @param {function} options.onCompleted + * @param {string} options.link Manual override + * @param {string} options.title Manual Override */ - init: init, + init: function (options = {}) { + Object.assign(this, init(options)) + + this.$elementOpt = getElementOptions(document.querySelector(this.$el)); + + if (this.$elementOpt.template) { + this.renderer = new Renderer(this.$elementOpt.template, this.DOMPurify); + } else if (options.renderer) { + /** + * @todo this was added on a whim... bad idea possibly + */ + this.renderer = new options.renderer(this); + } else { + this.renderer = new Banner(this); + } + + Object.defineProperties(this, { + 'renderer': { + configurable: false, + writable: false, + } + }) + }, /** - * Fetch the data from the endpoint + * Gets the data from the url endpoint. + * + * This is called by the */ - fetchData() { - if (this.isDismissed()) return; + fetch: function () { + + if (this.rendered) return; - fetch(this.url, this.config.fetchOptions) + if (isDismissed()) return; + + this.fetching = true; + + fetch(this.url, this.fetchOptions) .then(response => { return response.json() }) .then(json => { if (typeof json == "object") { - normaliser(json) - .then(({ title, link, secondaryLinks }) => { - this.postTitle = title - this.postLink = link - this.secondaryLinks = secondaryLinks || [] - - this.render() - }) - .catch(error => { - console.error(error) - this.destroy(); - }); + this.render(json); } else { console.error(`${this.url} Did not return an object`); } + + this.fetching = false; + }) + .catch(error => { + console.error(error); + this.fetching = false; + this.rendered = false; }); }, /** - * Render the element. + * Render the response to the actual message + * + * @param {Object} result */ - render() { - if (this.isDismissed()) return; - domReady().then(() => { - - if (!this.postTitle) { - console.error('[h-bar] no post data, unable to render'); - return; - } + render: function (result) { - let secondaryElement = null; + normaliser(result) + .then((result) => { + let element = document.querySelector(this.$el); - if (!this.dismissible) { - let secondaryLinkList = this.createSecondaryLinks() - secondaryElement = newElement('div', { - children: secondaryLinkList, - classes: `${this.styling.linkWrapper} ${themes[this.theme].linkWrapper}` - }) - } else { - secondaryElement = this.dismissibleButton(); - } - - let badge = newElement('span', { classes: `${this.styling.badge} ${themes[this.theme].badge}` }) - let postLink = newElement('a', { classes: `${this.styling.postTitle} ${themes[this.theme].postTitle}` }) + element.innerHTML = this.renderer.resolve(result) + element.__hbar__ = this; - badge.innerText = this.badge; - postLink.href = this.postLink; - postLink.innerText = this.postTitle; + this.rendered = true - postLink.innerHTML += ` - - - - ` - - let postElement = newElement('div', { - classes: `${this.styling.linkWrapper} ${themes[this.theme].linkWrapper}`, - children: [badge, postLink] + this.onCompleted({ __hbar__: this, result: element }); }) - - let _hbar = newElement('div', { - classes: `${this.styling.wrapper} ${themes[this.theme].wrapper}`, - children: [postElement, secondaryElement] - }) - - let container = document.getElementById(this.ele); - - container.innerHTML = "" - container.appendChild(_hbar) - - // ? what to send out - this.onCompleted({ element: container, id: this.ele }); - }) + .catch(error => { + console.error(error) + this.destroy(); + this.fetching = false; + this.rendered = false; + this.onFailure({__hbar__: this}) + }); }, /** @@ -117,88 +145,34 @@ const hBar = { * * Also used when dismissing. */ - destroy() { + destroy: function () { try { - document.getElementById(this.ele).remove() - + document.querySelector(this.$el).innerHTML = ''; return true; } catch (error) { console.error('Unable to destroy the h-bar wrapper') console.error(error) } - return false; }, +} +Object.defineProperties(hBar, { /** - * Creates the HTML node for a dismissible button. - * - * @returns HTMLElement + * Config method should not be changed */ - dismissibleButton() { - let dismiss = newElement('button', { - classes: '-mr-1 flex p-1 rounded-md hover:bg-gray-800 focus:outline-none focus:bg-gray-800', - }); - - dismiss.innerHTML = ` - - ` - - dismiss.onclick = (e) => { - e.preventDefault(); - - // just do it early if we not logging time. - if (!this.dismissFor) return this.destroy(); - - if (localStorage) { - localStorage.setItem('h-bar_dismiss_for', this.dismissFor.getTime()); - } - - return this.destroy(); - } - - return dismiss; + 'init': { + writable: false, + configurable: false, }, - - /** - * Determines if the banner has been dismissed. - * - * @returns boolean - */ - isDismissed() { - - if (localStorage) { - var dismissDate = localStorage.getItem('h-bar_dismiss_for'); - if (!dismissDate) { - return false; - } - - dismissDate = dismissDate; - var ourDate = (new Date()).getTime(); - - if (ourDate <= dismissDate) { - return true; - } - } - - return false; + 'destroy': { + writable: false, + configurable: false, }, - - /** - * Creates the secondary links for the bar. - */ - createSecondaryLinks() { - if (!this.secondaryLinks) return []; - - return this.secondaryLinks.map(({ title, link }) => { - let style = `${this.styling.secondaryLink} ${themes[this.theme].secondaryLink}`; - let butter = newElement('a', { classes: style }) - butter.href = link; - butter.innerText = title; - - return butter; - }, this); + 'fetch': { + writable: false, + configurable: false, } -} +}); -export default hBar +export default hBar; diff --git a/src/utils.js b/src/utils.js index 810e777..d53d1d3 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,4 @@ -// Thanks @stimulus: +// Thanks @stimulus: and I got it from @alpinejs // https://github.com/stimulusjs/stimulus/blob/master/packages/%40stimulus/core/src/application.ts export function domReady() { return new Promise(resolve => { @@ -46,3 +46,60 @@ export function addClasses(element, classes = '') { return element } + +/** + * Binds all the methods on a JS Class to the `this` context of the class. + * Adapted from https://github.com/sindresorhus/auto-bind + * @param {object} self The `this` context of the class + * @return {object} The `this` context of the class + */ +export function autoBind(self) { + const keys = Object.getOwnPropertyNames(self.constructor.prototype); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = self[key]; + if (key !== 'constructor' && typeof val === 'function') { + self[key] = val.bind(self); + } + } + + return self; +} + +/** + * Gets the data-* values that area related to the config of the template options. + * + * @param {HTMLElement} element + * @return {Object} + */ +export function getElementOptions(element) { + return { + template: element.dataset.template, + html: element.getAttribute('has-html') == "" ? true : false, + dismissFor: element.dataset.dismissFor || null, + }; +} + +/** + * Determines if the banner has been dismissed. + * + * @returns boolean + */ +export function isDismissed() { + + if (localStorage) { + var dismissDate = localStorage.getItem('h-bar_dismiss_for'); + if (!dismissDate) { + return false; + } + + dismissDate = dismissDate; + var ourDate = (new Date()).getTime(); + + if (ourDate <= dismissDate) { + return true; + } + } + + return false; +}