find-node-modules
Version:
Return an array of all parent node_modules directories
715 lines (690 loc) • 21 kB
JavaScript
"use strict";
var cov_vrgo9ok3b = function () {
var path = "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/configLoader/getContent.js";
var hash = "3358ba786039fc83b9a8360423af42a3be16e600";
var global = new Function("return this")();
var gcv = "__coverage__";
var coverageData = {
path: "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/configLoader/getContent.js",
statementMap: {
"0": {
start: {
line: 20,
column: 23
},
end: {
line: 20,
column: 45
}
},
"1": {
start: {
line: 21,
column: 21
},
end: {
line: 21,
column: 75
}
},
"2": {
start: {
line: 22,
column: 23
},
end: {
line: 22,
column: 56
}
},
"3": {
start: {
line: 23,
column: 18
},
end: {
line: 25,
column: 40
}
},
"4": {
start: {
line: 24,
column: 20
},
end: {
line: 24,
column: 59
}
},
"5": {
start: {
line: 25,
column: 20
},
end: {
line: 25,
column: 40
}
},
"6": {
start: {
line: 27,
column: 4
},
end: {
line: 42,
column: 5
}
},
"7": {
start: {
line: 28,
column: 23
},
end: {
line: 28,
column: 40
}
},
"8": {
start: {
line: 30,
column: 8
},
end: {
line: 32,
column: 11
}
},
"9": {
start: {
line: 34,
column: 8
},
end: {
line: 34,
column: 22
}
},
"10": {
start: {
line: 36,
column: 8
},
end: {
line: 39,
column: 21
}
},
"11": {
start: {
line: 41,
column: 8
},
end: {
line: 41,
column: 20
}
},
"12": {
start: {
line: 52,
column: 4
},
end: {
line: 54,
column: 5
}
},
"13": {
start: {
line: 53,
column: 6
},
end: {
line: 53,
column: 13
}
},
"14": {
start: {
line: 56,
column: 25
},
end: {
line: 56,
column: 64
}
},
"15": {
start: {
line: 57,
column: 27
},
end: {
line: 57,
column: 54
}
},
"16": {
start: {
line: 59,
column: 4
},
end: {
line: 61,
column: 5
}
},
"17": {
start: {
line: 60,
column: 6
},
end: {
line: 60,
column: 47
}
},
"18": {
start: {
line: 63,
column: 20
},
end: {
line: 63,
column: 51
}
},
"19": {
start: {
line: 64,
column: 4
},
end: {
line: 64,
column: 56
}
},
"20": {
start: {
line: 75,
column: 22
},
end: {
line: 75,
column: 49
}
},
"21": {
start: {
line: 77,
column: 2
},
end: {
line: 79,
column: 3
}
},
"22": {
start: {
line: 78,
column: 4
},
end: {
line: 78,
column: 96
}
},
"23": {
start: {
line: 81,
column: 2
},
end: {
line: 81,
column: 50
}
}
},
fnMap: {
"0": {
name: "readConfigContent",
decl: {
start: {
line: 19,
column: 9
},
end: {
line: 19,
column: 26
}
},
loc: {
start: {
line: 19,
column: 40
},
end: {
line: 43,
column: 1
}
},
line: 19
},
"1": {
name: "(anonymous_1)",
decl: {
start: {
line: 24,
column: 6
},
end: {
line: 24,
column: 7
}
},
loc: {
start: {
line: 24,
column: 20
},
end: {
line: 24,
column: 59
}
},
line: 24
},
"2": {
name: "(anonymous_2)",
decl: {
start: {
line: 25,
column: 6
},
end: {
line: 25,
column: 7
}
},
loc: {
start: {
line: 25,
column: 20
},
end: {
line: 25,
column: 40
}
},
line: 25
},
"3": {
name: "getConfigContent",
decl: {
start: {
line: 51,
column: 9
},
end: {
line: 51,
column: 25
}
},
loc: {
start: {
line: 51,
column: 54
},
end: {
line: 65,
column: 1
}
},
line: 51
},
"4": {
name: "readConfigFileContent",
decl: {
start: {
line: 73,
column: 9
},
end: {
line: 73,
column: 30
}
},
loc: {
start: {
line: 73,
column: 44
},
end: {
line: 82,
column: 1
}
},
line: 73
}
},
branchMap: {
"0": {
loc: {
start: {
line: 21,
column: 21
},
end: {
line: 21,
column: 75
}
},
type: "binary-expr",
locations: [{
start: {
line: 21,
column: 21
},
end: {
line: 21,
column: 45
}
}, {
start: {
line: 21,
column: 49
},
end: {
line: 21,
column: 75
}
}],
line: 21
},
"1": {
loc: {
start: {
line: 23,
column: 18
},
end: {
line: 25,
column: 40
}
},
type: "cond-expr",
locations: [{
start: {
line: 24,
column: 6
},
end: {
line: 24,
column: 59
}
}, {
start: {
line: 25,
column: 6
},
end: {
line: 25,
column: 40
}
}],
line: 23
},
"2": {
loc: {
start: {
line: 52,
column: 4
},
end: {
line: 54,
column: 5
}
},
type: "if",
locations: [{
start: {
line: 52,
column: 4
},
end: {
line: 54,
column: 5
}
}, {
start: {
line: 52,
column: 4
},
end: {
line: 54,
column: 5
}
}],
line: 52
},
"3": {
loc: {
start: {
line: 59,
column: 4
},
end: {
line: 61,
column: 5
}
},
type: "if",
locations: [{
start: {
line: 59,
column: 4
},
end: {
line: 61,
column: 5
}
}, {
start: {
line: 59,
column: 4
},
end: {
line: 61,
column: 5
}
}],
line: 59
},
"4": {
loc: {
start: {
line: 77,
column: 2
},
end: {
line: 79,
column: 3
}
},
type: "if",
locations: [{
start: {
line: 77,
column: 2
},
end: {
line: 79,
column: 3
}
}, {
start: {
line: 77,
column: 2
},
end: {
line: 79,
column: 3
}
}],
line: 77
}
},
s: {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0,
"13": 0,
"14": 0,
"15": 0,
"16": 0,
"17": 0,
"18": 0,
"19": 0,
"20": 0,
"21": 0,
"22": 0,
"23": 0
},
f: {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 0
},
b: {
"0": [0, 0],
"1": [0, 0],
"2": [0, 0],
"3": [0, 0],
"4": [0, 0]
},
_coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
hash: "3358ba786039fc83b9a8360423af42a3be16e600"
};
var coverage = global[gcv] || (global[gcv] = {});
if (coverage[path] && coverage[path].hash === hash) {
return coverage[path];
}
return coverage[path] = coverageData;
}();
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _stripJsonComments = _interopRequireDefault(require("strip-json-comments"));
var _isUtf = _interopRequireDefault(require("is-utf8"));
var _stripBom = _interopRequireDefault(require("strip-bom"));
var _configLoader = require("../configLoader");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = getConfigContent;
/**
* Read the content of a configuration file
* - if not js or json: strip any comments
* - if js or json: require it
* @param {String} configPath - full path to configuration file
* @return {Object}
*/
exports.default = _default;
function readConfigContent(configPath) {
cov_vrgo9ok3b.f[0]++;
const parsedPath = (cov_vrgo9ok3b.s[0]++, _path.default.parse(configPath));
const isRcFile = (cov_vrgo9ok3b.s[1]++, (cov_vrgo9ok3b.b[0][0]++, parsedPath.ext !== '.js') && (cov_vrgo9ok3b.b[0][1]++, parsedPath.ext !== '.json'));
const jsonString = (cov_vrgo9ok3b.s[2]++, readConfigFileContent(configPath));
const parse = (cov_vrgo9ok3b.s[3]++, isRcFile ? (cov_vrgo9ok3b.b[1][0]++, contents => {
cov_vrgo9ok3b.f[1]++;
cov_vrgo9ok3b.s[4]++;
return JSON.parse((0, _stripJsonComments.default)(contents));
}) : (cov_vrgo9ok3b.b[1][1]++, contents => {
cov_vrgo9ok3b.f[2]++;
cov_vrgo9ok3b.s[5]++;
return JSON.parse(contents);
}));
cov_vrgo9ok3b.s[6]++;
try {
const parsed = (cov_vrgo9ok3b.s[7]++, parse(jsonString));
cov_vrgo9ok3b.s[8]++;
Object.defineProperty(parsed, 'configPath', {
value: configPath
});
cov_vrgo9ok3b.s[9]++;
return parsed;
} catch (error) {
cov_vrgo9ok3b.s[10]++;
error.message = [`Parsing JSON at ${configPath} for commitizen config failed:`, error.mesasge].join('\n');
cov_vrgo9ok3b.s[11]++;
throw error;
}
}
/**
* Get content of the configuration file
* @param {String} configPath - partial path to configuration file
* @param {String} directory - directory path which will be joined with config argument
* @return {Object}
*/
function getConfigContent(configPath, baseDirectory) {
cov_vrgo9ok3b.f[3]++;
cov_vrgo9ok3b.s[12]++;
if (!configPath) {
cov_vrgo9ok3b.b[2][0]++;
cov_vrgo9ok3b.s[13]++;
return;
} else {
cov_vrgo9ok3b.b[2][1]++;
}
const resolvedPath = (cov_vrgo9ok3b.s[14]++, _path.default.resolve(baseDirectory, configPath));
const configBasename = (cov_vrgo9ok3b.s[15]++, _path.default.basename(resolvedPath));
cov_vrgo9ok3b.s[16]++;
if (!_fs.default.existsSync(resolvedPath)) {
cov_vrgo9ok3b.b[3][0]++;
cov_vrgo9ok3b.s[17]++;
return (0, _configLoader.getNormalizedConfig)(resolvedPath);
} else {
cov_vrgo9ok3b.b[3][1]++;
}
const content = (cov_vrgo9ok3b.s[18]++, readConfigContent(resolvedPath));
cov_vrgo9ok3b.s[19]++;
return (0, _configLoader.getNormalizedConfig)(configBasename, content);
}
;
/**
* Read proper content from config file.
* If the chartset of the config file is not utf-8, one error will be thrown.
* @param {String} configPath
* @return {String}
*/
function readConfigFileContent(configPath) {
cov_vrgo9ok3b.f[4]++;
let rawBufContent = (cov_vrgo9ok3b.s[20]++, _fs.default.readFileSync(configPath));
cov_vrgo9ok3b.s[21]++;
if (!(0, _isUtf.default)(rawBufContent)) {
cov_vrgo9ok3b.b[4][0]++;
cov_vrgo9ok3b.s[22]++;
throw new Error(`The config file at "${configPath}" contains invalid charset, expect utf8`);
} else {
cov_vrgo9ok3b.b[4][1]++;
}
cov_vrgo9ok3b.s[23]++;
return (0, _stripBom.default)(rawBufContent.toString("utf8"));
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdldENvbnRlbnQuanMiXSwibmFtZXMiOlsiZ2V0Q29uZmlnQ29udGVudCIsInJlYWRDb25maWdDb250ZW50IiwiY29uZmlnUGF0aCIsInBhcnNlZFBhdGgiLCJwYXRoIiwicGFyc2UiLCJpc1JjRmlsZSIsImV4dCIsImpzb25TdHJpbmciLCJyZWFkQ29uZmlnRmlsZUNvbnRlbnQiLCJjb250ZW50cyIsIkpTT04iLCJwYXJzZWQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZXJyb3IiLCJtZXNzYWdlIiwibWVzYXNnZSIsImpvaW4iLCJiYXNlRGlyZWN0b3J5IiwicmVzb2x2ZWRQYXRoIiwicmVzb2x2ZSIsImNvbmZpZ0Jhc2VuYW1lIiwiYmFzZW5hbWUiLCJmcyIsImV4aXN0c1N5bmMiLCJjb250ZW50IiwicmF3QnVmQ29udGVudCIsInJlYWRGaWxlU3luYyIsIkVycm9yIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFDRyxRQUFkLENBQXVCLE1BQXZCLENBQVQsQ0FBUDtBQUNEIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9jYWxsdW1hY3JhZS9TaXRlcy9maW5kLW5vZGUtbW9kdWxlcy9jei1jbGkvc3JjL2NvbmZpZ0xvYWRlciIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHN0cmlwSlNPTkNvbW1lbnRzIGZyb20gJ3N0cmlwLWpzb24tY29tbWVudHMnO1xuaW1wb3J0IGlzVVRGOCBmcm9tICdpcy11dGY4JztcbmltcG9ydCBzdHJpcEJvbSBmcm9tICdzdHJpcC1ib20nO1xuXG5pbXBvcnQgeyBnZXROb3JtYWxpemVkQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnTG9hZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgZ2V0Q29uZmlnQ29udGVudDtcblxuLyoqXG4gKiBSZWFkIHRoZSBjb250ZW50IG9mIGEgY29uZmlndXJhdGlvbiBmaWxlXG4gKiAtIGlmIG5vdCBqcyBvciBqc29uOiBzdHJpcCBhbnkgY29tbWVudHNcbiAqIC0gaWYganMgb3IganNvbjogcmVxdWlyZSBpdFxuICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ1BhdGggLSBmdWxsIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHJlYWRDb25maWdDb250ZW50IChjb25maWdQYXRoKSB7XG4gICAgY29uc3QgcGFyc2VkUGF0aCA9IHBhdGgucGFyc2UoY29uZmlnUGF0aClcbiAgICBjb25zdCBpc1JjRmlsZSA9IHBhcnNlZFBhdGguZXh0ICE9PSAnLmpzJyAmJiBwYXJzZWRQYXRoLmV4dCAhPT0gJy5qc29uJztcbiAgICBjb25zdCBqc29uU3RyaW5nID0gcmVhZENvbmZpZ0ZpbGVDb250ZW50KGNvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IHBhcnNlID0gaXNSY0ZpbGUgP1xuICAgICAgKGNvbnRlbnRzKSA9PiBKU09OLnBhcnNlKHN0cmlwSlNPTkNvbW1lbnRzKGNvbnRlbnRzKSkgOlxuICAgICAgKGNvbnRlbnRzKSA9PiBKU09OLnBhcnNlKGNvbnRlbnRzKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlKGpzb25TdHJpbmcpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXJzZWQsICdjb25maWdQYXRoJywge1xuICAgICAgICAgIHZhbHVlOiBjb25maWdQYXRoXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IFtcbiAgICAgICAgICBgUGFyc2luZyBKU09OIGF0ICR7Y29uZmlnUGF0aH0gZm9yIGNvbW1pdGl6ZW4gY29uZmlnIGZhaWxlZDpgLFxuICAgICAgICAgIGVycm9yLm1lc2FzZ2VcbiAgICAgICAgXS5qb2luKCdcXG4nKTtcblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ1BhdGggLSBwYXJ0aWFsIHBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlXG4gKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0b3J5IC0gZGlyZWN0b3J5IHBhdGggd2hpY2ggd2lsbCBiZSBqb2luZWQgd2l0aCBjb25maWcgYXJndW1lbnRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudCAoY29uZmlnUGF0aCwgYmFzZURpcmVjdG9yeSkge1xuICAgIGlmICghY29uZmlnUGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyZWN0b3J5LCBjb25maWdQYXRoKTtcbiAgICBjb25zdCBjb25maWdCYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKTtcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZENvbmZpZyhyZXNvbHZlZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkQ29uZmlnQ29udGVudChyZXNvbHZlZFBhdGgpO1xuICAgIHJldHVybiBnZXROb3JtYWxpemVkQ29uZmlnKGNvbmZpZ0Jhc2VuYW1lLCBjb250ZW50KTtcbn07XG5cbi8qKlxuICogUmVhZCBwcm9wZXIgY29udGVudCBmcm9tIGNvbmZpZyBmaWxlLlxuICogSWYgdGhlIGNoYXJ0c2V0IG9mIHRoZSBjb25maWcgZmlsZSBpcyBub3QgdXRmLTgsIG9uZSBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWdQYXRoXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHJlYWRDb25maWdGaWxlQ29udGVudCAoY29uZmlnUGF0aCkge1xuXG4gIGxldCByYXdCdWZDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgpO1xuXG4gIGlmICghaXNVVEY4KHJhd0J1ZkNvbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgY29uZmlnIGZpbGUgYXQgXCIke2NvbmZpZ1BhdGh9XCIgY29udGFpbnMgaW52YWxpZCBjaGFyc2V0LCBleHBlY3QgdXRmOGApO1xuICB9XG5cbiAgcmV0dXJuIHN0cmlwQm9tKHJhd0J1ZkNvbnRlbnQudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbn1cbiJdfQ==