UNPKG

find-node-modules

Version:

Return an array of all parent node_modules directories

1,436 lines (1,386 loc) 46.5 kB
"use strict"; var cov_l5hg93smj = function () { var path = "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/commitizen/adapter.js"; var hash = "b8bd02e835e5df95fa6376d9655a32b6e1be5e78"; var global = new Function("return this")(); var gcv = "__coverage__"; var coverageData = { path: "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/commitizen/adapter.js", statementMap: { "0": { start: { line: 37, column: 32 }, end: { line: 43, column: 3 } }, "1": { start: { line: 45, column: 24 }, end: { line: 45, column: 91 } }, "2": { start: { line: 46, column: 26 }, end: { line: 46, column: 67 } }, "3": { start: { line: 48, column: 15 }, end: { line: 48, column: 61 } }, "4": { start: { line: 49, column: 27 }, end: { line: 49, column: 56 } }, "5": { start: { line: 50, column: 30 }, end: { line: 50, column: 32 } }, "6": { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, "7": { start: { line: 52, column: 4 }, end: { line: 52, column: 81 } }, "8": { start: { line: 54, column: 2 }, end: { line: 54, column: 96 } }, "9": { start: { line: 63, column: 30 }, end: { line: 63, column: 61 } }, "10": { start: { line: 66, column: 2 }, end: { line: 70, column: 3 } }, "11": { start: { line: 67, column: 4 }, end: { line: 69, column: 5 } }, "12": { start: { line: 68, column: 6 }, end: { line: 68, column: 66 } }, "13": { start: { line: 72, column: 2 }, end: { line: 72, column: 31 } }, "14": { start: { line: 81, column: 30 }, end: { line: 81, column: 58 } }, "15": { start: { line: 84, column: 2 }, end: { line: 88, column: 3 } }, "16": { start: { line: 85, column: 4 }, end: { line: 87, column: 5 } }, "17": { start: { line: 86, column: 6 }, end: { line: 86, column: 66 } }, "18": { start: { line: 90, column: 2 }, end: { line: 90, column: 31 } }, "19": { start: { line: 99, column: 31 }, end: { line: 99, column: 55 } }, "20": { start: { line: 104, column: 2 }, end: { line: 108, column: 3 } }, "21": { start: { line: 105, column: 4 }, end: { line: 105, column: 37 } }, "22": { start: { line: 115, column: 2 }, end: { line: 115, column: 78 } }, "23": { start: { line: 122, column: 2 }, end: { line: 126, column: 49 } }, "24": { start: { line: 133, column: 2 }, end: { line: 136, column: 49 } }, "25": { start: { line: 144, column: 28 }, end: { line: 144, column: 59 } }, "26": { start: { line: 147, column: 16 }, end: { line: 147, column: 44 } }, "27": { start: { line: 165, column: 15 }, end: { line: 165, column: 45 } }, "28": { start: { line: 166, column: 15 }, end: { line: 166, column: 68 } }, "29": { start: { line: 169, column: 28 }, end: { line: 171, column: 22 } }, "30": { start: { line: 173, column: 2 }, end: { line: 179, column: 3 } }, "31": { start: { line: 175, column: 4 }, end: { line: 175, column: 48 } }, "32": { start: { line: 177, column: 4 }, end: { line: 177, column: 86 } }, "33": { start: { line: 178, column: 4 }, end: { line: 178, column: 16 } }, "34": { start: { line: 183, column: 2 }, end: { line: 183, column: 109 } } }, fnMap: { "0": { name: "addPathToAdapterConfig", decl: { start: { line: 35, column: 9 }, end: { line: 35, column: 31 } }, loc: { start: { line: 35, column: 68 }, end: { line: 55, column: 1 } }, line: 35 }, "1": { name: "generateNpmInstallAdapterCommand", decl: { start: { line: 60, column: 9 }, end: { line: 60, column: 41 } }, loc: { start: { line: 60, column: 75 }, end: { line: 73, column: 1 } }, line: 60 }, "2": { name: "generateYarnAddAdapterCommand", decl: { start: { line: 78, column: 9 }, end: { line: 78, column: 38 } }, loc: { start: { line: 78, column: 72 }, end: { line: 91, column: 1 } }, line: 78 }, "3": { name: "getNearestNodeModulesDirectory", decl: { start: { line: 96, column: 9 }, end: { line: 96, column: 39 } }, loc: { start: { line: 96, column: 50 }, end: { line: 109, column: 1 } }, line: 96 }, "4": { name: "getNearestProjectRootDirectory", decl: { start: { line: 114, column: 9 }, end: { line: 114, column: 39 } }, loc: { start: { line: 114, column: 60 }, end: { line: 116, column: 1 } }, line: 114 }, "5": { name: "getNpmInstallStringMappings", decl: { start: { line: 121, column: 9 }, end: { line: 121, column: 36 } }, loc: { start: { line: 121, column: 71 }, end: { line: 127, column: 1 } }, line: 121 }, "6": { name: "getYarnAddStringMappings", decl: { start: { line: 132, column: 9 }, end: { line: 132, column: 33 } }, loc: { start: { line: 132, column: 54 }, end: { line: 137, column: 1 } }, line: 132 }, "7": { name: "getPrompter", decl: { start: { line: 142, column: 9 }, end: { line: 142, column: 20 } }, loc: { start: { line: 142, column: 35 }, end: { line: 157, column: 1 } }, line: 142 }, "8": { name: "resolveAdapterPath", decl: { start: { line: 163, column: 9 }, end: { line: 163, column: 27 } }, loc: { start: { line: 163, column: 49 }, end: { line: 180, column: 1 } }, line: 163 }, "9": { name: "getGitRootPath", decl: { start: { line: 182, column: 9 }, end: { line: 182, column: 23 } }, loc: { start: { line: 182, column: 27 }, end: { line: 184, column: 1 } }, line: 182 } }, branchMap: { "0": { loc: { start: { line: 48, column: 15 }, end: { line: 48, column: 61 } }, type: "binary-expr", locations: [{ start: { line: 48, column: 15 }, end: { line: 48, column: 53 } }, { start: { line: 48, column: 57 }, end: { line: 48, column: 61 } }], line: 48 }, "1": { loc: { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, type: "if", locations: [{ start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }, { start: { line: 51, column: 2 }, end: { line: 53, column: 3 } }], line: 51 }, "2": { loc: { start: { line: 67, column: 4 }, end: { line: 69, column: 5 } }, type: "if", locations: [{ start: { line: 67, column: 4 }, end: { line: 69, column: 5 } }, { start: { line: 67, column: 4 }, end: { line: 69, column: 5 } }], line: 67 }, "3": { loc: { start: { line: 85, column: 4 }, end: { line: 87, column: 5 } }, type: "if", locations: [{ start: { line: 85, column: 4 }, end: { line: 87, column: 5 } }, { start: { line: 85, column: 4 }, end: { line: 87, column: 5 } }], line: 85 }, "4": { loc: { start: { line: 104, column: 2 }, end: { line: 108, column: 3 } }, type: "if", locations: [{ start: { line: 104, column: 2 }, end: { line: 108, column: 3 } }], line: 104 }, "5": { loc: { start: { line: 104, column: 6 }, end: { line: 104, column: 65 } }, type: "binary-expr", locations: [{ start: { line: 104, column: 6 }, end: { line: 104, column: 28 } }, { start: { line: 104, column: 32 }, end: { line: 104, column: 65 } }], line: 104 }, "6": { loc: { start: { line: 123, column: 17 }, end: { line: 123, column: 58 } }, type: "cond-expr", locations: [{ start: { line: 123, column: 38 }, end: { line: 123, column: 46 } }, { start: { line: 123, column: 49 }, end: { line: 123, column: 58 } }], line: 123 }, "7": { loc: { start: { line: 123, column: 18 }, end: { line: 123, column: 34 } }, type: "binary-expr", locations: [{ start: { line: 123, column: 18 }, end: { line: 123, column: 22 } }, { start: { line: 123, column: 26 }, end: { line: 123, column: 34 } }], line: 123 }, "8": { loc: { start: { line: 124, column: 20 }, end: { line: 124, column: 54 } }, type: "cond-expr", locations: [{ start: { line: 124, column: 30 }, end: { line: 124, column: 42 } }, { start: { line: 124, column: 45 }, end: { line: 124, column: 54 } }], line: 124 }, "9": { loc: { start: { line: 125, column: 22 }, end: { line: 125, column: 60 } }, type: "cond-expr", locations: [{ start: { line: 125, column: 34 }, end: { line: 125, column: 48 } }, { start: { line: 125, column: 51 }, end: { line: 125, column: 60 } }], line: 125 }, "10": { loc: { start: { line: 126, column: 18 }, end: { line: 126, column: 47 } }, type: "cond-expr", locations: [{ start: { line: 126, column: 26 }, end: { line: 126, column: 35 } }, { start: { line: 126, column: 38 }, end: { line: 126, column: 47 } }], line: 126 }, "11": { loc: { start: { line: 134, column: 16 }, end: { line: 134, column: 41 } }, type: "cond-expr", locations: [{ start: { line: 134, column: 22 }, end: { line: 134, column: 29 } }, { start: { line: 134, column: 32 }, end: { line: 134, column: 41 } }], line: 134 }, "12": { loc: { start: { line: 135, column: 18 }, end: { line: 135, column: 47 } }, type: "cond-expr", locations: [{ start: { line: 135, column: 26 }, end: { line: 135, column: 35 } }, { start: { line: 135, column: 38 }, end: { line: 135, column: 47 } }], line: 135 }, "13": { loc: { start: { line: 136, column: 18 }, end: { line: 136, column: 47 } }, type: "cond-expr", locations: [{ start: { line: 136, column: 26 }, end: { line: 136, column: 35 } }, { start: { line: 136, column: 38 }, end: { line: 136, column: 47 } }], line: 136 }, "14": { loc: { start: { line: 166, column: 15 }, end: { line: 166, column: 68 } }, type: "binary-expr", locations: [{ start: { line: 166, column: 15 }, end: { line: 166, column: 36 } }, { start: { line: 166, column: 40 }, end: { line: 166, column: 68 } }], line: 166 }, "15": { loc: { start: { line: 169, column: 28 }, end: { line: 171, column: 22 } }, type: "cond-expr", locations: [{ start: { line: 170, column: 4 }, end: { line: 170, column: 54 } }, { start: { line: 171, column: 4 }, end: { line: 171, column: 22 } }], line: 169 } }, 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, "24": 0, "25": 0, "26": 0, "27": 0, "28": 0, "29": 0, "30": 0, "31": 0, "32": 0, "33": 0, "34": 0 }, f: { "0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0 }, b: { "0": [0, 0], "1": [0, 0], "2": [0, 0], "3": [0, 0], "4": [0], "5": [0, 0], "6": [0, 0], "7": [0, 0], "8": [0, 0], "9": [0, 0], "10": [0, 0], "11": [0, 0], "12": [0, 0], "13": [0, 0], "14": [0, 0], "15": [0, 0] }, _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184", hash: "b8bd02e835e5df95fa6376d9655a32b6e1be5e78" }; 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.addPathToAdapterConfig = addPathToAdapterConfig; exports.getNearestNodeModulesDirectory = getNearestNodeModulesDirectory; exports.getNearestProjectRootDirectory = getNearestProjectRootDirectory; exports.getNpmInstallStringMappings = getNpmInstallStringMappings; exports.getPrompter = getPrompter; exports.generateNpmInstallAdapterCommand = generateNpmInstallAdapterCommand; exports.resolveAdapterPath = resolveAdapterPath; exports.getYarnAddStringMappings = getYarnAddStringMappings; exports.generateYarnAddAdapterCommand = generateYarnAddAdapterCommand; var _child_process = _interopRequireDefault(require("child_process")); var _path = _interopRequireDefault(require("path")); var _fs = _interopRequireDefault(require("fs")); var _findNodeModules = _interopRequireDefault(require("find-node-modules")); var _lodash = _interopRequireDefault(require("lodash")); var _detectIndent = _interopRequireDefault(require("detect-indent")); var _util = require("../common/util"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * ADAPTER * * Adapter is generally responsible for actually installing adapters to an * end user's project. It does not perform checks to determine if there is * a previous commitizen adapter installed or if the proper fields were * provided. It defers that responsibility to init. */ /** * Modifies the package.json, sets config.commitizen.path to the path of the adapter * Must be passed an absolute path to the cli's root */ function addPathToAdapterConfig(cliPath, repoPath, adapterNpmName) { cov_l5hg93smj.f[0]++; let commitizenAdapterConfig = (cov_l5hg93smj.s[0]++, { config: { commitizen: { path: `./node_modules/${adapterNpmName}` } } }); let packageJsonPath = (cov_l5hg93smj.s[1]++, _path.default.join(getNearestProjectRootDirectory(repoPath), 'package.json')); let packageJsonString = (cov_l5hg93smj.s[2]++, _fs.default.readFileSync(packageJsonPath, 'utf-8')); // tries to detect the indentation and falls back to a default if it can't let indent = (cov_l5hg93smj.s[3]++, (cov_l5hg93smj.b[0][0]++, (0, _detectIndent.default)(packageJsonString).indent) || (cov_l5hg93smj.b[0][1]++, ' ')); let packageJsonContent = (cov_l5hg93smj.s[4]++, JSON.parse(packageJsonString)); let newPackageJsonContent = (cov_l5hg93smj.s[5]++, ''); cov_l5hg93smj.s[6]++; if (_lodash.default.get(packageJsonContent, 'config.commitizen.path') !== adapterNpmName) { cov_l5hg93smj.b[1][0]++; cov_l5hg93smj.s[7]++; newPackageJsonContent = _lodash.default.merge(packageJsonContent, commitizenAdapterConfig); } else { cov_l5hg93smj.b[1][1]++; } cov_l5hg93smj.s[8]++; _fs.default.writeFileSync(packageJsonPath, JSON.stringify(newPackageJsonContent, null, indent) + '\n'); } /** * Generates an npm install command given a map of strings and a package name */ function generateNpmInstallAdapterCommand(stringMappings, adapterNpmName) { cov_l5hg93smj.f[1]++; // Start with an initial npm install command let installAdapterCommand = (cov_l5hg93smj.s[9]++, `npm install ${adapterNpmName}`); // Append the neccesary arguments to it based on user preferences cov_l5hg93smj.s[10]++; for (let value of stringMappings.values()) { cov_l5hg93smj.s[11]++; if (value) { cov_l5hg93smj.b[2][0]++; cov_l5hg93smj.s[12]++; installAdapterCommand = installAdapterCommand + ' ' + value; } else { cov_l5hg93smj.b[2][1]++; } } cov_l5hg93smj.s[13]++; return installAdapterCommand; } /** * Generates an yarn add command given a map of strings and a package name */ function generateYarnAddAdapterCommand(stringMappings, adapterNpmName) { cov_l5hg93smj.f[2]++; // Start with an initial yarn add command let installAdapterCommand = (cov_l5hg93smj.s[14]++, `yarn add ${adapterNpmName}`); // Append the necessary arguments to it based on user preferences cov_l5hg93smj.s[15]++; for (let value of stringMappings.values()) { cov_l5hg93smj.s[16]++; if (value) { cov_l5hg93smj.b[3][0]++; cov_l5hg93smj.s[17]++; installAdapterCommand = installAdapterCommand + ' ' + value; } else { cov_l5hg93smj.b[3][1]++; } } cov_l5hg93smj.s[18]++; return installAdapterCommand; } /** * Gets the nearest npm_modules directory */ function getNearestNodeModulesDirectory(options) { cov_l5hg93smj.f[3]++; // Get the nearest node_modules directories to the current working directory let nodeModulesDirectories = (cov_l5hg93smj.s[19]++, (0, _findNodeModules.default)(options)); // Make sure we find a node_modules folder /* istanbul ignore else */ cov_l5hg93smj.s[20]++; if ((cov_l5hg93smj.b[5][0]++, nodeModulesDirectories) && (cov_l5hg93smj.b[5][1]++, nodeModulesDirectories.length > 0)) { cov_l5hg93smj.b[4][0]++; cov_l5hg93smj.s[21]++; return nodeModulesDirectories[0]; } else { console.error(`Error: Could not locate node_modules in your project's root directory. Did you forget to npm init or npm install?`); } } /** * Gets the nearest project root directory */ function getNearestProjectRootDirectory(repoPath, options) { cov_l5hg93smj.f[4]++; cov_l5hg93smj.s[22]++; return _path.default.join(repoPath, getNearestNodeModulesDirectory(options), '/../'); } /** * Gets a map of arguments where the value is the corresponding npm strings */ function getNpmInstallStringMappings(save, saveDev, saveExact, force) { cov_l5hg93smj.f[5]++; cov_l5hg93smj.s[23]++; return new Map().set('save', (cov_l5hg93smj.b[7][0]++, save) && (cov_l5hg93smj.b[7][1]++, !saveDev) ? (cov_l5hg93smj.b[6][0]++, '--save') : (cov_l5hg93smj.b[6][1]++, undefined)).set('saveDev', saveDev ? (cov_l5hg93smj.b[8][0]++, '--save-dev') : (cov_l5hg93smj.b[8][1]++, undefined)).set('saveExact', saveExact ? (cov_l5hg93smj.b[9][0]++, '--save-exact') : (cov_l5hg93smj.b[9][1]++, undefined)).set('force', force ? (cov_l5hg93smj.b[10][0]++, '--force') : (cov_l5hg93smj.b[10][1]++, undefined)); } /** * Gets a map of arguments where the value is the corresponding yarn strings */ function getYarnAddStringMappings(dev, exact, force) { cov_l5hg93smj.f[6]++; cov_l5hg93smj.s[24]++; return new Map().set('dev', dev ? (cov_l5hg93smj.b[11][0]++, '--dev') : (cov_l5hg93smj.b[11][1]++, undefined)).set('exact', exact ? (cov_l5hg93smj.b[12][0]++, '--exact') : (cov_l5hg93smj.b[12][1]++, undefined)).set('force', force ? (cov_l5hg93smj.b[13][0]++, '--force') : (cov_l5hg93smj.b[13][1]++, undefined)); } /** * Gets the prompter from an adapter given an adapter path */ function getPrompter(adapterPath) { cov_l5hg93smj.f[7]++; // Resolve the adapter path let resolvedAdapterPath = (cov_l5hg93smj.s[25]++, resolveAdapterPath(adapterPath)); // Load the adapter let adapter = (cov_l5hg93smj.s[26]++, require(resolvedAdapterPath)); /* istanbul ignore next */ if (adapter && adapter.prompter && (0, _util.isFunction)(adapter.prompter)) { return adapter.prompter; } else if (adapter && adapter.default && adapter.default.prompter && (0, _util.isFunction)(adapter.default.prompter)) { return adapter.default.prompter; } else { throw new Error(`Could not find prompter method in the provided adapter module: ${adapterPath}`); } } /** * Given a resolvable module name or path, which can be a directory or file, will * return a located adapter path or will throw. */ function resolveAdapterPath(inboundAdapterPath) { cov_l5hg93smj.f[8]++; // Check if inboundAdapterPath is a path or node module name let parsed = (cov_l5hg93smj.s[27]++, _path.default.parse(inboundAdapterPath)); let isPath = (cov_l5hg93smj.s[28]++, (cov_l5hg93smj.b[14][0]++, parsed.dir.length > 0) && (cov_l5hg93smj.b[14][1]++, parsed.dir.charAt(0) !== "@")); // Resolve from the root of the git repo if inboundAdapterPath is a path let absoluteAdapterPath = (cov_l5hg93smj.s[29]++, isPath ? (cov_l5hg93smj.b[15][0]++, _path.default.resolve(getGitRootPath(), inboundAdapterPath)) : (cov_l5hg93smj.b[15][1]++, inboundAdapterPath)); cov_l5hg93smj.s[30]++; try { cov_l5hg93smj.s[31]++; // try to resolve the given path return require.resolve(absoluteAdapterPath); } catch (error) { cov_l5hg93smj.s[32]++; error.message = "Could not resolve " + absoluteAdapterPath + ". " + error.message; cov_l5hg93smj.s[33]++; throw error; } } function getGitRootPath() { cov_l5hg93smj.f[9]++; cov_l5hg93smj.s[34]++; return _child_process.default.spawnSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).stdout.trim(); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFkYXB0ZXIuanMiXSwibmFtZXMiOlsiYWRkUGF0aFRvQWRhcHRlckNvbmZpZyIsImNsaVBhdGgiLCJyZXBvUGF0aCIsImFkYXB0ZXJOcG1OYW1lIiwiY29tbWl0aXplbkFkYXB0ZXJDb25maWciLCJjb25maWciLCJjb21taXRpemVuIiwicGF0aCIsInBhY2thZ2VKc29uUGF0aCIsImpvaW4iLCJnZXROZWFyZXN0UHJvamVjdFJvb3REaXJlY3RvcnkiLCJwYWNrYWdlSnNvblN0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiaW5kZW50IiwicGFja2FnZUpzb25Db250ZW50IiwiSlNPTiIsInBhcnNlIiwibmV3UGFja2FnZUpzb25Db250ZW50IiwiXyIsImdldCIsIm1lcmdlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImdlbmVyYXRlTnBtSW5zdGFsbEFkYXB0ZXJDb21tYW5kIiwic3RyaW5nTWFwcGluZ3MiLCJpbnN0YWxsQWRhcHRlckNvbW1hbmQiLCJ2YWx1ZSIsInZhbHVlcyIsImdlbmVyYXRlWWFybkFkZEFkYXB0ZXJDb21tYW5kIiwiZ2V0TmVhcmVzdE5vZGVNb2R1bGVzRGlyZWN0b3J5Iiwib3B0aW9ucyIsIm5vZGVNb2R1bGVzRGlyZWN0b3JpZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MiLCJzYXZlIiwic2F2ZURldiIsInNhdmVFeGFjdCIsImZvcmNlIiwiTWFwIiwic2V0IiwidW5kZWZpbmVkIiwiZ2V0WWFybkFkZFN0cmluZ01hcHBpbmdzIiwiZGV2IiwiZXhhY3QiLCJnZXRQcm9tcHRlciIsImFkYXB0ZXJQYXRoIiwicmVzb2x2ZWRBZGFwdGVyUGF0aCIsInJlc29sdmVBZGFwdGVyUGF0aCIsImFkYXB0ZXIiLCJyZXF1aXJlIiwicHJvbXB0ZXIiLCJkZWZhdWx0IiwiRXJyb3IiLCJpbmJvdW5kQWRhcHRlclBhdGgiLCJwYXJzZWQiLCJpc1BhdGgiLCJkaXIiLCJjaGFyQXQiLCJhYnNvbHV0ZUFkYXB0ZXJQYXRoIiwicmVzb2x2ZSIsImdldEdpdFJvb3RQYXRoIiwibWVzc2FnZSIsImNoaWxkUHJvY2VzcyIsInNwYXduU3luYyIsImVuY29kaW5nIiwic3Rkb3V0IiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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WixHQUFoRSxFQUFzRkMsTUFBdEYsQ0FBNkZDLElBQTdGLEVBQVA7QUFDRCIsInNvdXJjZVJvb3QiOiIvVXNlcnMvY2FsbHVtYWNyYWUvU2l0ZXMvZmluZC1ub2RlLW1vZHVsZXMvY3otY2xpL3NyYy9jb21taXRpemVuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBmaW5kTm9kZU1vZHVsZXMgZnJvbSAnZmluZC1ub2RlLW1vZHVsZXMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCc7XG5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi9jb21tb24vdXRpbCc7XG5cbmV4cG9ydCB7XG4gIGFkZFBhdGhUb0FkYXB0ZXJDb25maWcsXG4gIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeSxcbiAgZ2V0TmVhcmVzdFByb2plY3RSb290RGlyZWN0b3J5LFxuICBnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MsXG4gIGdldFByb21wdGVyLFxuICBnZW5lcmF0ZU5wbUluc3RhbGxBZGFwdGVyQ29tbWFuZCxcbiAgcmVzb2x2ZUFkYXB0ZXJQYXRoLFxuICBnZXRZYXJuQWRkU3RyaW5nTWFwcGluZ3MsXG4gIGdlbmVyYXRlWWFybkFkZEFkYXB0ZXJDb21tYW5kLFxufTtcblxuLyoqXG4gKiBBREFQVEVSXG4gKlxuICogQWRhcHRlciBpcyBnZW5lcmFsbHkgcmVzcG9uc2libGUgZm9yIGFjdHVhbGx5IGluc3RhbGxpbmcgYWRhcHRlcnMgdG8gYW5cbiAqIGVuZCB1c2VyJ3MgcHJvamVjdC4gSXQgZG9lcyBub3QgcGVyZm9ybSBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzXG4gKiBhIHByZXZpb3VzIGNvbW1pdGl6ZW4gYWRhcHRlciBpbnN0YWxsZWQgb3IgaWYgdGhlIHByb3BlciBmaWVsZHMgd2VyZVxuICogcHJvdmlkZWQuIEl0IGRlZmVycyB0aGF0IHJlc3BvbnNpYmlsaXR5IHRvIGluaXQuXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGFja2FnZS5qc29uLCBzZXRzIGNvbmZpZy5jb21taXRpemVuLnBhdGggdG8gdGhlIHBhdGggb2YgdGhlIGFkYXB0ZXJcbiAqIE11c3QgYmUgcGFzc2VkIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGNsaSdzIHJvb3RcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aFRvQWRhcHRlckNvbmZpZyAoY2xpUGF0aCwgcmVwb1BhdGgsIGFkYXB0ZXJOcG1OYW1lKSB7XG5cbiAgbGV0IGNvbW1pdGl6ZW5BZGFwdGVyQ29uZmlnID0ge1xuICAgIGNvbmZpZzoge1xuICAgICAgY29tbWl0aXplbjoge1xuICAgICAgICBwYXRoOiBgLi9ub2RlX21vZHVsZXMvJHthZGFwdGVyTnBtTmFtZX1gXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGxldCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZ2V0TmVhcmVzdFByb2plY3RSb290RGlyZWN0b3J5KHJlcG9QYXRoKSwgJ3BhY2thZ2UuanNvbicpO1xuICBsZXQgcGFja2FnZUpzb25TdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKTtcbiAgLy8gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpbmRlbnRhdGlvbiBhbmQgZmFsbHMgYmFjayB0byBhIGRlZmF1bHQgaWYgaXQgY2FuJ3RcbiAgbGV0IGluZGVudCA9IGRldGVjdEluZGVudChwYWNrYWdlSnNvblN0cmluZykuaW5kZW50IHx8ICcgICc7XG4gIGxldCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uU3RyaW5nKTtcbiAgbGV0IG5ld1BhY2thZ2VKc29uQ29udGVudCA9ICcnO1xuICBpZiAoXy5nZXQocGFja2FnZUpzb25Db250ZW50LCAnY29uZmlnLmNvbW1pdGl6ZW4ucGF0aCcpICE9PSBhZGFwdGVyTnBtTmFtZSkge1xuICAgIG5ld1BhY2thZ2VKc29uQ29udGVudCA9IF8ubWVyZ2UocGFja2FnZUpzb25Db250ZW50LCBjb21taXRpemVuQWRhcHRlckNvbmZpZyk7XG4gIH1cbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KG5ld1BhY2thZ2VKc29uQ29udGVudCwgbnVsbCwgaW5kZW50KSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gbnBtIGluc3RhbGwgY29tbWFuZCBnaXZlbiBhIG1hcCBvZiBzdHJpbmdzIGFuZCBhIHBhY2thZ2UgbmFtZVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5wbUluc3RhbGxBZGFwdGVyQ29tbWFuZCAoc3RyaW5nTWFwcGluZ3MsIGFkYXB0ZXJOcG1OYW1lKSB7XG5cbiAgLy8gU3RhcnQgd2l0aCBhbiBpbml0aWFsIG5wbSBpbnN0YWxsIGNvbW1hbmRcbiAgbGV0IGluc3RhbGxBZGFwdGVyQ29tbWFuZCA9IGBucG0gaW5zdGFsbCAke2FkYXB0ZXJOcG1OYW1lfWA7XG5cbiAgLy8gQXBwZW5kIHRoZSBuZWNjZXNhcnkgYXJndW1lbnRzIHRvIGl0IGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXNcbiAgZm9yIChsZXQgdmFsdWUgb2Ygc3RyaW5nTWFwcGluZ3MudmFsdWVzKCkpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGluc3RhbGxBZGFwdGVyQ29tbWFuZCA9IGluc3RhbGxBZGFwdGVyQ29tbWFuZCArICcgJyArIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0YWxsQWRhcHRlckNvbW1hbmQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIHlhcm4gYWRkIGNvbW1hbmQgZ2l2ZW4gYSBtYXAgb2Ygc3RyaW5ncyBhbmQgYSBwYWNrYWdlIG5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVZYXJuQWRkQWRhcHRlckNvbW1hbmQgKHN0cmluZ01hcHBpbmdzLCBhZGFwdGVyTnBtTmFtZSkge1xuXG4gIC8vIFN0YXJ0IHdpdGggYW4gaW5pdGlhbCB5YXJuIGFkZCBjb21tYW5kXG4gIGxldCBpbnN0YWxsQWRhcHRlckNvbW1hbmQgPSBgeWFybiBhZGQgJHthZGFwdGVyTnBtTmFtZX1gO1xuXG4gIC8vIEFwcGVuZCB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBpdCBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2VzXG4gIGZvciAobGV0IHZhbHVlIG9mIHN0cmluZ01hcHBpbmdzLnZhbHVlcygpKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpbnN0YWxsQWRhcHRlckNvbW1hbmQgPSBpbnN0YWxsQWRhcHRlckNvbW1hbmQgKyAnICcgKyB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdGFsbEFkYXB0ZXJDb21tYW5kO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5lYXJlc3QgbnBtX21vZHVsZXMgZGlyZWN0b3J5XG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeSAob3B0aW9ucykge1xuXG4gIC8vIEdldCB0aGUgbmVhcmVzdCBub2RlX21vZHVsZXMgZGlyZWN0b3JpZXMgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgbGV0IG5vZGVNb2R1bGVzRGlyZWN0b3JpZXMgPSBmaW5kTm9kZU1vZHVsZXMob3B0aW9ucyk7XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGZpbmQgYSBub2RlX21vZHVsZXMgZm9sZGVyXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG5vZGVNb2R1bGVzRGlyZWN0b3JpZXMgJiYgbm9kZU1vZHVsZXNEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG5vZGVNb2R1bGVzRGlyZWN0b3JpZXNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3I6IENvdWxkIG5vdCBsb2NhdGUgbm9kZV9tb2R1bGVzIGluIHlvdXIgcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5LiBEaWQgeW91IGZvcmdldCB0byBucG0gaW5pdCBvciBucG0gaW5zdGFsbD9gKVxuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5XG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3RQcm9qZWN0Um9vdERpcmVjdG9yeSAocmVwb1BhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHBhdGguam9pbihyZXBvUGF0aCwgZ2V0TmVhcmVzdE5vZGVNb2R1bGVzRGlyZWN0b3J5KG9wdGlvbnMpLCAnLy4uLycpO1xufVxuXG4vKipcbiAqIEdldHMgYSBtYXAgb2YgYXJndW1lbnRzIHdoZXJlIHRoZSB2YWx1ZSBpcyB0aGUgY29ycmVzcG9uZGluZyBucG0gc3RyaW5nc1xuICovXG5mdW5jdGlvbiBnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MgKHNhdmUsIHNhdmVEZXYsIHNhdmVFeGFjdCwgZm9yY2UpIHtcbiAgcmV0dXJuIG5ldyBNYXAoKVxuICAgIC5zZXQoJ3NhdmUnLCAoc2F2ZSAmJiAhc2F2ZURldikgPyAnLS1zYXZlJyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdzYXZlRGV2Jywgc2F2ZURldiA/ICctLXNhdmUtZGV2JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdzYXZlRXhhY3QnLCBzYXZlRXhhY3QgPyAnLS1zYXZlLWV4YWN0JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdmb3JjZScsIGZvcmNlID8gJy0tZm9yY2UnIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbWFwIG9mIGFyZ3VtZW50cyB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgeWFybiBzdHJpbmdzXG4gKi9cbmZ1bmN0aW9uIGdldFlhcm5BZGRTdHJpbmdNYXBwaW5ncyAoZGV2LCBleGFjdCwgZm9yY2UpIHtcbiAgcmV0dXJuIG5ldyBNYXAoKVxuICAgIC5zZXQoJ2RldicsIGRldiA/ICctLWRldicgOiB1bmRlZmluZWQpXG4gICAgLnNldCgnZXhhY3QnLCBleGFjdCA/ICctLWV4YWN0JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdmb3JjZScsIGZvcmNlID8gJy0tZm9yY2UnIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9tcHRlciBmcm9tIGFuIGFkYXB0ZXIgZ2l2ZW4gYW4gYWRhcHRlciBwYXRoXG4gKi9cbmZ1bmN0aW9uIGdldFByb21wdGVyIChhZGFwdGVyUGF0aCkge1xuICAvLyBSZXNvbHZlIHRoZSBhZGFwdGVyIHBhdGhcbiAgbGV0IHJlc29sdmVkQWRhcHRlclBhdGggPSByZXNvbHZlQWRhcHRlclBhdGgoYWRhcHRlclBhdGgpO1xuXG4gIC8vIExvYWQgdGhlIGFkYXB0ZXJcbiAgbGV0IGFkYXB0ZXIgPSByZXF1aXJlKHJlc29sdmVkQWRhcHRlclBhdGgpO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChhZGFwdGVyICYmIGFkYXB0ZXIucHJvbXB0ZXIgJiYgaXNGdW5jdGlvbihhZGFwdGVyLnByb21wdGVyKSkge1xuICAgICByZXR1cm4gYWRhcHRlci5wcm9tcHRlcjtcbiAgfSBlbHNlIGlmIChhZGFwdGVyICYmIGFkYXB0ZXIuZGVmYXVsdCAmJiBhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXIgJiYgaXNGdW5jdGlvbihhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXIpKSB7XG4gICAgIHJldHVybiBhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBwcm9tcHRlciBtZXRob2QgaW4gdGhlIHByb3ZpZGVkIGFkYXB0ZXIgbW9kdWxlOiAke2FkYXB0ZXJQYXRofWApO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSByZXNvbHZhYmxlIG1vZHVsZSBuYW1lIG9yIHBhdGgsIHdoaWNoIGNhbiBiZSBhIGRpcmVjdG9yeSBvciBmaWxlLCB3aWxsXG4gKiByZXR1cm4gYSBsb2NhdGVkIGFkYXB0ZXIgcGF0aCBvciB3aWxsIHRocm93LlxuICovXG5mdW5jdGlvbiByZXNvbHZlQWRhcHRlclBhdGggKGluYm91bmRBZGFwdGVyUGF0aCkge1xuICAvLyBDaGVjayBpZiBpbmJvdW5kQWRhcHRlclBhdGggaXMgYSBwYXRoIG9yIG5vZGUgbW9kdWxlIG5hbWVcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoaW5ib3VuZEFkYXB0ZXJQYXRoKTtcbiAgbGV0IGlzUGF0aCA9IHBhcnNlZC5kaXIubGVuZ3RoID4gMCAmJiBwYXJzZWQuZGlyLmNoYXJBdCgwKSAhPT0gXCJAXCI7XG5cbiAgLy8gUmVzb2x2ZSBmcm9tIHRoZSByb290IG9mIHRoZSBnaXQgcmVwbyBpZiBpbmJvdW5kQWRhcHRlclBhdGggaXMgYSBwYXRoXG4gIGxldCBhYnNvbHV0ZUFkYXB0ZXJQYXRoID0gaXNQYXRoID9cbiAgICBwYXRoLnJlc29sdmUoZ2V0R2l0Um9vdFBhdGgoKSwgaW5ib3VuZEFkYXB0ZXJQYXRoKSA6XG4gICAgaW5ib3VuZEFkYXB0ZXJQYXRoO1xuXG4gIHRyeSB7XG4gICAgLy8gdHJ5IHRvIHJlc29sdmUgdGhlIGdpdmVuIHBhdGhcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKGFic29sdXRlQWRhcHRlclBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBcIkNvdWxkIG5vdCByZXNvbHZlIFwiICsgYWJzb2x1dGVBZGFwdGVyUGF0aCArIFwiLiBcIiArIGVycm9yLm1lc3NhZ2U7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0Um9vdFBhdGggKCkge1xuICByZXR1cm4gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KS5zdGRvdXQudHJpbSgpO1xufVxuIl19