diff options
author | XhmikosR <xhmikosr@gmail.com> | 2017-11-27 20:41:48 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-27 20:41:48 +0300 |
commit | 76295676a1c073f6d2cd15f5c54b0edcbbbc14c6 (patch) | |
tree | 21396fd8f59ef114485dc2c7f3205f39498c1edf /build | |
parent | 671bb278bb0619160a8baa109c530fc68bb4ccc8 (diff) |
Replace lint-vars.sh with a Node.js script. (#24860)
Also, include it in the `css` npm script since it's instant.
Diffstat (limited to 'build')
-rw-r--r-- | build/lint-vars.js | 83 | ||||
-rwxr-xr-x | build/lint-vars.sh | 28 |
2 files changed, 83 insertions, 28 deletions
diff --git a/build/lint-vars.js b/build/lint-vars.js new file mode 100644 index 0000000000..909f5293d7 --- /dev/null +++ b/build/lint-vars.js @@ -0,0 +1,83 @@ +#!/usr/bin/env node + +/*! + * Script to find unused Sass variables. + * + * Copyright 2017 The Bootstrap Authors + * Copyright 2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +'use strict' + +const fs = require('fs') +const path = require('path') +const glob = require('glob') + +// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37 +function regExpQuote(str) { + return str.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&') +} + +let globalSuccess = true + +function findUnusedVars(dir) { + if (!(fs.existsSync(dir) && fs.statSync(dir).isDirectory())) { + console.log(`"${dir}": Not a valid directory!`) + process.exit(1) + } + + console.log(`Finding unused variables in "${dir}"...`) + + // A variable to handle success/failure message in this function + let unusedVarsFound = false + + // Array of all Sass files' content + const sassFiles = glob.sync(path.join(dir, '**/*.scss')) + // String of all Sass files' content + let sassFilesString = '' + + sassFiles.forEach((file) => { + sassFilesString += fs.readFileSync(file, 'utf8') + }) + + // Array of all Sass variables + const variables = sassFilesString.match(/(^\$[a-zA-Z0-9_-]+[^:])/gm) + + console.log(`There's a total of ${variables.length} variables.`) + + // Loop through each variable + variables.forEach((variable) => { + const re = new RegExp(regExpQuote(variable), 'g') + const count = (sassFilesString.match(re) || []).length + + if (count === 1) { + console.log(`Variable "${variable}" is only used once!`) + unusedVarsFound = true + globalSuccess = false + } + }) + + if (unusedVarsFound === false) { + console.log(`No unused variables found in "${dir}".`) + } +} + +function main(args) { + if (args.length < 1) { + console.log('Wrong arguments!') + console.log('Usage: lint-vars.js folder [, folder2...]') + process.exit(1) + } + + args.forEach((arg) => { + findUnusedVars(arg) + }) + + if (globalSuccess === false) { + process.exit(1) + } +} + +// The first and second args are: path/to/node script.js +main(process.argv.slice(2)) diff --git a/build/lint-vars.sh b/build/lint-vars.sh deleted file mode 100755 index ae7f716c1f..0000000000 --- a/build/lint-vars.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -# -# Approach: -# 1. Find variable declaration in the form of "$my-var: anyvalue" -# 2. Loop through found variables and find occurrences of each variable in all sass files -# 3. Filter out vars that occurred only once -# -# Run from command line with `build/lint-vars.sh scss`. -# -# Source: https://gist.github.com/badsyntax/6193491 - -if [ -z "$1" ]; then - echo "Please specify a directory as the first argument." - exit 1 -fi -if [ ! -d "$1" ]; then - echo "Not a valid directory." - exit 1 -fi - -echo "Finding unused variables. This might take some time..." - -vars=$(find "$1" -type f -name "*.scss" -exec grep --color=never -h '^$[a-zA-Z0-9_-][^:]*' {} \; | sed 's/$\([a-zA-Z0-9_-][^:]*\).*/\1/') - -for var in $vars; do - echo -n "Occurrences of \"\$$var\":" - find "$1" -type f -name "*.scss" -exec grep --color=never -h "$var" "{}" \; | wc -l -done | grep ' 1$' |