UNPKG

find-node-modules

Version:

Return an array of all parent node_modules directories

715 lines (690 loc) 21 kB
"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==