diff --git a/lib/datasource/cdnjs/index.ts b/lib/datasource/cdnjs/index.ts index 5b83a103ed0c99fd0c3447619dd2e0c8d902be3b..b55f8af8d8950fb40b9e8bb4be171f12a69af919 100644 --- a/lib/datasource/cdnjs/index.ts +++ b/lib/datasource/cdnjs/index.ts @@ -21,8 +21,8 @@ export interface CdnjsResponse { assets?: CdnjsAsset[]; } -export function depUrl(depName: string): string { - return `https://api.cdnjs.com/libraries/${depName}?fields=homepage,repository,assets`; +export function depUrl(library: string): string { + return `https://api.cdnjs.com/libraries/${library}?fields=homepage,repository,assets`; } export async function getDigest( @@ -30,9 +30,9 @@ export async function getDigest( newValue?: string ): Promise<string | null> { let result = null; - const depName = lookupName.split('/')[0]; - const url = depUrl(depName); - const assetName = lookupName.replace(`${depName}/`, ''); + const library = lookupName.split('/')[0]; + const url = depUrl(library); + const assetName = lookupName.replace(`${library}/`, ''); let res = null; try { res = await got(url, { json: true }); @@ -55,10 +55,10 @@ export async function getPkgReleases({ return null; } - const [depName, ...assetParts] = lookupName.split('/'); + const [library, ...assetParts] = lookupName.split('/'); const assetName = assetParts.join('/'); - const cacheKey = depName; + const cacheKey = library; const cachedResult = await renovateCache.get<ReleaseResult>( cacheNamespace, cacheKey @@ -66,7 +66,7 @@ export async function getPkgReleases({ // istanbul ignore if if (cachedResult) return cachedResult; - const url = depUrl(depName); + const url = depUrl(library); try { const res = await got(url, { json: true }); @@ -74,7 +74,7 @@ export async function getPkgReleases({ const cdnjsResp: CdnjsResponse = res.body; if (!cdnjsResp || !cdnjsResp.assets) { - logger.warn({ depName }, `Invalid CDNJS response`); + logger.warn({ library }, `Invalid CDNJS response`); return null; } @@ -93,7 +93,7 @@ export async function getPkgReleases({ return result; } catch (err) { - const errorData = { depName, err }; + const errorData = { library, err }; if ( err.statusCode === 429 || diff --git a/lib/datasource/go/index.ts b/lib/datasource/go/index.ts index 7250073db03fd6bb8926cf69fb186afd5f97abfe..c9eb10d1bce1ff864c43259b75c6b1c2c97d841f 100644 --- a/lib/datasource/go/index.ts +++ b/lib/datasource/go/index.ts @@ -13,9 +13,9 @@ interface DataSource { lookupName: string; } -async function getDatasource(name: string): Promise<DataSource | null> { - if (name.startsWith('gopkg.in/')) { - const [pkg] = name.replace('gopkg.in/', '').split('.'); +async function getDatasource(goModule: string): Promise<DataSource | null> { + if (goModule.startsWith('gopkg.in/')) { + const [pkg] = goModule.replace('gopkg.in/', '').split('.'); if (pkg.includes('/')) { return { datasource: DATASOURCE_GITHUB_TAGS, lookupName: pkg }; } @@ -24,15 +24,15 @@ async function getDatasource(name: string): Promise<DataSource | null> { lookupName: `go-${pkg}/${pkg}`, }; } - if (name.startsWith('github.com/')) { - const split = name.split('/'); + if (goModule.startsWith('github.com/')) { + const split = goModule.split('/'); const lookupName = split[1] + '/' + split[2]; return { datasource: DATASOURCE_GITHUB_TAGS, lookupName, }; } - const pkgUrl = `https://${name}?go-get=1`; + const pkgUrl = `https://${goModule}?go-get=1`; try { const res = ( await got(pkgUrl, { @@ -40,11 +40,11 @@ async function getDatasource(name: string): Promise<DataSource | null> { }) ).body; const sourceMatch = res.match( - regEx(`<meta\\s+name="go-source"\\s+content="${name}\\s+([^\\s]+)`) + regEx(`<meta\\s+name="go-source"\\s+content="${goModule}\\s+([^\\s]+)`) ); if (sourceMatch) { const [, goSourceUrl] = sourceMatch; - logger.debug({ depName: name, goSourceUrl }, 'Go lookup source url'); + logger.debug({ goModule, goSourceUrl }, 'Go lookup source url'); if (goSourceUrl && goSourceUrl.startsWith('https://github.com/')) { return { datasource: DATASOURCE_GITHUB_TAGS, @@ -54,13 +54,13 @@ async function getDatasource(name: string): Promise<DataSource | null> { }; } } else { - logger.trace({ depName: name }, 'No go-source header found'); + logger.trace({ goModule }, 'No go-source header found'); } return null; } catch (err) { if (err.statusCode === 404 || err.code === 'ENOTFOUND') { logger.debug( - { dependency: name }, + { dependency: goModule }, `Dependency lookup failure: not found` ); logger.debug({ @@ -68,7 +68,7 @@ async function getDatasource(name: string): Promise<DataSource | null> { }); return null; } - logger.debug({ err, name }, 'go lookup failure: Unknown error'); + logger.debug({ err, goModule }, 'go lookup failure: Unknown error'); return null; } } diff --git a/lib/datasource/hex/index.ts b/lib/datasource/hex/index.ts index e65a8b2fa41f7f0d56631ad25c2ce358c510d658..e5d0eeca9f221a7e5b35770f2f3759f57f9facce 100644 --- a/lib/datasource/hex/index.ts +++ b/lib/datasource/hex/index.ts @@ -20,11 +20,11 @@ export async function getPkgReleases({ // Get dependency name from lookupName. // If the dependency is private lookupName contains organization name as following: - // depName:organizationName - // depName is used to pass it in hex dep url + // hexPackageName:organizationName + // hexPackageName is used to pass it in hex dep url // organizationName is used for accessing to private deps - const depName = lookupName.split(':')[0]; - const hexUrl = `https://hex.pm/api/packages/${depName}`; + const hexPackageName = lookupName.split(':')[0]; + const hexUrl = `https://hex.pm/api/packages/${hexPackageName}`; try { const response = await got(hexUrl, { json: true, @@ -34,14 +34,14 @@ export async function getPkgReleases({ const hexRelease: HexRelease = response.body; if (!hexRelease) { - logger.warn({ depName }, `Invalid response body`); + logger.warn({ datasource: 'hex', lookupName }, `Invalid response body`); return null; } const { releases = [], html_url: homepage, meta } = hexRelease; if (releases.length === 0) { - logger.debug(`No versions found for ${depName} (${hexUrl})`); // prettier-ignore + logger.debug(`No versions found for ${hexPackageName} (${hexUrl})`); // prettier-ignore return null; } @@ -59,7 +59,7 @@ export async function getPkgReleases({ return result; } catch (err) { - const errorData = { depName, err }; + const errorData = { lookupName, err }; if ( err.statusCode === 429 || diff --git a/lib/datasource/metadata.ts b/lib/datasource/metadata.ts index b8f5818298c56f4817d8486f7ff27e63a7d553c0..e5a48e8fc76a3e9abf0b82b0fb52d46c2cb34d68 100644 --- a/lib/datasource/metadata.ts +++ b/lib/datasource/metadata.ts @@ -72,15 +72,18 @@ export function addMetaData( if (!dep) { return; } - const depName = lookupName ? lookupName.toLowerCase() : null; + const lookupNameLowercase = lookupName ? lookupName.toLowerCase() : null; if ( manualChangelogUrls[datasource] && - manualChangelogUrls[datasource][depName] + manualChangelogUrls[datasource][lookupNameLowercase] ) { - dep.changelogUrl = manualChangelogUrls[datasource][depName]; + dep.changelogUrl = manualChangelogUrls[datasource][lookupNameLowercase]; } - if (manualSourceUrls[datasource] && manualSourceUrls[datasource][depName]) { - dep.sourceUrl = manualSourceUrls[datasource][depName]; + if ( + manualSourceUrls[datasource] && + manualSourceUrls[datasource][lookupNameLowercase] + ) { + dep.sourceUrl = manualSourceUrls[datasource][lookupNameLowercase]; } /** diff --git a/lib/datasource/npm/get.ts b/lib/datasource/npm/get.ts index c3dba75b098473cebc04b296dc2c2c137702ff0c..c76b846312db942e27ec6f00a06c18c310f3f89f 100644 --- a/lib/datasource/npm/get.ts +++ b/lib/datasource/npm/get.ts @@ -42,18 +42,18 @@ export interface NpmDependency extends ReleaseResult { } export async function getDependency( - name: string, + packageName: string, retries = 3 ): Promise<NpmDependency | null> { - logger.trace(`npm.getDependency(${name})`); + logger.trace(`npm.getDependency(${packageName})`); // 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]) { + if (memcache[packageName]) { logger.trace('Returning cached result'); - return JSON.parse(memcache[name]); + return JSON.parse(memcache[packageName]); } - const scope = name.split('/')[0]; + const scope = packageName.split('/')[0]; let regUrl: string; const npmrc = getNpmrc(); try { @@ -63,7 +63,7 @@ export async function getDependency( } const pkgUrl = url.resolve( regUrl, - encodeURIComponent(name).replace(/^%40/, '@') + encodeURIComponent(packageName).replace(/^%40/, '@') ); // Now check the persistent cache const cacheNamespace = 'datasource-npm'; @@ -86,7 +86,7 @@ export async function getDependency( } headers.authorization = `${authInfo.type} ${authInfo.token}`; logger.trace( - { token: maskToken(authInfo.token), npmName: name }, + { token: maskToken(authInfo.token), npmName: packageName }, 'Using auth for npm lookup' ); } else if (process.env.NPM_TOKEN && process.env.NPM_TOKEN !== 'undefined') { @@ -122,16 +122,16 @@ export async function getDependency( const res = raw.body; // eslint-disable-next-line no-underscore-dangle const returnedName = res.name ? res.name : res._id || ''; - if (returnedName.toLowerCase() !== name.toLowerCase()) { + if (returnedName.toLowerCase() !== packageName.toLowerCase()) { logger.warn( - { lookupName: name, returnedName: res.name, regUrl }, + { lookupName: packageName, returnedName: res.name, regUrl }, 'Returned name does not match with requested name' ); return null; } if (!res.versions || !Object.keys(res.versions).length) { // Registry returned a 200 OK but with no versions - logger.debug({ dependency: name }, 'No versions returned'); + logger.debug({ dependency: packageName }, 'No versions returned'); return null; } @@ -164,7 +164,7 @@ export async function getDependency( dep.sourceDirectory = res.repository.directory; } if (latestVersion.deprecated) { - dep.deprecationMessage = `On registry \`${regUrl}\`, the "latest" version (v${dep.latestVersion}) of dependency \`${name}\` has the following deprecation notice:\n\n\`${latestVersion.deprecated}\`\n\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`; + dep.deprecationMessage = `On registry \`${regUrl}\`, the "latest" version (v${dep.latestVersion}) of dependency \`${packageName}\` has the following deprecation notice:\n\n\`${latestVersion.deprecated}\`\n\nMarking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.`; dep.deprecationSource = DATASOURCE_NPM; } dep.releases = Object.keys(res.versions).map(version => { @@ -184,11 +184,11 @@ export async function getDependency( }); logger.trace({ dep }, 'dep'); // serialize first before saving - memcache[name] = JSON.stringify(dep); + memcache[packageName] = JSON.stringify(dep); const cacheMinutes = process.env.RENOVATE_CACHE_NPM_MINUTES ? parseInt(process.env.RENOVATE_CACHE_NPM_MINUTES, 10) : 5; - if (!name.startsWith('@')) { + if (!packageName.startsWith('@')) { await renovateCache.set(cacheNamespace, pkgUrl, dep, cacheMinutes); } return dep; @@ -201,7 +201,7 @@ export async function getDependency( authInfoToken: authInfo ? maskToken(authInfo.token) : undefined, err, statusCode: err.statusCode, - depName: name, + packageName, }, `Dependency lookup failure: unauthorized` ); @@ -216,14 +216,14 @@ export async function getDependency( authInfoToken: authInfo ? maskToken(authInfo.token) : undefined, err, statusCode: err.statusCode, - depName: name, + packageName, }, `Dependency lookup failure: payent required` ); return null; } if (err.statusCode === 404 || err.code === 'ENOTFOUND') { - logger.debug({ depName: name }, `Dependency lookup failure: not found`); + logger.debug({ packageName }, `Dependency lookup failure: not found`); logger.debug({ err, token: authInfo ? maskToken(authInfo.token) : 'none', @@ -238,7 +238,7 @@ export async function getDependency( ) { logger.warn({ pkgUrl, errName: err.name }, 'Retrying npm error'); await delay(5000); - return getDependency(name, retries - 1); + return getDependency(packageName, retries - 1); } // istanbul ignore if if (err.name === 'ParseError' && err.body) { diff --git a/lib/datasource/pypi/index.ts b/lib/datasource/pypi/index.ts index 2233aef0e3196944d28df1dfaefae757431bd15a..26a321b08e015a3501984a8b15099a1a8fbd1d6c 100644 --- a/lib/datasource/pypi/index.ts +++ b/lib/datasource/pypi/index.ts @@ -30,11 +30,11 @@ function compatibleVersions( } async function getDependency( - depName: string, + packageName: string, hostUrl: string, compatibility: Record<string, string> ): Promise<ReleaseResult | null> { - const lookupUrl = url.resolve(hostUrl, `${depName}/json`); + const lookupUrl = url.resolve(hostUrl, `${packageName}/json`); try { const dependency: ReleaseResult = { releases: null }; const rep = await got(url.parse(lookupUrl), { @@ -43,14 +43,14 @@ async function getDependency( }); const dep = rep && rep.body; if (!dep) { - logger.debug({ dependency: depName }, 'pip package not found'); + logger.debug({ dependency: packageName }, 'pip package not found'); return null; } if ( - !(dep.info && normalizeName(dep.info.name) === normalizeName(depName)) + !(dep.info && normalizeName(dep.info.name) === normalizeName(packageName)) ) { logger.warn( - { lookupUrl, lookupName: depName, returnedName: dep.info.name }, + { lookupUrl, lookupName: packageName, returnedName: dep.info.name }, 'Returned name does not match with requested name' ); return null; @@ -76,7 +76,11 @@ async function getDependency( return dependency; } catch (err) { logger.debug( - 'pypi dependency not found: ' + depName + '(searching in ' + hostUrl + ')' + 'pypi dependency not found: ' + + packageName + + '(searching in ' + + hostUrl + + ')' ); return null; } @@ -84,9 +88,9 @@ async function getDependency( function extractVersionFromLinkText( text: string, - depName: string + packageName: string ): string | null { - const srcPrefixes = [`${depName}-`, `${depName.replace(/-/g, '_')}-`]; + const srcPrefixes = [`${packageName}-`, `${packageName.replace(/-/g, '_')}-`]; for (const prefix of srcPrefixes) { const suffix = '.tar.gz'; if (text.startsWith(prefix) && text.endsWith(suffix)) { @@ -96,7 +100,7 @@ function extractVersionFromLinkText( // pep-0427 wheel packages // {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl. - const wheelPrefix = depName.replace(/[^\w\d.]+/g, '_') + '-'; + const wheelPrefix = packageName.replace(/[^\w\d.]+/g, '_') + '-'; const wheelSuffix = '.whl'; if ( text.startsWith(wheelPrefix) && @@ -110,10 +114,10 @@ function extractVersionFromLinkText( } async function getSimpleDependency( - depName: string, + packageName: string, hostUrl: string ): Promise<ReleaseResult | null> { - const lookupUrl = url.resolve(hostUrl, `${depName}`); + const lookupUrl = url.resolve(hostUrl, `${packageName}`); try { const dependency: ReleaseResult = { releases: null }; const response = await got<string>(url.parse(lookupUrl), { @@ -121,14 +125,14 @@ async function getSimpleDependency( }); const dep = response && response.body; if (!dep) { - logger.debug({ dependency: depName }, 'pip package not found'); + logger.debug({ dependency: packageName }, 'pip package not found'); return null; } const root: HTMLElement = parse(dep.replace(/<\/?pre>/, '')) as any; const links = root.querySelectorAll('a'); const versions = new Set<string>(); for (const link of Array.from(links)) { - const result = extractVersionFromLinkText(link.text, depName); + const result = extractVersionFromLinkText(link.text, packageName); if (result) { versions.add(result); } @@ -142,7 +146,11 @@ async function getSimpleDependency( return dependency; } catch (err) { logger.debug( - 'pypi dependency not found: ' + depName + '(searching in ' + hostUrl + ')' + 'pypi dependency not found: ' + + packageName + + '(searching in ' + + hostUrl + + ')' ); return null; }