You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
4.3 KiB
170 lines
4.3 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.default = void 0; |
|
|
|
var _path = _interopRequireDefault(require("path")); |
|
|
|
var _fs = require("fs"); |
|
|
|
var _child_process = require("child_process"); |
|
|
|
var _helperPluginUtils = require("@babel/helper-plugin-utils"); |
|
|
|
var _istanbulLibInstrument = require("istanbul-lib-instrument"); |
|
|
|
var _testExclude = _interopRequireDefault(require("test-exclude")); |
|
|
|
var _schema = _interopRequireDefault(require("@istanbuljs/schema")); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
|
|
|
function getRealpath(n) { |
|
try { |
|
return (0, _fs.realpathSync)(n) || |
|
/* istanbul ignore next */ |
|
n; |
|
} catch (e) { |
|
/* istanbul ignore next */ |
|
return n; |
|
} |
|
} |
|
|
|
const memoize = new Map(); |
|
/* istanbul ignore next */ |
|
|
|
const memosep = _path.default.sep === '/' ? ':' : ';'; |
|
|
|
function loadNycConfig(cwd, opts) { |
|
let memokey = cwd; |
|
const args = [_path.default.resolve(__dirname, 'load-nyc-config-sync.js'), cwd]; |
|
|
|
if ('nycrcPath' in opts) { |
|
args.push(opts.nycrcPath); |
|
memokey += memosep + opts.nycrcPath; |
|
} |
|
/* execFileSync is expensive, avoid it if possible! */ |
|
|
|
|
|
if (memoize.has(memokey)) { |
|
return memoize.get(memokey); |
|
} |
|
|
|
const result = JSON.parse((0, _child_process.execFileSync)(process.execPath, args)); |
|
const error = result['load-nyc-config-sync-error']; |
|
|
|
if (error) { |
|
throw new Error(error); |
|
} |
|
|
|
const config = { ..._schema.default.defaults.babelPluginIstanbul, |
|
cwd, |
|
...result |
|
}; |
|
memoize.set(memokey, config); |
|
return config; |
|
} |
|
|
|
function findConfig(opts) { |
|
const cwd = getRealpath(opts.cwd || process.env.NYC_CWD || |
|
/* istanbul ignore next */ |
|
process.cwd()); |
|
const keys = Object.keys(opts); |
|
const ignored = Object.keys(opts).filter(s => s === 'nycrcPath' || s === 'cwd'); |
|
|
|
if (keys.length > ignored.length) { |
|
// explicitly configuring options in babel |
|
// takes precedence. |
|
return { ..._schema.default.defaults.babelPluginIstanbul, |
|
cwd, |
|
...opts |
|
}; |
|
} |
|
|
|
if (ignored.length === 0 && process.env.NYC_CONFIG) { |
|
// defaults were already applied by nyc |
|
return JSON.parse(process.env.NYC_CONFIG); |
|
} |
|
|
|
return loadNycConfig(cwd, opts); |
|
} |
|
|
|
function makeShouldSkip() { |
|
let exclude; |
|
return function shouldSkip(file, nycConfig) { |
|
if (!exclude || exclude.cwd !== nycConfig.cwd) { |
|
exclude = new _testExclude.default({ |
|
cwd: nycConfig.cwd, |
|
include: nycConfig.include, |
|
exclude: nycConfig.exclude, |
|
extension: nycConfig.extension, |
|
// Make sure this is true unless explicitly set to `false`. `undefined` is still `true`. |
|
excludeNodeModules: nycConfig.excludeNodeModules !== false |
|
}); |
|
} |
|
|
|
return !exclude.shouldInstrument(file); |
|
}; |
|
} |
|
|
|
var _default = (0, _helperPluginUtils.declare)(api => { |
|
api.assertVersion(7); |
|
const shouldSkip = makeShouldSkip(); |
|
const t = api.types; |
|
return { |
|
visitor: { |
|
Program: { |
|
enter(path) { |
|
this.__dv__ = null; |
|
this.nycConfig = findConfig(this.opts); |
|
const realPath = getRealpath(this.file.opts.filename); |
|
|
|
if (shouldSkip(realPath, this.nycConfig)) { |
|
return; |
|
} |
|
|
|
let { |
|
inputSourceMap |
|
} = this.opts; |
|
|
|
if (this.opts.useInlineSourceMaps !== false) { |
|
if (!inputSourceMap && this.file.inputMap) { |
|
inputSourceMap = this.file.inputMap.sourcemap; |
|
} |
|
} |
|
|
|
const visitorOptions = {}; |
|
Object.entries(_schema.default.defaults.instrumentVisitor).forEach(([name, defaultValue]) => { |
|
if (name in this.nycConfig) { |
|
visitorOptions[name] = this.nycConfig[name]; |
|
} else { |
|
visitorOptions[name] = _schema.default.defaults.instrumentVisitor[name]; |
|
} |
|
}); |
|
this.__dv__ = (0, _istanbulLibInstrument.programVisitor)(t, realPath, { ...visitorOptions, |
|
inputSourceMap |
|
}); |
|
|
|
this.__dv__.enter(path); |
|
}, |
|
|
|
exit(path) { |
|
if (!this.__dv__) { |
|
return; |
|
} |
|
|
|
const result = this.__dv__.exit(path); |
|
|
|
if (this.opts.onCover) { |
|
this.opts.onCover(getRealpath(this.file.opts.filename), result.fileCoverage); |
|
} |
|
} |
|
|
|
} |
|
} |
|
}; |
|
}); |
|
|
|
exports.default = _default; |