From fcbbd0116be2b7a94e473f84642c69f14797ad09 Mon Sep 17 00:00:00 2001 From: Owen Melbourne Date: Mon, 19 Aug 2019 10:49:20 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8=20WIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Checkers/Certificate.php | 8 +- app/Checkers/Robots.php | 21 ++ app/Notifications/RobotsHasChanged.php | 80 ++++ composer.json | 3 - composer.lock | 353 +----------------- ...8_19_084235_create_notifications_table.php | 35 ++ public/js/maelstrom.js | 23 +- resources/js/components/CertificateReport.js | 4 +- resources/js/components/UptimeReport.js | 2 +- resources/views/mail/robots-changed.blade.php | 18 + .../maelstrom/layouts/wrapper.blade.php | 19 + 11 files changed, 201 insertions(+), 365 deletions(-) create mode 100644 app/Notifications/RobotsHasChanged.php create mode 100644 database/migrations/2019_08_19_084235_create_notifications_table.php create mode 100644 resources/views/mail/robots-changed.blade.php create mode 100644 resources/views/vendor/maelstrom/layouts/wrapper.blade.php diff --git a/app/Checkers/Certificate.php b/app/Checkers/Certificate.php index 005755b..a9715c8 100644 --- a/app/Checkers/Certificate.php +++ b/app/Checkers/Certificate.php @@ -3,8 +3,8 @@ namespace App\Checkers; use App\Website; -use Andyftw\SSLLabs\Api; use App\CertificateScan; +use VisualAppeal\SslLabs; use Spatie\SslCertificate\SslCertificate; class Certificate @@ -36,7 +36,7 @@ private function fetch() 'did_expire' => $certificate->isExpired(), ]); - $labs = new \VisualAppeal\SslLabs(); + $labs = new SslLabs(); $result = $labs->analyze( $this->website->certificate_hostname, @@ -56,7 +56,9 @@ private function fetch() } } - dump($scan->exists ? 'Cert Updated' : 'Pending...'); + if (app()->runningInConsole()) { + dump($scan->exists ? 'Cert Updated' : 'Pending...'); + } } private function notify() diff --git a/app/Checkers/Robots.php b/app/Checkers/Robots.php index bb2fc6b..7da2dba 100644 --- a/app/Checkers/Robots.php +++ b/app/Checkers/Robots.php @@ -6,12 +6,15 @@ use GuzzleHttp\Client; use App\Website; use SebastianBergmann\Diff\Differ; +use App\Notifications\RobotsHasChanged; class Robots { private $website; + private $scan; + public function __construct(Website $website) { $this->website = $website; @@ -21,6 +24,7 @@ public function run() { $this->fetch(); $this->compare(); + $this->notify(); } private function fetch() @@ -56,5 +60,22 @@ private function compare() $scans->first()->diff = $diff; $scans->first()->save(); + + $this->scan = $scans->first(); + } + + private function notify() + { + if (!$this->scan) { + return null; + } + + if (empty($this->scan->diff)) { + return null; + } + + $this->website->user->notify( + new RobotsHasChanged($this->website, $this->scan) + ); } } diff --git a/app/Notifications/RobotsHasChanged.php b/app/Notifications/RobotsHasChanged.php new file mode 100644 index 0000000..2703e0f --- /dev/null +++ b/app/Notifications/RobotsHasChanged.php @@ -0,0 +1,80 @@ +website = $website; + $this->scan = $scan; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['database', 'mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->subject('🤖 Change detected on: ' . $this->website->url) + ->markdown('mail.robots-changed', [ + 'website' => $this->website, + 'scan' => $this->scan, + ]); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'website_id' => $this->website->id, + 'url' => $this->website->robots_url, + 'changed_on' => $this->scan->created_at, + 'txt' => $this->scan->txt, + 'diff' => $this->scan->diff, + ]; + } +} diff --git a/composer.json b/composer.json index a34b272..baba037 100644 --- a/composer.json +++ b/composer.json @@ -9,8 +9,6 @@ "license": "MIT", "require": { "php": "^7.1.3", - "amhr/laravel-dnsparser": "^1.3@dev", - "andyftw/ssllabs-php": "^1.2", "doctrine/annotations": "^1.7", "fideloper/proxy": "^4.0", "guzzlehttp/guzzle": "^6.3", @@ -18,7 +16,6 @@ "laravel/tinker": "^1.0", "maelstrom-cms/toolkit": "^1.0", "sebastian/diff": "^3.0", - "spatie/dns": "^1.4", "spatie/ssl-certificate": "^1.15", "visualappeal/php-ssllabs-api": "^1.0", "whoisdoma/dnsparser": "dev-master", diff --git a/composer.lock b/composer.lock index b2dcb40..4ba3a96 100644 --- a/composer.lock +++ b/composer.lock @@ -4,87 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ee4227d4054badebf0147d1038e752de", + "content-hash": "e33b62ea1502d8e4760a6166bf7b5390", "packages": [ - { - "name": "amhr/laravel-dnsparser", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Amhr/laravel-dnsparser.git", - "reference": "8038b0ad01d7fa1ada2f212bab4c5d70e3b0a262" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Amhr/laravel-dnsparser/zipball/8038b0ad01d7fa1ada2f212bab4c5d70e3b0a262", - "reference": "8038b0ad01d7fa1ada2f212bab4c5d70e3b0a262", - "shasum": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Mhr\\DNSParser\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "authors": [ - { - "name": "Mohammad", - "email": "pp2007ws@yahoo.com" - } - ], - "time": "2017-12-16T12:12:54+00:00" - }, - { - "name": "andyftw/ssllabs-php", - "version": "v1.2", - "source": { - "type": "git", - "url": "https://github.com/andyftw/ssllabs-php.git", - "reference": "c14869253419916c26086de9e199030763876de4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/andyftw/ssllabs-php/zipball/c14869253419916c26086de9e199030763876de4", - "reference": "c14869253419916c26086de9e199030763876de4", - "shasum": "" - }, - "require": { - "jms/serializer": "^0.16.0", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Andyftw\\SSLLabs\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andy", - "email": "info@andyfront.de", - "homepage": "https://andyfront.de" - } - ], - "description": "SSL Labs API PHP-Port", - "homepage": "https://github.com/andyftw/ssllabs-php", - "keywords": [ - "ssllabs" - ], - "time": "2016-05-24T23:25:27+00:00" - }, { "name": "dnoegel/php-xdg-base-dir", "version": "0.1", @@ -872,166 +793,6 @@ "description": "Highlight PHP code in terminal", "time": "2018-09-29T18:48:56+00:00" }, - { - "name": "jms/metadata", - "version": "1.7.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8", - "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "doctrine/cache": "~1.0", - "symfony/cache": "~3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - }, - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "time": "2018-10-26T12:40:10+00:00" - }, - { - "name": "jms/parser-lib", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", - "shasum": "" - }, - "require": { - "phpoption/phpoption": ">=0.9,<2.0-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-18T18:08:43+00:00" - }, - { - "name": "jms/serializer", - "version": "0.16.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/serializer.git", - "reference": "c8a171357ca92b6706e395c757f334902d430ea9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/c8a171357ca92b6706e395c757f334902d430ea9", - "reference": "c8a171357ca92b6706e395c757f334902d430ea9", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "jms/metadata": "~1.1", - "jms/parser-lib": "1.*", - "php": ">=5.3.2", - "phpcollection/phpcollection": "~0.1" - }, - "require-dev": { - "doctrine/orm": "~2.1", - "doctrine/phpcr-odm": "~1.0.1", - "jackalope/jackalope-doctrine-dbal": "1.0.*", - "propel/propel1": "~1.7", - "symfony/filesystem": "2.*", - "symfony/form": "~2.1", - "symfony/translation": "~2.0", - "symfony/validator": "~2.0", - "symfony/yaml": "2.*", - "twig/twig": ">=1.8,<2.0-dev" - }, - "suggest": { - "symfony/yaml": "Required if you'd like to serialize data to YAML format." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.15-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\Serializer": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes Schmitt", - "role": "Developer of wrapped JMSSerializerBundle", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - } - ], - "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", - "homepage": "http://jmsyst.com/libs/serializer", - "keywords": [ - "deserialization", - "jaxb", - "json", - "serialization", - "xml" - ], - "time": "2014-03-18T08:39:00+00:00" - }, { "name": "laravel/framework", "version": "v5.8.32", @@ -1457,16 +1218,16 @@ }, { "name": "nesbot/carbon", - "version": "2.23.0", + "version": "2.23.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "97a08830a22ce0b69549a4966773c0eae900468d" + "reference": "767617a047e5b8b8b3b0b6023a2650847ed7df02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a08830a22ce0b69549a4966773c0eae900468d", - "reference": "97a08830a22ce0b69549a4966773c0eae900468d", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/767617a047e5b8b8b3b0b6023a2650847ed7df02", + "reference": "767617a047e5b8b8b3b0b6023a2650847ed7df02", "shasum": "" }, "require": { @@ -1520,7 +1281,7 @@ "datetime", "time" ], - "time": "2019-08-12T17:19:41+00:00" + "time": "2019-08-17T13:57:34+00:00" }, { "name": "nikic/php-parser", @@ -1679,54 +1440,6 @@ ], "time": "2018-07-02T15:55:56+00:00" }, - { - "name": "phpcollection/phpcollection", - "version": "0.5.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-collection.git", - "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", - "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", - "shasum": "" - }, - "require": { - "phpoption/phpoption": "1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, - "autoload": { - "psr-0": { - "PhpCollection": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "General-Purpose Collection Library for PHP", - "keywords": [ - "collection", - "list", - "map", - "sequence", - "set" - ], - "time": "2015-05-17T12:39:23+00:00" - }, { "name": "phpoption/phpoption", "version": "1.5.0", @@ -2223,59 +1936,6 @@ ], "time": "2019-02-04T06:01:07+00:00" }, - { - "name": "spatie/dns", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/dns.git", - "reference": "403865f19c01e0b9cfa9356fba5748dd5307b35c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/dns/zipball/403865f19c01e0b9cfa9356fba5748dd5307b35c", - "reference": "403865f19c01e0b9cfa9356fba5748dd5307b35c", - "shasum": "" - }, - "require": { - "php": "^7.1", - "symfony/process": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "role": "Developer", - "email": "freek@spatie.be", - "homepage": "https://spatie.be" - }, - { - "name": "Harish Toshniwal", - "role": "Developer", - "email": "harish@spatie.be", - "homepage": "https://spatie.be" - } - ], - "description": "Retrieve DNS records", - "homepage": "https://github.com/spatie/dns", - "keywords": [ - "dns", - "spatie" - ], - "time": "2019-05-17T07:19:43+00:00" - }, { "name": "spatie/macroable", "version": "1.0.0", @@ -5803,7 +5463,6 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { - "amhr/laravel-dnsparser": 20, "whoisdoma/dnsparser": 20, "whoisdoma/domainparser": 20 }, diff --git a/database/migrations/2019_08_19_084235_create_notifications_table.php b/database/migrations/2019_08_19_084235_create_notifications_table.php new file mode 100644 index 0000000..fb16d5b --- /dev/null +++ b/database/migrations/2019_08_19_084235_create_notifications_table.php @@ -0,0 +1,35 @@ +uuid('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notifications'); + } +} diff --git a/public/js/maelstrom.js b/public/js/maelstrom.js index 6918a02..5f86301 100644 --- a/public/js/maelstrom.js +++ b/public/js/maelstrom.js @@ -12957,7 +12957,7 @@ function (_Component) { }); } }, - loading: this.state.loading || undefined, + loading: this.state.loading, type: "primary", htmlType: "submit", icon: "save" @@ -20568,7 +20568,7 @@ function (_React$Component) { onClick: this.update, type: "default", icon: "save", - loading: this.state.busy || undefined, + loading: this.state.busy, disabled: !this.state.name }, this.state.busy ? 'Saving' : 'Save'), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(antd__WEBPACK_IMPORTED_MODULE_3__["Popconfirm"], { placement: "left", @@ -62521,10 +62521,10 @@ var _package_json__WEBPACK_IMPORTED_MODULE_0___namespace = /*#__PURE__*/__webpac /*!****************************************!*\ !*** ./node_modules/antd/package.json ***! \****************************************/ -/*! exports provided: _from, _id, _inBundle, _integrity, _location, _phantomChildren, _requested, _requiredBy, _resolved, _shasum, _spec, _where, browserslist, bugs, bundleDependencies, contributors, dependencies, deprecated, description, devDependencies, files, homepage, husky, keywords, license, main, module, name, peerDependencies, publishConfig, repository, scripts, sideEffects, title, typings, version, default */ +/*! exports provided: _args, _from, _id, _inBundle, _integrity, _location, _phantomChildren, _requested, _requiredBy, _resolved, _spec, _where, browserslist, bugs, contributors, dependencies, description, devDependencies, files, homepage, husky, keywords, license, main, module, name, peerDependencies, publishConfig, repository, scripts, sideEffects, title, typings, version, default */ /***/ (function(module) { -module.exports = JSON.parse("{\"_from\":\"antd\",\"_id\":\"antd@3.21.4\",\"_inBundle\":false,\"_integrity\":\"sha512-ZtX2UAEewrWUepl4sT6TeJw91A98bgl4VGTjRIKfwzNW1GKGKKf4iI9bA6oCyMt/C4QEFsSsmkBwfBqT+N+Xzg==\",\"_location\":\"/antd\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"tag\",\"registry\":true,\"raw\":\"antd\",\"name\":\"antd\",\"escapedName\":\"antd\",\"rawSpec\":\"\",\"saveSpec\":null,\"fetchSpec\":\"latest\"},\"_requiredBy\":[\"#USER\",\"/\",\"/@maelstrom-cms/toolkit\"],\"_resolved\":\"https://registry.npmjs.org/antd/-/antd-3.21.4.tgz\",\"_shasum\":\"6e5e8c6edde25ddce0aa1c666f0d6ef8d04e821e\",\"_spec\":\"antd\",\"_where\":\"/Users/owen/Sites/odin\",\"browserslist\":[\"last 2 version\",\"Firefox ESR\",\"> 1%\",\"ie >= 9\"],\"bugs\":{\"url\":\"https://github.com/ant-design/ant-design/issues\"},\"bundleDependencies\":false,\"contributors\":[{\"name\":\"ant\"}],\"dependencies\":{\"@ant-design/create-react-context\":\"^0.2.4\",\"@ant-design/icons\":\"~2.1.1\",\"@ant-design/icons-react\":\"~2.0.1\",\"@types/react-slick\":\"^0.23.4\",\"array-tree-filter\":\"^2.1.0\",\"babel-runtime\":\"6.x\",\"classnames\":\"~2.2.6\",\"copy-to-clipboard\":\"^3.2.0\",\"css-animation\":\"^1.5.0\",\"dom-closest\":\"^0.2.0\",\"enquire.js\":\"^2.1.6\",\"lodash\":\"^4.17.13\",\"moment\":\"^2.24.0\",\"omit.js\":\"^1.0.2\",\"prop-types\":\"^15.7.2\",\"raf\":\"^3.4.1\",\"rc-animate\":\"^2.8.3\",\"rc-calendar\":\"~9.15.5\",\"rc-cascader\":\"~0.17.4\",\"rc-checkbox\":\"~2.1.6\",\"rc-collapse\":\"~1.11.3\",\"rc-dialog\":\"~7.5.2\",\"rc-drawer\":\"~2.0.1\",\"rc-dropdown\":\"~2.4.1\",\"rc-editor-mention\":\"^1.1.13\",\"rc-form\":\"^2.4.5\",\"rc-input-number\":\"~4.4.5\",\"rc-mentions\":\"~0.3.1\",\"rc-menu\":\"~7.4.23\",\"rc-notification\":\"~3.3.1\",\"rc-pagination\":\"~1.20.5\",\"rc-progress\":\"~2.5.0\",\"rc-rate\":\"~2.5.0\",\"rc-select\":\"~9.2.0\",\"rc-slider\":\"~8.6.11\",\"rc-steps\":\"~3.4.1\",\"rc-switch\":\"~1.9.0\",\"rc-table\":\"~6.7.0\",\"rc-tabs\":\"~9.6.4\",\"rc-time-picker\":\"~3.7.1\",\"rc-tooltip\":\"~3.7.3\",\"rc-tree\":\"~2.1.0\",\"rc-tree-select\":\"~2.9.1\",\"rc-trigger\":\"^2.6.2\",\"rc-upload\":\"~2.7.0\",\"rc-util\":\"^4.6.0\",\"react-lazy-load\":\"^3.0.13\",\"react-lifecycles-compat\":\"^3.0.4\",\"react-slick\":\"~0.24.0\",\"resize-observer-polyfill\":\"^1.5.1\",\"shallowequal\":\"^1.1.0\",\"warning\":\"~4.0.3\"},\"deprecated\":false,\"description\":\"An enterprise-class UI design language and React components implementation\",\"devDependencies\":{\"@ant-design/colors\":\"^3.1.0\",\"@ant-design/tools\":\"^8.0.4\",\"@packtracker/webpack-plugin\":\"^2.0.1\",\"@sentry/browser\":\"^5.4.0\",\"@types/classnames\":\"^2.2.8\",\"@types/prop-types\":\"^15.7.1\",\"@types/react\":\"^16.9.0\",\"@types/react-dom\":\"^16.8.4\",\"@types/warning\":\"^3.0.0\",\"@typescript-eslint/eslint-plugin\":\"^1.13.0\",\"@typescript-eslint/parser\":\"^1.13.0\",\"@yesmeck/offline-plugin\":\"^5.0.5\",\"antd-theme-generator\":\"^1.1.6\",\"babel-eslint\":\"^10.0.1\",\"babel-plugin-add-react-displayname\":\"^0.0.5\",\"bisheng\":\"^1.3.0\",\"bisheng-plugin-antd\":\"^1.0.2\",\"bisheng-plugin-description\":\"^0.1.4\",\"bisheng-plugin-react\":\"^1.0.0\",\"bisheng-plugin-toc\":\"^0.4.4\",\"chalk\":\"^2.4.2\",\"cross-env\":\"^5.2.0\",\"css-split-webpack-plugin\":\"^0.2.6\",\"dekko\":\"^0.2.1\",\"docsearch.js\":\"^2.6.3\",\"enquire-js\":\"^0.2.1\",\"enzyme\":\"^3.10.0\",\"enzyme-adapter-react-16\":\"^1.14.0\",\"enzyme-to-json\":\"^3.3.5\",\"eslint\":\"^6.1.0\",\"eslint-config-airbnb\":\"^17.1.0\",\"eslint-config-prettier\":\"^6.0.0\",\"eslint-plugin-babel\":\"^5.3.0\",\"eslint-plugin-import\":\"^2.17.3\",\"eslint-plugin-jest\":\"^22.6.4\",\"eslint-plugin-jsx-a11y\":\"^6.2.1\",\"eslint-plugin-markdown\":\"^1.0.0\",\"eslint-plugin-react\":\"^7.14.2\",\"eslint-tinker\":\"^0.5.0\",\"fetch-jsonp\":\"^1.1.3\",\"glob\":\"^7.1.4\",\"husky\":\"^3.0.2\",\"immutability-helper\":\"^3.0.0\",\"intersection-observer\":\"^0.7.0\",\"jest\":\"^24.8.0\",\"jsdom\":\"^15.1.1\",\"jsonml.js\":\"^0.1.0\",\"logrocket\":\"^1.0.0\",\"logrocket-react\":\"^3.0.0\",\"lz-string\":\"^1.4.4\",\"mockdate\":\"^2.0.2\",\"node-fetch\":\"^2.6.0\",\"preact\":\"^8.4.2\",\"preact-compat\":\"^3.18.5\",\"prettier\":\"^1.17.1\",\"pretty-quick\":\"^1.11.0\",\"querystring\":\"^0.2.0\",\"rc-queue-anim\":\"^1.6.12\",\"rc-scroll-anim\":\"^2.5.8\",\"rc-tween-one\":\"^2.4.1\",\"react\":\"^16.5.2\",\"react-color\":\"^2.17.3\",\"react-copy-to-clipboard\":\"^5.0.1\",\"react-dnd\":\"^9.0.0\",\"react-dnd-html5-backend\":\"^9.0.0\",\"react-document-title\":\"^2.0.3\",\"react-dom\":\"^16.5.2\",\"react-github-button\":\"^0.1.11\",\"react-highlight-words\":\"^0.16.0\",\"react-infinite-scroller\":\"^1.2.4\",\"react-intl\":\"^3.1.1\",\"react-resizable\":\"^1.8.0\",\"react-router\":\"^3.2.3\",\"react-router-dom\":\"^5.0.1\",\"react-sticky\":\"^6.0.3\",\"react-test-renderer\":\"^16.8.6\",\"react-virtualized\":\"~9.21.1\",\"reqwest\":\"^2.0.5\",\"rimraf\":\"^2.6.3\",\"scrollama\":\"^2.0.0\",\"simple-git\":\"^1.113.0\",\"stylelint\":\"^10.0.1\",\"stylelint-config-prettier\":\"^5.2.0\",\"stylelint-config-rational-order\":\"^0.1.2\",\"stylelint-config-standard\":\"^18.3.0\",\"stylelint-declaration-block-no-ignored-properties\":\"^2.1.0\",\"stylelint-order\":\"^3.0.0\",\"typescript\":\"~3.5.1\",\"xhr-mock\":\"^2.4.1\",\"xhr2\":\"^0.2.0\"},\"files\":[\"dist\",\"lib\",\"es\"],\"homepage\":\"http://ant.design/\",\"husky\":{\"hooks\":{\"pre-commit\":\"pretty-quick --staged\"}},\"keywords\":[\"ant\",\"design\",\"react\",\"react-component\",\"component\",\"components\",\"ui\",\"framework\",\"frontend\"],\"license\":\"MIT\",\"main\":\"lib/index.js\",\"module\":\"es/index.js\",\"name\":\"antd\",\"peerDependencies\":{\"react\":\">=16.0.0\",\"react-dom\":\">=16.0.0\"},\"publishConfig\":{\"registry\":\"https://registry.npmjs.org/\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/ant-design/ant-design.git\"},\"scripts\":{\"api-collection\":\"antd-tools run api-collection\",\"authors\":\"git log --format='%aN <%aE>' | sort -u | grep -v 'users.noreply.github.com' | grep -v 'gitter.im' | grep -v '.local>' | grep -v 'alibaba-inc.com' | grep -v 'alipay.com' | grep -v 'taobao.com' > AUTHORS.txt\",\"check-commit\":\"node ./scripts/check-commit.js\",\"compile\":\"antd-tools run compile\",\"deploy\":\"bisheng gh-pages --push-only\",\"deploy:china-mirror\":\"git checkout gh-pages && git pull origin gh-pages && git push git@gitee.com:ant-design/ant-design.git gh-pages\",\"dist\":\"antd-tools run dist\",\"lint\":\"npm run lint:ts && npm run lint:ts:with-eslint && npm run lint:es && npm run lint:demo && npm run lint:style && npm run lint:deps\",\"lint-fix\":\"npm run lint-fix:code && npm run lint-fix:demo && npm run lint-fix:style\",\"lint-fix:code\":\"eslint --fix tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'\",\"lint-fix:demo\":\"eslint-tinker ./components/*/demo/*.md\",\"lint-fix:style\":\"stylelint --fix '{site,components}/**/*.less' --syntax less\",\"lint-fix:ts\":\"npm run tsc && antd-tools run ts-lint-fix\",\"lint:demo\":\"cross-env RUN_ENV=DEMO eslint components/*/demo/*.md --ext '.md' --rule 'import/no-unresolved: 0'\",\"lint:deps\":\"antd-tools run deps-lint\",\"lint:es\":\"eslint tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'\",\"lint:md\":\"remark components/\",\"lint:style\":\"stylelint '{site,components}/**/*.less' --syntax less\",\"lint:ts\":\"npm run tsc && antd-tools run ts-lint\",\"lint:ts:with-eslint\":\"eslint components/**/*.tsx\",\"pre-publish\":\"npm run check-commit && npm run test-all\",\"predeploy\":\"antd-tools run clean && npm run site && cp netlify.toml CNAME _site && cp .circleci/config.yml _site\",\"prepublish\":\"antd-tools run guard\",\"prettier\":\"prettier -c --write '**/*'\",\"pretty-quick\":\"pretty-quick\",\"pub\":\"antd-tools run pub\",\"site\":\"bisheng build --ssr -c ./site/bisheng.config.js && node ./scripts/generateColorLess.js\",\"sort-api\":\"antd-tools run sort-api-table\",\"start\":\"rimraf _site && mkdir _site && node ./scripts/generateColorLess.js && cross-env NODE_ENV=development bisheng start -c ./site/bisheng.config.js\",\"start:preact\":\"node ./scripts/generateColorLess.js && cross-env NODE_ENV=development REACT_ENV=preact bisheng start -c ./site/bisheng.config.js\",\"test\":\"jest --config .jest.js --no-cache\",\"test-all\":\"./scripts/test-all.sh\",\"test-node\":\"jest --config .jest.node.js --no-cache\",\"tsc\":\"tsc\"},\"sideEffects\":[\"dist/*\",\"es/**/style/*\",\"lib/**/style/*\",\"*.less\"],\"title\":\"Ant Design\",\"typings\":\"lib/index.d.ts\",\"version\":\"3.21.4\"}"); +module.exports = JSON.parse("{\"_args\":[[\"antd@3.21.4\",\"/Users/storm/Documents/Websites/odin\"]],\"_from\":\"antd@3.21.4\",\"_id\":\"antd@3.21.4\",\"_inBundle\":false,\"_integrity\":\"sha512-ZtX2UAEewrWUepl4sT6TeJw91A98bgl4VGTjRIKfwzNW1GKGKKf4iI9bA6oCyMt/C4QEFsSsmkBwfBqT+N+Xzg==\",\"_location\":\"/antd\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"antd@3.21.4\",\"name\":\"antd\",\"escapedName\":\"antd\",\"rawSpec\":\"3.21.4\",\"saveSpec\":null,\"fetchSpec\":\"3.21.4\"},\"_requiredBy\":[\"/\",\"/@maelstrom-cms/toolkit\"],\"_resolved\":\"https://registry.npmjs.org/antd/-/antd-3.21.4.tgz\",\"_spec\":\"3.21.4\",\"_where\":\"/Users/storm/Documents/Websites/odin\",\"browserslist\":[\"last 2 version\",\"Firefox ESR\",\"> 1%\",\"ie >= 9\"],\"bugs\":{\"url\":\"https://github.com/ant-design/ant-design/issues\"},\"contributors\":[{\"name\":\"ant\"}],\"dependencies\":{\"@ant-design/create-react-context\":\"^0.2.4\",\"@ant-design/icons\":\"~2.1.1\",\"@ant-design/icons-react\":\"~2.0.1\",\"@types/react-slick\":\"^0.23.4\",\"array-tree-filter\":\"^2.1.0\",\"babel-runtime\":\"6.x\",\"classnames\":\"~2.2.6\",\"copy-to-clipboard\":\"^3.2.0\",\"css-animation\":\"^1.5.0\",\"dom-closest\":\"^0.2.0\",\"enquire.js\":\"^2.1.6\",\"lodash\":\"^4.17.13\",\"moment\":\"^2.24.0\",\"omit.js\":\"^1.0.2\",\"prop-types\":\"^15.7.2\",\"raf\":\"^3.4.1\",\"rc-animate\":\"^2.8.3\",\"rc-calendar\":\"~9.15.5\",\"rc-cascader\":\"~0.17.4\",\"rc-checkbox\":\"~2.1.6\",\"rc-collapse\":\"~1.11.3\",\"rc-dialog\":\"~7.5.2\",\"rc-drawer\":\"~2.0.1\",\"rc-dropdown\":\"~2.4.1\",\"rc-editor-mention\":\"^1.1.13\",\"rc-form\":\"^2.4.5\",\"rc-input-number\":\"~4.4.5\",\"rc-mentions\":\"~0.3.1\",\"rc-menu\":\"~7.4.23\",\"rc-notification\":\"~3.3.1\",\"rc-pagination\":\"~1.20.5\",\"rc-progress\":\"~2.5.0\",\"rc-rate\":\"~2.5.0\",\"rc-select\":\"~9.2.0\",\"rc-slider\":\"~8.6.11\",\"rc-steps\":\"~3.4.1\",\"rc-switch\":\"~1.9.0\",\"rc-table\":\"~6.7.0\",\"rc-tabs\":\"~9.6.4\",\"rc-time-picker\":\"~3.7.1\",\"rc-tooltip\":\"~3.7.3\",\"rc-tree\":\"~2.1.0\",\"rc-tree-select\":\"~2.9.1\",\"rc-trigger\":\"^2.6.2\",\"rc-upload\":\"~2.7.0\",\"rc-util\":\"^4.6.0\",\"react-lazy-load\":\"^3.0.13\",\"react-lifecycles-compat\":\"^3.0.4\",\"react-slick\":\"~0.24.0\",\"resize-observer-polyfill\":\"^1.5.1\",\"shallowequal\":\"^1.1.0\",\"warning\":\"~4.0.3\"},\"description\":\"An enterprise-class UI design language and React components implementation\",\"devDependencies\":{\"@ant-design/colors\":\"^3.1.0\",\"@ant-design/tools\":\"^8.0.4\",\"@packtracker/webpack-plugin\":\"^2.0.1\",\"@sentry/browser\":\"^5.4.0\",\"@types/classnames\":\"^2.2.8\",\"@types/prop-types\":\"^15.7.1\",\"@types/react\":\"^16.9.0\",\"@types/react-dom\":\"^16.8.4\",\"@types/warning\":\"^3.0.0\",\"@typescript-eslint/eslint-plugin\":\"^1.13.0\",\"@typescript-eslint/parser\":\"^1.13.0\",\"@yesmeck/offline-plugin\":\"^5.0.5\",\"antd-theme-generator\":\"^1.1.6\",\"babel-eslint\":\"^10.0.1\",\"babel-plugin-add-react-displayname\":\"^0.0.5\",\"bisheng\":\"^1.3.0\",\"bisheng-plugin-antd\":\"^1.0.2\",\"bisheng-plugin-description\":\"^0.1.4\",\"bisheng-plugin-react\":\"^1.0.0\",\"bisheng-plugin-toc\":\"^0.4.4\",\"chalk\":\"^2.4.2\",\"cross-env\":\"^5.2.0\",\"css-split-webpack-plugin\":\"^0.2.6\",\"dekko\":\"^0.2.1\",\"docsearch.js\":\"^2.6.3\",\"enquire-js\":\"^0.2.1\",\"enzyme\":\"^3.10.0\",\"enzyme-adapter-react-16\":\"^1.14.0\",\"enzyme-to-json\":\"^3.3.5\",\"eslint\":\"^6.1.0\",\"eslint-config-airbnb\":\"^17.1.0\",\"eslint-config-prettier\":\"^6.0.0\",\"eslint-plugin-babel\":\"^5.3.0\",\"eslint-plugin-import\":\"^2.17.3\",\"eslint-plugin-jest\":\"^22.6.4\",\"eslint-plugin-jsx-a11y\":\"^6.2.1\",\"eslint-plugin-markdown\":\"^1.0.0\",\"eslint-plugin-react\":\"^7.14.2\",\"eslint-tinker\":\"^0.5.0\",\"fetch-jsonp\":\"^1.1.3\",\"glob\":\"^7.1.4\",\"husky\":\"^3.0.2\",\"immutability-helper\":\"^3.0.0\",\"intersection-observer\":\"^0.7.0\",\"jest\":\"^24.8.0\",\"jsdom\":\"^15.1.1\",\"jsonml.js\":\"^0.1.0\",\"logrocket\":\"^1.0.0\",\"logrocket-react\":\"^3.0.0\",\"lz-string\":\"^1.4.4\",\"mockdate\":\"^2.0.2\",\"node-fetch\":\"^2.6.0\",\"preact\":\"^8.4.2\",\"preact-compat\":\"^3.18.5\",\"prettier\":\"^1.17.1\",\"pretty-quick\":\"^1.11.0\",\"querystring\":\"^0.2.0\",\"rc-queue-anim\":\"^1.6.12\",\"rc-scroll-anim\":\"^2.5.8\",\"rc-tween-one\":\"^2.4.1\",\"react\":\"^16.5.2\",\"react-color\":\"^2.17.3\",\"react-copy-to-clipboard\":\"^5.0.1\",\"react-dnd\":\"^9.0.0\",\"react-dnd-html5-backend\":\"^9.0.0\",\"react-document-title\":\"^2.0.3\",\"react-dom\":\"^16.5.2\",\"react-github-button\":\"^0.1.11\",\"react-highlight-words\":\"^0.16.0\",\"react-infinite-scroller\":\"^1.2.4\",\"react-intl\":\"^3.1.1\",\"react-resizable\":\"^1.8.0\",\"react-router\":\"^3.2.3\",\"react-router-dom\":\"^5.0.1\",\"react-sticky\":\"^6.0.3\",\"react-test-renderer\":\"^16.8.6\",\"react-virtualized\":\"~9.21.1\",\"reqwest\":\"^2.0.5\",\"rimraf\":\"^2.6.3\",\"scrollama\":\"^2.0.0\",\"simple-git\":\"^1.113.0\",\"stylelint\":\"^10.0.1\",\"stylelint-config-prettier\":\"^5.2.0\",\"stylelint-config-rational-order\":\"^0.1.2\",\"stylelint-config-standard\":\"^18.3.0\",\"stylelint-declaration-block-no-ignored-properties\":\"^2.1.0\",\"stylelint-order\":\"^3.0.0\",\"typescript\":\"~3.5.1\",\"xhr-mock\":\"^2.4.1\",\"xhr2\":\"^0.2.0\"},\"files\":[\"dist\",\"lib\",\"es\"],\"homepage\":\"http://ant.design/\",\"husky\":{\"hooks\":{\"pre-commit\":\"pretty-quick --staged\"}},\"keywords\":[\"ant\",\"design\",\"react\",\"react-component\",\"component\",\"components\",\"ui\",\"framework\",\"frontend\"],\"license\":\"MIT\",\"main\":\"lib/index.js\",\"module\":\"es/index.js\",\"name\":\"antd\",\"peerDependencies\":{\"react\":\">=16.0.0\",\"react-dom\":\">=16.0.0\"},\"publishConfig\":{\"registry\":\"https://registry.npmjs.org/\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/ant-design/ant-design.git\"},\"scripts\":{\"api-collection\":\"antd-tools run api-collection\",\"authors\":\"git log --format='%aN <%aE>' | sort -u | grep -v 'users.noreply.github.com' | grep -v 'gitter.im' | grep -v '.local>' | grep -v 'alibaba-inc.com' | grep -v 'alipay.com' | grep -v 'taobao.com' > AUTHORS.txt\",\"check-commit\":\"node ./scripts/check-commit.js\",\"compile\":\"antd-tools run compile\",\"deploy\":\"bisheng gh-pages --push-only\",\"deploy:china-mirror\":\"git checkout gh-pages && git pull origin gh-pages && git push git@gitee.com:ant-design/ant-design.git gh-pages\",\"dist\":\"antd-tools run dist\",\"lint\":\"npm run lint:ts && npm run lint:ts:with-eslint && npm run lint:es && npm run lint:demo && npm run lint:style && npm run lint:deps\",\"lint-fix\":\"npm run lint-fix:code && npm run lint-fix:demo && npm run lint-fix:style\",\"lint-fix:code\":\"eslint --fix tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'\",\"lint-fix:demo\":\"eslint-tinker ./components/*/demo/*.md\",\"lint-fix:style\":\"stylelint --fix '{site,components}/**/*.less' --syntax less\",\"lint-fix:ts\":\"npm run tsc && antd-tools run ts-lint-fix\",\"lint:demo\":\"cross-env RUN_ENV=DEMO eslint components/*/demo/*.md --ext '.md' --rule 'import/no-unresolved: 0'\",\"lint:deps\":\"antd-tools run deps-lint\",\"lint:es\":\"eslint tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'\",\"lint:md\":\"remark components/\",\"lint:style\":\"stylelint '{site,components}/**/*.less' --syntax less\",\"lint:ts\":\"npm run tsc && antd-tools run ts-lint\",\"lint:ts:with-eslint\":\"eslint components/**/*.tsx\",\"pre-publish\":\"npm run check-commit && npm run test-all\",\"predeploy\":\"antd-tools run clean && npm run site && cp netlify.toml CNAME _site && cp .circleci/config.yml _site\",\"prepublish\":\"antd-tools run guard\",\"prettier\":\"prettier -c --write '**/*'\",\"pretty-quick\":\"pretty-quick\",\"pub\":\"antd-tools run pub\",\"site\":\"bisheng build --ssr -c ./site/bisheng.config.js && node ./scripts/generateColorLess.js\",\"sort-api\":\"antd-tools run sort-api-table\",\"start\":\"rimraf _site && mkdir _site && node ./scripts/generateColorLess.js && cross-env NODE_ENV=development bisheng start -c ./site/bisheng.config.js\",\"start:preact\":\"node ./scripts/generateColorLess.js && cross-env NODE_ENV=development REACT_ENV=preact bisheng start -c ./site/bisheng.config.js\",\"test\":\"jest --config .jest.js --no-cache\",\"test-all\":\"./scripts/test-all.sh\",\"test-node\":\"jest --config .jest.node.js --no-cache\",\"tsc\":\"tsc\"},\"sideEffects\":[\"dist/*\",\"es/**/style/*\",\"lib/**/style/*\",\"*.less\"],\"title\":\"Ant Design\",\"typings\":\"lib/index.d.ts\",\"version\":\"3.21.4\"}"); /***/ }), @@ -112526,10 +112526,10 @@ module.exports = JSON.parse("{\"amp\":\"&\",\"apos\":\"'\",\"gt\":\">\",\"lt\":\ /*!*******************************************!*\ !*** ./node_modules/cheerio/package.json ***! \*******************************************/ -/*! exports provided: _from, _id, _inBundle, _integrity, _location, _phantomChildren, _requested, _requiredBy, _resolved, _shasum, _spec, _where, author, bugs, bundleDependencies, dependencies, deprecated, description, devDependencies, engines, files, homepage, keywords, license, main, name, repository, scripts, version, default */ +/*! exports provided: _args, _development, _from, _id, _inBundle, _integrity, _location, _phantomChildren, _requested, _requiredBy, _resolved, _spec, _where, author, bugs, dependencies, description, devDependencies, engines, files, homepage, keywords, license, main, name, repository, scripts, version, default */ /***/ (function(module) { -module.exports = JSON.parse("{\"_from\":\"cheerio@^0.22.0\",\"_id\":\"cheerio@0.22.0\",\"_inBundle\":false,\"_integrity\":\"sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=\",\"_location\":\"/cheerio\",\"_phantomChildren\":{\"boolbase\":\"1.0.0\",\"css-what\":\"2.1.3\",\"domelementtype\":\"1.3.1\",\"nth-check\":\"1.0.2\"},\"_requested\":{\"type\":\"range\",\"registry\":true,\"raw\":\"cheerio@^0.22.0\",\"name\":\"cheerio\",\"escapedName\":\"cheerio\",\"rawSpec\":\"^0.22.0\",\"saveSpec\":null,\"fetchSpec\":\"^0.22.0\"},\"_requiredBy\":[\"/prettify-html\"],\"_resolved\":\"https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz\",\"_shasum\":\"a9baa860a3f9b595a6b81b1a86873121ed3a269e\",\"_spec\":\"cheerio@^0.22.0\",\"_where\":\"/Users/owen/Sites/odin/node_modules/prettify-html\",\"author\":{\"name\":\"Matt Mueller\",\"email\":\"mattmuelle@gmail.com\",\"url\":\"mat.io\"},\"bugs\":{\"url\":\"https://github.com/cheeriojs/cheerio/issues\"},\"bundleDependencies\":false,\"dependencies\":{\"css-select\":\"~1.2.0\",\"dom-serializer\":\"~0.1.0\",\"entities\":\"~1.1.1\",\"htmlparser2\":\"^3.9.1\",\"lodash.assignin\":\"^4.0.9\",\"lodash.bind\":\"^4.1.4\",\"lodash.defaults\":\"^4.0.1\",\"lodash.filter\":\"^4.4.0\",\"lodash.flatten\":\"^4.2.0\",\"lodash.foreach\":\"^4.3.0\",\"lodash.map\":\"^4.4.0\",\"lodash.merge\":\"^4.4.0\",\"lodash.pick\":\"^4.2.1\",\"lodash.reduce\":\"^4.4.0\",\"lodash.reject\":\"^4.4.0\",\"lodash.some\":\"^4.4.0\"},\"deprecated\":false,\"description\":\"Tiny, fast, and elegant implementation of core jQuery designed specifically for the server\",\"devDependencies\":{\"benchmark\":\"^2.1.0\",\"coveralls\":\"^2.11.9\",\"expect.js\":\"~0.3.1\",\"istanbul\":\"^0.4.3\",\"jquery\":\"^3.0.0\",\"jsdom\":\"^9.2.1\",\"jshint\":\"^2.9.2\",\"mocha\":\"^2.5.3\",\"xyz\":\"~0.5.0\"},\"engines\":{\"node\":\">= 0.6\"},\"files\":[\"index.js\",\"lib\"],\"homepage\":\"https://github.com/cheeriojs/cheerio#readme\",\"keywords\":[\"htmlparser\",\"jquery\",\"selector\",\"scraper\",\"parser\",\"html\"],\"license\":\"MIT\",\"main\":\"./index.js\",\"name\":\"cheerio\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/cheeriojs/cheerio.git\"},\"scripts\":{\"test\":\"make test\"},\"version\":\"0.22.0\"}"); +module.exports = JSON.parse("{\"_args\":[[\"cheerio@0.22.0\",\"/Users/storm/Documents/Websites/odin\"]],\"_development\":true,\"_from\":\"cheerio@0.22.0\",\"_id\":\"cheerio@0.22.0\",\"_inBundle\":false,\"_integrity\":\"sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=\",\"_location\":\"/cheerio\",\"_phantomChildren\":{\"boolbase\":\"1.0.0\",\"css-what\":\"2.1.3\",\"domelementtype\":\"1.3.1\",\"nth-check\":\"1.0.2\"},\"_requested\":{\"type\":\"version\",\"registry\":true,\"raw\":\"cheerio@0.22.0\",\"name\":\"cheerio\",\"escapedName\":\"cheerio\",\"rawSpec\":\"0.22.0\",\"saveSpec\":null,\"fetchSpec\":\"0.22.0\"},\"_requiredBy\":[\"/prettify-html\"],\"_resolved\":\"https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz\",\"_spec\":\"0.22.0\",\"_where\":\"/Users/storm/Documents/Websites/odin\",\"author\":{\"name\":\"Matt Mueller\",\"email\":\"mattmuelle@gmail.com\",\"url\":\"mat.io\"},\"bugs\":{\"url\":\"https://github.com/cheeriojs/cheerio/issues\"},\"dependencies\":{\"css-select\":\"~1.2.0\",\"dom-serializer\":\"~0.1.0\",\"entities\":\"~1.1.1\",\"htmlparser2\":\"^3.9.1\",\"lodash.assignin\":\"^4.0.9\",\"lodash.bind\":\"^4.1.4\",\"lodash.defaults\":\"^4.0.1\",\"lodash.filter\":\"^4.4.0\",\"lodash.flatten\":\"^4.2.0\",\"lodash.foreach\":\"^4.3.0\",\"lodash.map\":\"^4.4.0\",\"lodash.merge\":\"^4.4.0\",\"lodash.pick\":\"^4.2.1\",\"lodash.reduce\":\"^4.4.0\",\"lodash.reject\":\"^4.4.0\",\"lodash.some\":\"^4.4.0\"},\"description\":\"Tiny, fast, and elegant implementation of core jQuery designed specifically for the server\",\"devDependencies\":{\"benchmark\":\"^2.1.0\",\"coveralls\":\"^2.11.9\",\"expect.js\":\"~0.3.1\",\"istanbul\":\"^0.4.3\",\"jquery\":\"^3.0.0\",\"jsdom\":\"^9.2.1\",\"jshint\":\"^2.9.2\",\"mocha\":\"^2.5.3\",\"xyz\":\"~0.5.0\"},\"engines\":{\"node\":\">= 0.6\"},\"files\":[\"index.js\",\"lib\"],\"homepage\":\"https://github.com/cheeriojs/cheerio#readme\",\"keywords\":[\"htmlparser\",\"jquery\",\"selector\",\"scraper\",\"parser\",\"html\"],\"license\":\"MIT\",\"main\":\"./index.js\",\"name\":\"cheerio\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/cheeriojs/cheerio.git\"},\"scripts\":{\"test\":\"make test\"},\"version\":\"0.22.0\"}"); /***/ }), @@ -322321,6 +322321,9 @@ function (_React$Component) { case 'F': return _helpers__WEBPACK_IMPORTED_MODULE_3__["RED"]; + + case 'N/A': + return _helpers__WEBPACK_IMPORTED_MODULE_3__["YELLOW"]; } }; @@ -322330,7 +322333,7 @@ function (_React$Component) { percent: 100, format: function format() { return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", { - className: "text-6xl font-bold", + className: "".concat(_this.state.grade === 'N/A' ? 'text-4xl' : 'text-6xl', " font-bold"), style: { color: color(_this.state.grade) } @@ -323343,7 +323346,7 @@ function (_React$Component) { website: JSON.parse(_this.props.website), loading: true, uptime: { - total: '-', + total: 100, month: '-', week: '-', day: '-' @@ -323790,8 +323793,8 @@ __webpack_require__(/*! @maelstrom-cms/toolkit */ "./node_modules/@maelstrom-cms /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(/*! /Users/owen/Sites/odin/resources/js/maelstrom.js */"./resources/js/maelstrom.js"); -module.exports = __webpack_require__(/*! /Users/owen/Sites/odin/resources/sass/maelstrom.css */"./resources/sass/maelstrom.css"); +__webpack_require__(/*! /Users/storm/Documents/Websites/odin/resources/js/maelstrom.js */"./resources/js/maelstrom.js"); +module.exports = __webpack_require__(/*! /Users/storm/Documents/Websites/odin/resources/sass/maelstrom.css */"./resources/sass/maelstrom.css"); /***/ }), diff --git a/resources/js/components/CertificateReport.js b/resources/js/components/CertificateReport.js index 8888fb2..d7f0014 100644 --- a/resources/js/components/CertificateReport.js +++ b/resources/js/components/CertificateReport.js @@ -66,6 +66,8 @@ export default class CertificateReport extends React.Component { return RED; case 'F': return RED; + case 'N/A': + return YELLOW; } }; @@ -75,7 +77,7 @@ export default class CertificateReport extends React.Component { strokeColor={ color(this.state.grade) } type="circle" percent={100} - format={ () => { this.state.grade } } + format={ () => { this.state.grade } } />
diff --git a/resources/js/components/UptimeReport.js b/resources/js/components/UptimeReport.js index ab1cc7d..a8f2861 100644 --- a/resources/js/components/UptimeReport.js +++ b/resources/js/components/UptimeReport.js @@ -9,7 +9,7 @@ export default class UptimeReport extends React.Component { website: JSON.parse(this.props.website), loading: true, uptime: { - total: '-', + total: 100, month: '-', week: '-', day: '-', diff --git a/resources/views/mail/robots-changed.blade.php b/resources/views/mail/robots-changed.blade.php new file mode 100644 index 0000000..87a5450 --- /dev/null +++ b/resources/views/mail/robots-changed.blade.php @@ -0,0 +1,18 @@ +@component('mail::message') +# 🤖 Change detected on: {{ $website->url }} + +The robots.txt file has changed since the last scan - please check and make any necessary changes. + +Please see the diff below: + +
+
{{ $scan->diff }}
+
+ +@component('mail::button', ['url' => $website->show_link]) +Open Monitor +@endcomponent + +Thanks,
+{{ config('app.name') }} +@endcomponent diff --git a/resources/views/vendor/maelstrom/layouts/wrapper.blade.php b/resources/views/vendor/maelstrom/layouts/wrapper.blade.php new file mode 100644 index 0000000..fcbf362 --- /dev/null +++ b/resources/views/vendor/maelstrom/layouts/wrapper.blade.php @@ -0,0 +1,19 @@ + + + @yield('title') :: {{ config('maelstrom.title_prefix', config('maelstrom.title')) }} + + @include('maelstrom::partials.head-meta') + + +
+ + @include('maelstrom::partials.header') + +
+ @yield('main') +
+ +
+ @include('maelstrom::partials.footer-scripts') + +