From cde99e30587114861818209fd0e96179300e32d5 Mon Sep 17 00:00:00 2001 From: shani-terminus <44702601+shani-terminus@users.noreply.github.com> Date: Tue, 28 May 2019 13:54:00 -0400 Subject: [PATCH] chore(SCSS): created skeleton for testing SCSS (#1521) ISSUES CLOSED: #952 --- .eslintrc.ci.js | 14 ++- .eslintrc.js | 14 ++- jest.config.js | 65 +++++++------- package.json | 1 + terminus-ui/scss/helpers/_a11y.spec.scss | 28 ++++++ terminus-ui/scss/helpers/_animation.spec.scss | 2 + terminus-ui/scss/helpers/_assets.spec.scss | 2 + .../scss/helpers/_breakpoints.spec.scss | 16 ++++ terminus-ui/scss/helpers/_buttons.spec.scss | 27 ++++++ terminus-ui/scss/helpers/_card.spec.scss | 2 + terminus-ui/scss/helpers/_color.spec.scss | 89 +++++++++++++++++++ terminus-ui/scss/helpers/_cursors.spec.scss | 2 + .../scss/helpers/_input-placeholder.spec.scss | 2 + terminus-ui/scss/helpers/_layout.spec.scss | 2 + terminus-ui/scss/helpers/_menu.spec.scss | 2 + .../helpers/_opposite-direction.spec.scss | 2 + terminus-ui/scss/helpers/_reset.spec.scss | 2 + terminus-ui/scss/helpers/_shadows.spec.scss | 2 + terminus-ui/scss/helpers/_spacing.spec.scss | 56 ++++++++++++ terminus-ui/scss/helpers/_theme.spec.scss | 2 + terminus-ui/scss/helpers/_triangle.spec.scss | 2 + .../scss/helpers/_typography.spec.scss | 2 + terminus-ui/scss/helpers/_z-index.spec.scss | 2 + terminus-ui/scss/helpers/test-sass.js | 11 +++ terminus-ui/scss/helpers/test-sass.md | 87 ++++++++++++++++++ yarn.lock | 31 +++++++ 26 files changed, 432 insertions(+), 35 deletions(-) create mode 100644 terminus-ui/scss/helpers/_a11y.spec.scss create mode 100644 terminus-ui/scss/helpers/_animation.spec.scss create mode 100644 terminus-ui/scss/helpers/_assets.spec.scss create mode 100644 terminus-ui/scss/helpers/_breakpoints.spec.scss create mode 100644 terminus-ui/scss/helpers/_buttons.spec.scss create mode 100644 terminus-ui/scss/helpers/_card.spec.scss create mode 100644 terminus-ui/scss/helpers/_color.spec.scss create mode 100644 terminus-ui/scss/helpers/_cursors.spec.scss create mode 100644 terminus-ui/scss/helpers/_input-placeholder.spec.scss create mode 100644 terminus-ui/scss/helpers/_layout.spec.scss create mode 100644 terminus-ui/scss/helpers/_menu.spec.scss create mode 100644 terminus-ui/scss/helpers/_opposite-direction.spec.scss create mode 100644 terminus-ui/scss/helpers/_reset.spec.scss create mode 100644 terminus-ui/scss/helpers/_shadows.spec.scss create mode 100644 terminus-ui/scss/helpers/_spacing.spec.scss create mode 100644 terminus-ui/scss/helpers/_theme.spec.scss create mode 100644 terminus-ui/scss/helpers/_triangle.spec.scss create mode 100644 terminus-ui/scss/helpers/_typography.spec.scss create mode 100644 terminus-ui/scss/helpers/_z-index.spec.scss create mode 100644 terminus-ui/scss/helpers/test-sass.js create mode 100644 terminus-ui/scss/helpers/test-sass.md diff --git a/.eslintrc.ci.js b/.eslintrc.ci.js index 7239d48cd..2f2187a29 100644 --- a/.eslintrc.ci.js +++ b/.eslintrc.ci.js @@ -14,5 +14,17 @@ module.exports = { ] } ] - } + }, + 'overrides': [ + { + 'files': [ + '**/*.spec.ts', + '**/*.mock.ts', + '**/test-sass.js', + ], + 'env': { + 'jest': true, + }, + }, + ], } diff --git a/.eslintrc.js b/.eslintrc.js index 9d0766ce2..6d240ead7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,5 +14,17 @@ module.exports = { ] } ] - } + }, + 'overrides': [ + { + 'files': [ + '**/*.spec.ts', + '**/*.mock.ts', + '**/test-sass.js', + ], + 'env': { + 'jest': true, + }, + }, + ], } diff --git a/jest.config.js b/jest.config.js index c0614aeda..3978964d4 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,44 +1,43 @@ module.exports = { - "globals": { - "ts-jest": { - "tsConfigFile": "./terminus-ui/tsconfig.spec.json", - "ignoreCoverageForAllDecorators": true, + globals: { + 'ts-jest': { + tsConfigFile: './terminus-ui/tsconfig.spec.json', + ignoreCoverageForAllDecorators: true, }, - "__TRANSFORM_HTML__": true, + '__TRANSFORM_HTML__': true, }, - "transform": { - "^.+\\.(ts|js|html)$": "/node_modules/jest-preset-angular/preprocessor.js", - }, - "testMatch": [ - "/**/?(*.)spec.ts?(x)", + transform: {'^.+\\.(ts|js|html)$': '/node_modules/jest-preset-angular/preprocessor.js' }, + testMatch: [ + '/**/?(*.)spec.ts?(x)', + '/**/?(*.)test-sass.js?(x)', ], - "testPathIgnorePatterns": [ - "/node_modules/", - "/demo/app", + testPathIgnorePatterns: [ + '/node_modules/', + '/demo/app', ], - "transformIgnorePatterns": [ - "node_modules/(?!@ngrx)", + transformIgnorePatterns: [ + 'node_modules/(?!@ngrx)', ], - "reporters": ["default", [ "jest-junit", { output: "./coverage/junit/report.xml" } ]], - "clearMocks": true, - "collectCoverageFrom": [ - "terminus-ui/**/!(index|public-api|*.module|*.interface|*.constant|*.mock|*.d).ts", - "!terminus-ui/**/testing/**" + reporters: ['default', ['jest-junit', { output: './coverage/junit/report.xml' }]], + clearMocks: true, + collectCoverageFrom: [ + 'terminus-ui/**/!(index|public-api|*.module|*.interface|*.constant|*.mock|*.d).ts', + '!terminus-ui/**/testing/**', ], - "moduleFileExtensions": [ - "ts", - "js", - "html", + moduleFileExtensions: [ + 'ts', + 'js', + 'html', ], - "coverageDirectory": "/coverage/", - "setupFilesAfterEnv": [ - "/tooling/jest-setup.ts", + coverageDirectory: '/coverage/', + setupFilesAfterEnv: [ + '/tooling/jest-setup.ts', ], - "moduleNameMapper": { - "app/(.*)": "/demo/app/$1", - "assets/(.*)": "/demo/assets/$1", - "environments/(.*)": "/demo/environments/$1", - "^@terminus/ui(.*)$": "/terminus-ui$1/src/public-api.ts", - "^@terminus/ui(.*)/testing$": "/terminus-ui$1/testing/src/public-api.ts", + moduleNameMapper: { + 'app/(.*)': '/demo/app/$1', + 'assets/(.*)': '/demo/assets/$1', + 'environments/(.*)': '/demo/environments/$1', + '^@terminus/ui(.*)$': '/terminus-ui$1/src/public-api.ts', + '^@terminus/ui(.*)/testing$': '/terminus-ui$1/testing/src/public-api.ts', }, } diff --git a/package.json b/package.json index dfb820d69..eb5722c12 100644 --- a/package.json +++ b/package.json @@ -264,6 +264,7 @@ "rxjs": "^6.3.3", "sass-lint": "^1.12.1", "sass-module-importer": "^1.4.0", + "sass-true": "^4.0.0", "scssfmt": "^1.0.6", "semantic-release": "^15.13.3", "source-map-explorer": "^1.6.0", diff --git a/terminus-ui/scss/helpers/_a11y.spec.scss b/terminus-ui/scss/helpers/_a11y.spec.scss new file mode 100644 index 000000000..cd05b097d --- /dev/null +++ b/terminus-ui/scss/helpers/_a11y.spec.scss @@ -0,0 +1,28 @@ +@import 'true'; +@import './a11y'; + +@include describe ('a11y') { + @include test ('should correctly render cdk-a11y') { + @include assert { + @include output { + @include cdk-a11y(); + } + @include expect { + .cdk-visually-hidden { + -webkit-appearance: none; + -moz-appearance: none; + + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + outline: 0; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + } + } + } + } +} diff --git a/terminus-ui/scss/helpers/_animation.spec.scss b/terminus-ui/scss/helpers/_animation.spec.scss new file mode 100644 index 000000000..c1686d588 --- /dev/null +++ b/terminus-ui/scss/helpers/_animation.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './animation'; diff --git a/terminus-ui/scss/helpers/_assets.spec.scss b/terminus-ui/scss/helpers/_assets.spec.scss new file mode 100644 index 000000000..e02ef79ed --- /dev/null +++ b/terminus-ui/scss/helpers/_assets.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './assets'; diff --git a/terminus-ui/scss/helpers/_breakpoints.spec.scss b/terminus-ui/scss/helpers/_breakpoints.spec.scss new file mode 100644 index 000000000..272fe6c2b --- /dev/null +++ b/terminus-ui/scss/helpers/_breakpoints.spec.scss @@ -0,0 +1,16 @@ +@import 'true'; +@import './breakpoints'; + +/* @include describe ('breakpoints') { + @include test ('should correctly render bp') { + @include assert { + @include output { + @include bp(layout-xs); + } + // is there a way to tests @media queries? + @include expect { + + } + } + } +} */ diff --git a/terminus-ui/scss/helpers/_buttons.spec.scss b/terminus-ui/scss/helpers/_buttons.spec.scss new file mode 100644 index 000000000..6dfda3589 --- /dev/null +++ b/terminus-ui/scss/helpers/_buttons.spec.scss @@ -0,0 +1,27 @@ +@import 'true'; +@import './buttons'; + +@include describe ('button') { + @include test ('should correctly render button-base') { + @include assert { + @include output { + .button-test { + @include button-base(); + } + } + @include expect { + .button-test { + background-color: transparent; + border: 0; + cursor: pointer; + outline: 0; + text-align: center; + } + + .button-test:focus { + outline: 0; + } + } + } + } +} diff --git a/terminus-ui/scss/helpers/_card.spec.scss b/terminus-ui/scss/helpers/_card.spec.scss new file mode 100644 index 000000000..e0ab85853 --- /dev/null +++ b/terminus-ui/scss/helpers/_card.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './card'; diff --git a/terminus-ui/scss/helpers/_color.spec.scss b/terminus-ui/scss/helpers/_color.spec.scss new file mode 100644 index 000000000..2d050944b --- /dev/null +++ b/terminus-ui/scss/helpers/_color.spec.scss @@ -0,0 +1,89 @@ +@import 'true'; +@import './color'; + +@include describe ('color') { + @include test('should return the correct color based on palette and tone') { + $test: color(warn, dark); + $expect: #b55949; + + @include assert-equal($test, $expect); + } + + /* @include test('should return the correct theme (this seems to fail due to class being added by true)') { + @include assert{ + @include output { + @include theme-color(background-color); + } + @include expect { + ::ng-deep .u-theme--primary .test-output { + background-color: #00538a; + color: #fafafa; + } + + ::ng-deep .u-theme--primary .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--accent .test-output { + background-color: #2f854d; + color: #fafafa; + } + + ::ng-deep .u-theme--accent .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--error .test-output { + background-color: #c8604d; + color: #fafafa; + } + + ::ng-deep .u-theme--error .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--warn .test-output { + background-color: #dea83b; + color: #fafafa; + } + + ::ng-deep .u-theme--warn .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--highlight .test-output { + background-color: #efe557; + color: #302d35; + } + + ::ng-deep .u-theme--highlight .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--pure .test-output { + background-color: #fafafa; + } + + ::ng-deep .u-theme--pure .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + + ::ng-deep .u-theme--utility .test-output { + background-color: #999; + color: #fafafa; + } + + ::ng-deep .u-theme--utility .test-output[disabled] { + background-color: #cecdd1; + color: #999; + } + } + } + } */ +} diff --git a/terminus-ui/scss/helpers/_cursors.spec.scss b/terminus-ui/scss/helpers/_cursors.spec.scss new file mode 100644 index 000000000..8e44c0e50 --- /dev/null +++ b/terminus-ui/scss/helpers/_cursors.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './cursors'; diff --git a/terminus-ui/scss/helpers/_input-placeholder.spec.scss b/terminus-ui/scss/helpers/_input-placeholder.spec.scss new file mode 100644 index 000000000..f871618c1 --- /dev/null +++ b/terminus-ui/scss/helpers/_input-placeholder.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './input-placeholder'; diff --git a/terminus-ui/scss/helpers/_layout.spec.scss b/terminus-ui/scss/helpers/_layout.spec.scss new file mode 100644 index 000000000..91c826c17 --- /dev/null +++ b/terminus-ui/scss/helpers/_layout.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './layout'; diff --git a/terminus-ui/scss/helpers/_menu.spec.scss b/terminus-ui/scss/helpers/_menu.spec.scss new file mode 100644 index 000000000..2cc2be297 --- /dev/null +++ b/terminus-ui/scss/helpers/_menu.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './menu'; diff --git a/terminus-ui/scss/helpers/_opposite-direction.spec.scss b/terminus-ui/scss/helpers/_opposite-direction.spec.scss new file mode 100644 index 000000000..76f00e545 --- /dev/null +++ b/terminus-ui/scss/helpers/_opposite-direction.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './opposite-direction'; diff --git a/terminus-ui/scss/helpers/_reset.spec.scss b/terminus-ui/scss/helpers/_reset.spec.scss new file mode 100644 index 000000000..8ef1a02ed --- /dev/null +++ b/terminus-ui/scss/helpers/_reset.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './reset'; diff --git a/terminus-ui/scss/helpers/_shadows.spec.scss b/terminus-ui/scss/helpers/_shadows.spec.scss new file mode 100644 index 000000000..34294d98d --- /dev/null +++ b/terminus-ui/scss/helpers/_shadows.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './shadows'; diff --git a/terminus-ui/scss/helpers/_spacing.spec.scss b/terminus-ui/scss/helpers/_spacing.spec.scss new file mode 100644 index 000000000..2266b001e --- /dev/null +++ b/terminus-ui/scss/helpers/_spacing.spec.scss @@ -0,0 +1,56 @@ +@import 'true'; +@import './spacing'; + +@include describe ('spacing') { + @include describe ('default') { + @include test('should return the correct default spacing') { + $test: spacing(); + $expect: 16px; + + @include assert-equal($test, $expect); + } + } + + @include describe ('small') { + @include test('should return the correct small spacing') { + $test1: spacing(small); + $expect1: 12px; + + $test2: spacing(small, 1); + $expect2: 8px; + + $test3: spacing(small, 2); + $expect3: 4px; + + @include assert-equal($test1, $expect1); + @include assert-equal($test2, $expect2); + @include assert-equal($test3, $expect3); + } + } + + @include describe ('large') { + @include test('should return the correct large spacing') { + $test1: spacing(large); + $expect1: 24px; + + $test2: spacing(large, 3); + $expect2: 48px; + + $test3: spacing(large, 6); + $expect3: 96px; + + @include assert-equal($test1, $expect1); + @include assert-equal($test2, $expect2); + @include assert-equal($test3, $expect3); + } + } + + @include describe('failures') { + @include test('should fail with mismatched values') { + $test: spacing(large, 2); + $expect: 24px; + + @include assert-unequal($test, $expect); + } + } +} diff --git a/terminus-ui/scss/helpers/_theme.spec.scss b/terminus-ui/scss/helpers/_theme.spec.scss new file mode 100644 index 000000000..e3792f1ef --- /dev/null +++ b/terminus-ui/scss/helpers/_theme.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './theme'; diff --git a/terminus-ui/scss/helpers/_triangle.spec.scss b/terminus-ui/scss/helpers/_triangle.spec.scss new file mode 100644 index 000000000..1b9136045 --- /dev/null +++ b/terminus-ui/scss/helpers/_triangle.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './triangle'; diff --git a/terminus-ui/scss/helpers/_typography.spec.scss b/terminus-ui/scss/helpers/_typography.spec.scss new file mode 100644 index 000000000..260630ca8 --- /dev/null +++ b/terminus-ui/scss/helpers/_typography.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './typography'; diff --git a/terminus-ui/scss/helpers/_z-index.spec.scss b/terminus-ui/scss/helpers/_z-index.spec.scss new file mode 100644 index 000000000..2d9448a4f --- /dev/null +++ b/terminus-ui/scss/helpers/_z-index.spec.scss @@ -0,0 +1,2 @@ +@import 'true'; +@import './z-index'; diff --git a/terminus-ui/scss/helpers/test-sass.js b/terminus-ui/scss/helpers/test-sass.js new file mode 100644 index 000000000..3ad9f6d74 --- /dev/null +++ b/terminus-ui/scss/helpers/test-sass.js @@ -0,0 +1,11 @@ +const path = require('path'); +const sassTrue = require('sass-true'); +const glob = require('glob'); + +describe('Sass', () => { + const sassTestFiles = glob.sync( + path.resolve(process.cwd(), 'terminus-ui/**/*.spec.scss') + ) + + sassTestFiles.forEach(file => sassTrue.runSass({ file }, describe, test)) +}) diff --git a/terminus-ui/scss/helpers/test-sass.md b/terminus-ui/scss/helpers/test-sass.md new file mode 100644 index 000000000..1d3772c10 --- /dev/null +++ b/terminus-ui/scss/helpers/test-sass.md @@ -0,0 +1,87 @@ +

Testing SCSS

+ + + + + +**Table of Contents** + +- [Basic Usage](#basic-usage) +- [Yarn](#yarn) +- [Types of tests](#types-of-tests) + - [Test to Fail](#test-to-fail) +- [Issues, idiosyncracies, etc](#issues-idiosyncracies-etc) + + + +## Basic Usage + +We are using a tool called `true` to test our SCSS output. `https://www.oddbird.net/true/docs/` + +Think SASS… @include everything (describe, test, etc.) + +Each helper file has a .spec.scss file that imports both `true` and the corresponding helper .scss file + +## Yarn + +If you simply run `yarn run test`, the test doesn’t run, saying there are no changes. Essentially the _watch functionality doesn’t work_. + +Workaround (recommended): +1. Select ‘p’ to run by regex of file name +1. Type 'sass' and hit enter +1. Every time you need to run the test again, go to the terminal and hit enter + +If you run `yarn run test` and select ‘a’ to run all tests, or if you run `yarn run test:ci:local` it will test the scss and catch errors and display them in the terminal. However, it does not show up in the istanbul report. + + +## Types of tests + +Two ways to write tests: +For functions, it’s the assert test. For mixins, there’s the assert - output - expect + +Example function test: +In this scenario, the $test calls the function, the $expect holds the result, and they are compared. +*Note* +`assert-equal` is for testing equivalency +`assert-unequal` is to test fail cases +`contains` will look for partials +Also available are `assert-true` and `assert-false` + +```scss +Define the function, define the expected value, assert they’re equal + @include test('should return the correct default spacing') { + $test: spacing(); + $expect: 16px; + @include assert-equal($test, $expect); + } +``` + +Example mixin test: +In this scenario the assert has two pieces, an output that includes the mixin, and an expect block of rendered CSS. + +```scss +@include test('should return the correct default spacing') { + @include assert { + @include output { + @include make-white(); + } + @include expect { + .sample-class { + color: #ffffff; + } + } + } +} +``` + +### Test to Fail + +It's highly recommended to write your tests to fail, to insure the test is running properly. In other words, it gives a lot of false-positives. Once you know the test is running correctly, then change the expect value to be the correct one. + + +## Issues, idiosyncracies, etc + +1. Not quite sure how to navigate large blocks of rendered scss (reference _color.spec.scss’s commented-out test. Currently investigating how `true` adds classes in the tests so we can better mitigate this critical functionality. + +1. It doesn’t care for ticks, so use single quotes in describe and test statements + diff --git a/yarn.lock b/yarn.lock index b2aabb255..e6e6b7b9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3929,6 +3929,11 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-selector-parser@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.3.0.tgz#5f1ad43e2d8eefbfdc304fcd39a521664943e3eb" + integrity sha1-XxrUPi2O77/cME/NOaUhZklD4+s= + css-selector-tokenizer@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" @@ -9570,6 +9575,16 @@ lodash.escaperegexp@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= +lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + +lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -9609,6 +9624,11 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.last@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.last/-/lodash.last-3.0.0.tgz#242f663112dd4c6e63728c60a3c909d1bdadbd4c" + integrity sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw= + lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -13721,6 +13741,17 @@ sass-module-importer@^1.4.0: resolve "1.1.7" resolve-bower "0.0.1" +sass-true@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/sass-true/-/sass-true-4.0.0.tgz#4f1573f5d75f0c5d8539f57ca9c374995d15f278" + integrity sha512-2CqHkWr+0cRHaMU92r90/84Uwpejy2v5lPUMKGBMCeo0r4KFaRd4jddsxrS3jb8umL9A24FZwbDt0WKGEMfRLQ== + dependencies: + css "^2.2.1" + css-selector-parser "^1.1.0" + lodash.find "^4.6.0" + lodash.foreach "^4.5.0" + lodash.last "^3.0.0" + sauce-connect-launcher@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz#8d38f85242a9fbede1b2303b559f7e20c5609a1c"