Browse Source

Merge pull request #14656 from grafana/husky-and-sasslint-fixes

Husky and sasslint fixes
Torkel Ödegaard 7 years ago
parent
commit
8a976f5cb4

+ 9 - 6
package.json

@@ -17,6 +17,7 @@
     "@babel/preset-react": "^7.0.0",
     "@babel/preset-typescript": "^7.1.0",
     "@rtsao/plugin-proposal-class-properties": "^7.0.1-patch.1",
+    "@types/classnames": "^2.2.6",
     "@types/d3": "^4.10.1",
     "@types/enzyme": "^3.1.13",
     "@types/jest": "^23.3.2",
@@ -26,7 +27,6 @@
     "@types/react-custom-scrollbars": "^4.0.5",
     "@types/react-dom": "^16.0.9",
     "@types/react-select": "^2.0.4",
-    "@types/classnames": "^2.2.6",
     "angular-mocks": "1.6.6",
     "autoprefixer": "^6.4.0",
     "axios": "^0.17.1",
@@ -52,15 +52,12 @@
     "grunt-cli": "~1.2.0",
     "grunt-contrib-clean": "~1.0.0",
     "grunt-contrib-compress": "^1.3.0",
-    "grunt-contrib-concat": "^1.0.1",
     "grunt-contrib-copy": "~1.0.0",
-    "grunt-contrib-cssmin": "~1.0.2",
     "grunt-exec": "^1.0.1",
     "grunt-newer": "^1.3.0",
     "grunt-notify": "^0.4.5",
     "grunt-postcss": "^0.8.0",
-    "grunt-sass": "^2.0.0",
-    "grunt-sass-lint": "^0.2.2",
+    "grunt-sass-lint": "^0.2.4",
     "grunt-usemin": "3.1.1",
     "grunt-webpack": "^3.0.2",
     "html-loader": "^0.5.1",
@@ -76,6 +73,7 @@
     "ng-annotate-webpack-plugin": "^0.3.0",
     "ngtemplate-loader": "^2.0.1",
     "npm": "^5.4.2",
+    "node-sass": "^4.11.0",
     "optimize-css-assets-webpack-plugin": "^4.0.2",
     "phantomjs-prebuilt": "^2.1.15",
     "postcss-browser-reporter": "^0.5.0",
@@ -116,7 +114,12 @@
     "typecheck": "tsc --noEmit",
     "jest": "jest --notify --watch",
     "api-tests": "jest --notify --watch --config=tests/api/jest.js",
-    "precommit": "lint-staged && grunt precommit"
+    "precommit": "grunt precommit"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged && grunt precommit"
+    }
   },
   "lint-staged": {
     "*.{ts,tsx}": [

+ 26 - 12
public/sass/.sass-lint.yml

@@ -1,23 +1,41 @@
 options:
   formatter: stylish
 
-files:
-  include: '**/*.s+(a|c)ss'
-  ignore:
-    - './utils/*.scss'
-
 rules:
+  quotes:
+    - 0
+    -
+      style: 'single'
+
+  brace-style:
+    - 2
+    -
+      style: '1tbs'
+
+  space-before-brace:
+    - 2
+
+  no-duplicate-properties:
+    - 0
+    -
+      exclude:
+        - 'font-size'
+        - 'word-break'
+
+  empty-line-between-blocks:
+    - 0
+    -
+      allow-single-line-rulesets: 1
+
   # Extends
   extends-before-mixins: 0
   extends-before-declarations: 0
   placeholder-in-extend: 0
-
   # Mixins
   mixins-before-declarations: 0
 
   # Line Spacing
   one-declaration-per-line: 0
-  empty-line-between-blocks: 0
   single-line-per-selector: 0
 
   # Disallows
@@ -25,7 +43,6 @@ rules:
   no-color-literals: 0
   no-css-comments: 0
   no-debug: 0
-  no-duplicate-properties: 0
   no-empty-rulesets: 1
   no-extends: 0
   no-ids: 0
@@ -40,6 +57,7 @@ rules:
   no-vendor-prefixes: 0
   no-warn: 0
   property-units: 0
+  pseudo-element: 0
 
   # Nesting
   force-attribute-nesting: 0
@@ -57,7 +75,6 @@ rules:
   # Style Guide
   bem-depth: 0
   border-zero: 0
-  brace-style: 0
   clean-import-paths: 0
   empty-args: 0
   hex-length: 0
@@ -66,7 +83,6 @@ rules:
   leading-zero: 0
   nesting-depth: 0
   property-sort-order: 0
-  quotes: 0
   shorthand-values: 0
   url-quotes: 0
   variable-for-property: 0
@@ -76,12 +92,10 @@ rules:
   space-after-comma: 0
   space-before-colon: 0
   space-after-colon: 0
-  space-before-brace: 0
   space-before-bang: 0
   space-after-bang: 0
   space-between-parens: 0
   space-around-operator: 0
 
   # Final Items
-  trailing-semicolon: 0
   final-newline: 0

+ 6 - 6
public/sass/components/_drop.scss

@@ -5,13 +5,13 @@ $useDropShadow: false;
 $attachmentOffset: 0%;
 $easing: cubic-bezier(0, 0, 0.265, 1);
 
-@include drop-theme("error", $popover-error-bg, $popover-color);
-@include drop-theme("popover", $popover-bg, $popover-color, $popover-border-color);
-@include drop-theme("help", $popover-help-bg, $popover-help-color);
+@include drop-theme('error', $popover-error-bg, $popover-color);
+@include drop-theme('popover', $popover-bg, $popover-color, $popover-border-color);
+@include drop-theme('help', $popover-help-bg, $popover-help-color);
 
-@include drop-animation-scale("drop", "help", $attachmentOffset: $attachmentOffset, $easing: $easing);
-@include drop-animation-scale("drop", "error", $attachmentOffset: $attachmentOffset, $easing: $easing);
-@include drop-animation-scale("drop", "popover", $attachmentOffset: $attachmentOffset, $easing: $easing);
+@include drop-animation-scale('drop', 'help', $attachmentOffset: $attachmentOffset, $easing: $easing);
+@include drop-animation-scale('drop', 'error', $attachmentOffset: $attachmentOffset, $easing: $easing);
+@include drop-animation-scale('drop', 'popover', $attachmentOffset: $attachmentOffset, $easing: $easing);
 
 .drop-element {
   z-index: 10000;

+ 3 - 3
public/sass/components/_filter-list.scss

@@ -67,17 +67,17 @@
   text-transform: uppercase;
 
   &.online {
-    background-image: url("/img/online.svg");
+    background-image: url('/img/online.svg');
     color: $online;
   }
 
   &.warn {
-    background-image: url("/img/warn-tiny.svg");
+    background-image: url('/img/warn-tiny.svg');
     color: $warn;
   }
 
   &.critical {
-    background-image: url("/img/critical.svg");
+    background-image: url('/img/critical.svg');
     color: $critical;
   }
 }

+ 14 - 2
public/sass/components/_jsontree.scss

@@ -3,16 +3,20 @@ json-tree {
   .json-tree-key {
     vertical-align: middle;
   }
+
   .expandable {
     position: relative;
+
     &::before {
       pointer-events: none;
     }
+
     &::before,
     & > .json-tree-key {
       cursor: pointer;
     }
   }
+
   .json-tree-branch-preview {
     display: inline-block;
     vertical-align: middle;
@@ -24,36 +28,44 @@ json-tree {
   ul {
     padding-left: $spacer;
   }
+
   li,
   ul {
     list-style: none;
   }
+
   li {
     line-height: 1.3rem;
   }
+
   .json-tree-key {
     color: $variable;
     padding: 5px 10px 5px 15px;
+
     &::after {
-      content: ":";
+      content: ':';
     }
   }
+
   json-node.expandable {
     &::before {
-      content: "\25b6";
+      content: '\25b6';
       position: absolute;
       left: 0px;
       font-size: 8px;
       transition: transform 0.1s ease;
     }
+
     &.expanded::before {
       transform: rotate(90deg);
     }
   }
+
   .json-tree-leaf-value,
   .json-tree-branch-preview {
     word-break: break-all;
   }
+
   .json-tree-branch-preview {
     overflow: hidden;
     font-style: italic;

+ 0 - 2
public/sass/components/_panel_editor.scss

@@ -174,7 +174,6 @@
 }
 
 .panel-editor-tabs {
-  position: relative;
   z-index: 2;
   display: flex;
   flex-direction: column;
@@ -221,7 +220,6 @@
 
     &:hover {
       filter: $panel-editor-side-menu-shadow;
-      transform: translate(-2px, -2px);
       transform: scale(1.1);
     }
   }

+ 2 - 3
public/sass/components/_panel_gettingstarted.scss

@@ -51,8 +51,7 @@ $path-position: $marker-size-half - ($path-height / 2);
   min-width: $marker-size;
 
   &::after {
-    right: -50%;
-    content: "";
+    content: '';
     display: block;
     position: absolute;
     z-index: 1;
@@ -105,7 +104,7 @@ $path-position: $marker-size-half - ($path-height / 2);
 
       // change icon to check
       .icon-gf::before {
-        content: "\e604";
+        content: '\e604';
       }
     }
     .progress-text {

+ 0 - 1
public/sass/components/_panel_graph.scss

@@ -368,7 +368,6 @@
   font-size: $font-size-sm;
   position: absolute;
   text-align: center;
-  font-size: 12px;
 }
 
 .alert-handle-wrapper {

+ 1 - 2
public/sass/components/_shortcuts.scss

@@ -33,9 +33,8 @@
   text-align: center;
   margin-right: 0.3rem;
   padding: 3px 5px;
-  font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
+  font: 11px Consolas, 'Liberation Mono', Menlo, Courier, monospace;
   line-height: 10px;
-  color: #555;
   vertical-align: middle;
   background-color: $btn-inverse-bg;
   border: solid 1px $btn-inverse-bg-hl;

+ 1 - 2
public/sass/components/_sidemenu.scss

@@ -29,12 +29,12 @@
   .sidemenu-open {
     .sidemenu {
       background: $side-menu-bg;
-      position: initial;
       height: auto;
       box-shadow: $side-menu-shadow;
       position: relative;
       z-index: $zindex-sidemenu;
     }
+
     .sidemenu__top,
     .sidemenu__bottom {
       display: block;
@@ -212,7 +212,6 @@ li.sidemenu-org-switcher {
     .sidemenu {
       width: 100%;
       background: $side-menu-bg-mobile;
-      position: initial;
       height: auto;
       box-shadow: $side-menu-shadow;
       position: relative;

+ 0 - 1
public/sass/components/_slate_editor.scss

@@ -32,7 +32,6 @@
     left: -10000px;
     opacity: 0;
     border-radius: $border-radius;
-    transition: opacity 0.75s;
     border: $panel-border;
     max-height: calc(66vh);
     overflow-y: scroll;

+ 0 - 3
public/sass/components/_submenu.scss

@@ -22,10 +22,8 @@
 }
 
 .submenu-item {
-  margin-right: 20px;
   display: inline-block;
   margin-right: 15px;
-  display: inline-block;
   float: left;
 
   .fa-caret-down {
@@ -42,7 +40,6 @@
   background-color: $input-bg;
   border: 1px solid $input-border-color;
   border-radius: $input-border-radius;
-  color: $input-color;
   box-sizing: content-box;
   display: inline-block;
   color: $text-color;

+ 2 - 4
public/sass/components/_switch.scss

@@ -19,15 +19,14 @@ gf-form-switch[disabled] {
 }
 
 .gf-form-switch {
+  display: flex;
   position: relative;
-  display: inline-block;
   width: 60px;
   height: $gf-form-input-height;
   background: $switch-bg;
   border: 1px solid $input-border-color;
   border-left: none;
   border-radius: $input-border-radius;
-  display: flex;
   align-items: center;
   justify-content: center;
 
@@ -77,14 +76,13 @@ input:checked + .gf-form-switch__slider::before {
 
 .gf-form-checkbox {
   position: relative;
-  display: inline-block;
+  display: flex;
   width: 50px;
   height: $gf-form-input-height;
   background: $switch-bg;
   border: 1px solid $input-border-color;
   border-left: none;
   border-radius: $input-border-radius;
-  display: flex;
   align-items: center;
   justify-content: center;
 

+ 0 - 1
public/sass/components/_tabbed_view.scss

@@ -31,7 +31,6 @@
 
 .tabbed-view-close-btn {
   float: right;
-  padding: 0;
   margin: 0;
   background-color: transparent;
   border: none;

+ 1 - 0
public/sass/components/_tags.scss

@@ -25,6 +25,7 @@
   border-width: 1px;
   border-style: solid;
   box-shadow: 0 0 1px rgba($white, 0.2);
+
   .icon-tag {
     position: relative;
     top: 1px;

+ 3 - 0
public/sass/components/_tagsinput.scss

@@ -24,12 +24,15 @@
     [data-role='remove'] {
       margin-left: 8px;
       cursor: pointer;
+
       &::after {
         content: 'x';
         padding: 0px 2px;
       }
+
       &:hover {
         box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+
         &:active {
           box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
         }

+ 9 - 0
public/sass/components/_timepicker.scss

@@ -60,9 +60,11 @@
     list-style: none;
     float: left;
     margin: 0 30px 10px 0px;
+
     li {
       line-height: 22px;
     }
+
     li.active {
       border-bottom: 1px solid $blue;
       margin: 3px 0;
@@ -77,26 +79,32 @@
   td {
     padding: 1px;
   }
+
   button {
     @include buttonBackground($btn-inverse-bg, $btn-inverse-bg-hl);
     background-image: none;
     border: none;
     color: $text-color;
+
     &.active span {
       color: $blue;
       font-weight: bold;
     }
+
     .text-info {
       color: $orange;
       font-weight: bold;
     }
+
     &.btn-sm {
       font-size: $font-size-sm;
       padding: 5px 11px;
     }
+
     &:hover {
       color: $text-color-strong;
     }
+
     &[disabled] {
       color: $text-color;
     }
@@ -119,6 +127,7 @@
 .fa-chevron-left::before {
   content: '\f053';
 }
+
 .fa-chevron-right::before {
   content: '\f054';
 }

+ 9 - 0
public/sass/components/_tooltip.scss

@@ -11,21 +11,26 @@
   font-size: 11px;
   line-height: 1.4;
   @include opacity(0);
+
   &.in {
     @include opacity(100);
   }
+
   &.top {
     margin-top: -3px;
     padding: 5px 0;
   }
+
   &.right {
     margin-left: 3px;
     padding: 0 5px;
   }
+
   &.bottom {
     margin-top: 3px;
     padding: 5px 0;
   }
+
   &.left {
     margin-left: -3px;
     padding: 0 5px;
@@ -60,6 +65,7 @@
     border-width: $tooltipArrowWidth $tooltipArrowWidth 0;
     border-top-color: $tooltipArrowColor;
   }
+
   &.right .tooltip-arrow {
     top: 50%;
     left: 0;
@@ -67,6 +73,7 @@
     border-width: $tooltipArrowWidth $tooltipArrowWidth $tooltipArrowWidth 0;
     border-right-color: $tooltipArrowColor;
   }
+
   &.left .tooltip-arrow {
     top: 50%;
     right: 0;
@@ -74,6 +81,7 @@
     border-width: $tooltipArrowWidth 0 $tooltipArrowWidth $tooltipArrowWidth;
     border-left-color: $tooltipArrowColor;
   }
+
   &.bottom .tooltip-arrow {
     top: 0;
     left: 50%;
@@ -98,6 +106,7 @@
   max-height: 600px;
   overflow: hidden;
   line-height: 14px;
+
   a {
     color: $tooltipLinkColor;
   }

+ 3 - 0
public/sass/components/_view_states.scss

@@ -10,6 +10,7 @@
 
   .navbar-page-btn {
     transform: translate3d(-36px, 0, 0);
+
     i {
       opacity: 0;
     }
@@ -40,9 +41,11 @@
   .navbar {
     display: none;
   }
+
   .scroll-canvas--dashboard {
     height: 100%;
   }
+
   .submenu-controls {
     display: none;
   }

+ 1 - 0
public/sass/components/edit_sidemenu.scss

@@ -46,6 +46,7 @@
     li {
       float: left;
     }
+
     a {
       margin: 0.3rem 1rem;
     }

+ 1 - 1
public/sass/fonts.scss

@@ -1 +1 @@
-@import "base/fonts";
+@import 'base/fonts';

+ 3 - 3
public/sass/grafana.dark.scss

@@ -1,3 +1,3 @@
-@import "variables";
-@import "variables.dark";
-@import "grafana";
+@import 'variables';
+@import 'variables.dark';
+@import 'grafana';

+ 3 - 3
public/sass/grafana.light.scss

@@ -1,3 +1,3 @@
-@import "variables";
-@import "variables.light";
-@import "grafana";
+@import 'variables';
+@import 'variables.light';
+@import 'grafana';

+ 2 - 4
public/sass/layout/_page.scss

@@ -42,15 +42,13 @@
   overflow: auto;
   height: 100%;
   -webkit-overflow-scrolling: touch;
+  display: flex;
+  flex-direction: column;
 
   &--dashboard {
     height: calc(100% - 56px);
   }
 
-  // Sticky footer
-  display: flex;
-  flex-direction: column;
-
   > div {
     flex-grow: 1;
   }

+ 1 - 8
public/sass/mixins/_forms.scss

@@ -13,16 +13,9 @@
   .custom-control {
     color: $color;
   }
-  // Set the border and box shadow on specific inputs to match
+
   .form-control {
     border-color: $color;
-    // @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
-
-    &:focus {
-      // border-color: darken($border-color, 10%);
-      // $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
-      // @include box-shadow($shadow);
-    }
   }
 
   // Set validation states also for addons

+ 0 - 4
public/sass/pages/_history.scss

@@ -29,10 +29,6 @@
   white-space: nowrap;
   position: relative;
 
-  &:before,
-  &:after {
-  }
-
   &:after {
     left: -40px;
   }

+ 9 - 5
public/sass/pages/_login.scss

@@ -13,9 +13,11 @@ $login-border: #8daac5;
   background-image: url(../img/heatmap_bg_test.svg);
   background-size: cover;
   color: #d8d9da;
+
   & a {
     color: #d8d9da !important;
   }
+
   & .btn-primary {
     @include buttonBackground(#ff6600, #bc3e06);
   }
@@ -198,6 +200,10 @@ select:-webkit-autofill:focus {
   border: none;
   font-size: 15px;
   padding: 10px 10px;
+  font-weight: bold;
+  display: inline-block;
+  width: 170px;
+  color: $text-color;
 
   &.active {
     background: darken($tight-form-bg, 5%);
@@ -207,11 +213,6 @@ select:-webkit-autofill:focus {
   &:focus {
     outline: 0;
   }
-
-  font-weight: bold;
-  display: inline-block;
-  width: 170px;
-  color: $text-color;
 }
 
 .password-strength {
@@ -222,10 +223,12 @@ select:-webkit-autofill:focus {
   padding-top: 3px;
   color: darken($text-color, 20%);
   border-top: 3px solid $red;
+
   &.password-strength-ok {
     width: 40%;
     border-top: 3px solid lighten($yellow, 10%);
   }
+
   &.password-strength-good {
     width: 100%;
     border-top: 3px solid lighten($green, 10%);
@@ -252,6 +255,7 @@ select:-webkit-autofill:focus {
 .password-recovery {
   background: $tight-form-bg;
   padding: 10px;
+
   a {
     color: $gray-2;
   }

+ 6 - 4
public/sass/pages/_plugins.scss

@@ -3,9 +3,11 @@
   font-size: $font-size-sm;
   position: relative;
   top: 1.2rem;
+
   &:hover {
     color: $link-hover-color;
   }
+
   img {
     vertical-align: top;
   }
@@ -18,12 +20,12 @@
 }
 
 .plugin-info-list-item {
-  img {
-    width: 16px;
-  }
-
   white-space: nowrap;
   max-width: $page-sidebar-width;
   text-overflow: ellipsis;
   overflow: hidden;
+
+  img {
+    width: 16px;
+  }
 }

+ 0 - 3
public/sass/utils/_validation.scss

@@ -1,6 +1,3 @@
-input[type='text'].ng-dirty.ng-invalid {
-}
-
 input.validation-error,
 input.ng-dirty.ng-invalid {
   box-shadow: inset 0 0px 5px $red;

+ 4 - 5
scripts/grunt/options/sasslint.js

@@ -4,10 +4,9 @@ module.exports = function(config) {
     options: {
       configFile: 'public/sass/.sass-lint.yml',
     },
-    // src: ['public/sass#<{(||)}>#*'],
-    target: [
-      'public/sass/*.scss',
-      'public/sass/components/*.scss',
-    ]
+    src: [
+      'public/sass/**/*.scss',
+      'packages/**/*.scss',
+    ],
   };
 };

+ 16 - 84
yarn.lock

@@ -1098,7 +1098,7 @@
   dependencies:
     "@types/react" "*"
 
-"@types/react@*", "@types/react@^16.1.0", "@types/react@^16.7.6":
+"@types/react@*", "@types/react@16.7.6", "@types/react@^16.1.0", "@types/react@^16.7.6":
   version "16.7.6"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.6.tgz#80e4bab0d0731ad3ae51f320c4b08bdca5f03040"
   integrity sha512-QBUfzftr/8eg/q3ZRgf/GaDP6rTYc7ZNem+g4oZM38C9vXyV8AWRWaTQuW5yCoZTsfHrN7b3DeEiUnqH9SrnpA==
@@ -1412,7 +1412,7 @@ ajv@^4.7.0:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^5.1.0, ajv@^5.3.0:
+ajv@^5.3.0:
   version "5.5.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
   integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
@@ -1862,7 +1862,7 @@ aws-sign2@~0.7.0:
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
   integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
-aws4@^1.6.0, aws4@^1.8.0:
+aws4@^1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
   integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
@@ -3168,7 +3168,7 @@ caniuse-api@^1.5.2:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+caniuse-db@1.0.30000772, caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
   version "1.0.30000772"
   resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000772.tgz#51aae891768286eade4a3d8319ea76d6a01b512b"
   integrity sha1-UarokXaChureSj2DGep21qAbUSs=
@@ -3670,7 +3670,7 @@ combined-stream@1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-combined-stream@~1.0.5, combined-stream@~1.0.6:
+combined-stream@~1.0.6:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
   integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
@@ -5035,14 +5035,6 @@ duplexify@^3.4.2, duplexify@^3.6.0:
     readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
-each-async@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473"
-  integrity sha1-3uUim98KtrogEqOV4bhpq/iBNHM=
-  dependencies:
-    onetime "^1.0.0"
-    set-immediate-shim "^1.0.0"
-
 eastasianwidth@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
@@ -5715,7 +5707,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
 
-extend@~3.0.1, extend@~3.0.2:
+extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -6095,7 +6087,7 @@ fork-ts-checker-webpack-plugin@^0.4.9:
     resolve "^1.5.0"
     tapable "^1.0.0"
 
-form-data@~2.3.1, form-data@~2.3.2:
+form-data@~2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
   integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=
@@ -6776,22 +6768,13 @@ grunt-postcss@^0.8.0:
     diff "^2.0.2"
     postcss "^5.0.0"
 
-grunt-sass-lint@^0.2.2:
+grunt-sass-lint@^0.2.4:
   version "0.2.4"
   resolved "https://registry.yarnpkg.com/grunt-sass-lint/-/grunt-sass-lint-0.2.4.tgz#06f77635ad8a5048968ea33c5584b40a18281e35"
   integrity sha512-jV88yXoxFFvr4R3WVBl0uz4YBzNxXTrCJ7ZBKrYby/SjRCw2sieKPkt5tpWDcQZIj9XrKsOpKuHQn08MaECVwg==
   dependencies:
     sass-lint "^1.12.0"
 
-grunt-sass@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/grunt-sass/-/grunt-sass-2.1.0.tgz#b7ba1d85ef4c2d9b7d8195fe65f664ac7554efa1"
-  integrity sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==
-  dependencies:
-    each-async "^1.0.0"
-    node-sass "^4.7.2"
-    object-assign "^4.0.1"
-
 grunt-usemin@3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/grunt-usemin/-/grunt-usemin-3.1.1.tgz#5ab679510d672cea566cc717abe8b8a009f641c2"
@@ -6874,14 +6857,6 @@ har-schema@^2.0.0:
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
   integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
 
-har-validator@~5.0.3:
-  version "5.0.3"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
-  integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=
-  dependencies:
-    ajv "^5.1.0"
-    har-schema "^2.0.0"
-
 har-validator@~5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29"
@@ -10097,10 +10072,10 @@ node-releases@^1.0.1:
   dependencies:
     semver "^5.3.0"
 
-node-sass@^4.7.2:
-  version "4.9.3"
-  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224"
-  integrity sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==
+node-sass@^4.11.0:
+  version "4.11.0"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
+  integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==
   dependencies:
     async-foreach "^0.1.3"
     chalk "^1.1.1"
@@ -10117,7 +10092,7 @@ node-sass@^4.7.2:
     nan "^2.10.0"
     node-gyp "^3.8.0"
     npmlog "^4.0.0"
-    request "2.87.0"
+    request "^2.88.0"
     sass-graph "^2.2.4"
     stdout-stream "^1.4.0"
     "true-case-path" "^1.0.2"
@@ -10498,11 +10473,6 @@ nwsapi@^2.0.7:
   resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016"
   integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==
 
-oauth-sign@~0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-  integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=
-
 oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
@@ -11896,7 +11866,7 @@ qs@6.5.1:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
   integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==
 
-qs@~6.5.1, qs@~6.5.2:
+qs@~6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
@@ -12700,33 +12670,7 @@ request-promise-native@^1.0.5:
     stealthy-require "^1.1.0"
     tough-cookie ">=2.3.3"
 
-request@2.87.0:
-  version "2.87.0"
-  resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
-  integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==
-  dependencies:
-    aws-sign2 "~0.7.0"
-    aws4 "^1.6.0"
-    caseless "~0.12.0"
-    combined-stream "~1.0.5"
-    extend "~3.0.1"
-    forever-agent "~0.6.1"
-    form-data "~2.3.1"
-    har-validator "~5.0.3"
-    http-signature "~1.2.0"
-    is-typedarray "~1.0.0"
-    isstream "~0.1.2"
-    json-stringify-safe "~5.0.1"
-    mime-types "~2.1.17"
-    oauth-sign "~0.8.2"
-    performance-now "^2.1.0"
-    qs "~6.5.1"
-    safe-buffer "^5.1.1"
-    tough-cookie "~2.3.3"
-    tunnel-agent "^0.6.0"
-    uuid "^3.1.0"
-
-request@^2.74.0, request@^2.81.0, request@^2.85.0, request@^2.87.0:
+request@^2.74.0, request@^2.81.0, request@^2.85.0, request@^2.87.0, request@^2.88.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
   integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@@ -13217,11 +13161,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
-set-immediate-shim@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
-  integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
-
 set-value@^0.4.3:
   version "0.4.3"
   resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
@@ -14383,13 +14322,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3:
     psl "^1.1.24"
     punycode "^1.4.1"
 
-tough-cookie@~2.3.3:
-  version "2.3.4"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
-  integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==
-  dependencies:
-    punycode "^1.4.1"
-
 tr46@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
@@ -14898,7 +14830,7 @@ utils-merge@1.0.1:
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 
-uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2:
+uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
   integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==