aboutsummaryrefslogtreecommitdiff
path: root/node_modules/test-exclude/index.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-28 00:38:50 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-28 00:40:43 +0200
commit7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch)
tree6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/test-exclude/index.js
parent963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff)
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/test-exclude/index.js')
-rw-r--r--node_modules/test-exclude/index.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/node_modules/test-exclude/index.js b/node_modules/test-exclude/index.js
new file mode 100644
index 000000000..ccc0957c2
--- /dev/null
+++ b/node_modules/test-exclude/index.js
@@ -0,0 +1,115 @@
+const assign = require('object-assign')
+const arrify = require('arrify')
+const micromatch = require('micromatch')
+const path = require('path')
+const readPkgUp = require('read-pkg-up')
+const requireMainFilename = require('require-main-filename')
+
+function TestExclude (opts) {
+ assign(this, {
+ cwd: process.cwd(),
+ include: false,
+ relativePath: true,
+ configKey: null, // the key to load config from in package.json.
+ configPath: null, // optionally override requireMainFilename.
+ configFound: false
+ }, opts)
+
+ if (typeof this.include === 'string') this.include = [this.include]
+ if (typeof this.exclude === 'string') this.exclude = [this.exclude]
+
+ if (!this.include && !this.exclude && this.configKey) {
+ assign(this, this.pkgConf(this.configKey, this.configPath))
+ }
+
+ if (!this.exclude || !Array.isArray(this.exclude)) {
+ this.exclude = exportFunc.defaultExclude
+ }
+
+ if (this.include && this.include.length > 0) {
+ this.include = prepGlobPatterns(arrify(this.include))
+ } else {
+ this.include = false
+ }
+
+ if (!this.removeNegatedModuleExclude() && this.exclude.indexOf('**/node_modules/**') === -1) {
+ this.exclude.push('**/node_modules/**')
+ }
+
+ this.exclude = prepGlobPatterns(
+ [].concat(arrify(this.exclude))
+ )
+}
+
+// if a glob has been provided that explicitly negates
+// the **/node_modules/** default exclude rule, remove it from
+// excludes but don't add the default exclude rule.
+TestExclude.prototype.removeNegatedModuleExclude = function () {
+ var moduleExcludeNegated = false
+ this.exclude = this.exclude.filter(function (e) {
+ var negated = !!micromatch('./node_modules/foo.js', e, {nonegate: false}).length !==
+ !!micromatch('./node_modules/foo.js', e, {nonegate: true}).length
+ if (negated) moduleExcludeNegated = true
+ return !negated
+ })
+ return moduleExcludeNegated
+}
+
+TestExclude.prototype.shouldInstrument = function (filename, relFile) {
+ var pathToCheck = filename
+
+ if (this.relativePath) {
+ relFile = relFile || path.relative(this.cwd, filename)
+
+ // Don't instrument files that are outside of the current working directory.
+ if (/^\.\./.test(path.relative(this.cwd, filename))) return false
+
+ pathToCheck = relFile.replace(/^\.[\\/]/, '') // remove leading './' or '.\'.
+ }
+
+ return (!this.include || micromatch.any(pathToCheck, this.include, {dotfiles: true})) && !micromatch.any(pathToCheck, this.exclude, {dotfiles: true})
+}
+
+TestExclude.prototype.pkgConf = function (key, path) {
+ const obj = readPkgUp.sync({
+ cwd: path || requireMainFilename(require)
+ })
+
+ if (obj.pkg && obj.pkg[key] && typeof obj.pkg[key] === 'object') {
+ this.configFound = true
+ return obj.pkg[key]
+ } else {
+ return {}
+ }
+}
+
+function prepGlobPatterns (patterns) {
+ return patterns.reduce(function (result, pattern) {
+ // Allow gitignore style of directory exclusion
+ if (!/\/\*\*$/.test(pattern)) {
+ result = result.concat(pattern.replace(/\/$/, '') + '/**')
+ }
+
+ // Any rules of the form **/foo.js, should also match foo.js.
+ if (/^\*\*\//.test(pattern)) {
+ result = result.concat(pattern.replace(/^\*\*\//, ''))
+ }
+
+ return result.concat(pattern)
+ }, [])
+}
+
+var exportFunc = function (opts) {
+ return new TestExclude(opts)
+}
+
+exportFunc.defaultExclude = [
+ 'coverage/**',
+ 'test/**',
+ 'test{,-*}.js',
+ '**/*.test.js',
+ '**/__tests__/**',
+ '**/node_modules/**'
+]
+
+module.exports = exportFunc