JezK
Edit File: npm-registry.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.SCOPE_SEPARATOR = void 0; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _slicedToArray2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); _slicedToArray2 = function _slicedToArray2() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _classCallCheck2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); _classCallCheck2 = function _classCallCheck2() { return data; }; return data; } function _createClass2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); _createClass2 = function _createClass2() { return data; }; return data; } function _inherits2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); _inherits2 = function _inherits2() { return data; }; return data; } function _possibleConstructorReturn2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); _possibleConstructorReturn2 = function _possibleConstructorReturn2() { return data; }; return data; } function _getPrototypeOf2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); _getPrototypeOf2 = function _getPrototypeOf2() { return data; }; return data; } function _defineProperty2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); _defineProperty2 = function _defineProperty2() { return data; }; return data; } function _constants() { var data = require("../constants.js"); _constants = function _constants() { return data; }; return data; } function fs() { var data = _interopRequireWildcard(require("../util/fs.js")); fs = function fs() { return data; }; return data; } function _npmResolver() { var data = _interopRequireDefault(require("../resolvers/registries/npm-resolver.js")); _npmResolver = function _npmResolver() { return data; }; return data; } function _envReplace() { var data = _interopRequireDefault(require("../util/env-replace.js")); _envReplace = function _envReplace() { return data; }; return data; } function _baseRegistry() { var data = _interopRequireDefault(require("./base-registry.js")); _baseRegistry = function _baseRegistry() { return data; }; return data; } function _misc() { var data = require("../util/misc"); _misc = function _misc() { return data; }; return data; } function _path() { var data = require("../util/path"); _path = function _path() { return data; }; return data; } function _normalizeUrl() { var data = _interopRequireDefault(require("normalize-url")); _normalizeUrl = function _normalizeUrl() { return data; }; return data; } function _userHomeDir() { var data = _interopRequireWildcard(require("../util/user-home-dir")); _userHomeDir = function _userHomeDir() { return data; }; return data; } function _errors() { var data = require("../errors.js"); _errors = function _errors() { return data; }; return data; } function _login() { var data = require("../cli/commands/login.js"); _login = function _login() { return data; }; return data; } function _path2() { var data = _interopRequireDefault(require("path")); _path2 = function _path2() { return data; }; return data; } function _url() { var data = _interopRequireDefault(require("url")); _url = function _url() { return data; }; return data; } function _ini() { var data = _interopRequireDefault(require("ini")); _ini = function _ini() { return data; }; return data; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2()["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2()["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2()["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2()["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var DEFAULT_REGISTRY = 'https://registry.npmjs.org/'; var REGEX_REGISTRY_ENFORCED_HTTPS = /^https?:\/\/([^\/]+\.)?(yarnpkg\.com|npmjs\.(org|com))(\/|$)/; var REGEX_REGISTRY_HTTP_PROTOCOL = /^https?:/i; var REGEX_REGISTRY_PREFIX = /^(https?:)?\/\//i; var REGEX_REGISTRY_SUFFIX = /registry\/?$/; var SCOPE_SEPARATOR = '%2f'; // All scoped package names are of the format `@scope%2fpkg` from the use of NpmRegistry.escapeName // `(?:^|\/)` Match either the start of the string or a `/` but don't capture // `[^\/?]+?` Match any character that is not '/' or '?' and capture, up until the first occurrence of: // `(?=%2f|\/)` Match SCOPE_SEPARATOR, the escaped '/', or a raw `/` and don't capture // The reason for matching a plain `/` is NPM registry being inconsistent about escaping `/` in // scoped package names: when you're fetching a tarball, it is not escaped, when you want info // about the package, it is escaped. exports.SCOPE_SEPARATOR = SCOPE_SEPARATOR; var SCOPED_PKG_REGEXP = /(?:^|\/)(@[^\/?]+?)(?=%2f|\/)/; // TODO: Use the method from src/cli/commands/global.js for this instead function getGlobalPrefix() { if (process.env.PREFIX) { return process.env.PREFIX; } else if (process.platform === 'win32') { // c:\node\node.exe --> prefix=c:\node\ return _path2()["default"].dirname(process.execPath); } else { // /usr/local/bin/node --> prefix=/usr/local var prefix = _path2()["default"].dirname(_path2()["default"].dirname(process.execPath)); // destdir only is respected on Unix if (process.env.DESTDIR) { prefix = _path2()["default"].join(process.env.DESTDIR, prefix); } return prefix; } } var PATH_CONFIG_OPTIONS = new Set(['cache', 'cafile', 'prefix', 'userconfig']); function isPathConfigOption(key) { return PATH_CONFIG_OPTIONS.has(key); } function normalizePath(val) { if (val === undefined) { return undefined; } if (typeof val !== 'string') { val = String(val); } return (0, _path().resolveWithHome)(val); } function urlParts(requestUrl) { var normalizedUrl = (0, _normalizeUrl()["default"])(requestUrl); var parsed = _url()["default"].parse(normalizedUrl); var host = parsed.host || ''; var path = parsed.path || ''; return { host: host, path: path }; } var NpmRegistry = /*#__PURE__*/function (_Registry) { (0, _inherits2()["default"])(NpmRegistry, _Registry); var _super = _createSuper(NpmRegistry); function NpmRegistry(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles) { var _this; (0, _classCallCheck2()["default"])(this, NpmRegistry); _this = _super.call(this, cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles); _this.folder = 'node_modules'; return _this; } (0, _createClass2()["default"])(NpmRegistry, [{ key: "isScopedPackage", value: function isScopedPackage(packageIdent) { return SCOPED_PKG_REGEXP.test(packageIdent); } }, { key: "getRequestUrl", value: function getRequestUrl(registry, pathname) { var resolved = pathname; if (!REGEX_REGISTRY_PREFIX.test(pathname)) { resolved = _url()["default"].resolve((0, _misc().addSuffix)(registry, '/'), "./".concat(pathname)); } if (REGEX_REGISTRY_ENFORCED_HTTPS.test(resolved)) { resolved = resolved.replace(/^http:\/\//, 'https://'); } return resolved; } }, { key: "isRequestToRegistry", value: function isRequestToRegistry(requestUrl, registryUrl) { var request = urlParts(requestUrl); var registry = urlParts(registryUrl); var customHostSuffix = this.getRegistryOrGlobalOption(registryUrl, 'custom-host-suffix'); var requestToRegistryHost = request.host === registry.host; var requestToYarn = _constants().YARN_REGISTRY.includes(request.host) && DEFAULT_REGISTRY.includes(registry.host); var requestToRegistryPath = request.path.startsWith(registry.path); // For some registries, the package path does not prefix with the registry path var customHostSuffixInUse = typeof customHostSuffix === 'string' && request.host.endsWith(customHostSuffix); return (requestToRegistryHost || requestToYarn) && (requestToRegistryPath || customHostSuffixInUse); } }, { key: "request", value: function () { var _request = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(pathname) { var opts, packageName, packageIdent, registry, requestUrl, alwaysAuth, headers, isToRegistry, authorization, _args = arguments; return _regenerator()["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: opts = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}; packageName = _args.length > 2 ? _args[2] : undefined; // packageName needs to be escaped when if it is passed packageIdent = packageName && NpmRegistry.escapeName(packageName) || pathname; registry = opts.registry || this.getRegistry(packageIdent); requestUrl = this.getRequestUrl(registry, pathname); alwaysAuth = this.getRegistryOrGlobalOption(registry, 'always-auth'); headers = _objectSpread({ Accept: // This is to use less bandwidth unless we really need to get the full response. // See https://github.com/npm/npm-registry-client#requests opts.unfiltered ? 'application/json' : 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' }, opts.headers); isToRegistry = this.isRequestToRegistry(requestUrl, registry) || this.requestNeedsAuth(requestUrl); // this.token must be checked to account for publish requests on non-scoped packages if (this.token || isToRegistry && (alwaysAuth || this.isScopedPackage(packageIdent))) { authorization = this.getAuth(packageIdent); if (authorization) { headers.authorization = authorization; } } if (this.otp) { headers['npm-otp'] = this.otp; } _context.prev = 10; _context.next = 13; return this.requestManager.request({ url: requestUrl, method: opts.method, body: opts.body, auth: opts.auth, headers: headers, json: !opts.buffer, buffer: opts.buffer, process: opts.process, gzip: true }); case 13: return _context.abrupt("return", _context.sent); case 16: _context.prev = 16; _context.t0 = _context["catch"](10); if (!(_context.t0 instanceof _errors().OneTimePasswordError)) { _context.next = 30; break; } if (!this.otp) { _context.next = 21; break; } throw new (_errors().MessageError)(this.reporter.lang('incorrectOneTimePassword')); case 21: this.reporter.info(this.reporter.lang('twoFactorAuthenticationEnabled')); if (_context.t0.notice) { this.reporter.info(_context.t0.notice); } _context.next = 25; return (0, _login().getOneTimePassword)(this.reporter); case 25: this.otp = _context.sent; this.requestManager.clearCache(); return _context.abrupt("return", this.request(pathname, opts, packageName)); case 30: throw _context.t0; case 31: case "end": return _context.stop(); } }, _callee, this, [[10, 16]]); })); function request(_x) { return _request.apply(this, arguments); } return request; }() }, { key: "requestNeedsAuth", value: function requestNeedsAuth(requestUrl) { var config = this.config; var requestParts = urlParts(requestUrl); return !!Object.keys(config).find(function (option) { var parts = option.split(':'); if (parts.length === 2 && parts[1] === '_authToken' || parts[1] === '_password') { var registryParts = urlParts(parts[0]); if (requestParts.host === registryParts.host && requestParts.path.startsWith(registryParts.path)) { return true; } } return false; }); } }, { key: "checkOutdated", value: function () { var _checkOutdated = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee2(config, name, range) { var escapedName, req, repository, homepage, wantedPkg, latest, url; return _regenerator()["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: escapedName = NpmRegistry.escapeName(name); _context2.next = 3; return this.request(escapedName, { unfiltered: true }); case 3: req = _context2.sent; if (req) { _context2.next = 6; break; } throw new Error("couldn't find ".concat(name)); case 6: // By default use top level 'repository' and 'homepage' values repository = req.repository, homepage = req.homepage; _context2.next = 9; return _npmResolver()["default"].findVersionInRegistryResponse(config, escapedName, range, req); case 9: wantedPkg = _context2.sent; // But some local repositories like Verdaccio do not return 'repository' nor 'homepage' // in top level data structure, so we fallback to wanted package manifest if (!repository && !homepage) { repository = wantedPkg.repository; homepage = wantedPkg.homepage; } latest = req['dist-tags'].latest; // In certain cases, registries do not return a 'latest' tag. if (!latest) { latest = wantedPkg.version; } url = homepage || repository && repository.url || ''; return _context2.abrupt("return", { latest: latest, wanted: wantedPkg.version, url: url }); case 15: case "end": return _context2.stop(); } }, _callee2, this); })); function checkOutdated(_x2, _x3, _x4) { return _checkOutdated.apply(this, arguments); } return checkOutdated; }() }, { key: "getPossibleConfigLocations", value: function () { var _getPossibleConfigLocations = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee3(filename, reporter) { var possibles, _iterator, _step, rcFile, localfile, foldersFromRootToCwd, actuals, _iterator2, _step2, _step2$value, isHome, loc; return _regenerator()["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: possibles = []; _iterator = _createForOfIteratorHelper(this.extraneousRcFiles.slice().reverse()); try { for (_iterator.s(); !(_step = _iterator.n()).done;) { rcFile = _step.value; possibles.push([false, _path2()["default"].resolve(process.cwd(), rcFile)]); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (this.enableDefaultRc) { // npmrc --> ./.npmrc, ~/.npmrc, ${prefix}/etc/npmrc localfile = '.' + filename; possibles = possibles.concat([[false, _path2()["default"].join(this.cwd, localfile)], [true, this.config.userconfig || _path2()["default"].join(_userHomeDir()["default"], localfile)], [false, _path2()["default"].join(getGlobalPrefix(), 'etc', filename)]]); // When home directory for global install is different from where $HOME/npmrc is stored, // E.g. /usr/local/share vs /root on linux machines, check the additional location if (_userHomeDir().home !== _userHomeDir()["default"]) { possibles.push([true, _path2()["default"].join(_userHomeDir().home, localfile)]); } // npmrc --> ../.npmrc, ../../.npmrc, etc. foldersFromRootToCwd = (0, _path().getPosixPath)(this.cwd).split('/'); while (foldersFromRootToCwd.length > 1) { possibles.push([false, _path2()["default"].join(foldersFromRootToCwd.join(_path2()["default"].sep), localfile)]); foldersFromRootToCwd.pop(); } } actuals = []; _iterator2 = _createForOfIteratorHelper(possibles); _context3.prev = 6; _iterator2.s(); case 8: if ((_step2 = _iterator2.n()).done) { _context3.next = 25; break; } _step2$value = (0, _slicedToArray2()["default"])(_step2.value, 2), isHome = _step2$value[0], loc = _step2$value[1]; reporter.verbose(reporter.lang('configPossibleFile', loc)); _context3.next = 13; return fs().exists(loc); case 13: if (!_context3.sent) { _context3.next = 23; break; } reporter.verbose(reporter.lang('configFileFound', loc)); _context3.t0 = actuals; _context3.t1 = isHome; _context3.t2 = loc; _context3.next = 20; return fs().readFile(loc); case 20: _context3.t3 = _context3.sent; _context3.t4 = [_context3.t1, _context3.t2, _context3.t3]; _context3.t0.push.call(_context3.t0, _context3.t4); case 23: _context3.next = 8; break; case 25: _context3.next = 30; break; case 27: _context3.prev = 27; _context3.t5 = _context3["catch"](6); _iterator2.e(_context3.t5); case 30: _context3.prev = 30; _iterator2.f(); return _context3.finish(30); case 33: return _context3.abrupt("return", actuals); case 34: case "end": return _context3.stop(); } }, _callee3, this, [[6, 27, 30, 33]]); })); function getPossibleConfigLocations(_x5, _x6) { return _getPossibleConfigLocations.apply(this, arguments); } return getPossibleConfigLocations; }() }, { key: "loadConfig", value: function () { var _loadConfig = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee4() { var _iterator3, _step3, _step3$value, loc, file, config, offlineLoc, mirrorLoc; return _regenerator()["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: // docs: https://docs.npmjs.com/misc/config this.mergeEnv('npm_config_'); _context4.t0 = _createForOfIteratorHelper; _context4.next = 4; return this.getPossibleConfigLocations('npmrc', this.reporter); case 4: _context4.t1 = _context4.sent; _iterator3 = (0, _context4.t0)(_context4.t1); _context4.prev = 6; _iterator3.s(); case 8: if ((_step3 = _iterator3.n()).done) { _context4.next = 19; break; } _step3$value = (0, _slicedToArray2()["default"])(_step3.value, 3), loc = _step3$value[1], file = _step3$value[2]; config = NpmRegistry.normalizeConfig(_ini()["default"].parse(file)); // normalize offline mirror path relative to the current npmrc offlineLoc = config['yarn-offline-mirror']; // don't normalize if we already have a mirror path if (!(!this.config['yarn-offline-mirror'] && offlineLoc)) { _context4.next = 16; break; } mirrorLoc = config['yarn-offline-mirror'] = _path2()["default"].resolve(_path2()["default"].dirname(loc), offlineLoc); _context4.next = 16; return fs().mkdirp(mirrorLoc); case 16: this.config = Object.assign({}, config, this.config); case 17: _context4.next = 8; break; case 19: _context4.next = 24; break; case 21: _context4.prev = 21; _context4.t2 = _context4["catch"](6); _iterator3.e(_context4.t2); case 24: _context4.prev = 24; _iterator3.f(); return _context4.finish(24); case 27: case "end": return _context4.stop(); } }, _callee4, this, [[6, 21, 24, 27]]); })); function loadConfig() { return _loadConfig.apply(this, arguments); } return loadConfig; }() }, { key: "getScope", value: function getScope(packageIdent) { var match = packageIdent.match(SCOPED_PKG_REGEXP); return match && match[1] || ''; } }, { key: "getRegistry", value: function getRegistry(packageIdent) { // Try extracting registry from the url, then scoped registry, and default registry if (packageIdent.match(REGEX_REGISTRY_PREFIX)) { var availableRegistries = this.getAvailableRegistries(); var registry = availableRegistries.find(function (registry) { return packageIdent.startsWith(registry); }); if (registry) { return String(registry); } } for (var _i = 0, _arr = [this.getScope(packageIdent), '']; _i < _arr.length; _i++) { var scope = _arr[_i]; var _registry = this.getScopedOption(scope, 'registry') || this.registries.yarn.getScopedOption(scope, 'registry'); if (_registry) { return String(_registry); } } return DEFAULT_REGISTRY; } }, { key: "getAuthByRegistry", value: function getAuthByRegistry(registry) { // Check for bearer token. var authToken = this.getRegistryOrGlobalOption(registry, '_authToken'); if (authToken) { return "Bearer ".concat(String(authToken)); } // Check for basic auth token. var auth = this.getRegistryOrGlobalOption(registry, '_auth'); if (auth) { return "Basic ".concat(String(auth)); } // Check for basic username/password auth. var username = this.getRegistryOrGlobalOption(registry, 'username'); var password = this.getRegistryOrGlobalOption(registry, '_password'); if (username && password) { var pw = Buffer.from(String(password), 'base64').toString(); return 'Basic ' + Buffer.from(String(username) + ':' + pw).toString('base64'); } return ''; } }, { key: "getAuth", value: function getAuth(packageIdent) { if (this.token) { return this.token; } var baseRegistry = this.getRegistry(packageIdent); var registries = [baseRegistry]; // If sending a request to the Yarn registry, we must also send it the auth token for the npm registry if (baseRegistry === _constants().YARN_REGISTRY) { registries.push(DEFAULT_REGISTRY); } for (var _i2 = 0, _registries = registries; _i2 < _registries.length; _i2++) { var registry = _registries[_i2]; var auth = this.getAuthByRegistry(registry); if (auth) { return auth; } } return ''; } }, { key: "getScopedOption", value: function getScopedOption(scope, option) { return this.getOption(scope + (scope ? ':' : '') + option); } }, { key: "getRegistryOption", value: function getRegistryOption(registry, option) { var pre = REGEX_REGISTRY_HTTP_PROTOCOL; var suf = REGEX_REGISTRY_SUFFIX; // When registry is used config scope, the trailing '/' is required var reg = (0, _misc().addSuffix)(registry, '/'); // 1st attempt, try to get option for the given registry URL // 2nd attempt, remove the 'https?:' prefix of the registry URL // 3nd attempt, remove the 'registry/?' suffix of the registry URL return this.getScopedOption(reg, option) || pre.test(reg) && this.getRegistryOption(reg.replace(pre, ''), option) || suf.test(reg) && this.getRegistryOption(reg.replace(suf, ''), option); } }, { key: "getRegistryOrGlobalOption", value: function getRegistryOrGlobalOption(registry, option) { return this.getRegistryOption(registry, option) || this.getOption(option); } }], [{ key: "escapeName", value: function escapeName(name) { // scoped packages contain slashes and the npm registry expects them to be escaped return name.replace('/', SCOPE_SEPARATOR); } }, { key: "getConfigEnv", value: function getConfigEnv() { var env = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : process.env; // To match NPM's behavior, HOME is always the user's home directory. var overrideEnv = { HOME: _userHomeDir().home }; return Object.assign({}, env, overrideEnv); } }, { key: "normalizeConfig", value: function normalizeConfig(config) { var env = NpmRegistry.getConfigEnv(); config = _baseRegistry()["default"].normalizeConfig(config); for (var key in config) { config[key] = (0, _envReplace()["default"])(config[key], env); if (isPathConfigOption(key)) { config[key] = normalizePath(config[key]); } } return config; } }]); return NpmRegistry; }(_baseRegistry()["default"]); exports["default"] = NpmRegistry; (0, _defineProperty2()["default"])(NpmRegistry, "filename", 'package.json'); //# sourceMappingURL=npm-registry.js.map