Skip to content
Snippets Groups Projects
Select Git revision
  • 00dabb5dc162c91e3d74457010cf67790784e5c8
  • master default
2 results

lock-files.js

Blame
  • get.js 7.82 KiB
    const moment = require('moment');
    const url = require('url');
    const getRegistryUrl = require('registry-auth-token/registry-url');
    const registryAuthToken = require('registry-auth-token');
    const parse = require('github-url-from-git');
    const { isBase64 } = require('validator');
    const { logger } = require('../../logger');
    
    const got = require('../../util/got');
    const hostRules = require('../../util/host-rules');
    const { maskToken } = require('../../util/mask');
    const { getNpmrc } = require('./npmrc');
    
    module.exports = {
      getDependency,
      resetCache,
      resetMemCache,
    };
    
    let memcache = {};
    
    function resetMemCache() {
      logger.debug('resetMemCache()');
      memcache = {};
    }
    
    function resetCache() {
      resetMemCache();
    }
    
    async function getDependency(name) {
      logger.trace(`npm.getDependency(${name})`);
    
      // This is our datastore cache and is cleared at the end of each repo, i.e. we never requery/revalidate during a "run"
      if (memcache[name]) {
        logger.trace('Returning cached result');
        return JSON.parse(memcache[name]);
      }
    
      const scope = name.split('/')[0];
      let regUrl;
      const npmrc = getNpmrc();
      try {
        regUrl = getRegistryUrl(scope, npmrc);
      } catch (err) {
        regUrl = 'https://registry.npmjs.org';
      }
      const pkgUrl = url.resolve(
        regUrl,
        encodeURIComponent(name).replace(/^%40/, '@')
      );
      // Now check the persistent cache
      const cacheNamespace = 'datasource-npm';
      const cachedResult = await renovateCache.get(cacheNamespace, pkgUrl);
      if (cachedResult) {
        return cachedResult;
      }
      const authInfo = registryAuthToken(regUrl, { npmrc });
      const headers = {};
    
      if (authInfo && authInfo.type && authInfo.token) {
        // istanbul ignore if
        if (npmrc && npmrc.massagedAuth && isBase64(authInfo.token)) {
          logger.debug('Massaging authorization type to Basic');
          authInfo.type = 'Basic';
        }
        headers.authorization = `${authInfo.type} ${authInfo.token}`;
        logger.trace(
          { token: maskToken(authInfo.token), npmName: name },
          'Using auth for npm lookup'