diff --git a/lib/datasource/nuget/v2.js b/lib/datasource/nuget/v2.js index aed75a5f4497a637d58003891cf430f1100a3ff8..80de3bf62bef25957cc307afc6029e530564bccd 100644 --- a/lib/datasource/nuget/v2.js +++ b/lib/datasource/nuget/v2.js @@ -28,6 +28,7 @@ async function getPkgReleases(feedUrl, pkgName) { const pkgVersionsListDoc = new XmlDocument(pkgVersionsListRaw.body); const pkgInfoList = pkgVersionsListDoc.children.filter( + // @ts-ignore node => node.name === 'entry' ); @@ -50,9 +51,11 @@ async function getPkgReleases(feedUrl, pkgName) { } const nextPkgUrlListLink = pkgVersionsListDoc.children.find( + // @ts-ignore node => node.name === 'link' && node.attr.rel === 'next' ); + // @ts-ignore pkgUrlList = nextPkgUrlListLink ? nextPkgUrlListLink.attr.href : null; } while (pkgUrlList !== null); diff --git a/lib/manager/ansible/extract.js b/lib/manager/ansible/extract.ts similarity index 74% rename from lib/manager/ansible/extract.js rename to lib/manager/ansible/extract.ts index 44f38ebe5aeffa9ba82912955881fd5953bc7aee..b28748cadb3c03c7b439412058868a9a7577ffe5 100644 --- a/lib/manager/ansible/extract.js +++ b/lib/manager/ansible/extract.ts @@ -1,13 +1,10 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { +export default function extractPackageFile(content: string): PackageFile { logger.trace('ansible.extractPackageFile()'); - let deps = []; + let deps: PackageDependency[] = []; let lineNumber = 0; for (const line of content.split('\n')) { const match = line.match(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/); diff --git a/lib/manager/ansible/index.js b/lib/manager/ansible/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/ansible/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/ansible/index.ts b/lib/manager/ansible/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..595304a1ea0e7202069fc15d7fd2df5b8b514944 --- /dev/null +++ b/lib/manager/ansible/index.ts @@ -0,0 +1,6 @@ +import extractPackageFile from './extract'; +import updateDependency from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/ansible/update.js b/lib/manager/ansible/update.ts similarity index 78% rename from lib/manager/ansible/update.js rename to lib/manager/ansible/update.ts index ac2727a519962d647cbae3a6e18ad8cb855b4b3a..ae2781a70b99f0e42f6d8d4fea72082ce0101b94 100644 --- a/lib/manager/ansible/update.js +++ b/lib/manager/ansible/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export default function updateDependency( + fileContent: string, + upgrade: Upgrade +) { try { const newFrom = getNewFrom(upgrade); logger.debug(`ansible.updateDependency(): ${newFrom}`); diff --git a/lib/manager/bazel/extract.js b/lib/manager/bazel/extract.ts similarity index 86% rename from lib/manager/bazel/extract.js rename to lib/manager/bazel/extract.ts index 55c0cf2e6f97a3290b718b6363c8b302f51563b9..4269f55a0d9ba0fdd73b30e7f7d326d25766e7ed 100644 --- a/lib/manager/bazel/extract.js +++ b/lib/manager/bazel/extract.ts @@ -1,24 +1,21 @@ -/* eslint no-plusplus: 0 default-case: 0 */ -const parse = require('github-url-from-git'); -const URL = require('url'); -const { logger } = require('../../logger'); +/* eslint no-plusplus: 0 */ +import parse from 'github-url-from-git'; +import { parse as _parse } from 'url'; +import { logger } from '../../logger'; +import { PackageDependency, PackageFile } from '../common'; -module.exports = { - extractPackageFile, -}; - -function parseUrl(urlString) { +function parseUrl(urlString: string) { // istanbul ignore if if (!urlString) { return null; } - const url = URL.parse(urlString); + const url = _parse(urlString); if (url.host !== 'github.com') { return null; } const path = url.path.split('/').slice(1); const repo = path[0] + '/' + path[1]; - let currentValue = null; + let currentValue: string = null; if (path[2] === 'releases' && path[3] === 'download') { currentValue = path[4]; } @@ -32,7 +29,7 @@ function parseUrl(urlString) { return null; } -function findBalancedParenIndex(longString) { +function findBalancedParenIndex(longString: string) { /** * Minimalistic string parser with single task -> find last char in def. * It treats [)] as the last char. @@ -57,13 +54,16 @@ function findBalancedParenIndex(longString) { case '"': if (i > 1 && arr.slice(i - 2, i).every(prev => char === prev)) intShouldNotBeOdd++; + break; + default: + break; } return !parenNestingDepth && !(intShouldNotBeOdd % 2) && char === ')'; }); } -function parseContent(content) { +function parseContent(content: string) { return [ 'container_pull', 'http_archive', @@ -82,32 +82,32 @@ function parseContent(content) { }) .filter(Boolean), ], - [] + [] as string[] ); } -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { const definitions = parseContent(content); if (!definitions.length) { logger.debug('No matching WORKSPACE definitions found'); return null; } logger.debug({ definitions }, `Found ${definitions.length} definitions`); - const deps = []; + const deps: PackageDependency[] = []; definitions.forEach(def => { logger.debug({ def }, 'Checking bazel definition'); const [depType] = def.split('(', 1); - const dep = { depType, managerData: { def } }; - let depName; - let importpath; - let remote; - let currentValue; - let commit; - let url; - let sha256; - let digest; - let repository; - let registry; + const dep: PackageDependency = { depType, managerData: { def } }; + let depName: string; + let importpath: string; + let remote: string; + let currentValue: string; + let commit: string; + let url: string; + let sha256: string; + let digest: string; + let repository: string; + let registry: string; let match = def.match(/name\s*=\s*"([^"]+)"/); if (match) { [, depName] = match; diff --git a/lib/manager/bazel/index.js b/lib/manager/bazel/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/bazel/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/bazel/index.ts b/lib/manager/bazel/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123 --- /dev/null +++ b/lib/manager/bazel/index.ts @@ -0,0 +1,4 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +export { extractPackageFile, updateDependency }; diff --git a/lib/manager/bazel/update.js b/lib/manager/bazel/update.ts similarity index 87% rename from lib/manager/bazel/update.js rename to lib/manager/bazel/update.ts index 6d5b19edd4725e0ffab90cba07bb4e922e267e54..318d723d81e53645fa0ab93f64bf3ed3c4532b6d 100644 --- a/lib/manager/bazel/update.js +++ b/lib/manager/bazel/update.ts @@ -1,12 +1,13 @@ -const hasha = require('hasha'); -const got = require('../../util/got'); -const { logger } = require('../../logger'); +import { fromStream } from 'hasha'; +import got from '../../util/got'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateWithNewVersion(content, currentValue, newValue) { +function updateWithNewVersion( + content: string, + currentValue: string, + newValue: string +) { const currentVersion = currentValue.replace(/^v/, ''); const newVersion = newValue.replace(/^v/, ''); let newContent = content; @@ -16,7 +17,7 @@ function updateWithNewVersion(content, currentValue, newValue) { return newContent; } -function extractUrl(flattened) { +function extractUrl(flattened: string) { const urlMatch = flattened.match(/url="(.*?)"/); if (!urlMatch) { logger.debug('Cannot locate urls in new definition'); @@ -25,7 +26,7 @@ function extractUrl(flattened) { return [urlMatch[1]]; } -function extractUrls(content) { +function extractUrls(content: string) { const flattened = content.replace(/\n/g, '').replace(/\s/g, ''); const urlsMatch = flattened.match(/urls?=\[.*?\]/); if (!urlsMatch) { @@ -39,13 +40,13 @@ function extractUrls(content) { return urls; } -async function getHashFromUrl(url) { +async function getHashFromUrl(url: string) { const cacheNamespace = 'url-sha256'; const cachedResult = await renovateCache.get(cacheNamespace, url); /* istanbul ignore next line */ if (cachedResult) return cachedResult; try { - const hash = await hasha.fromStream(got.stream(url), { + const hash = await fromStream(got.stream(url), { algorithm: 'sha256', }); const cacheMinutes = 3 * 24 * 60; // 3 days @@ -56,7 +57,7 @@ async function getHashFromUrl(url) { } } -async function getHashFromUrls(urls) { +async function getHashFromUrls(urls: string[]) { const hashes = (await Promise.all( urls.map(url => getHashFromUrl(url)) )).filter(Boolean); @@ -72,16 +73,19 @@ async function getHashFromUrls(urls) { return distinctHashes[0]; } -function setNewHash(content, hash) { +function setNewHash(content: string, hash: string) { return content.replace(/(sha256\s*=\s*)"[^"]+"/, `$1"${hash}"`); } -async function updateDependency(fileContent, upgrade) { +export async function updateDependency( + fileContent: string, + upgrade: Upgrade +): Promise<string> { try { logger.debug( `bazel.updateDependency(): ${upgrade.newValue || upgrade.newDigest}` ); - let newDef; + let newDef: string; if (upgrade.depType === 'container_pull') { newDef = upgrade.managerData.def .replace(/(tag\s*=\s*)"[^"]+"/, `$1"${upgrade.newValue}"`) diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.ts similarity index 83% rename from lib/manager/buildkite/extract.js rename to lib/manager/buildkite/extract.ts index ef2a946fffc56a3c12363010af25c255c453bab7..a5754c65ec7d78240e6e7cd6112dc3260a8aae08 100644 --- a/lib/manager/buildkite/extract.js +++ b/lib/manager/buildkite/extract.ts @@ -1,12 +1,11 @@ -const { logger } = require('../../logger'); -const { isVersion } = require('../../versioning/semver'); +import { logger } from '../../logger'; +import { isVersion } from '../../versioning/semver'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; +export { extractPackageFile }; -function extractPackageFile(content) { - const deps = []; +function extractPackageFile(content: string): PackageFile { + const deps: PackageDependency[] = []; try { const lines = content.split('\n'); for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { @@ -21,8 +20,8 @@ function extractPackageFile(content) { logger.trace('depLineMatch'); lineNumber += 1; const [, depName, currentValue] = depLineMatch; - let skipReason; - let repo; + let skipReason: string; + let repo: string; if (depName.startsWith('https://') || depName.startsWith('git@')) { logger.debug({ dependency: depName }, 'Skipping git plugin'); skipReason = 'git-plugin'; @@ -46,7 +45,7 @@ function extractPackageFile(content) { skipReason = 'unknown'; } } - const dep = { + const dep: PackageDependency = { managerData: { lineNumber }, depName, currentValue, diff --git a/lib/manager/buildkite/index.js b/lib/manager/buildkite/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/buildkite/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/buildkite/index.ts b/lib/manager/buildkite/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123 --- /dev/null +++ b/lib/manager/buildkite/index.ts @@ -0,0 +1,4 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +export { extractPackageFile, updateDependency }; diff --git a/lib/manager/buildkite/update.js b/lib/manager/buildkite/update.ts similarity index 82% rename from lib/manager/buildkite/update.js rename to lib/manager/buildkite/update.ts index 9275ba513acd2d813b3b30e620c8db4b713987c8..fe9c8c3bcee8a543c7128f4e0539254f9c615f8c 100644 --- a/lib/manager/buildkite/update.js +++ b/lib/manager/buildkite/update.ts @@ -1,10 +1,7 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(currentFileContent, upgrade) { +export function updateDependency(currentFileContent: string, upgrade: Upgrade) { try { logger.debug(`buildkite.updateDependency: ${upgrade.newValue}`); const lines = currentFileContent.split('\n'); diff --git a/lib/manager/bundler/artifacts.js b/lib/manager/bundler/artifacts.ts similarity index 81% rename from lib/manager/bundler/artifacts.js rename to lib/manager/bundler/artifacts.ts index 66bdb078d4a2b05f06d3836c0c5e90ee6f50fe52..1dc820f246eedc7d686822821bf833946c124d2f 100644 --- a/lib/manager/bundler/artifacts.js +++ b/lib/manager/bundler/artifacts.ts @@ -1,27 +1,23 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { exec } = require('../../util/exec'); -const { getChildProcessEnv } = require('../../util/env'); -const { logger } = require('../../logger'); - -const { getPkgReleases } = require('../../datasource/docker'); -const { +import { outputFile, readFile } from 'fs-extra'; +import { join, dirname } from 'upath'; +import { exec } from '../../util/exec'; +import { getChildProcessEnv } from '../../util/env'; +import { logger } from '../../logger'; +import { getPkgReleases } from '../../datasource/docker'; +import { isValid, isVersion, matches, sortVersions, -} = require('../../versioning/ruby'); - -module.exports = { - updateArtifacts, -}; +} from '../../versioning/ruby'; +import { UpdateArtifactsConfig } from '../common'; // istanbul ignore next -async function updateArtifacts( - packageFileName, - updatedDeps, - newPackageFileContent, - config +export async function updateArtifacts( + packageFileName: string, + updatedDeps: string[], + newPackageFileContent: string, + config: UpdateArtifactsConfig ) { logger.debug(`bundler.updateArtifacts(${packageFileName})`); // istanbul ignore if @@ -35,28 +31,25 @@ async function updateArtifacts( logger.debug('No Gemfile.lock found'); return null; } - const cwd = upath.join(config.localDir, upath.dirname(packageFileName)); - let stdout; - let stderr; + const cwd = join(config.localDir, dirname(packageFileName)); + let stdout: string; + let stderr: string; try { - const localPackageFileName = upath.join(config.localDir, packageFileName); - await fs.outputFile(localPackageFileName, newPackageFileContent); - const localLockFileName = upath.join(config.localDir, lockFileName); + const localPackageFileName = join(config.localDir, packageFileName); + await outputFile(localPackageFileName, newPackageFileContent); + const localLockFileName = join(config.localDir, lockFileName); const env = getChildProcessEnv(); const startTime = process.hrtime(); let cmd; if (config.binarySource === 'docker') { logger.info('Running bundler via docker'); let tag = 'latest'; - let rubyConstraint; + let rubyConstraint: string; if (config && config.compatibility && config.compatibility.ruby) { logger.debug('Using rubyConstraint from config'); rubyConstraint = config.compatibility.ruby; } else { - const rubyVersionFile = upath.join( - upath.dirname(packageFileName), - '.ruby-version' - ); + const rubyVersionFile = join(dirname(packageFileName), '.ruby-version'); logger.debug('Checking ' + rubyVersionFile); const rubyVersionFileContent = await platform.getFile(rubyVersionFile); if (rubyVersionFileContent) { @@ -135,7 +128,7 @@ async function updateArtifacts( { file: { name: lockFileName, - contents: await fs.readFile(localLockFileName, 'utf8'), + contents: await readFile(localLockFileName, 'utf8'), }, }, ]; @@ -153,7 +146,7 @@ async function updateArtifacts( throw new Error('bundler-credentials'); } if (err.stderr && err.stderr.includes('incompatible marshal file format')) { - const gemrcFile = await platform.getFile(upath.join(cwd, '.gemrc')); + const gemrcFile = await platform.getFile(join(cwd, '.gemrc')); logger.debug( { err, gemfile: newPackageFileContent, gemrcFile }, 'Gemfile marshalling error' diff --git a/lib/manager/bundler/extract.js b/lib/manager/bundler/extract.ts similarity index 92% rename from lib/manager/bundler/extract.js rename to lib/manager/bundler/extract.ts index 540be09e70c19e6977c7e5f2e436896fc1e2721e..ef60fb0ca977b985c8dd5dc40c1bfe871111af58 100644 --- a/lib/manager/bundler/extract.js +++ b/lib/manager/bundler/extract.ts @@ -1,12 +1,14 @@ -const { logger } = require('../../logger'); -const { isValid } = require('../../versioning/ruby'); +import { logger } from '../../logger'; +import { isValid } from '../../versioning/ruby'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; +export { extractPackageFile }; -async function extractPackageFile(content, fileName) { - const res = { +async function extractPackageFile( + content: string, + fileName?: string +): Promise<PackageFile> { + const res: PackageFile = { registryUrls: [], deps: [], }; @@ -14,7 +16,7 @@ async function extractPackageFile(content, fileName) { const delimiters = ['"', "'"]; for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { const line = lines[lineNumber]; - let sourceMatch; + let sourceMatch: RegExpMatchArray; for (const delimiter of delimiters) { sourceMatch = sourceMatch || @@ -25,7 +27,7 @@ async function extractPackageFile(content, fileName) { if (sourceMatch) { res.registryUrls.push(sourceMatch[1]); } - let rubyMatch; + let rubyMatch: RegExpMatchArray; for (const delimiter of delimiters) { rubyMatch = rubyMatch || @@ -36,8 +38,8 @@ async function extractPackageFile(content, fileName) { if (rubyMatch) { res.compatibility = { ruby: rubyMatch[1] }; } - let gemMatch; - let gemDelimiter; + let gemMatch: RegExpMatchArray; + let gemDelimiter: string; for (const delimiter of delimiters) { const gemMatchRegex = `^gem ${delimiter}([^${delimiter}]+)${delimiter}(,\\s+${delimiter}([^${delimiter}]+)${delimiter}){0,2}`; if (line.match(new RegExp(gemMatchRegex))) { @@ -46,7 +48,7 @@ async function extractPackageFile(content, fileName) { } } if (gemMatch) { - const dep = { + const dep: PackageDependency = { depName: gemMatch[1], managerData: { lineNumber }, }; diff --git a/lib/manager/bundler/index.js b/lib/manager/bundler/index.ts similarity index 67% rename from lib/manager/bundler/index.js rename to lib/manager/bundler/index.ts index 886cc5b07959ad1447853e90e2979f97f8e9c3ca..3cff436f7497d7c28ffbfe9526f3835cb8e08be0 100644 --- a/lib/manager/bundler/index.js +++ b/lib/manager/bundler/index.ts @@ -1,7 +1,7 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { updateArtifacts } = require('./artifacts'); -const { getRangeStrategy } = require('./range'); +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; +import { updateArtifacts } from './artifacts'; +import { getRangeStrategy } from './range'; const language = 'ruby'; @@ -10,7 +10,7 @@ const language = 'ruby'; * The best way to understand them in more detail is to look at the existing managers and find one that matches most closely what you need to do. */ -module.exports = { +export { extractPackageFile, // Mandatory unless extractAllPackageFiles is used instead updateArtifacts, // Optional getRangeStrategy, // Optional diff --git a/lib/manager/bundler/range.js b/lib/manager/bundler/range.ts similarity index 86% rename from lib/manager/bundler/range.js rename to lib/manager/bundler/range.ts index d40496c31cee853cddc23248dbb21331ae0c5e77..067a55721e5eb0fabc02a23ce95b23951a66524b 100644 --- a/lib/manager/bundler/range.js +++ b/lib/manager/bundler/range.ts @@ -1,7 +1,3 @@ -module.exports = { - getRangeStrategy, -}; - /* * The getRangeStrategy() function is optional and can be removed if not applicable. * It is used when the user configures rangeStrategy=auto. @@ -15,6 +11,6 @@ module.exports = { * */ -function getRangeStrategy() { +export function getRangeStrategy() { return 'replace'; } diff --git a/lib/manager/bundler/update.js b/lib/manager/bundler/update.ts similarity index 88% rename from lib/manager/bundler/update.js rename to lib/manager/bundler/update.ts index 010668fd8ae56ead936d65d5f0bff880dbbfe6f0..2c0f3a2ebc9d9d57fac9d6a7ab8003d8fd217c64 100644 --- a/lib/manager/bundler/update.js +++ b/lib/manager/bundler/update.ts @@ -1,8 +1,5 @@ -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; /* * The updateDependency() function is mandatory, and is used for updating one dependency at a time. @@ -10,7 +7,10 @@ module.exports = { * or with new content if changes are necessary. */ -function updateDependency(currentFileContent, upgrade) { +export function updateDependency( + currentFileContent: string, + upgrade: Upgrade +): string { try { const delimiter = currentFileContent.split('"').length > diff --git a/lib/manager/cargo/artifacts.js b/lib/manager/cargo/artifacts.ts similarity index 78% rename from lib/manager/cargo/artifacts.js rename to lib/manager/cargo/artifacts.ts index 1ede6e8db7f7282ab1591e1fd8855677012aaf9a..1509aa56dc2fcd0a51ef829f5e63387fc4049c63 100644 --- a/lib/manager/cargo/artifacts.js +++ b/lib/manager/cargo/artifacts.ts @@ -1,20 +1,17 @@ -const upath = require('upath'); -const process = require('process'); -const fs = require('fs-extra'); -const { exec } = require('../../util/exec'); -const { getChildProcessEnv } = require('../../util/env'); -const { logger } = require('../../logger'); +import { join } from 'upath'; +import { hrtime } from 'process'; +import { outputFile, readFile } from 'fs-extra'; +import { exec } from '../../util/exec'; +import { getChildProcessEnv } from '../../util/env'; +import { logger } from '../../logger'; +import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common'; -module.exports = { - updateArtifacts, -}; - -async function updateArtifacts( - packageFileName, - updatedDeps, - newPackageFileContent, - config -) { +export async function updateArtifacts( + packageFileName: string, + updatedDeps: string[], + newPackageFileContent: string, + config: UpdateArtifactsConfig +): Promise<UpdateArtifactsResult[]> { await logger.debug(`cargo.updateArtifacts(${packageFileName})`); if (updatedDeps === undefined || updatedDeps.length < 1) { logger.debug('No updated cargo deps - returning null'); @@ -26,12 +23,12 @@ async function updateArtifacts( logger.debug('No Cargo.lock found'); return null; } - const localPackageFileName = upath.join(config.localDir, packageFileName); - const localLockFileName = upath.join(config.localDir, lockFileName); - let stdout; - let stderr; + const localPackageFileName = join(config.localDir, packageFileName); + const localLockFileName = join(config.localDir, lockFileName); + let stdout: string; + let stderr: string; try { - await fs.outputFile(localPackageFileName, newPackageFileContent); + await outputFile(localPackageFileName, newPackageFileContent); logger.debug('Updating ' + lockFileName); const cwd = config.localDir; const env = getChildProcessEnv(); @@ -39,7 +36,7 @@ async function updateArtifacts( const dep = updatedDeps[i]; // Update dependency `${dep}` in Cargo.lock file corresponding to Cargo.toml file located // at ${localPackageFileName} path - let cmd; + let cmd: string; // istanbul ignore if if (config.binarySource === 'docker') { logger.info('Running cargo via docker'); @@ -55,7 +52,7 @@ async function updateArtifacts( cmd = 'cargo'; } cmd += ` update --manifest-path ${localPackageFileName} --package ${dep}`; - const startTime = process.hrtime(); + const startTime = hrtime(); try { ({ stdout, stderr } = await exec(cmd, { cwd, @@ -84,7 +81,7 @@ async function updateArtifacts( throw err; // this is caught below } } - const duration = process.hrtime(startTime); + const duration = hrtime(startTime); const seconds = Math.round(duration[0] + duration[1] / 1e9); logger.info( { seconds, type: 'Cargo.lock', stdout, stderr }, @@ -92,7 +89,7 @@ async function updateArtifacts( ); } logger.debug('Returning updated Cargo.lock'); - const newCargoLockContent = await fs.readFile(localLockFileName, 'utf8'); + const newCargoLockContent = await readFile(localLockFileName, 'utf8'); if (existingLockFileContent === newCargoLockContent) { logger.debug('Cargo.lock is unchanged'); return null; diff --git a/lib/manager/cargo/extract.js b/lib/manager/cargo/extract.ts similarity index 72% rename from lib/manager/cargo/extract.js rename to lib/manager/cargo/extract.ts index e80891fa59e377a227d9c5d712b6a1fc3878cbe2..399cee39bc25396923f322a9faacd402254e8c41 100644 --- a/lib/manager/cargo/extract.js +++ b/lib/manager/cargo/extract.ts @@ -1,16 +1,17 @@ -const toml = require('toml'); -const { logger } = require('../../logger'); -const semver = require('../../versioning/cargo'); +import { parse } from 'toml'; +import { logger } from '../../logger'; +import { isValid } from '../../versioning/cargo'; +import { PackageDependency, PackageFile } from '../common'; +import { CargoConfig, CargoSection } from './types'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content, fileName) { +export function extractPackageFile( + content: string, + fileName: string +): PackageFile { logger.trace(`cargo.extractPackageFile(${fileName})`); - let parsedContent; + let parsedContent: CargoConfig; try { - parsedContent = toml.parse(content); + parsedContent = parse(content); } catch (err) { logger.debug({ err }, 'Error parsing Cargo.toml file'); return null; @@ -24,7 +25,7 @@ function extractPackageFile(content, fileName) { */ const targetSection = parsedContent.target; // An array of all dependencies in the target section - let targetDeps = []; + let targetDeps: PackageDependency[] = []; if (targetSection) { const targets = Object.keys(targetSection); targets.forEach(target => { @@ -50,20 +51,24 @@ function extractPackageFile(content, fileName) { return { deps }; } -function extractFromSection(parsedContent, section, target) { - const deps = []; +function extractFromSection( + parsedContent: CargoSection, + section: keyof CargoSection, + target?: string +) { + const deps: PackageDependency[] = []; const sectionContent = parsedContent[section]; if (!sectionContent) { return []; } Object.keys(sectionContent).forEach(depName => { - let skipReason; + let skipReason: string; let currentValue = sectionContent[depName]; let nestedVersion = false; if (typeof currentValue !== 'string') { - const version = sectionContent[depName].version; - const path = sectionContent[depName].path; - const git = sectionContent[depName].git; + const version = currentValue.version; + const path = currentValue.path; + const git = currentValue.git; if (version) { currentValue = version; nestedVersion = true; @@ -84,16 +89,16 @@ function extractFromSection(parsedContent, section, target) { skipReason = 'invalid-dependency-specification'; } } - const dep = { + const dep: PackageDependency = { depName, depType: section, - currentValue, + currentValue: currentValue as any, managerData: { nestedVersion }, datasource: 'cargo', }; if (skipReason) { dep.skipReason = skipReason; - } else if (!semver.isValid(dep.currentValue)) { + } else if (!isValid(dep.currentValue)) { dep.skipReason = 'unknown-version'; } if (target) { diff --git a/lib/manager/cargo/index.js b/lib/manager/cargo/index.js deleted file mode 100644 index fbe1889565be2e1e0ce13fd2a03b06cef5a85576..0000000000000000000000000000000000000000 --- a/lib/manager/cargo/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { updateArtifacts } = require('./artifacts'); - -const language = 'rust'; - -module.exports = { - extractPackageFile, - updateArtifacts, - language, - updateDependency, - // TODO: Support this - supportsLockFileMaintenance: false, -}; diff --git a/lib/manager/cargo/index.ts b/lib/manager/cargo/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b3e0f380d2758dde45c19da861444f00747516f0 --- /dev/null +++ b/lib/manager/cargo/index.ts @@ -0,0 +1,9 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; +import { updateArtifacts } from './artifacts'; + +const language = 'rust'; +// TODO: Support this +export const supportsLockFileMaintenance = false; + +export { extractPackageFile, updateArtifacts, language, updateDependency }; diff --git a/lib/manager/cargo/types.ts b/lib/manager/cargo/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e22022b7c7bebf6034c4389a9f19b73661f435ef --- /dev/null +++ b/lib/manager/cargo/types.ts @@ -0,0 +1,17 @@ +export interface CargoDep { + path: any; + git: any; + version: any; +} + +export type CargoDeps = Record<string, CargoDep | string>; + +export interface CargoSection { + dependencies: CargoDeps; + 'dev-dependencies': CargoDeps; + 'build-dependencies': CargoDeps; +} + +export interface CargoConfig extends CargoSection { + target: Record<string, CargoSection>; +} diff --git a/lib/manager/cargo/update.js b/lib/manager/cargo/update.ts similarity index 82% rename from lib/manager/cargo/update.js rename to lib/manager/cargo/update.ts index 5b61b6a916afe08276b86db51431e5210d39a19b..0c8f1168988dec366caf16c8e48cec716ed6f609 100644 --- a/lib/manager/cargo/update.js +++ b/lib/manager/cargo/update.ts @@ -1,18 +1,21 @@ -const _ = require('lodash'); -const toml = require('toml'); -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; +import { isEqual } from 'lodash'; +import { parse } from 'toml'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; +import { CargoConfig, CargoSection } from './types'; // Return true if the match string is found at index in content -function matchAt(content, index, match) { +function matchAt(content: string, index: number, match: string) { return content.substring(index, index + match.length) === match; } // Replace oldString with newString at location index of content -function replaceAt(content, index, oldString, newString) { +function replaceAt( + content: string, + index: number, + oldString: string, + newString: string +) { logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`); return ( content.substr(0, index) + @@ -21,21 +24,24 @@ function replaceAt(content, index, oldString, newString) { ); } -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade<{ nestedVersion?: boolean }> +) { logger.trace({ config: upgrade }, 'poetry.updateDependency()'); if (!upgrade) { return fileContent; } const { target, depType, depName, newValue, managerData } = upgrade; const { nestedVersion } = managerData; - let parsedContent; + let parsedContent: CargoConfig; try { - parsedContent = toml.parse(fileContent); + parsedContent = parse(fileContent); } catch (err) { logger.debug({ err }, 'Error parsing Cargo.toml file'); return fileContent; } - let section; + let section: CargoSection; if (target) { section = parsedContent.target[target]; if (section) { @@ -58,7 +64,7 @@ function updateDependency(fileContent, upgrade) { } return fileContent; } - let oldVersion; + let oldVersion: any; const oldDep = section[depName]; if (!oldDep) { logger.info( @@ -115,7 +121,7 @@ function updateDependency(fileContent, upgrade) { newString ); // Compare the parsed toml structure of old and new - if (_.isEqual(parsedContent, toml.parse(testContent))) { + if (isEqual(parsedContent, parse(testContent))) { newFileContent = testContent; break; } else { diff --git a/lib/manager/circleci/extract.js b/lib/manager/circleci/extract.ts similarity index 84% rename from lib/manager/circleci/extract.js rename to lib/manager/circleci/extract.ts index 732cf211614f330513d392b7238e44ed838b2620..ed12bc590ca806905fa97904b46d9c3f58d40674 100644 --- a/lib/manager/circleci/extract.js +++ b/lib/manager/circleci/extract.ts @@ -1,12 +1,9 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { - const deps = []; +export function extractPackageFile(content: string): PackageFile { + const deps: PackageDependency[] = []; try { const lines = content.split('\n'); for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { @@ -14,7 +11,7 @@ function extractPackageFile(content) { const orbs = line.match(/^\s*orbs:\s*$/); if (orbs) { logger.trace(`Matched orbs on line ${lineNumber}`); - let foundOrb; + let foundOrb: boolean; do { foundOrb = false; const orbLine = lines[lineNumber + 1]; @@ -26,7 +23,7 @@ function extractPackageFile(content) { lineNumber += 1; const depName = orbMatch[1]; const [orbName, currentValue] = orbMatch[2].split('@'); - const dep = { + const dep: PackageDependency = { depType: 'orb', depName, currentValue, diff --git a/lib/manager/circleci/index.js b/lib/manager/circleci/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/circleci/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/circleci/index.ts b/lib/manager/circleci/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3 --- /dev/null +++ b/lib/manager/circleci/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/circleci/update.js b/lib/manager/circleci/update.ts similarity index 86% rename from lib/manager/circleci/update.js rename to lib/manager/circleci/update.ts index b81237f8b3cd2c0cfb5435c479ca4e2c9a821076..23b35a55465ca5d9397f29f1ace34ac84b84831e 100644 --- a/lib/manager/circleci/update.js +++ b/lib/manager/circleci/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { const lines = fileContent.split('\n'); const lineToChange = lines[upgrade.managerData.lineNumber]; diff --git a/lib/manager/common.ts b/lib/manager/common.ts new file mode 100644 index 0000000000000000000000000000000000000000..588773bd97144941fb3894c9a3e6f92e2870c802 --- /dev/null +++ b/lib/manager/common.ts @@ -0,0 +1,216 @@ +import { ReleaseType } from 'semver'; +import { RangeStrategy } from '../versioning'; + +export type Result<T> = T | Promise<T>; + +export interface ManagerConfig { + binarySource?: string; + localDir?: string; + registryUrls?: (string | Registry)[]; +} + +export interface ManagerData<T> { + managerData?: T; +} + +export interface ExtractConfig extends ManagerConfig { + endpoint?: string; + global?: any; + gradle?: { timeout?: number }; + ignoreNpmrcFile?: boolean; + + skipInstalls?: boolean; + versionScheme?: string; +} + +export interface UpdateArtifactsConfig extends ManagerConfig { + isLockFileMaintenance?: boolean; + compatibility?: Record<string, string>; + cacheDir?: string; + postUpdateOptions?: string[]; +} + +export interface PackageUpdateConfig { + currentValue?: string; + rangeStrategy?: RangeStrategy; + supportPolicy?: string[]; +} + +export interface PackageUpdateResult { + newValue: string[]; + newMajor: string; + isRange: boolean; + sourceUrl: string; +} + +export interface RangeConfig<T = Record<string, any>> extends ManagerData<T> { + composerJsonType?: 'composer-plugin' | 'library' | 'metapackage' | 'project'; + currentValue?: string; + depName?: string; + depType?: string; + manager?: string; + packageJsonType?: 'app' | 'library'; + rangeStrategy: RangeStrategy; +} + +export interface Registry { + type?: string; + url: string; +} + +export interface NpmLockFiles { + yarnIntegrity?: boolean; + yarnLock?: string; + packageLock?: string; + shrinkwrapJson?: string; + pnpmShrinkwrap?: string; + npmLock?: string; + lernaDir?: string; +} + +export interface PackageFile<T = Record<string, any>> + extends NpmLockFiles, + ManagerData<T> { + hasYarnWorkspaces?: boolean; + internalPackages?: string[]; + compatibility?: Record<string, string>; + datasource?: string; + registryUrls?: (string | Registry)[]; + deps: PackageDependency[]; + ignoreNpmrcFile?: boolean; + lernaClient?: string; + lernaPackages?: string[]; + manager?: string; + mavenProps?: Record<string, any>; + npmrc?: string; + packageFile?: string; + packageJsonName?: string; + packageJsonType?: 'app' | 'library'; + packageJsonVersion?: string; + parent?: string; + skipInstalls?: boolean; + yarnrc?: string; + yarnWorkspacesPackages?: string[] | string; +} + +export interface Package<T> extends ManagerData<T> { + currentValue?: string; + currentDigest?: string; + depName?: string; + depNameShort?: string; + depType?: string; + fileReplacePosition?: number; + groupName?: string; + lineNumber?: number; + lookupName?: string; + repo?: string; + target?: string; + versionScheme?: string; + + // npm manager + bumpVersion?: ReleaseType | string; + npmPackageAlias?: boolean; + packageJsonVersion?: string; + gitRef?: boolean; + sourceUrl?: string; + githubRepo?: string; + pinDigests?: boolean; + currentRawValue?: string; + major?: { enabled?: boolean }; + prettyDepType?: any; +} + +export interface PackageDependency<T = Record<string, any>> extends Package<T> { + commitMessageTopic?: string; + currentDigestShort?: string; + datasource?: string; + digestOneAndOnly?: boolean; + fromVersion?: string; + lockedVersion?: string; + lookupType?: string; + moduleName?: string; + propSource?: string; + registryUrls?: string[]; + rangeStrategy?: RangeStrategy; + skipReason?: string; + source?: string; + sourceLine?: number; + versionLine?: number; +} + +export interface Upgrade<T = Record<string, any>> + extends Package<T>, + NpmLockFiles { + isLockfileUpdate?: boolean; + currentRawValue?: any; + checksumUrl?: string; + currentVersion?: string; + depGroup?: string; + downloadUrl?: string; + name?: string; + newDigest?: string; + newFrom?: string; + newMajor?: number; + newValue?: string; + newVersion?: string; + packageFile?: string; + rangeStrategy?: RangeStrategy; + toVersion?: string; + updateType?: string; + version?: string; +} + +interface ArtifactError { + lockFile?: string; + stderr?: string; +} + +export interface UpdateArtifactsResult { + artifactError?: ArtifactError; + file?: { name: string; contents: string }; + lockFileError?: ArtifactError; +} + +export interface ManagerApi { + language?: string; + supportsLockFileMaintenance?: boolean; + + extractAllPackageFiles?( + config: ExtractConfig, + files: string[] + ): Result<PackageFile[]>; + + extractPackageFile?( + content: string, + packageFile?: string, + config?: ExtractConfig + ): Result<PackageFile>; + + getPackageUpdates(config: PackageUpdateConfig): Result<PackageUpdateResult[]>; + + getRangeStrategy(config: RangeConfig): RangeStrategy; + + updateArtifacts?( + packageFileName: string, + updatedDeps: string[], + newPackageFileContent: string, + config: UpdateArtifactsConfig + ): Result<UpdateArtifactsResult[]>; + + updateDependency(fileContent: string, upgrade: Upgrade): Result<string>; +} + +// TODO: name and properties used by npm manager +export interface PostUpdateConfig extends ManagerConfig, Record<string, any> { + cacheDir?: string; + + postUpdateOptions?: string[]; + skipInstalls?: boolean; + + platform?: string; + upgrades?: Upgrade[]; + npmLock?: string; + yarnLock?: string; + branchName?: string; + parentBranch?: string; +} diff --git a/lib/manager/composer/artifacts.js b/lib/manager/composer/artifacts.ts similarity index 90% rename from lib/manager/composer/artifacts.js rename to lib/manager/composer/artifacts.ts index d7d439e9f4f9b6e63306bd1740953b6730f5809a..8ce8a4bcfc4e19382e9b5a53057f78dc60304985 100644 --- a/lib/manager/composer/artifacts.js +++ b/lib/manager/composer/artifacts.ts @@ -1,20 +1,18 @@ import is from '@sindresorhus/is'; +import URL from 'url'; +import fs from 'fs-extra'; +import upath from 'upath'; import { exec } from '../../util/exec'; +import { UpdateArtifactsConfig, Registry } from '../common'; +import { logger } from '../../logger'; +import * as hostRules from '../../util/host-rules'; +import { getChildProcessEnv } from '../../util/env'; -const URL = require('url'); -const fs = require('fs-extra'); -const upath = require('upath'); -const { logger } = require('../../logger'); -const hostRules = require('../../util/host-rules'); -const { getChildProcessEnv } = require('../../util/env'); - -export { updateArtifacts }; - -async function updateArtifacts( - packageFileName, - updatedDeps, - newPackageFileContent, - config +export async function updateArtifacts( + packageFileName: string, + updatedDeps: string[], + newPackageFileContent: string, + config: UpdateArtifactsConfig ) { logger.debug(`composer.updateArtifacts(${packageFileName})`); process.env.COMPOSER_CACHE_DIR = @@ -30,8 +28,8 @@ async function updateArtifacts( } const cwd = upath.join(config.localDir, upath.dirname(packageFileName)); await fs.ensureDir(upath.join(cwd, 'vendor')); - let stdout; - let stderr; + let stdout: string; + let stderr: string; try { const localPackageFileName = upath.join(config.localDir, packageFileName); await fs.outputFile(localPackageFileName, newPackageFileContent); @@ -63,7 +61,7 @@ async function updateArtifacts( try { // istanbul ignore else if (is.array(config.registryUrls)) { - for (const regUrl of config.registryUrls) { + for (const regUrl of config.registryUrls as Registry[]) { if (regUrl.url) { const { host } = URL.parse(regUrl.url); const hostRule = hostRules.find({ @@ -98,7 +96,7 @@ async function updateArtifacts( } const env = getChildProcessEnv(['COMPOSER_CACHE_DIR']); const startTime = process.hrtime(); - let cmd; + let cmd: string; if (config.binarySource === 'docker') { logger.info('Running composer via docker'); cmd = `docker run --rm `; diff --git a/lib/manager/composer/extract.js b/lib/manager/composer/extract.ts similarity index 77% rename from lib/manager/composer/extract.js rename to lib/manager/composer/extract.ts index 262e8935f0e48f945d386c13f3523b313b939ccf..fe985b006400e9f5b0ceb5c733a06e8a753cd845 100644 --- a/lib/manager/composer/extract.js +++ b/lib/manager/composer/extract.ts @@ -1,9 +1,22 @@ import is from '@sindresorhus/is'; +import { logger } from '../../logger'; +import { api as semverComposer } from '../../versioning/composer'; +import { PackageFile, PackageDependency, Registry } from '../common'; -const { logger } = require('../../logger'); -const semverComposer = require('../../versioning/composer'); +interface Repo { + name?: string; + type: 'composer' | 'git' | 'package' | 'vcs'; -export { extractPackageFile }; + url: string; +} + +interface ComposerConfig { + type?: string; + repositories: Record<string, Repo>; + + require: Record<string, string>; + 'require-dev': Record<string, string>; +} /** * Parse the repositories field from a composer.json @@ -15,7 +28,11 @@ export { extractPackageFile }; * @param repositories * @param registryUrls */ -function parseRepositories(repoJson, repositories, registryUrls) { +function parseRepositories( + repoJson: Record<string, Repo>, + repositories: Record<string, Repo>, + registryUrls: Registry[] +) { try { Object.entries(repoJson).forEach(([key, repo]) => { const name = is.array(repoJson) ? repo.name : key; @@ -26,7 +43,9 @@ function parseRepositories(repoJson, repositories, registryUrls) { repositories[name] = repo; break; default: + // TODO: only add required props registryUrls.push(repo); + break; } }); } catch (e) /* istanbul ignore next */ { @@ -37,18 +56,18 @@ function parseRepositories(repoJson, repositories, registryUrls) { } } -async function extractPackageFile(content, fileName) { +export async function extractPackageFile(content: string, fileName: string) { logger.trace(`composer.extractPackageFile(${fileName})`); - let composerJson; + let composerJson: ComposerConfig; try { composerJson = JSON.parse(content); } catch (err) { logger.info({ fileName }, 'Invalid JSON'); return null; } - const repositories = {}; - const registryUrls = []; - const res = {}; + const repositories: Record<string, Repo> = {}; + const registryUrls: Registry[] = []; + const res: PackageFile = { deps: [] }; // handle lockfile const lockfilePath = fileName.replace(/\.json$/, '.lock'); @@ -75,9 +94,9 @@ async function extractPackageFile(content, fileName) { for (const depType of depTypes) { if (composerJson[depType]) { try { - for (const [depName, version] of Object.entries( - composerJson[depType] - )) { + for (const [depName, version] of Object.entries(composerJson[ + depType + ] as Record<string, string>)) { const currentValue = version.trim(); // Default datasource and lookupName let datasource = 'packagist'; @@ -94,7 +113,7 @@ async function extractPackageFile(content, fileName) { break; } } - const dep = { + const dep: PackageDependency = { depType, depName, currentValue, diff --git a/lib/manager/composer/index.js b/lib/manager/composer/index.js deleted file mode 100644 index e31490e30d7ca86d5572c08e37e29bb89e4b3f5f..0000000000000000000000000000000000000000 --- a/lib/manager/composer/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('../npm/update'); -const { updateArtifacts } = require('./artifacts'); -const { getRangeStrategy } = require('./range'); - -const language = 'php'; - -module.exports = { - extractPackageFile, - updateArtifacts, - language, - updateDependency, - getRangeStrategy, - supportsLockFileMaintenance: true, -}; diff --git a/lib/manager/composer/index.ts b/lib/manager/composer/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7bd3bf71b41d702d18951972dbf7da86ec85ab69 --- /dev/null +++ b/lib/manager/composer/index.ts @@ -0,0 +1,15 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from '../npm/update'; +import { updateArtifacts } from './artifacts'; +import { getRangeStrategy } from './range'; + +const language = 'php'; +export const supportsLockFileMaintenance = true; + +export { + extractPackageFile, + updateArtifacts, + language, + updateDependency, + getRangeStrategy, +}; diff --git a/lib/manager/composer/range.js b/lib/manager/composer/range.ts similarity index 83% rename from lib/manager/composer/range.js rename to lib/manager/composer/range.ts index 407278044321294a5ec5ded1cac796153a0d36ea..2293a62587d33bb6eb7db95509953543f8ffc5c2 100644 --- a/lib/manager/composer/range.js +++ b/lib/manager/composer/range.ts @@ -1,10 +1,8 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { RangeConfig } from '../common'; +import { RangeStrategy } from '../../versioning'; -module.exports = { - getRangeStrategy, -}; - -function getRangeStrategy(config) { +export function getRangeStrategy(config: RangeConfig): RangeStrategy { const { managerData = {}, depType, diff --git a/lib/manager/deps-edn/extract.js b/lib/manager/deps-edn/extract.ts similarity index 69% rename from lib/manager/deps-edn/extract.js rename to lib/manager/deps-edn/extract.ts index c1196ecbf8fb2e2a3bcb715dcc986c0e0d0c7197..52a2a84003281b9c8aa4d61a5837c889190c4940 100644 --- a/lib/manager/deps-edn/extract.js +++ b/lib/manager/deps-edn/extract.ts @@ -1,8 +1,9 @@ -const { DEFAULT_MAVEN_REPO } = require('../maven/extract'); -const { expandDepName, DEFAULT_CLOJARS_REPO } = require('../leiningen/extract'); +import { DEFAULT_MAVEN_REPO } from '../maven/extract'; +import { expandDepName, DEFAULT_CLOJARS_REPO } from '../leiningen/extract'; +import { PackageFile, PackageDependency } from '../common'; -function extractPackageFile(content) { - const deps = []; +export function extractPackageFile(content: string): PackageFile { + const deps: PackageDependency[] = []; const regex = /([^{\s,]*)[\s,]*{[\s,]*:mvn\/version[\s,]+"([^"]+)"[\s,]*}/; let rest = content; @@ -28,7 +29,3 @@ function extractPackageFile(content) { return { deps }; } - -module.exports = { - extractPackageFile, -}; diff --git a/lib/manager/deps-edn/index.js b/lib/manager/deps-edn/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/deps-edn/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/deps-edn/index.ts b/lib/manager/deps-edn/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123 --- /dev/null +++ b/lib/manager/deps-edn/index.ts @@ -0,0 +1,4 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +export { extractPackageFile, updateDependency }; diff --git a/lib/manager/deps-edn/update.js b/lib/manager/deps-edn/update.js deleted file mode 100644 index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000 --- a/lib/manager/deps-edn/update.js +++ /dev/null @@ -1,5 +0,0 @@ -const { updateAtPosition } = require('../maven/update'); - -module.exports = { - updateDependency: updateAtPosition, -}; diff --git a/lib/manager/deps-edn/update.ts b/lib/manager/deps-edn/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1 --- /dev/null +++ b/lib/manager/deps-edn/update.ts @@ -0,0 +1 @@ +export { updateAtPosition as updateDependency } from '../maven/update'; diff --git a/lib/manager/docker-compose/extract.js b/lib/manager/docker-compose/extract.ts similarity index 74% rename from lib/manager/docker-compose/extract.js rename to lib/manager/docker-compose/extract.ts index 5fb1b5f53f4090ebe0ebf1dfb50ff5d7695fee18..1fd6e03ee798656b2536f7cf011df46ec71ea286 100644 --- a/lib/manager/docker-compose/extract.js +++ b/lib/manager/docker-compose/extract.ts @@ -1,13 +1,10 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.debug('docker-compose.extractPackageFile()'); - let deps = []; + let deps: PackageDependency[] = []; let lineNumber = 0; for (const line of content.split('\n')) { const match = line.match(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/); diff --git a/lib/manager/docker-compose/index.js b/lib/manager/docker-compose/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/docker-compose/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/docker-compose/index.ts b/lib/manager/docker-compose/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3 --- /dev/null +++ b/lib/manager/docker-compose/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/docker-compose/update.js b/lib/manager/docker-compose/update.ts similarity index 78% rename from lib/manager/docker-compose/update.js rename to lib/manager/docker-compose/update.ts index 3fd31907f54d41a6e8f05ed6f6dbb0ae87aff6d4..e36a85b0718cab65b63608d9fbb8b853a2454611 100644 --- a/lib/manager/docker-compose/update.js +++ b/lib/manager/docker-compose/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { const newFrom = getNewFrom(upgrade); logger.debug(`docker-compose.updateDependency(): ${newFrom}`); diff --git a/lib/manager/dockerfile/extract.js b/lib/manager/dockerfile/extract.ts similarity index 86% rename from lib/manager/dockerfile/extract.js rename to lib/manager/dockerfile/extract.ts index 46e4e67f15163c6d135c7399bbb97a3be2d5861d..c032d917d3d2a245e94dcebf1b31f4cbc39f593b 100644 --- a/lib/manager/dockerfile/extract.js +++ b/lib/manager/dockerfile/extract.ts @@ -1,12 +1,7 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { PackageDependency, PackageFile } from '../common'; -module.exports = { - splitImageParts, - getDep, - extractPackageFile, -}; - -function splitImageParts(currentFrom) { +export function splitImageParts(currentFrom: string): PackageDependency { if (currentFrom.includes('$')) { return { skipReason: 'contains-variable', @@ -14,8 +9,8 @@ function splitImageParts(currentFrom) { } const [currentDepTag, currentDigest] = currentFrom.split('@'); const depTagSplit = currentDepTag.split(':'); - let depName; - let currentValue; + let depName: string; + let currentValue: string; if ( depTagSplit.length === 1 || depTagSplit[depTagSplit.length - 1].includes('/') @@ -25,7 +20,7 @@ function splitImageParts(currentFrom) { currentValue = depTagSplit.pop(); depName = depTagSplit.join(':'); } - const dep = { + const dep: PackageDependency = { depName, currentValue, currentDigest, @@ -33,8 +28,7 @@ function splitImageParts(currentFrom) { return dep; } -function getDep(currentFrom) { - /** @type any */ +export function getDep(currentFrom: string) { const dep = splitImageParts(currentFrom); dep.datasource = 'docker'; if ( @@ -47,9 +41,9 @@ function getDep(currentFrom) { return dep; } -function extractPackageFile(content) { - const deps = []; - const stageNames = []; +export function extractPackageFile(content: string): PackageFile { + const deps: PackageDependency[] = []; + const stageNames: string[] = []; let lineNumber = 0; for (const fromLine of content.split('\n')) { const fromMatch = fromLine.match(/^FROM /i); diff --git a/lib/manager/dockerfile/index.js b/lib/manager/dockerfile/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/dockerfile/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/dockerfile/index.ts b/lib/manager/dockerfile/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3 --- /dev/null +++ b/lib/manager/dockerfile/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/dockerfile/update.js b/lib/manager/dockerfile/update.ts similarity index 84% rename from lib/manager/dockerfile/update.js rename to lib/manager/dockerfile/update.ts index b10f798e71b9c1921d352aa99606a2a8ed4f6272..feae2bfa3d191b7ff4833161db86c967e67b8cf8 100644 --- a/lib/manager/dockerfile/update.js +++ b/lib/manager/dockerfile/update.ts @@ -1,11 +1,7 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - getNewFrom, - updateDependency, -}; - -function getNewFrom(upgrade) { +export function getNewFrom(upgrade: Upgrade) { const { depName, newValue, newDigest } = upgrade; let newFrom = depName; if (newValue) { @@ -17,7 +13,7 @@ function getNewFrom(upgrade) { return newFrom; } -function updateDependency(fileContent, upgrade) { +export function updateDependency(fileContent: string, upgrade: Upgrade) { try { const { lineNumber, fromSuffix } = upgrade.managerData; let { fromPrefix } = upgrade.managerData; diff --git a/lib/manager/github-actions/extract.js b/lib/manager/github-actions/extract.ts similarity index 73% rename from lib/manager/github-actions/extract.js rename to lib/manager/github-actions/extract.ts index bcd6d38f2840218903bde7b736eb7f03df29a5ee..b50126c0936d19373ab547f54145bbbee7b15583 100644 --- a/lib/manager/github-actions/extract.js +++ b/lib/manager/github-actions/extract.ts @@ -1,19 +1,15 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.debug('github-actions.extractPackageFile()'); - const deps = []; + const deps: PackageDependency[] = []; let lineNumber = 0; for (const line of content.split('\n')) { const match = line.match(/^\s+uses = "docker:\/\/([^"]+)"\s*$/); if (match) { const currentFrom = match[1]; - /** @type any */ const dep = getDep(currentFrom); logger.debug( { diff --git a/lib/manager/github-actions/index.js b/lib/manager/github-actions/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/github-actions/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/github-actions/index.ts b/lib/manager/github-actions/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3 --- /dev/null +++ b/lib/manager/github-actions/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/github-actions/update.js b/lib/manager/github-actions/update.ts similarity index 78% rename from lib/manager/github-actions/update.js rename to lib/manager/github-actions/update.ts index 1f35a2697fc1f2f6a10392f0e066fec167939872..49e094dac9deb4baeeba239501a37f013496a220 100644 --- a/lib/manager/github-actions/update.js +++ b/lib/manager/github-actions/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { const newFrom = getNewFrom(upgrade); logger.debug(`github-actions.updateDependency(): ${newFrom}`); diff --git a/lib/manager/gitlabci-include/extract.js b/lib/manager/gitlabci-include/extract.ts similarity index 71% rename from lib/manager/gitlabci-include/extract.js rename to lib/manager/gitlabci-include/extract.ts index 39a513a9a54de00b64e0876def3901125bacaaf1..0200c27a061e91f724813499fa82997ffa9748ee 100644 --- a/lib/manager/gitlabci-include/extract.js +++ b/lib/manager/gitlabci-include/extract.ts @@ -1,16 +1,17 @@ import is from '@sindresorhus/is'; +import yaml from 'js-yaml'; +import { logger } from '../../logger'; +import { PackageDependency, ExtractConfig, PackageFile } from '../common'; -const yaml = require('js-yaml'); - -const { logger } = require('../../logger'); - -export { extractPackageFile }; - -function extractDepFromInclude(includeObj) { +function extractDepFromInclude(includeObj: { + file: any; + project: string; + ref: string; +}) { if (!includeObj.file || !includeObj.project) { return null; } - const dep = { + const dep: PackageDependency = { datasource: 'gitlab', depName: includeObj.project, depType: 'repository', @@ -23,8 +24,12 @@ function extractDepFromInclude(includeObj) { return dep; } -function extractPackageFile(content, packageFile, config) { - const deps = []; +export function extractPackageFile( + content: string, + _packageFile: string, + config: ExtractConfig +): PackageFile { + const deps: PackageDependency[] = []; try { const doc = yaml.safeLoad(content); if (doc.include && is.array(doc.include)) { diff --git a/lib/manager/gitlabci-include/index.js b/lib/manager/gitlabci-include/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/gitlabci-include/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/gitlabci-include/index.ts b/lib/manager/gitlabci-include/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e0095e4c0b87742ea8ebb8b318ad025b50f123 --- /dev/null +++ b/lib/manager/gitlabci-include/index.ts @@ -0,0 +1,4 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +export { extractPackageFile, updateDependency }; diff --git a/lib/manager/gitlabci-include/update.js b/lib/manager/gitlabci-include/update.ts similarity index 70% rename from lib/manager/gitlabci-include/update.js rename to lib/manager/gitlabci-include/update.ts index cce3b683ab0345d098fcbd58571ceac7f00016b5..975ed795af902aed634cff6ba745807b01047f1c 100644 --- a/lib/manager/gitlabci-include/update.js +++ b/lib/manager/gitlabci-include/update.ts @@ -1,11 +1,11 @@ -const YAWN = require('yawn-yaml/cjs'); -const { logger } = require('../../logger'); +import YAWN from 'yawn-yaml/cjs'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(currentFileContent, upgrade) { +export function updateDependency( + currentFileContent: string, + upgrade: Upgrade +): string { try { const { depName, newValue } = upgrade; diff --git a/lib/manager/gitlabci/extract.js b/lib/manager/gitlabci/extract.ts similarity index 88% rename from lib/manager/gitlabci/extract.js rename to lib/manager/gitlabci/extract.ts index 1c663445a863b9d89057817916f908974318c0a5..8e489ca12e68cf00c011f2e0d5a9eb8e4a9248eb 100644 --- a/lib/manager/gitlabci/extract.js +++ b/lib/manager/gitlabci/extract.ts @@ -1,12 +1,9 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { - const deps = []; +export function extractPackageFile(content: string): PackageFile { + const deps: PackageDependency[] = []; try { const lines = content.split('\n'); for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { @@ -24,7 +21,6 @@ function extractPackageFile(content) { lineNumber += 1; logger.trace(`Matched image name on line ${lineNumber}`); const currentFrom = imageNameMatch[1]; - /** @type any */ const dep = getDep(currentFrom); dep.managerData = { lineNumber }; dep.depType = 'image-name'; @@ -35,7 +31,6 @@ function extractPackageFile(content) { default: { logger.trace(`Matched image on line ${lineNumber}`); const currentFrom = imageMatch[1]; - /** @type any */ const dep = getDep(currentFrom); dep.managerData = { lineNumber }; dep.depType = 'image'; @@ -59,7 +54,6 @@ function extractPackageFile(content) { foundImage = true; const currentFrom = serviceImageMatch[1]; lineNumber += 1; - /** @type any */ const dep = getDep(currentFrom); dep.managerData = { lineNumber }; dep.depType = 'service-image'; diff --git a/lib/manager/gitlabci/index.js b/lib/manager/gitlabci/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/gitlabci/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5705105fe4b3fc5c6ffd85e4a307850d0b81f0a3 --- /dev/null +++ b/lib/manager/gitlabci/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; + +const language = 'docker'; + +export { extractPackageFile, language, updateDependency }; diff --git a/lib/manager/gitlabci/update.js b/lib/manager/gitlabci/update.ts similarity index 85% rename from lib/manager/gitlabci/update.js rename to lib/manager/gitlabci/update.ts index 4e16b2e62d876bffec11b93e8f115684d04cb002..f00493bff6d84a78b3d6dad3f5fbb6358cdc806c 100644 --- a/lib/manager/gitlabci/update.js +++ b/lib/manager/gitlabci/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(currentFileContent, upgrade) { +export function updateDependency( + currentFileContent: string, + upgrade: Upgrade +): string { try { const newFrom = getNewFrom(upgrade); const lines = currentFileContent.split('\n'); diff --git a/lib/manager/gomod/artifacts.js b/lib/manager/gomod/artifacts.ts similarity index 79% rename from lib/manager/gomod/artifacts.js rename to lib/manager/gomod/artifacts.ts index 5f3e8c25a8da9de1da2b9e1496292518fabc9be9..3eacdbc95c60b03a7eb9b56e14913e75a16e45e7 100644 --- a/lib/manager/gomod/artifacts.js +++ b/lib/manager/gomod/artifacts.ts @@ -1,24 +1,21 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { exec } = require('../../util/exec'); -const hostRules = require('../../util/host-rules'); -const { getChildProcessEnv } = require('../../util/env'); -const { logger } = require('../../logger'); +import { ensureDir, outputFile, readFile } from 'fs-extra'; +import { join, dirname } from 'upath'; +import { exec } from '../../util/exec'; +import { find } from '../../util/host-rules'; +import { getChildProcessEnv } from '../../util/env'; +import { logger } from '../../logger'; +import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common'; -module.exports = { - updateArtifacts, -}; - -async function updateArtifacts( - goModFileName, - updatedDeps, - newGoModContent, - config -) { +export async function updateArtifacts( + goModFileName: string, + _updatedDeps: string[], + newGoModContent: string, + config: UpdateArtifactsConfig +): Promise<UpdateArtifactsResult[]> { logger.debug(`gomod.updateArtifacts(${goModFileName})`); process.env.GOPATH = - process.env.GOPATH || upath.join(config.cacheDir, './others/go'); - await fs.ensureDir(process.env.GOPATH); + process.env.GOPATH || join(config.cacheDir, './others/go'); + await ensureDir(process.env.GOPATH); logger.debug('Using GOPATH: ' + process.env.GOPATH); const sumFileName = goModFileName.replace(/\.mod$/, '.sum'); const existingGoSumContent = await platform.getFile(sumFileName); @@ -26,11 +23,11 @@ async function updateArtifacts( logger.debug('No go.sum found'); return null; } - const cwd = upath.join(config.localDir, upath.dirname(goModFileName)); - let stdout; - let stderr; + const cwd = join(config.localDir, dirname(goModFileName)); + let stdout: string; + let stderr: string; try { - const localGoModFileName = upath.join(config.localDir, goModFileName); + const localGoModFileName = join(config.localDir, goModFileName); const massagedGoMod = newGoModContent.replace( /\n(replace\s+[^\s]+\s+=>\s+\.\.\/.*)/g, '\n// renovate-replace $1' @@ -38,12 +35,12 @@ async function updateArtifacts( if (massagedGoMod !== newGoModContent) { logger.debug('Removed some relative replace statements from go.mod'); } - await fs.outputFile(localGoModFileName, massagedGoMod); - const localGoSumFileName = upath.join(config.localDir, sumFileName); + await outputFile(localGoModFileName, massagedGoMod); + const localGoSumFileName = join(config.localDir, sumFileName); const customEnv = ['GOPATH', 'GOPROXY']; const env = getChildProcessEnv(customEnv); const startTime = process.hrtime(); - let cmd; + let cmd: string; if (config.binarySource === 'docker') { logger.info('Running go via docker'); cmd = `docker run --rm `; @@ -54,7 +51,7 @@ async function updateArtifacts( cmd += '-e CGO_ENABLED=0 '; cmd += `-w ${cwd} `; cmd += `renovate/go `; - const credentials = hostRules.find({ + const credentials = find({ hostType: 'github', url: 'https://api.github.com/', }); @@ -116,11 +113,11 @@ async function updateArtifacts( res.push({ file: { name: sumFileName, - contents: await fs.readFile(localGoSumFileName, 'utf8'), + contents: await readFile(localGoSumFileName, 'utf8'), }, }); - const vendorDir = upath.join(upath.dirname(goModFileName), 'vendor/'); - const vendorModulesFileName = upath.join(vendorDir, 'modules.txt'); + const vendorDir = join(dirname(goModFileName), 'vendor/'); + const vendorModulesFileName = join(vendorDir, 'modules.txt'); // istanbul ignore if if (await platform.getFile(vendorModulesFileName)) { args = 'mod vendor'; @@ -158,11 +155,11 @@ async function updateArtifacts( status = await platform.getRepoStatus(); for (const f of status.modified.concat(status.not_added)) { if (f.startsWith(vendorDir)) { - const localModified = upath.join(config.localDir, f); + const localModified = join(config.localDir, f); res.push({ file: { name: f, - contents: await fs.readFile(localModified, 'utf8'), + contents: await readFile(localModified, 'utf8'), }, }); } @@ -176,7 +173,7 @@ async function updateArtifacts( }); } } - const finalGoModContent = (await fs.readFile( + const finalGoModContent = (await readFile( localGoModFileName, 'utf8' )).replace(/\/\/ renovate-replace /g, ''); diff --git a/lib/manager/gomod/extract.js b/lib/manager/gomod/extract.ts similarity index 86% rename from lib/manager/gomod/extract.js rename to lib/manager/gomod/extract.ts index 89d176939971ccba99682364cee27258d607b47a..965a9a72986e5e6a8160eb5febb2b49c23dd1c4a 100644 --- a/lib/manager/gomod/extract.js +++ b/lib/manager/gomod/extract.ts @@ -1,15 +1,12 @@ -const { logger } = require('../../logger'); -const { isVersion } = require('../../versioning/semver'); +import { logger } from '../../logger'; +import { isVersion } from '../../versioning/semver'; +import { PackageDependency, PackageFile } from '../common'; -module.exports = { - extractPackageFile, -}; - -function getDep(lineNumber, match, type) { +function getDep(lineNumber: number, match: RegExpMatchArray, type: string) { const [, , currentValue] = match; let [, depName] = match; depName = depName.replace(/"/g, ''); - const dep = { + const dep: PackageDependency = { managerData: { lineNumber, }, @@ -38,9 +35,9 @@ function getDep(lineNumber, match, type) { return dep; } -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.trace({ content }, 'gomod.extractPackageFile()'); - const deps = []; + const deps: PackageDependency[] = []; try { const lines = content.split('\n'); for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { diff --git a/lib/manager/gomod/index.js b/lib/manager/gomod/index.js deleted file mode 100644 index 4e6836ebcb6f4236f0602fb8d16afb94a36060f9..0000000000000000000000000000000000000000 --- a/lib/manager/gomod/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { updateArtifacts } = require('./artifacts'); - -module.exports = { - extractPackageFile, - updateDependency, - updateArtifacts, - language: 'golang', -}; diff --git a/lib/manager/gomod/index.ts b/lib/manager/gomod/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6636c89068c943da7b01953eb77b21dfa2695df4 --- /dev/null +++ b/lib/manager/gomod/index.ts @@ -0,0 +1,6 @@ +import { extractPackageFile } from './extract'; +import { updateDependency } from './update'; +import { updateArtifacts } from './artifacts'; + +export const language = 'golang'; +export { extractPackageFile, updateDependency, updateArtifacts }; diff --git a/lib/manager/gomod/update.js b/lib/manager/gomod/update.ts similarity index 92% rename from lib/manager/gomod/update.js rename to lib/manager/gomod/update.ts index 6a7d2dcd07fc702269ed72eb54efd7b3672fe66a..c63dbf3c9dc3cdd968f785972e56e88b3ada4d51 100644 --- a/lib/manager/gomod/update.js +++ b/lib/manager/gomod/update.ts @@ -1,11 +1,11 @@ -const { DateTime } = require('luxon'); -const { logger } = require('../../logger'); +import { DateTime } from 'luxon'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(currentFileContent, upgrade) { +export function updateDependency( + currentFileContent: string, + upgrade: Upgrade +): string { try { logger.debug(`gomod.updateDependency: ${upgrade.newValue}`); const { depName, depType } = upgrade; @@ -28,7 +28,7 @@ function updateDependency(currentFileContent, upgrade) { ); return null; } - let updateLineExp; + let updateLineExp: RegExp; if (depType === 'replace') { updateLineExp = new RegExp( /^(replace\s+[^\s]+[\s]+[=][>]+\s+)([^\s]+\s+)([^\s]+)/ @@ -44,7 +44,7 @@ function updateDependency(currentFileContent, upgrade) { logger.debug('No image line found'); return null; } - let newLine; + let newLine: string; if (upgrade.updateType === 'digest') { const newDigestRightSized = upgrade.newDigest.substring( 0, diff --git a/lib/manager/gradle-wrapper/extract.js b/lib/manager/gradle-wrapper/extract.ts similarity index 79% rename from lib/manager/gradle-wrapper/extract.js rename to lib/manager/gradle-wrapper/extract.ts index 42e6a092f743027808620a672793bb8b7f20cb49..b4ccac285c3281fc89cad47fa3f2862e54f9746f 100644 --- a/lib/manager/gradle-wrapper/extract.js +++ b/lib/manager/gradle-wrapper/extract.ts @@ -1,11 +1,8 @@ -const { coerce } = require('semver'); -const { logger } = require('../../logger'); +import { coerce } from 'semver'; +import { logger } from '../../logger'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(fileContent) { +export function extractPackageFile(fileContent: string): PackageFile { logger.debug('gradle-wrapper.extractPackageFile()'); const lines = fileContent.split('\n'); @@ -15,7 +12,7 @@ function extractPackageFile(fileContent) { /^distributionUrl=.*-((\d|\.)+)-(bin|all)\.zip\s*$/ ); if (match) { - const dependency = { + const dependency: PackageDependency = { datasource: 'gradleVersion', depType: 'gradle-wrapper', depName: 'gradle', diff --git a/lib/manager/gradle-wrapper/index.js b/lib/manager/gradle-wrapper/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/gradle-wrapper/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/gradle-wrapper/index.ts b/lib/manager/gradle-wrapper/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/gradle-wrapper/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/gradle-wrapper/update.js b/lib/manager/gradle-wrapper/update.ts similarity index 81% rename from lib/manager/gradle-wrapper/update.js rename to lib/manager/gradle-wrapper/update.ts index 3db4fc90784f611487e8025a51877640828008d4..a20f419b6fd7b1e96a3b82929762ff128fc723ab 100644 --- a/lib/manager/gradle-wrapper/update.js +++ b/lib/manager/gradle-wrapper/update.ts @@ -1,11 +1,11 @@ -const got = require('../../util/got'); -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; - -async function updateDependency(fileContent, upgrade) { +import got from '../../util/got'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; + +export async function updateDependency( + fileContent: string, + upgrade: Upgrade +): Promise<string> { try { logger.debug(upgrade, 'gradle-wrapper.updateDependency()'); const lines = fileContent.split('\n'); @@ -35,11 +35,11 @@ async function updateDependency(fileContent, upgrade) { } } -function replaceType(url) { +function replaceType(url: string) { return url.replace('bin', 'all'); } -async function getChecksum(url) { +async function getChecksum(url: string) { try { const response = await got(url); return response.body; diff --git a/lib/manager/gradle/build-gradle.js b/lib/manager/gradle/build-gradle.ts similarity index 70% rename from lib/manager/gradle/build-gradle.js rename to lib/manager/gradle/build-gradle.ts index 03fc6debc028fcf294980a09604d9f40dc109100..d3f406b9841022db0d24fd5c4bbe026833c345aa 100644 --- a/lib/manager/gradle/build-gradle.js +++ b/lib/manager/gradle/build-gradle.ts @@ -1,13 +1,34 @@ +import { BuildDependency } from './gradle-updates-report'; + /** * Functions adapted/ported from https://github.com/patrikerdes/gradle-use-latest-versions-plugin * gradle-use-latest-versions-plugin is licensed under MIT and Copyright (c) 2018 Patrik Erdes */ -let variables = {}; +let variables: Record<string, string> = {}; + +// TODO: Unify with BuildDependency ? +export interface GradleDependency { + group: string; + name: string; + version?: string; +} -function updateGradleVersion(buildGradleContent, dependency, newVersion) { +interface UpdateFunction { + ( + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string + ): string; +} + +export function updateGradleVersion( + buildGradleContent: string, + dependency: GradleDependency, + newVersion: string +) { if (dependency) { - const updateFunctions = [ + const updateFunctions: UpdateFunction[] = [ updateVersionStringFormat, updateVersionMapFormat, updateVersionMapVariableFormat, @@ -33,9 +54,12 @@ function updateGradleVersion(buildGradleContent, dependency, newVersion) { return buildGradleContent; } -function collectVersionVariables(dependencies, buildGradleContent) { +export function collectVersionVariables( + dependencies: BuildDependency[], + buildGradleContent: string +) { for (const dep of dependencies) { - const dependency = { + const dependency: GradleDependency = { ...dep, group: dep.depGroup, }; @@ -54,11 +78,15 @@ function collectVersionVariables(dependencies, buildGradleContent) { } } -function init() { +export function init() { variables = {}; } -function updateVersionStringFormat(dependency, buildGradleContent, newVersion) { +function updateVersionStringFormat( + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string +) { const regex = moduleStringVersionFormatMatch(dependency); if (buildGradleContent.match(regex)) { return buildGradleContent.replace(regex, `$1${newVersion}$2`); @@ -66,7 +94,11 @@ function updateVersionStringFormat(dependency, buildGradleContent, newVersion) { return null; } -function updateVersionMapFormat(dependency, buildGradleContent, newVersion) { +function updateVersionMapFormat( + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string +) { const regex = moduleMapVersionFormatMatch(dependency); if (buildGradleContent.match(regex)) { return buildGradleContent.replace(regex, `$1${newVersion}$2`); @@ -75,9 +107,9 @@ function updateVersionMapFormat(dependency, buildGradleContent, newVersion) { } function updateVersionMapVariableFormat( - dependency, - buildGradleContent, - newVersion + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string ) { const regex = moduleMapVariableVersionFormatMatch(dependency); const match = buildGradleContent.match(regex); @@ -91,9 +123,9 @@ function updateVersionMapVariableFormat( } function updateVersionStringVariableFormat( - dependency, - buildGradleContent, - newVersion + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string ) { const regex = moduleStringVariableInterpolationVersionFormatMatch(dependency); const match = buildGradleContent.match(regex); @@ -107,9 +139,9 @@ function updateVersionStringVariableFormat( } function updateVersionExpressionVariableFormat( - dependency, - buildGradleContent, - newVersion + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string ) { const regex = moduleStringVariableExpressionVersionFormatMatch(dependency); const match = buildGradleContent.match(regex); @@ -122,7 +154,11 @@ function updateVersionExpressionVariableFormat( return null; } -function updateGlobalVariables(dependency, buildGradleContent, newVersion) { +function updateGlobalVariables( + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string +) { const variable = variables[`${dependency.group}:${dependency.name}`]; if (variable) { const regex = variableDefinitionFormatMatch(variable); @@ -138,9 +174,9 @@ function updateGlobalVariables(dependency, buildGradleContent, newVersion) { } function updatePropertyFileGlobalVariables( - dependency, - buildGradleContent, - newVersion + dependency: GradleDependency, + buildGradleContent: string, + newVersion: string ) { const variable = variables[`${dependency.group}:${dependency.name}`]; if (variable) { @@ -154,13 +190,13 @@ function updatePropertyFileGlobalVariables( } // https://github.com/patrikerdes/gradle-use-latest-versions-plugin/blob/8cf9c3917b8b04ba41038923cab270d2adda3aa6/src/main/groovy/se/patrikerdes/DependencyUpdate.groovy#L27-L29 -function moduleStringVersionFormatMatch(dependency) { +function moduleStringVersionFormatMatch(dependency: GradleDependency) { return new RegExp( `(["']${dependency.group}:${dependency.name}:)[^$].*?(([:@].*?)?["'])` ); } -function moduleMapVersionFormatMatch(dependency) { +function moduleMapVersionFormatMatch(dependency: GradleDependency) { // prettier-ignore return new RegExp( `(group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` + @@ -169,7 +205,7 @@ function moduleMapVersionFormatMatch(dependency) { ); } -function moduleMapVariableVersionFormatMatch(dependency) { +function moduleMapVariableVersionFormatMatch(dependency: GradleDependency) { // prettier-ignore return new RegExp( `group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` + @@ -178,24 +214,22 @@ function moduleMapVariableVersionFormatMatch(dependency) { ); } -function moduleStringVariableInterpolationVersionFormatMatch(dependency) { +function moduleStringVariableInterpolationVersionFormatMatch( + dependency: GradleDependency +) { return new RegExp( `["']${dependency.group}:${dependency.name}:\\$([^{].*?)["']` ); } -function moduleStringVariableExpressionVersionFormatMatch(dependency) { +function moduleStringVariableExpressionVersionFormatMatch( + dependency: GradleDependency +) { return new RegExp( `["']${dependency.group}:${dependency.name}:\\$\{([^{].*?)}["']` ); } -function variableDefinitionFormatMatch(variable) { +function variableDefinitionFormatMatch(variable: string) { return new RegExp(`(${variable}\\s*=\\s*?["'])(.*)(["'])`); } - -module.exports = { - updateGradleVersion, - collectVersionVariables, - init, -}; diff --git a/lib/manager/gradle/gradle-updates-report.js b/lib/manager/gradle/gradle-updates-report.ts similarity index 63% rename from lib/manager/gradle/gradle-updates-report.js rename to lib/manager/gradle/gradle-updates-report.ts index fcbdba8b0f051013d5185e5a0703932494b9edf2..1dcf9da855ec0fd24996ac6ee472db8d608e8a93 100644 --- a/lib/manager/gradle/gradle-updates-report.js +++ b/lib/manager/gradle/gradle-updates-report.ts @@ -1,10 +1,33 @@ -const path = require('path'); -const fs = require('fs-extra'); -const { logger } = require('../../logger'); +import { join } from 'path'; +import { writeFile, exists, readFile } from 'fs-extra'; +import { logger } from '../../logger'; const GRADLE_DEPENDENCY_REPORT_FILENAME = 'gradle-renovate-report.json'; -async function createRenovateGradlePlugin(localDir) { +interface GradleProject { + project: string; + repositories: string[]; + dependencies: GradleModule[]; +} + +interface GradleModule { + name: string; + group: string; + version: string; +} + +type GradleModuleWithRepos = GradleModule & { repos: string[] }; + +// TODO: Unify with GradleDependency ? +export interface BuildDependency { + name: string; + depGroup: string; + depName?: string; + currentValue?: string; + registryUrls?: string[]; +} + +async function createRenovateGradlePlugin(localDir: string) { const content = ` import groovy.json.JsonOutput import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency @@ -36,14 +59,14 @@ gradle.buildFinished { def json = JsonOutput.toJson(output) outputFile.write json } `; - const gradleInitFile = path.join(localDir, 'renovate-plugin.gradle'); + const gradleInitFile = join(localDir, 'renovate-plugin.gradle'); logger.debug( 'Creating renovate-plugin.gradle file with renovate gradle plugin' ); - await fs.writeFile(gradleInitFile, content); + await writeFile(gradleInitFile, content); } -async function extractDependenciesFromUpdatesReport(localDir) { +async function extractDependenciesFromUpdatesReport(localDir: string) { const gradleProjectConfigurations = await readGradleReport(localDir); const dependencies = gradleProjectConfigurations @@ -54,16 +77,16 @@ async function extractDependenciesFromUpdatesReport(localDir) { return dependencies.map(gradleModule => buildDependency(gradleModule)); } -async function readGradleReport(localDir) { - const renovateReportFilename = path.join( +async function readGradleReport(localDir: string): Promise<GradleProject[]> { + const renovateReportFilename = join( localDir, GRADLE_DEPENDENCY_REPORT_FILENAME ); - if (!(await fs.exists(renovateReportFilename))) { + if (!(await exists(renovateReportFilename))) { return []; } - const contents = await fs.readFile(renovateReportFilename, 'utf8'); + const contents = await readFile(renovateReportFilename, 'utf8'); try { return JSON.parse(contents); } catch (err) { @@ -72,7 +95,9 @@ async function readGradleReport(localDir) { } } -function mergeDependenciesWithRepositories(project) { +function mergeDependenciesWithRepositories( + project: GradleProject +): GradleModuleWithRepos[] { if (!project.dependencies) { return []; } @@ -82,12 +107,18 @@ function mergeDependenciesWithRepositories(project) { })); } -function flatternDependencies(accumulator, currentValue) { +function flatternDependencies( + accumulator: GradleModuleWithRepos[], + currentValue: GradleModuleWithRepos[] +) { accumulator.push(...currentValue); return accumulator; } -function combineReposOnDuplicatedDependencies(accumulator, currentValue) { +function combineReposOnDuplicatedDependencies( + accumulator: GradleModuleWithRepos[], + currentValue: GradleModuleWithRepos +): GradleModuleWithRepos[] { const existingDependency = accumulator.find( dep => dep.name === currentValue.name && dep.group === currentValue.group ); @@ -102,7 +133,7 @@ function combineReposOnDuplicatedDependencies(accumulator, currentValue) { return accumulator; } -function buildDependency(gradleModule) { +function buildDependency(gradleModule: GradleModuleWithRepos): BuildDependency { return { name: gradleModule.name, depGroup: gradleModule.group, @@ -112,7 +143,7 @@ function buildDependency(gradleModule) { }; } -module.exports = { +export { extractDependenciesFromUpdatesReport, createRenovateGradlePlugin, GRADLE_DEPENDENCY_REPORT_FILENAME, diff --git a/lib/manager/gradle/index.js b/lib/manager/gradle/index.ts similarity index 67% rename from lib/manager/gradle/index.js rename to lib/manager/gradle/index.ts index 35eebc9e1bb8e2d0160c5fa4c63d573658e79711..353255b4bce0409b064a81a867d338ef11f27c5e 100644 --- a/lib/manager/gradle/index.js +++ b/lib/manager/gradle/index.ts @@ -1,34 +1,46 @@ -const fs = require('fs-extra'); -const { exec } = require('../../util/exec'); -const { logger } = require('../../logger'); +import { exists } from 'fs-extra'; +import { exec } from '../../util/exec'; +import { logger } from '../../logger'; -const gradle = require('./build-gradle'); -const updatesReport = require('./gradle-updates-report'); +import { + init, + collectVersionVariables, + updateGradleVersion, + GradleDependency, +} from './build-gradle'; +import { + createRenovateGradlePlugin, + extractDependenciesFromUpdatesReport, +} from './gradle-updates-report'; +import { PackageFile, ExtractConfig, Upgrade } from '../common'; const GRADLE_DEPENDENCY_REPORT_OPTIONS = '--init-script renovate-plugin.gradle renovate'; const TIMEOUT_CODE = 143; -async function extractAllPackageFiles(config, packageFiles) { +export async function extractAllPackageFiles( + config: ExtractConfig, + packageFiles: string[] +): Promise<PackageFile[]> { if (!packageFiles.some(packageFile => packageFile === 'build.gradle')) { logger.warn('No root build.gradle found - skipping'); return null; } logger.info('Extracting dependencies from all gradle files'); - await updatesReport.createRenovateGradlePlugin(config.localDir); + await createRenovateGradlePlugin(config.localDir); await executeGradle(config); - gradle.init(); + init(); - const dependencies = await updatesReport.extractDependenciesFromUpdatesReport( + const dependencies = await extractDependenciesFromUpdatesReport( config.localDir ); if (dependencies.length === 0) { return []; } - const gradleFiles = []; + const gradleFiles: PackageFile[] = []; for (const packageFile of packageFiles) { const content = await platform.getFile(packageFile); if (content) { @@ -39,7 +51,7 @@ async function extractAllPackageFiles(config, packageFiles) { deps: dependencies, }); - gradle.collectVersionVariables(dependencies, content); + collectVersionVariables(dependencies, content); } else { // istanbul ignore next logger.info({ packageFile }, 'packageFile has no content'); @@ -49,24 +61,27 @@ async function extractAllPackageFiles(config, packageFiles) { return gradleFiles; } -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { // prettier-ignore logger.debug(`gradle.updateDependency(): packageFile:${upgrade.packageFile} depName:${upgrade.depName}, version:${upgrade.currentVersion} ==> ${upgrade.newValue}`); - return gradle.updateGradleVersion( + return updateGradleVersion( fileContent, buildGradleDependency(upgrade), upgrade.newValue ); } -function buildGradleDependency(config) { +function buildGradleDependency(config: Upgrade): GradleDependency { return { group: config.depGroup, name: config.name, version: config.version }; } -async function executeGradle(config) { - let stdout; - let stderr; +async function executeGradle(config: ExtractConfig) { + let stdout: string; + let stderr: string; const gradleTimeout = config.gradle && config.gradle.timeout ? config.gradle.timeout * 1000 @@ -98,9 +113,9 @@ async function executeGradle(config) { logger.info('Gradle report complete'); } -async function getGradleCommandLine(config) { - let cmd; - const gradlewExists = await fs.exists(config.localDir + '/gradlew'); +async function getGradleCommandLine(config: ExtractConfig) { + let cmd: string; + const gradlewExists = await exists(config.localDir + '/gradlew'); if (config.binarySource === 'docker') { cmd = `docker run --rm -v ${config.localDir}:${config.localDir} -w ${config.localDir} renovate/gradle gradle`; } else if (gradlewExists) { @@ -110,9 +125,4 @@ async function getGradleCommandLine(config) { } return cmd + ' ' + GRADLE_DEPENDENCY_REPORT_OPTIONS; } - -module.exports = { - extractAllPackageFiles, - updateDependency, - language: 'java', -}; +export const language = 'java'; diff --git a/lib/manager/homebrew/extract.js b/lib/manager/homebrew/extract.ts similarity index 83% rename from lib/manager/homebrew/extract.js rename to lib/manager/homebrew/extract.ts index cab4695a294f231df6db0f2f3c7ab9ea622398c2..c4c51b0f047907083ad193731e63845cc42c37b3 100644 --- a/lib/manager/homebrew/extract.js +++ b/lib/manager/homebrew/extract.ts @@ -1,15 +1,10 @@ -const semver = require('../../versioning/semver'); -const { skip, isSpace, removeComments } = require('./util'); - -const { logger } = require('../../logger'); - -module.exports = { - extractPackageFile, - parseUrlPath, -}; +import { isValid } from '../../versioning/semver'; +import { skip, isSpace, removeComments } from './util'; +import { logger } from '../../logger'; +import { PackageFile, PackageDependency } from '../common'; // TODO: Maybe check if quotes/double-quotes are balanced -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.trace('extractPackageFile()'); /* 1. match "class className < Formula" @@ -28,10 +23,10 @@ function extractPackageFile(content) { logger.debug('Invalid URL field'); } const urlPathResult = parseUrlPath(url); - let skipReason; - let currentValue = null; - let ownerName = null; - let repoName = null; + let skipReason: string; + let currentValue: string = null; + let ownerName: string = null; + let repoName: string = null; if (urlPathResult) { currentValue = urlPathResult.currentValue; ownerName = urlPathResult.ownerName; @@ -45,7 +40,7 @@ function extractPackageFile(content) { logger.debug('Error: Invalid sha256 field'); skipReason = 'invalid-sha256'; } - const dep = { + const dep: PackageDependency = { depName: `${ownerName}/${repoName}`, managerData: { ownerName, repoName, sha256, url }, currentValue, @@ -62,7 +57,7 @@ function extractPackageFile(content) { return { deps }; } -function extractSha256(content) { +function extractSha256(content: string) { const sha256RegExp = /(^|\s)sha256(\s)/; let i = content.search(sha256RegExp); if (isSpace(content[i])) { @@ -71,7 +66,7 @@ function extractSha256(content) { return parseSha256(i, content); } -function parseSha256(idx, content) { +function parseSha256(idx: number, content: string) { let i = idx; i += 'sha256'.length; i = skip(i, content, c => { @@ -89,7 +84,7 @@ function parseSha256(idx, content) { return sha256; } -function extractUrl(content) { +function extractUrl(content: string) { const urlRegExp = /(^|\s)url(\s)/; let i = content.search(urlRegExp); // content.search() returns -1 if not found @@ -103,7 +98,7 @@ function extractUrl(content) { return parseUrl(i, content); } -function parseUrlPath(urlStr) { +export function parseUrlPath(urlStr: string) { if (!urlStr) { return null; } @@ -116,7 +111,7 @@ function parseUrlPath(urlStr) { s = s.filter(val => val); const ownerName = s[0]; const repoName = s[1]; - let currentValue; + let currentValue: string; if (s[2] === 'archive') { currentValue = s[3]; const targz = currentValue.slice( @@ -132,7 +127,7 @@ function parseUrlPath(urlStr) { if (!currentValue) { return null; } - if (!semver.isValid(currentValue)) { + if (!isValid(currentValue)) { return null; } return { currentValue, ownerName, repoName }; @@ -141,7 +136,7 @@ function parseUrlPath(urlStr) { } } -function parseUrl(idx, content) { +function parseUrl(idx: number, content: string) { let i = idx; i += 'url'.length; i = skip(i, content, c => { @@ -160,7 +155,7 @@ function parseUrl(idx, content) { return url; } -function extractClassName(content) { +function extractClassName(content: string) { const classRegExp = /(^|\s)class\s/; let i = content.search(classRegExp); if (isSpace(content[i])) { @@ -171,7 +166,7 @@ function extractClassName(content) { /* This function parses the "class className < Formula" header and returns the className and index of the character just after the header */ -function parseClassHeader(idx, content) { +function parseClassHeader(idx: number, content: string) { let i = idx; i += 'class'.length; i = skip(i, content, c => { diff --git a/lib/manager/homebrew/index.js b/lib/manager/homebrew/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/homebrew/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/homebrew/index.ts b/lib/manager/homebrew/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/homebrew/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/homebrew/update.js b/lib/manager/homebrew/update.ts similarity index 82% rename from lib/manager/homebrew/update.js rename to lib/manager/homebrew/update.ts index 84e13b84298d00424c56f662894c63e9c812ad9c..a228bb5c1ef91dbcc900cd1c225e288759f88819 100644 --- a/lib/manager/homebrew/update.js +++ b/lib/manager/homebrew/update.ts @@ -1,24 +1,24 @@ -const crypto = require('crypto'); -const { coerce } = require('semver'); -const { parseUrlPath } = require('./extract'); -const { skip, isSpace, removeComments } = require('./util'); -const got = require('../../util/got'); -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; +import { createHash } from 'crypto'; +import { coerce } from 'semver'; +import { parseUrlPath } from './extract'; +import { skip, isSpace, removeComments } from './util'; +import got from '../../util/got'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; // TODO: Refactor -async function updateDependency(content, upgrade) { +export async function updateDependency( + content: string, + upgrade: Upgrade +): Promise<string> { logger.trace('updateDependency()'); /* 1. Update url field 2. Update sha256 field */ let newContent = content; - let newUrl; - let file; + let newUrl: string; + let file: string; // Example urls: // "https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz" // "https://github.com/aide/aide/releases/download/v0.16.1/aide-0.16.1.tar.gz" @@ -61,8 +61,7 @@ async function updateDependency(content, upgrade) { logger.debug(`Failed to update url for dependency ${upgrade.depName}`); return content; } - const newSha256 = crypto - .createHash('sha256') + const newSha256 = createHash('sha256') .update(file) .digest('hex'); newContent = updateUrl(content, upgrade.managerData.url, newUrl); @@ -78,7 +77,7 @@ async function updateDependency(content, upgrade) { return newContent; } -function updateUrl(content, oldUrl, newUrl) { +function updateUrl(content: string, oldUrl: string, newUrl: string) { const urlRegExp = /(^|\s)url(\s)/; let i = content.search(urlRegExp); if (i === -1) { @@ -103,7 +102,7 @@ function updateUrl(content, oldUrl, newUrl) { return newContent; } -function getUrlTestContent(content, oldUrl, newUrl) { +function getUrlTestContent(content: string, oldUrl: string, newUrl: string) { const urlRegExp = /(^|\s)url(\s)/; const cleanContent = removeComments(content); let j = cleanContent.search(urlRegExp); @@ -114,7 +113,12 @@ function getUrlTestContent(content, oldUrl, newUrl) { return testContent; } -function replaceUrl(idx, content, oldUrl, newUrl) { +function replaceUrl( + idx: number, + content: string, + oldUrl: string, + newUrl: string +) { let i = idx; i += 'url'.length; i = skip(i, content, c => isSpace(c)); @@ -128,7 +132,7 @@ function replaceUrl(idx, content, oldUrl, newUrl) { return newContent; } -function updateSha256(content, oldSha256, newSha256) { +function updateSha256(content: string, oldSha256: string, newSha256: string) { const sha256RegExp = /(^|\s)sha256(\s)/; let i = content.search(sha256RegExp); if (i === -1) { @@ -153,7 +157,11 @@ function updateSha256(content, oldSha256, newSha256) { return newContent; } -function getSha256TestContent(content, oldSha256, newSha256) { +function getSha256TestContent( + content: string, + oldSha256: string, + newSha256: string +) { const sha256RegExp = /(^|\s)sha256(\s)/; const cleanContent = removeComments(content); let j = cleanContent.search(sha256RegExp); @@ -164,7 +172,12 @@ function getSha256TestContent(content, oldSha256, newSha256) { return testContent; } -function replaceSha256(idx, content, oldSha256, newSha256) { +function replaceSha256( + idx: number, + content: string, + oldSha256: string, + newSha256: string +) { let i = idx; i += 'sha256'.length; i = skip(i, content, c => isSpace(c)); diff --git a/lib/manager/homebrew/util.js b/lib/manager/homebrew/util.ts similarity index 81% rename from lib/manager/homebrew/util.js rename to lib/manager/homebrew/util.ts index bb52b1af02b2240d226b802a180a33a36b6af595..83e3e89e2299c4fed84957dc8d7e633d2d719cc9 100644 --- a/lib/manager/homebrew/util.js +++ b/lib/manager/homebrew/util.ts @@ -1,10 +1,8 @@ -module.exports = { - skip, - isSpace, - removeComments, -}; - -function skip(idx, content, cond) { +export function skip( + idx: number, + content: string, + cond: (s: string) => boolean +) { let i = idx; while (i < content.length) { if (!cond(content[i])) { @@ -15,18 +13,18 @@ function skip(idx, content, cond) { return i; } -function isSpace(c) { +export function isSpace(c: string) { return /\s/.test(c); } -function removeComments(content) { +export function removeComments(content: string) { let newContent = removeLineComments(content); newContent = removeMultiLineComments(newContent); return newContent; } // Remove line comments starting with # -function removeLineComments(content) { +function removeLineComments(content: string) { let newContent = ''; let comment = false; for (let i = 0; i < content.length; i += 1) { @@ -47,7 +45,7 @@ function removeLineComments(content) { } // Remove multi-line comments enclosed between =begin and =end -function removeMultiLineComments(content) { +function removeMultiLineComments(content: string) { const beginRegExp = /(^|\n)=begin\s/; const endRegExp = /(^|\n)=end\s/; let newContent = content; diff --git a/lib/manager/index.js b/lib/manager/index.js deleted file mode 100644 index 3c019c00eba5b13d74fab2b07f6fc893d36d5e06..0000000000000000000000000000000000000000 --- a/lib/manager/index.js +++ /dev/null @@ -1,94 +0,0 @@ -const managerList = [ - 'ansible', - 'bazel', - 'buildkite', - 'bundler', - 'cargo', - 'circleci', - 'composer', - 'deps-edn', - 'docker-compose', - 'dockerfile', - 'github-actions', - 'gitlabci', - 'gitlabci-include', - 'gomod', - 'gradle', - 'gradle-wrapper', - 'kubernetes', - 'leiningen', - 'maven', - 'meteor', - 'npm', - 'nuget', - 'nvm', - 'pip_requirements', - 'pip_setup', - 'pipenv', - 'poetry', - 'pub', - 'sbt', - 'swift', - 'terraform', - 'travis', - 'ruby-version', - 'homebrew', -]; -const managers = {}; -for (const manager of managerList) { - // eslint-disable-next-line global-require,import/no-dynamic-require - managers[manager] = require(`./${manager}`); -} - -const languageList = [ - 'dart', - 'docker', - 'dotnet', - 'golang', - 'js', - 'node', - 'php', - 'python', - 'ruby', - 'rust', -]; - -const get = (manager, name) => managers[manager][name]; -const getLanguageList = () => languageList; -const getManagerList = () => managerList; - -module.exports = { - get, - getLanguageList, - getManagerList, -}; - -const managerFunctions = [ - 'extractAllPackageFiles', - 'extractPackageFile', - 'getPackageUpdates', - 'supportsLockFileMaintenance', - 'updateDependency', -]; - -for (const f of managerFunctions) { - module.exports[f] = (manager, ...params) => { - if (managers[manager][f]) { - return managers[manager][f](...params); - } - return null; - }; -} - -module.exports.getRangeStrategy = config => { - const { manager, rangeStrategy } = config; - if (managers[manager].getRangeStrategy) { - // Use manager's own function if it exists - return managers[manager].getRangeStrategy(config); - } - if (rangeStrategy === 'auto') { - // default to 'replace' for auto - return 'replace'; - } - return config.rangeStrategy; -}; diff --git a/lib/manager/index.ts b/lib/manager/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..393d1b926c735a215adab585668b7d2f6a81ce4e --- /dev/null +++ b/lib/manager/index.ts @@ -0,0 +1,109 @@ +import { + ManagerApi, + ExtractConfig, + RangeConfig, + PackageUpdateConfig, +} from './common'; + +const managerList = [ + 'ansible', + 'bazel', + 'buildkite', + 'bundler', + 'cargo', + 'circleci', + 'composer', + 'deps-edn', + 'docker-compose', + 'dockerfile', + 'github-actions', + 'gitlabci', + 'gitlabci-include', + 'gomod', + 'gradle', + 'gradle-wrapper', + 'kubernetes', + 'leiningen', + 'maven', + 'meteor', + 'npm', + 'nuget', + 'nvm', + 'pip_requirements', + 'pip_setup', + 'pipenv', + 'poetry', + 'pub', + 'sbt', + 'swift', + 'terraform', + 'travis', + 'ruby-version', + 'homebrew', +]; + +const managers: Record<string, ManagerApi> = {}; +for (const manager of managerList) { + managers[manager] = require(`./${manager}`); // eslint-disable-line +} + +const languageList = [ + 'dart', + 'docker', + 'dotnet', + 'golang', + 'js', + 'node', + 'php', + 'python', + 'ruby', + 'rust', +]; + +export const get = <T extends keyof ManagerApi>(manager: string, name: T) => + managers[manager][name]; +export const getLanguageList = () => languageList; +export const getManagerList = () => managerList; + +export function extractAllPackageFiles( + manager: string, + config: ExtractConfig, + files: string[] +) { + return managers[manager] && get(manager, 'extractAllPackageFiles') + ? get(manager, 'extractAllPackageFiles')(config, files) + : null; +} + +export function getPackageUpdates( + manager: string, + config: PackageUpdateConfig +) { + return managers[manager] && get(manager, 'getPackageUpdates') + ? get(manager, 'getPackageUpdates')(config) + : null; +} + +export function extractPackageFile( + manager: string, + content: string, + fileName?: string, + config?: ExtractConfig +) { + return managers[manager] && get(manager, 'extractPackageFile') + ? get(manager, 'extractPackageFile')(content, fileName, config) + : null; +} + +export function getRangeStrategy(config: RangeConfig) { + const { manager, rangeStrategy } = config; + if (managers[manager].getRangeStrategy) { + // Use manager's own function if it exists + return managers[manager].getRangeStrategy(config); + } + if (rangeStrategy === 'auto') { + // default to 'replace' for auto + return 'replace'; + } + return config.rangeStrategy; +} diff --git a/lib/manager/kubernetes/extract.js b/lib/manager/kubernetes/extract.ts similarity index 77% rename from lib/manager/kubernetes/extract.js rename to lib/manager/kubernetes/extract.ts index 8473b284deddd772b723585967cb7ce1623057a3..21a7709ff61de782b271ed8faee5c04326e8c595 100644 --- a/lib/manager/kubernetes/extract.js +++ b/lib/manager/kubernetes/extract.ts @@ -1,13 +1,10 @@ -const { logger } = require('../../logger'); -const { getDep } = require('../dockerfile/extract'); +import { logger } from '../../logger'; +import { getDep } from '../dockerfile/extract'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.trace('kubernetes.extractPackageFile()'); - let deps = []; + let deps: PackageDependency[] = []; let lineNumber = 0; const isKubernetesManifest = @@ -20,7 +17,6 @@ function extractPackageFile(content) { const match = line.match(/^\s*-?\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/); if (match) { const currentFrom = match[1]; - /** @type any */ const dep = getDep(currentFrom); logger.debug( { diff --git a/lib/manager/kubernetes/index.js b/lib/manager/kubernetes/index.js deleted file mode 100644 index f98aa074d98cb6dc1534aeb4c1aa1250bf5fba71..0000000000000000000000000000000000000000 --- a/lib/manager/kubernetes/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'docker'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/kubernetes/index.ts b/lib/manager/kubernetes/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c356e13fd898b905f8f07f0aa9cd9362dd6be94d --- /dev/null +++ b/lib/manager/kubernetes/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; + +export const language = 'docker'; diff --git a/lib/manager/kubernetes/update.js b/lib/manager/kubernetes/update.ts similarity index 78% rename from lib/manager/kubernetes/update.js rename to lib/manager/kubernetes/update.ts index 6487c205732c3e62144321a1bde416b9e9487607..56418fab2fce10372c39d621e51ebe9267a3f389 100644 --- a/lib/manager/kubernetes/update.js +++ b/lib/manager/kubernetes/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { getNewFrom } = require('../dockerfile/update'); +import { logger } from '../../logger'; +import { getNewFrom } from '../dockerfile/update'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { const newFrom = getNewFrom(upgrade); logger.debug(`kubernetes.updateDependency(): ${newFrom}`); diff --git a/lib/manager/leiningen/extract.js b/lib/manager/leiningen/extract.ts similarity index 77% rename from lib/manager/leiningen/extract.js rename to lib/manager/leiningen/extract.ts index f045af1bf1ac4cf1350d2c60d1e736cabebde8b1..dc3864a35b4a032553249f121c51e8bbe5530626 100644 --- a/lib/manager/leiningen/extract.js +++ b/lib/manager/leiningen/extract.ts @@ -1,8 +1,9 @@ -const { DEFAULT_MAVEN_REPO } = require('../maven/extract'); +import { DEFAULT_MAVEN_REPO } from '../maven/extract'; +import { PackageDependency, PackageFile } from '../common'; -const DEFAULT_CLOJARS_REPO = 'https://clojars.org/repo/'; +export const DEFAULT_CLOJARS_REPO = 'https://clojars.org/repo/'; -function trimAtKey(str, kwName) { +export function trimAtKey(str: string, kwName: string) { const regex = new RegExp(`:${kwName}(?=\\s)`); const keyOffset = str.search(regex); if (keyOffset < 0) return null; @@ -12,23 +13,32 @@ function trimAtKey(str, kwName) { return withSpaces.slice(valueOffset); } -function expandDepName(name) { +export function expandDepName(name: string) { return name.indexOf('/') === -1 ? `${name}:${name}` : name.replace('/', ':'); } -function extractFromVectors(str, offset = 0, ctx = {}) { +export interface ExtractContext { + depType?: string; + registryUrls?: string[]; +} + +export function extractFromVectors( + str: string, + offset = 0, + ctx: ExtractContext = {} +): PackageDependency[] { if (str.indexOf('[') !== 0) return []; let balance = 0; - const result = []; + const result: PackageDependency[] = []; let idx = 0; let vecPos = 0; let artifactId = ''; let version = ''; - let fileReplacePosition = null; + let fileReplacePosition: number = null; - const isSpace = ch => ch && /[\s,]/.test(ch); + const isSpace = (ch: string) => ch && /[\s,]/.test(ch); - const cleanStrLiteral = s => s.replace(/^"/, '').replace(/"$/, ''); + const cleanStrLiteral = (s: string) => s.replace(/^"/, '').replace(/"$/, ''); const yieldDep = () => { if (artifactId && version && fileReplacePosition) { @@ -79,7 +89,7 @@ function extractFromVectors(str, offset = 0, ctx = {}) { return result; } -function extractLeinRepos(content) { +function extractLeinRepos(content: string) { const result = [DEFAULT_CLOJARS_REPO, DEFAULT_MAVEN_REPO]; const repoContent = trimAtKey( @@ -111,9 +121,9 @@ function extractLeinRepos(content) { return result; } -function extractPackageFile(content) { - const collect = (key, ctx) => { - let result = []; +export function extractPackageFile(content: string): PackageFile { + const collect = (key: string, ctx: ExtractContext) => { + let result: PackageDependency[] = []; let restContent = trimAtKey(content, key); while (restContent) { const offset = content.length - restContent.length; @@ -125,7 +135,7 @@ function extractPackageFile(content) { const registryUrls = extractLeinRepos(content); - const deps = [ + const deps: PackageDependency[] = [ ...collect('dependencies', { depType: 'dependencies', registryUrls, @@ -150,11 +160,3 @@ function extractPackageFile(content) { return { deps }; } - -module.exports = { - trimAtKey, - extractFromVectors, - expandDepName, - DEFAULT_CLOJARS_REPO, - extractPackageFile, -}; diff --git a/lib/manager/leiningen/index.js b/lib/manager/leiningen/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/leiningen/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/leiningen/index.ts b/lib/manager/leiningen/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/leiningen/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/leiningen/update.js b/lib/manager/leiningen/update.js deleted file mode 100644 index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000 --- a/lib/manager/leiningen/update.js +++ /dev/null @@ -1,5 +0,0 @@ -const { updateAtPosition } = require('../maven/update'); - -module.exports = { - updateDependency: updateAtPosition, -}; diff --git a/lib/manager/leiningen/update.ts b/lib/manager/leiningen/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1 --- /dev/null +++ b/lib/manager/leiningen/update.ts @@ -0,0 +1 @@ +export { updateAtPosition as updateDependency } from '../maven/update'; diff --git a/lib/manager/maven/extract.js b/lib/manager/maven/extract.ts similarity index 73% rename from lib/manager/maven/extract.js rename to lib/manager/maven/extract.ts index 6fa33d2799195e84e5186d334810d43636e39ae7..bf535024ef3f3f271b26f97fcd26b83943e4a070 100644 --- a/lib/manager/maven/extract.js +++ b/lib/manager/maven/extract.ts @@ -1,12 +1,13 @@ -const path = require('path'); -const { XmlDocument } = require('xmldoc'); -const { isValid } = require('../../versioning/maven'); -const { logger } = require('../../logger'); +import { basename, dirname, normalize, join } from 'path'; +import { XmlDocument, XmlElement } from 'xmldoc'; +import { isValid } from '../../versioning/maven'; +import { logger } from '../../logger'; +import { ExtractConfig, PackageFile, PackageDependency } from '../common'; -const DEFAULT_MAVEN_REPO = 'https://repo.maven.apache.org/maven2'; +export const DEFAULT_MAVEN_REPO = 'https://repo.maven.apache.org/maven2'; -function parsePom(raw) { - let project; +export function parsePom(raw: string) { + let project: XmlDocument; try { project = new XmlDocument(raw); } catch (e) { @@ -18,11 +19,17 @@ function parsePom(raw) { return project; } -function containsPlaceholder(str) { +export function containsPlaceholder(str: string) { return /\${.*?}/g.test(str); } -function depFromNode(node) { +interface MavenProp { + val: string; + fileReplacePosition: number; + packageFile: string; +} + +function depFromNode(node: XmlElement): PackageDependency { if (!node.valueWithPath) return null; const groupId = node.valueWithPath('groupId'); const artifactId = node.valueWithPath('artifactId'); @@ -44,21 +51,28 @@ function depFromNode(node) { return null; } -function deepExtract(node, result = [], isRoot = true) { - const dep = depFromNode(node); +function deepExtract( + node: XmlElement, + result = [], + isRoot = true +): PackageDependency[] { + const dep = depFromNode(node as XmlElement); if (dep && !isRoot) { result.push(dep); } if (node.children) { for (const child of node.children) { - deepExtract(child, result, false); + deepExtract(child as XmlElement, result, false); } } return result; } -function applyProps(dep, props) { - const replaceAll = str => +function applyProps( + dep: PackageDependency<Record<string, any>>, + props: MavenProp +) { + const replaceAll = (str: string) => str.replace(/\${.*?}/g, substr => { const propKey = substr.slice(2, -1).trim(); const propValue = props[propKey]; @@ -85,7 +99,7 @@ function applyProps(dep, props) { return substr; }); - const result = { + const result: PackageDependency = { ...dep, depName, registryUrls, @@ -109,35 +123,36 @@ function applyProps(dep, props) { return result; } -function resolveParentFile(packageFile, parentPath) { +function resolveParentFile(packageFile: string, parentPath: string) { let parentFile = 'pom.xml'; let parentDir = parentPath; - const parentBasename = path.basename(parentPath); + const parentBasename = basename(parentPath); if (parentBasename === 'pom.xml' || /\.pom\.xml$/.test(parentBasename)) { parentFile = parentBasename; - parentDir = path.dirname(parentPath); + parentDir = dirname(parentPath); } - const dir = path.dirname(packageFile); - return path.normalize(path.join(dir, parentDir, parentFile)); + const dir = dirname(packageFile); + return normalize(join(dir, parentDir, parentFile)); } -function extractPackage(rawContent, packageFile = null) { +export function extractPackage(rawContent: string, packageFile: string = null) { if (!rawContent) return null; const project = parsePom(rawContent); if (!project) return null; - const result = { + const result: PackageFile = { datasource: 'maven', packageFile, + deps: [], }; result.deps = deepExtract(project); const propsNode = project.childNamed('properties'); - const props = {}; + const props: Record<string, MavenProp> = {}; if (propsNode && propsNode.children) { - for (const propNode of propsNode.children) { + for (const propNode of propsNode.children as XmlElement[]) { const key = propNode.name; const val = propNode.val && propNode.val.trim(); if (key && val) { @@ -172,11 +187,11 @@ function extractPackage(rawContent, packageFile = null) { return result; } -function resolveProps(packages) { - const packageFileNames = []; - const extractedPackages = {}; - const extractedDeps = {}; - const extractedProps = {}; +export function resolveProps(packages: PackageFile[]): PackageFile[] { + const packageFileNames: string[] = []; + const extractedPackages: Record<string, PackageFile> = {}; + const extractedDeps: Record<string, PackageDependency[]> = {}; + const extractedProps: Record<string, MavenProp> = {}; packages.forEach(pkg => { const name = pkg.packageFile; packageFileNames.push(name); @@ -188,7 +203,7 @@ function resolveProps(packages) { // and merge them in reverse order, // which allows inheritance/overriding. packageFileNames.forEach(name => { - const hierarchy = []; + const hierarchy: Record<string, MavenProp>[] = []; let pkg = extractedPackages[name]; while (pkg) { hierarchy.unshift(pkg.mavenProps); @@ -225,8 +240,11 @@ function cleanResult(packageFiles) { return packageFiles; } -async function extractAllPackageFiles(config, packageFiles) { - const packages = []; +export async function extractAllPackageFiles( + _config: ExtractConfig, + packageFiles: string[] +): Promise<PackageFile[]> { + const packages: PackageFile[] = []; for (const packageFile of packageFiles) { const content = await platform.getFile(packageFile); if (content) { @@ -243,12 +261,3 @@ async function extractAllPackageFiles(config, packageFiles) { return cleanResult(resolveProps(packages)); } - -module.exports = { - containsPlaceholder, - parsePom, - extractPackage, - resolveProps, - extractAllPackageFiles, - DEFAULT_MAVEN_REPO, -}; diff --git a/lib/manager/maven/index.js b/lib/manager/maven/index.js deleted file mode 100644 index 6fe73add6aee5ee31f789b500dce2b0601131ab1..0000000000000000000000000000000000000000 --- a/lib/manager/maven/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const { extractAllPackageFiles } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractAllPackageFiles, - language: 'java', - updateDependency, -}; diff --git a/lib/manager/maven/index.ts b/lib/manager/maven/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..683d30f630ee84659c533e4f1acbb006f17133e1 --- /dev/null +++ b/lib/manager/maven/index.ts @@ -0,0 +1,4 @@ +export { extractAllPackageFiles } from './extract'; +export { updateDependency } from './update'; + +export const language = 'java'; diff --git a/lib/manager/maven/update.js b/lib/manager/maven/update.ts similarity index 81% rename from lib/manager/maven/update.js rename to lib/manager/maven/update.ts index 64a91f7f4b66be928248e9ee566fb5164d0904d1..1bfc0fa088584ca69f1aa60ce97b7f671bc8e62d 100644 --- a/lib/manager/maven/update.js +++ b/lib/manager/maven/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateAtPosition, - updateDependency, -}; - -function updateAtPosition(fileContent, upgrade, endingAnchor = '"') { +export function updateAtPosition( + fileContent: string, + upgrade: Upgrade, + endingAnchor = '"' +) { const { depName, currentValue, newValue, fileReplacePosition } = upgrade; const leftPart = fileContent.slice(0, fileReplacePosition); const rightPart = fileContent.slice(fileReplacePosition); @@ -24,7 +24,7 @@ function updateAtPosition(fileContent, upgrade, endingAnchor = '"') { return null; } -function updateDependency(fileContent, upgrade) { +export function updateDependency(fileContent: string, upgrade: Upgrade) { const offset = fileContent.indexOf('<'); const spaces = fileContent.slice(0, offset); const restContent = fileContent.slice(offset); diff --git a/lib/manager/meteor/extract.js b/lib/manager/meteor/extract.ts similarity index 81% rename from lib/manager/meteor/extract.js rename to lib/manager/meteor/extract.ts index e85030876b054ed9e7c2c4fad077d023aff7a369..face708d11c227647c1e1417b238d5114e8eeab5 100644 --- a/lib/manager/meteor/extract.js +++ b/lib/manager/meteor/extract.ts @@ -1,11 +1,8 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { PackageFile, PackageDependency } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { - let deps = []; +export function extractPackageFile(content: string): PackageFile { + let deps: PackageDependency[] = []; const npmDepends = content.match(/\nNpm\.depends\({([\s\S]*?)}\);/); if (!npmDepends) { return null; diff --git a/lib/manager/meteor/index.js b/lib/manager/meteor/index.js deleted file mode 100644 index c2e44ba353e13b81e9936e56dcbf429f15b6c0b2..0000000000000000000000000000000000000000 --- a/lib/manager/meteor/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - language: 'js', - updateDependency, -}; diff --git a/lib/manager/meteor/index.ts b/lib/manager/meteor/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..8704d70aec4af354e7d4b8836b7c099379c77257 --- /dev/null +++ b/lib/manager/meteor/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; + +export const language = 'js'; diff --git a/lib/manager/meteor/update.js b/lib/manager/meteor/update.ts similarity index 70% rename from lib/manager/meteor/update.js rename to lib/manager/meteor/update.ts index c23d67eb3111d8ab6d48791940c44cab976cb16a..eb0e6c5b09b446ac1bf5889ebb35ad3fbec96546 100644 --- a/lib/manager/meteor/update.js +++ b/lib/manager/meteor/update.ts @@ -1,10 +1,7 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency(fileContent: string, upgrade: Upgrade) { const { depName, currentValue, newValue } = upgrade; logger.debug(`meteor.updateDependency(): ${depName} = ${newValue}`); const regexReplace = new RegExp( diff --git a/lib/manager/npm/extract/common.ts b/lib/manager/npm/extract/common.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd8bca151f352341683d00eaad2513c29069f70c --- /dev/null +++ b/lib/manager/npm/extract/common.ts @@ -0,0 +1,14 @@ +import { PackageJson } from 'type-fest'; + +export interface NpmPackage extends PackageJson { + workspaces?: any; + renovate?: any; + _from?: any; + _args?: any; + _id?: any; +} + +export type LockFileEntry = Record< + string, + { version: string; integrity?: boolean } +>; diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.ts similarity index 81% rename from lib/manager/npm/extract/index.js rename to lib/manager/npm/extract/index.ts index 2a80716a56260aa1be05c61cb73d32c7ee93c253..8e023fc442ff959b3d670c9abc243b38d8a33ca8 100644 --- a/lib/manager/npm/extract/index.js +++ b/lib/manager/npm/extract/index.ts @@ -1,22 +1,26 @@ -const fs = require('fs-extra'); -const path = require('path'); -const upath = require('upath'); -const validateNpmPackageName = require('validate-npm-package-name'); -const { logger } = require('../../../logger'); +import { remove } from 'fs-extra'; +import { dirname } from 'path'; +import { join } from 'upath'; +import validateNpmPackageName from 'validate-npm-package-name'; +import { logger } from '../../../logger'; -const { getLockedVersions } = require('./locked-versions'); -const { detectMonorepos } = require('./monorepo'); -const { mightBeABrowserLibrary } = require('./type'); -const semver = require('../../../versioning/npm'); +import { getLockedVersions } from './locked-versions'; +import { detectMonorepos } from './monorepo'; +import { mightBeABrowserLibrary } from './type'; +import { isValid, isVersion } from '../../../versioning/npm'; +import { + ExtractConfig, + PackageFile, + PackageDependency, + NpmLockFiles, +} from '../../common'; +import { NpmPackage } from './common'; -module.exports = { - extractAllPackageFiles, - extractPackageFile, - postExtract, -}; - -async function extractAllPackageFiles(config, packageFiles) { - const npmFiles = []; +export async function extractAllPackageFiles( + config: ExtractConfig, + packageFiles: string[] +): Promise<PackageFile[]> { + const npmFiles: PackageFile[] = []; for (const packageFile of packageFiles) { const content = await platform.getFile(packageFile); if (content) { @@ -36,11 +40,15 @@ async function extractAllPackageFiles(config, packageFiles) { return npmFiles; } -async function extractPackageFile(content, fileName, config) { +export async function extractPackageFile( + content: string, + fileName: string, + config: ExtractConfig +): Promise<PackageFile> { logger.trace(`npm.extractPackageFile(${fileName})`); logger.trace({ content }); - const deps = []; - let packageJson; + const deps: PackageDependency[] = []; + let packageJson: NpmPackage; try { packageJson = JSON.parse(content); } catch (err) { @@ -74,7 +82,7 @@ async function extractPackageFile(content, fileName, config) { ? 'library' : 'app'; - const lockFiles = { + const lockFiles: NpmLockFiles = { yarnLock: 'yarn.lock', packageLock: 'package-lock.json', shrinkwrapJson: 'npm-shrinkwrap.json', @@ -82,7 +90,7 @@ async function extractPackageFile(content, fileName, config) { }; for (const [key, val] of Object.entries(lockFiles)) { - const filePath = upath.join(path.dirname(fileName), val); + const filePath = join(dirname(fileName), val); if (await platform.getFile(filePath)) { lockFiles[key] = filePath; } else { @@ -93,13 +101,13 @@ async function extractPackageFile(content, fileName, config) { delete lockFiles.packageLock; delete lockFiles.shrinkwrapJson; - let npmrc; - let ignoreNpmrcFile; - const npmrcFileName = upath.join(path.dirname(fileName), '.npmrc'); - const npmrcFileNameLocal = upath.join(config.localDir || '', npmrcFileName); + let npmrc: string; + let ignoreNpmrcFile: boolean; + const npmrcFileName = join(dirname(fileName), '.npmrc'); + const npmrcFileNameLocal = join(config.localDir || '', npmrcFileName); // istanbul ignore if if (config.ignoreNpmrcFile) { - await fs.remove(npmrcFileNameLocal); + await remove(npmrcFileNameLocal); } else { npmrc = await platform.getFile(npmrcFileName); if (npmrc && npmrc.includes('package-lock')) { @@ -111,25 +119,24 @@ async function extractPackageFile(content, fileName, config) { logger.info('Discarding .npmrc file with variables'); ignoreNpmrcFile = true; npmrc = undefined; - await fs.remove(npmrcFileNameLocal); + await remove(npmrcFileNameLocal); } } else { npmrc = undefined; } } const yarnrc = - (await platform.getFile(upath.join(path.dirname(fileName), '.yarnrc'))) || - undefined; + (await platform.getFile(join(dirname(fileName), '.yarnrc'))) || undefined; - let lernaDir; - let lernaPackages; - let lernaClient; + let lernaDir: string; + let lernaPackages: string[]; + let lernaClient: 'yarn' | 'npm'; let hasFileRefs = false; const lernaJson = JSON.parse( - await platform.getFile(upath.join(path.dirname(fileName), 'lerna.json')) + await platform.getFile(join(dirname(fileName), 'lerna.json')) ); if (lernaJson) { - lernaDir = path.dirname(fileName); + lernaDir = dirname(fileName); lernaPackages = lernaJson.packages; lernaClient = lernaJson.npmClient === 'yarn' || lockFiles.yarnLock ? 'yarn' : 'npm'; @@ -143,8 +150,8 @@ async function extractPackageFile(content, fileName, config) { engines: 'engine', }; - function extractDependency(depType, depName, input) { - const dep = {}; + function extractDependency(depType: string, depName: string, input: string) { + const dep: PackageDependency = {}; if (!validateNpmPackageName(depName).validForOldPackages) { dep.skipReason = 'invalid-name'; return dep; @@ -168,7 +175,7 @@ async function extractPackageFile(content, fileName, config) { } else { dep.skipReason = 'unknown-engines'; } - if (!semver.isValid(dep.currentValue)) { + if (!isValid(dep.currentValue)) { dep.skipReason = 'unknown-version'; } return dep; @@ -191,7 +198,7 @@ async function extractPackageFile(content, fileName, config) { hasFileRefs = true; return dep; } - if (semver.isValid(dep.currentValue)) { + if (isValid(dep.currentValue)) { dep.datasource = 'npm'; if (dep.currentValue === '*') { dep.skipReason = 'any-version'; @@ -226,7 +233,7 @@ async function extractPackageFile(content, fileName, config) { dep.skipReason = 'unknown-version'; return dep; } - if (semver.isVersion(depRefPart)) { + if (isVersion(depRefPart)) { dep.currentRawValue = dep.currentValue; dep.currentValue = depRefPart; dep.datasource = 'github'; @@ -254,8 +261,10 @@ async function extractPackageFile(content, fileName, config) { for (const depType of Object.keys(depTypes)) { if (packageJson[depType]) { try { - for (const [depName, val] of Object.entries(packageJson[depType])) { - const dep = { + for (const [depName, val] of Object.entries(packageJson[ + depType + ] as Record<string, any>)) { + const dep: PackageDependency = { depType, depName, }; @@ -319,7 +328,7 @@ async function extractPackageFile(content, fileName, config) { }; } -async function postExtract(packageFiles) { +export async function postExtract(packageFiles: PackageFile[]) { await detectMonorepos(packageFiles); await getLockedVersions(packageFiles); } diff --git a/lib/manager/npm/extract/locked-versions.js b/lib/manager/npm/extract/locked-versions.ts similarity index 79% rename from lib/manager/npm/extract/locked-versions.js rename to lib/manager/npm/extract/locked-versions.ts index ad2a8a4c6f7c1a40e45b975c25fe931ca17cef9e..553a6eb1f220dff499894c75de1ecce100399108 100644 --- a/lib/manager/npm/extract/locked-versions.js +++ b/lib/manager/npm/extract/locked-versions.ts @@ -1,14 +1,11 @@ -const { valid } = require('semver'); -const { logger } = require('../../../logger'); -const { getNpmLock } = require('./npm'); -const { getYarnLock } = require('./yarn'); +import { valid } from 'semver'; +import { logger } from '../../../logger'; +import { getNpmLock } from './npm'; +import { getYarnLock } from './yarn'; +import { PackageFile } from '../../common'; -module.exports = { - getLockedVersions, -}; - -async function getLockedVersions(packageFiles) { - const lockFileCache = {}; +export async function getLockedVersions(packageFiles: PackageFile[]) { + const lockFileCache: Record<string, Record<string, string>> = {}; logger.debug('Finding locked versions'); for (const packageFile of packageFiles) { const { yarnLock, npmLock, pnpmShrinkwrap } = packageFile; diff --git a/lib/manager/npm/extract/monorepo.js b/lib/manager/npm/extract/monorepo.ts similarity index 85% rename from lib/manager/npm/extract/monorepo.js rename to lib/manager/npm/extract/monorepo.ts index e678bb461b402d30c9bc03676a1ca1e626c5ed06..22834edded159d134250ad4c890d15ad170df5a2 100644 --- a/lib/manager/npm/extract/monorepo.js +++ b/lib/manager/npm/extract/monorepo.ts @@ -1,13 +1,12 @@ import is from '@sindresorhus/is'; -const minimatch = require('minimatch'); -const path = require('path'); -const upath = require('upath'); -const { logger } = require('../../../logger'); +import minimatch from 'minimatch'; +import path from 'path'; +import upath from 'upath'; +import { logger } from '../../../logger'; +import { PackageFile } from '../../common'; -export { detectMonorepos }; - -function matchesAnyPattern(val, patterns) { +function matchesAnyPattern(val: string, patterns: string[]) { const res = patterns.some( pattern => pattern === val + '/' || minimatch(val, pattern, { dot: true }) ); @@ -15,7 +14,7 @@ function matchesAnyPattern(val, patterns) { return res; } -function detectMonorepos(packageFiles) { +export function detectMonorepos(packageFiles: Partial<PackageFile>[]) { logger.debug('Detecting Lerna and Yarn Workspaces'); for (const p of packageFiles) { const { diff --git a/lib/manager/npm/extract/npm.js b/lib/manager/npm/extract/npm.ts similarity index 50% rename from lib/manager/npm/extract/npm.js rename to lib/manager/npm/extract/npm.ts index 447683d2a8a159ced08930515a15f12e328d7a7b..12455c7f834b5d76fa81c9b4c1168203dcc4d58c 100644 --- a/lib/manager/npm/extract/npm.js +++ b/lib/manager/npm/extract/npm.ts @@ -1,15 +1,15 @@ -const { logger } = require('../../../logger'); +import { logger } from '../../../logger'; +import { LockFileEntry } from './common'; -module.exports = { - getNpmLock, -}; - -async function getNpmLock(filePath) { +export async function getNpmLock( + filePath: string +): Promise<Record<string, string>> { const lockRaw = await platform.getFile(filePath); try { const lockParsed = JSON.parse(lockRaw); - const lockFile = {}; - for (const [entry, val] of Object.entries(lockParsed.dependencies || {})) { + const lockFile: Record<string, string> = {}; + for (const [entry, val] of Object.entries((lockParsed.dependencies || + {}) as LockFileEntry)) { logger.trace({ entry, version: val.version }); lockFile[entry] = val.version; } diff --git a/lib/manager/npm/extract/type.js b/lib/manager/npm/extract/type.ts similarity index 78% rename from lib/manager/npm/extract/type.js rename to lib/manager/npm/extract/type.ts index 111498e1fdc2557acc6478782853f0325b4b28da..addc7d2f33426d5449b472bbe1dfdaf9c395d65b 100644 --- a/lib/manager/npm/extract/type.js +++ b/lib/manager/npm/extract/type.ts @@ -1,8 +1,6 @@ -module.exports = { - mightBeABrowserLibrary, -}; +import { NpmPackage } from './common'; -function mightBeABrowserLibrary(packageJson) { +export function mightBeABrowserLibrary(packageJson: NpmPackage) { // return true unless we're sure it's not a browser library if (packageJson.private === true) { // it's not published diff --git a/lib/manager/npm/extract/yarn.js b/lib/manager/npm/extract/yarn.ts similarity index 57% rename from lib/manager/npm/extract/yarn.js rename to lib/manager/npm/extract/yarn.ts index b3dceef1f4f6718bcac1cf0d3a736aa37305dd0f..e175b0551439db2897db48f7109859c83dc4c465 100644 --- a/lib/manager/npm/extract/yarn.js +++ b/lib/manager/npm/extract/yarn.ts @@ -1,14 +1,15 @@ -const yarnLockParser = require('@yarnpkg/lockfile'); -const { logger } = require('../../../logger'); +import { parse } from '@yarnpkg/lockfile'; +import { logger } from '../../../logger'; +import { LockFileEntry } from './common'; -module.exports = { - getYarnLock, +export type YarnLock = Record<string, string> & { + '@renovate_yarn_integrity'?: boolean; }; -async function getYarnLock(filePath) { +export async function getYarnLock(filePath: string): Promise<YarnLock> { const yarnLockRaw = await platform.getFile(filePath); try { - const yarnLockParsed = yarnLockParser.parse(yarnLockRaw); + const yarnLockParsed = parse(yarnLockRaw); // istanbul ignore if if (yarnLockParsed.type !== 'success') { logger.info( @@ -17,8 +18,11 @@ async function getYarnLock(filePath) { ); return {}; } - const lockFile = {}; - for (const [entry, val] of Object.entries(yarnLockParsed.object)) { + const lockFile: YarnLock = {}; + + for (const [entry, val] of Object.entries( + yarnLockParsed.object as LockFileEntry + )) { logger.trace({ entry, version: val.version }); lockFile[entry] = val.version; // istanbul ignore if diff --git a/lib/manager/npm/index.js b/lib/manager/npm/index.js deleted file mode 100644 index f8196c283b70baef0d60f22376ce78494cf8e9b6..0000000000000000000000000000000000000000 --- a/lib/manager/npm/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const { extractAllPackageFiles } = require('./extract'); -const { updateDependency } = require('./update'); -const { getRangeStrategy } = require('./range'); - -module.exports = { - extractAllPackageFiles, - language: 'js', - getRangeStrategy, - updateDependency, - supportsLockFileMaintenance: true, -}; diff --git a/lib/manager/npm/index.ts b/lib/manager/npm/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..77f6c1cec305cacf25d2c1863a582cea9f663c9e --- /dev/null +++ b/lib/manager/npm/index.ts @@ -0,0 +1,6 @@ +export { extractAllPackageFiles } from './extract'; +export { updateDependency } from './update'; +export { getRangeStrategy } from './range'; + +export const language = 'js'; +export const supportsLockFileMaintenance = true; diff --git a/lib/manager/npm/post-update/index.js b/lib/manager/npm/post-update/index.ts similarity index 91% rename from lib/manager/npm/post-update/index.js rename to lib/manager/npm/post-update/index.ts index 19aebd7280df3c338c3d3322ae50bb21190d2706..1c27087a336361ee87f9ab37ae17fd73b38ec873 100644 --- a/lib/manager/npm/post-update/index.js +++ b/lib/manager/npm/post-update/index.ts @@ -1,29 +1,32 @@ import is from '@sindresorhus/is'; - -const fs = require('fs-extra'); -const path = require('path'); -const upath = require('upath'); -const { logger } = require('../../../logger'); -const npm = require('./npm'); -const lerna = require('./lerna'); -const yarn = require('./yarn'); -const pnpm = require('./pnpm'); -const hostRules = require('../../../util/host-rules'); -const { getChildProcessEnv } = require('../../../util/env'); - -export { - determineLockFileDirs, - writeExistingFiles, - writeUpdatedPackageFiles, - getAdditionalFiles, -}; +import fs from 'fs-extra'; +import path from 'path'; +import upath from 'upath'; +import { PackageJson } from 'type-fest'; +import { logger } from '../../../logger'; +import * as npm from './npm'; +import * as lerna from './lerna'; +import * as yarn from './yarn'; +import * as pnpm from './pnpm'; +import * as hostRules from '../../../util/host-rules'; +import { getChildProcessEnv } from '../../../util/env'; +import { PostUpdateConfig, PackageFile, Upgrade } from '../../common'; // Strips empty values, deduplicates, and returns the directories from filenames // istanbul ignore next -const getDirs = arr => Array.from(new Set(arr.filter(Boolean))); +const getDirs = (arr: string[]) => Array.from(new Set(arr.filter(Boolean))); +export interface DetermineLockFileDirsResult { + yarnLockDirs: string[]; + npmLockDirs: string[]; + pnpmShrinkwrapDirs: string[]; + lernaDirs: string[]; +} // istanbul ignore next -function determineLockFileDirs(config, packageFiles) { +export function determineLockFileDirs( + config: PostUpdateConfig, + packageFiles: AdditionalPackageFiles +): DetermineLockFileDirsResult { const npmLockDirs = []; const yarnLockDirs = []; const pnpmShrinkwrapDirs = []; @@ -49,7 +52,7 @@ function determineLockFileDirs(config, packageFiles) { if ( config.upgrades.every( - upgrade => + (upgrade: Upgrade) => upgrade.updateType === 'lockFileMaintenance' || upgrade.isLockfileUpdate ) ) { @@ -61,7 +64,7 @@ function determineLockFileDirs(config, packageFiles) { }; } - function getPackageFile(fileName) { + function getPackageFile(fileName: string): Partial<PackageFile> { logger.trace('Looking for packageFile: ' + fileName); for (const packageFile of packageFiles.npm) { if (packageFile.packageFile === fileName) { @@ -103,7 +106,10 @@ function determineLockFileDirs(config, packageFiles) { } // istanbul ignore next -async function writeExistingFiles(config, packageFiles) { +export async function writeExistingFiles( + config: PostUpdateConfig, + packageFiles: AdditionalPackageFiles +) { const lernaJson = await platform.getFile('lerna.json'); if (lernaJson) { logger.debug(`Writing repo lerna.json (${config.localDir})`); @@ -137,7 +143,7 @@ async function writeExistingFiles(config, packageFiles) { ); logger.trace(`Writing package.json to ${basedir}`); // Massage the file to eliminate yarn errors - const massagedFile = JSON.parse( + const massagedFile: PackageJson = JSON.parse( await platform.getFile(packageFile.packageFile) ); if (massagedFile.name) { @@ -267,7 +273,9 @@ async function writeExistingFiles(config, packageFiles) { } // istanbul ignore next -function listLocalLibs(dependencies) { +function listLocalLibs( + dependencies: { [s: string]: unknown } | ArrayLike<unknown> +) { logger.trace(`listLocalLibs (${dependencies})`); const toCopy = []; if (dependencies) { @@ -287,7 +295,7 @@ function listLocalLibs(dependencies) { } // istanbul ignore next -async function writeUpdatedPackageFiles(config) { +export async function writeUpdatedPackageFiles(config: PostUpdateConfig) { logger.trace({ config }, 'writeUpdatedPackageFiles'); logger.debug('Writing any updated package files'); if (!config.updatedPackageFiles) { @@ -330,11 +338,32 @@ async function writeUpdatedPackageFiles(config) { } } +export interface AdditionalPackageFiles { + npm?: Partial<PackageFile>[]; +} + +interface ArtifactError { + lockFile: string; + stderr: string; +} + +interface UpdatedArtifcats { + name: string; + contents: string; +} + +export interface WriteExistingFilesResult { + artifactErrors: ArtifactError[]; + updatedArtifacts: UpdatedArtifcats[]; +} // istanbul ignore next -async function getAdditionalFiles(config, packageFiles) { +export async function getAdditionalFiles( + config: PostUpdateConfig, + packageFiles: AdditionalPackageFiles +): Promise<WriteExistingFilesResult> { logger.trace({ config }, 'getAdditionalFiles'); - const artifactErrors = []; - const updatedArtifacts = []; + const artifactErrors: ArtifactError[] = []; + const updatedArtifacts: UpdatedArtifcats[] = []; if (!(packageFiles.npm && packageFiles.npm.length)) { return { artifactErrors, updatedArtifacts }; } @@ -351,10 +380,10 @@ async function getAdditionalFiles(config, packageFiles) { logger.debug('Skipping lockFileMaintenance update'); return { artifactErrors, updatedArtifacts }; } - const dirs = module.exports.determineLockFileDirs(config, packageFiles); + const dirs = determineLockFileDirs(config, packageFiles); logger.debug({ dirs }, 'lock file dirs'); - await module.exports.writeExistingFiles(config, packageFiles); - await module.exports.writeUpdatedPackageFiles(config); + await writeExistingFiles(config, packageFiles); + await writeUpdatedPackageFiles(config); process.env.NPM_CONFIG_CACHE = process.env.NPM_CONFIG_CACHE || upath.join(config.cacheDir, './others/npm'); @@ -575,7 +604,7 @@ async function getAdditionalFiles(config, packageFiles) { } for (const lernaDir of dirs.lernaDirs) { - let lockFile; + let lockFile: string; logger.debug(`Finding package.json for lerna directory "${lernaDir}"`); const lernaPackageFile = packageFiles.npm.find( p => path.dirname(p.packageFile) === lernaDir @@ -650,7 +679,7 @@ async function getAdditionalFiles(config, packageFiles) { const lockFilePath = upath.join(config.localDir, filename); logger.trace('Checking against ' + lockFilePath); try { - let newContent; + let newContent: string; try { newContent = await fs.readFile(lockFilePath, 'utf8'); } catch (err) { diff --git a/lib/manager/npm/post-update/lerna.js b/lib/manager/npm/post-update/lerna.ts similarity index 81% rename from lib/manager/npm/post-update/lerna.js rename to lib/manager/npm/post-update/lerna.ts index ceee6b228f8356af1b037ce0a73e099204977ab1..1677a7d93fb546cf739c6e4607db7d7a49c936ef 100644 --- a/lib/manager/npm/post-update/lerna.js +++ b/lib/manager/npm/post-update/lerna.ts @@ -1,28 +1,29 @@ -const { exec } = require('../../../util/exec'); -const { logger } = require('../../../logger'); +import { exec } from '../../../util/exec'; +import { logger } from '../../../logger'; -module.exports = { - generateLockFiles, -}; +export interface GenerateLockFileResult { + error?: boolean; + stderr?: string; +} -async function generateLockFiles( - lernaClient, - cwd, - env, - skipInstalls, - binarySource -) { +export async function generateLockFiles( + lernaClient: string, + cwd: string, + env?: NodeJS.ProcessEnv, + skipInstalls?: boolean, + binarySource?: string +): Promise<GenerateLockFileResult> { if (!lernaClient) { logger.warn('No lernaClient specified - returning'); return { error: false }; } logger.debug(`Spawning lerna with ${lernaClient} to create lock files`); - let stdout; - let stderr; - let cmd; + let stdout: string; + let stderr: string; + let cmd: string; try { const startTime = process.hrtime(); - let lernaVersion; + let lernaVersion: string; try { const pJson = JSON.parse(await platform.getFile('package.json')); lernaVersion = @@ -33,7 +34,7 @@ async function generateLockFiles( } lernaVersion = lernaVersion || 'latest'; logger.debug('Using lerna version ' + lernaVersion); - let params; + let params: string; if (lernaClient === 'npm') { if (skipInstalls === false) { params = '--ignore-scripts --no-audit'; diff --git a/lib/manager/npm/post-update/npm.js b/lib/manager/npm/post-update/npm.ts similarity index 83% rename from lib/manager/npm/post-update/npm.js rename to lib/manager/npm/post-update/npm.ts index a9cb6fd77814e4ef827ce494f4e3fc6c082f0a30..af943de4c9eb6f77c164689db2785db187a71210 100644 --- a/lib/manager/npm/post-update/npm.js +++ b/lib/manager/npm/post-update/npm.ts @@ -1,32 +1,34 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { getInstalledPath } = require('get-installed-path'); -const { exec } = require('../../../util/exec'); -const { logger } = require('../../../logger'); +import { readFile } from 'fs-extra'; +import { join } from 'upath'; +import { getInstalledPath } from 'get-installed-path'; +import { exec } from '../../../util/exec'; +import { logger } from '../../../logger'; +import { PostUpdateConfig, Upgrade } from '../../common'; -module.exports = { - generateLockFile, -}; - -async function generateLockFile( - cwd, - env, - filename, - config = {}, - upgrades = [] -) { +export interface GenerateLockFileResult { + error?: boolean; + lockFile?: string; + stderr?: string; +} +export async function generateLockFile( + cwd: string, + env: NodeJS.ProcessEnv, + filename: string, + config: PostUpdateConfig = {}, + upgrades: Upgrade[] = [] +): Promise<GenerateLockFileResult> { logger.debug(`Spawning npm install to create ${cwd}/${filename}`); const { skipInstalls, binarySource, postUpdateOptions } = config; - let lockFile = null; + let lockFile: string = null; let stdout = ''; let stderr = ''; - let cmd; + let cmd: string; let args = ''; try { const startTime = process.hrtime(); try { // See if renovate is installed locally - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('npm', { local: true, }), @@ -38,7 +40,7 @@ async function generateLockFile( // Look inside globally installed renovate try { const renovateLocation = await getInstalledPath('renovate'); - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('npm', { local: true, cwd: renovateLocation, @@ -50,7 +52,7 @@ async function generateLockFile( logger.debug('Could not find globally nested npm'); // look for global npm try { - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('npm'), 'bin/npm-cli.js' ); @@ -127,7 +129,7 @@ async function generateLockFile( } const duration = process.hrtime(startTime); const seconds = Math.round(duration[0] + duration[1] / 1e9); - lockFile = await fs.readFile(upath.join(cwd, filename), 'utf8'); + lockFile = await readFile(join(cwd, filename), 'utf8'); logger.info( { seconds, type: filename, stdout, stderr }, 'Generated lockfile' diff --git a/lib/manager/npm/post-update/pnpm.js b/lib/manager/npm/post-update/pnpm.ts similarity index 77% rename from lib/manager/npm/post-update/pnpm.js rename to lib/manager/npm/post-update/pnpm.ts index 6972e588f1a4c605bf2a8211cefb24cd22f1a94f..6676354f60951960ac8d5ba73075cb725f576b4c 100644 --- a/lib/manager/npm/post-update/pnpm.js +++ b/lib/manager/npm/post-update/pnpm.ts @@ -1,24 +1,32 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { getInstalledPath } = require('get-installed-path'); -const { exec } = require('../../../util/exec'); -const { logger } = require('../../../logger'); +import { readFile } from 'fs-extra'; +import { join } from 'upath'; +import { getInstalledPath } from 'get-installed-path'; +import { exec } from '../../../util/exec'; +import { logger } from '../../../logger'; +import { PostUpdateConfig } from '../../common'; -module.exports = { - generateLockFile, -}; +export interface GenerateLockFileResult { + error?: boolean; + lockFile?: string; + stderr?: string; + stdout?: string; +} -async function generateLockFile(cwd, env, config) { +export async function generateLockFile( + cwd: string, + env: NodeJS.ProcessEnv, + config: PostUpdateConfig +): Promise<GenerateLockFileResult> { logger.debug(`Spawning pnpm install to create ${cwd}/pnpm-lock.yaml`); let lockFile = null; - let stdout; - let stderr; - let cmd; + let stdout: string; + let stderr: string; + let cmd: string; try { const startTime = process.hrtime(); try { // See if renovate is installed locally - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('pnpm', { local: true, }), @@ -30,7 +38,7 @@ async function generateLockFile(cwd, env, config) { // Look inside globally installed renovate try { const renovateLocation = await getInstalledPath('renovate'); - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('pnpm', { local: true, cwd: renovateLocation, @@ -42,7 +50,7 @@ async function generateLockFile(cwd, env, config) { logger.debug('Could not find globally nested pnpm'); // look for global pnpm try { - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('pnpm'), 'lib/bin/pnpm.js' ); @@ -83,7 +91,7 @@ async function generateLockFile(cwd, env, config) { logger.debug(`pnpm stderr:\n${stderr}`); const duration = process.hrtime(startTime); const seconds = Math.round(duration[0] + duration[1] / 1e9); - lockFile = await fs.readFile(upath.join(cwd, 'pnpm-lock.yaml'), 'utf8'); + lockFile = await readFile(join(cwd, 'pnpm-lock.yaml'), 'utf8'); logger.info( { seconds, type: 'pnpm-lock.yaml', stdout, stderr }, 'Generated lockfile' diff --git a/lib/manager/npm/post-update/yarn.js b/lib/manager/npm/post-update/yarn.ts similarity index 85% rename from lib/manager/npm/post-update/yarn.js rename to lib/manager/npm/post-update/yarn.ts index 78e87982c18dfefe1941670a8ce07fa99d7d1e82..3c48a995a26a8b333dcc7b491b2f86197c6ace4c 100644 --- a/lib/manager/npm/post-update/yarn.js +++ b/lib/manager/npm/post-update/yarn.ts @@ -1,25 +1,33 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { getInstalledPath } = require('get-installed-path'); -const { exec } = require('../../../util/exec'); -const { logger } = require('../../../logger'); +import { readFile } from 'fs-extra'; +import { join } from 'upath'; +import { getInstalledPath } from 'get-installed-path'; +import { exec } from '../../../util/exec'; +import { logger } from '../../../logger'; +import { PostUpdateConfig, Upgrade } from '../../common'; -module.exports = { - generateLockFile, -}; +export interface GenerateLockFileResult { + error?: boolean; + lockFile?: string; + stderr?: string; +} -async function generateLockFile(cwd, env, config = {}, upgrades = []) { +export async function generateLockFile( + cwd: string, + env?: NodeJS.ProcessEnv, + config: PostUpdateConfig = {}, + upgrades: Upgrade[] = [] +): Promise<GenerateLockFileResult> { const { binarySource } = config; logger.debug(`Spawning yarn install to create ${cwd}/yarn.lock`); let lockFile = null; - let stdout; - let stderr; - let cmd; + let stdout: string; + let stderr: string; + let cmd: string; try { const startTime = process.hrtime(); try { // See if renovate is installed locally - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('yarn', { local: true, }), @@ -35,7 +43,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) { local: true, }); logger.info('Using nested bundled yarn@1.9.4 for install'); - cmd = 'node ' + upath.join(renovatePath, 'bin/yarn-1.9.4.js'); + cmd = 'node ' + join(renovatePath, 'bin/yarn-1.9.4.js'); } catch (err) { logger.info('Using bundled yarn@1.9.4 for install'); cmd = cmd.replace( @@ -49,7 +57,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) { // Look inside globally installed renovate try { const renovateLocation = await getInstalledPath('renovate'); - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('yarn', { local: true, cwd: renovateLocation, @@ -61,7 +69,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) { logger.debug('Could not find globally nested yarn'); // look for global yarn try { - const installedPath = upath.join( + const installedPath = join( await getInstalledPath('yarn'), 'bin/yarn.js' ); @@ -150,7 +158,7 @@ async function generateLockFile(cwd, env, config = {}, upgrades = []) { } const duration = process.hrtime(startTime); const seconds = Math.round(duration[0] + duration[1] / 1e9); - lockFile = await fs.readFile(upath.join(cwd, 'yarn.lock'), 'utf8'); + lockFile = await readFile(join(cwd, 'yarn.lock'), 'utf8'); logger.info( { seconds, type: 'yarn.lock', stdout, stderr }, 'Generated lockfile' diff --git a/lib/manager/npm/range.js b/lib/manager/npm/range.ts similarity index 80% rename from lib/manager/npm/range.js rename to lib/manager/npm/range.ts index 89083aa749434cd78f4a70e9309e6ee5aff28b7f..c431081cf66130e6ef5a150ef6893571a4890ad6 100644 --- a/lib/manager/npm/range.js +++ b/lib/manager/npm/range.ts @@ -1,11 +1,9 @@ -const { parseRange } = require('semver-utils'); -const { logger } = require('../../logger'); +import { parseRange } from 'semver-utils'; +import { logger } from '../../logger'; +import { RangeConfig } from '../common'; +import { RangeStrategy } from '../../versioning'; -module.exports = { - getRangeStrategy, -}; - -function getRangeStrategy(config) { +export function getRangeStrategy(config: RangeConfig): RangeStrategy { const { depType, depName, diff --git a/lib/manager/npm/update.js b/lib/manager/npm/update.ts similarity index 89% rename from lib/manager/npm/update.js rename to lib/manager/npm/update.ts index e2804069841aad8038023a8ff5c9a1dd0cdf860b..f7f5a5efe0d60f1d67551e07b7be73d58060132b 100644 --- a/lib/manager/npm/update.js +++ b/lib/manager/npm/update.ts @@ -1,13 +1,12 @@ -const _ = require('lodash'); -const semver = require('semver'); -const { logger } = require('../../logger'); +import { isEqual } from 'lodash'; +import { inc, ReleaseType } from 'semver'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, - bumpPackageVersion, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { const { depType, depName } = upgrade; let { newValue } = upgrade; if (upgrade.currentRawValue) { @@ -63,7 +62,7 @@ function updateDependency(fileContent, upgrade) { newString ); // Compare the parsed JSON structure of old and new - if (_.isEqual(parsedContents, JSON.parse(testContent))) { + if (isEqual(parsedContents, JSON.parse(testContent))) { newFileContent = testContent; break; } @@ -118,7 +117,7 @@ function updateDependency(fileContent, upgrade) { newResolution ); // Compare the parsed JSON structure of old and new - if (_.isEqual(parsedContents, JSON.parse(testContent))) { + if (isEqual(parsedContents, JSON.parse(testContent))) { newFileContent = testContent; break; } @@ -138,12 +137,17 @@ function updateDependency(fileContent, upgrade) { } // Return true if the match string is found at index in content -function matchAt(content, index, match) { +function matchAt(content: string, index: number, match: string) { return content.substring(index, index + match.length) === match; } // Replace oldString with newString at location index of content -function replaceAt(content, index, oldString, newString) { +function replaceAt( + content: string, + index: number, + oldString: string, + newString: string +) { logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`); return ( content.substr(0, index) + @@ -152,7 +156,11 @@ function replaceAt(content, index, oldString, newString) { ); } -function bumpPackageVersion(content, currentValue, bumpVersion) { +export function bumpPackageVersion( + content: string, + currentValue: string, + bumpVersion: ReleaseType | string +) { logger.debug('bumpVersion()'); if (!bumpVersion) { return content; @@ -176,7 +184,7 @@ function bumpPackageVersion(content, currentValue, bumpVersion) { return content; } } else { - newPjVersion = semver.inc(currentValue, bumpVersion); + newPjVersion = inc(currentValue, bumpVersion as ReleaseType); } logger.debug({ newPjVersion }); const bumpedContent = content.replace( diff --git a/lib/manager/nuget/extract.js b/lib/manager/nuget/extract.ts similarity index 59% rename from lib/manager/nuget/extract.js rename to lib/manager/nuget/extract.ts index d3a7153644972c92aa70ae703a5b8d91d01cd04f..edf654f13c0a8d6acfb94bf349fbfdde804e0ec5 100644 --- a/lib/manager/nuget/extract.js +++ b/lib/manager/nuget/extract.ts @@ -1,14 +1,15 @@ -const { logger } = require('../../logger'); -const versioning = require('../../versioning'); +import { logger } from '../../logger'; +import { get } from '../../versioning'; +import { PackageDependency, ExtractConfig, PackageFile } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content, packageFile, config = {}) { +export function extractPackageFile( + content: string, + packageFile: string, + config: ExtractConfig = {} +): PackageFile { logger.trace(`nuget.extractPackageFile(${packageFile})`); - const { isVersion } = versioning.get(config.versionScheme || 'semver'); - const deps = []; + const { isVersion } = get(config.versionScheme || 'semver'); + const deps: PackageDependency[] = []; let lineNumber = 0; for (const line of content.split('\n')) { @@ -18,7 +19,7 @@ function extractPackageFile(content, packageFile, config = {}) { if (match) { const depName = match[1]; const currentValue = match[2]; - const dep = { + const dep: PackageDependency = { depType: 'nuget', depName, currentValue, diff --git a/lib/manager/nuget/index.js b/lib/manager/nuget/index.js deleted file mode 100644 index 646426d4eb14292037e46fee09d28c59daab2c6f..0000000000000000000000000000000000000000 --- a/lib/manager/nuget/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - language: 'dotnet', - updateDependency, -}; diff --git a/lib/manager/nuget/index.ts b/lib/manager/nuget/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..721267a6f9cae10881109d471363f1aefc1ec3fa --- /dev/null +++ b/lib/manager/nuget/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; + +export const language = 'dotnet'; diff --git a/lib/manager/nuget/update.js b/lib/manager/nuget/update.ts similarity index 78% rename from lib/manager/nuget/update.js rename to lib/manager/nuget/update.ts index 121c52dc68f964da8c8feec2c6dd4694255394a1..6869ded841b2c222b1ea6339b1484e7ace76070b 100644 --- a/lib/manager/nuget/update.js +++ b/lib/manager/nuget/update.ts @@ -1,10 +1,10 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { logger.debug(`nuget.updateDependency(): ${upgrade.newFrom}`); const lines = fileContent.split('\n'); diff --git a/lib/manager/nvm/extract.js b/lib/manager/nvm/extract.js deleted file mode 100644 index 25d5725b7e191f8cbd68ebb7873599fdc4b53887..0000000000000000000000000000000000000000 --- a/lib/manager/nvm/extract.js +++ /dev/null @@ -1,18 +0,0 @@ -const node = require('../../versioning/node'); - -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { - const dep = { - depName: 'node', - currentValue: content.trim(), - datasource: 'github', - lookupName: 'nodejs/node', - }; - if (!node.isValid(dep.currentValue)) { - dep.skipReason = 'unsupported-version'; - } - return { deps: [dep] }; -} diff --git a/lib/manager/nvm/extract.ts b/lib/manager/nvm/extract.ts new file mode 100644 index 0000000000000000000000000000000000000000..87c30d3c7f96ea9c722268cfb1067adebcdb6583 --- /dev/null +++ b/lib/manager/nvm/extract.ts @@ -0,0 +1,15 @@ +import { isValid } from '../../versioning/node'; +import { PackageFile, PackageDependency } from '../common'; + +export function extractPackageFile(content: string): PackageFile { + const dep: PackageDependency = { + depName: 'node', + currentValue: content.trim(), + datasource: 'github', + lookupName: 'nodejs/node', + }; + if (!isValid(dep.currentValue)) { + dep.skipReason = 'unsupported-version'; + } + return { deps: [dep] }; +} diff --git a/lib/manager/nvm/index.js b/lib/manager/nvm/index.js deleted file mode 100644 index 26d28e951e2a30c3edfda15778cf51f9c9d71f2d..0000000000000000000000000000000000000000 --- a/lib/manager/nvm/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'node'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/nvm/index.ts b/lib/manager/nvm/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5ce4fd8d10ac0455b7de9dff4a1e96fb624fb5f --- /dev/null +++ b/lib/manager/nvm/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; + +export const language = 'node'; diff --git a/lib/manager/nvm/update.js b/lib/manager/nvm/update.js deleted file mode 100644 index 5de15329f5d2bb1e82b0ff3c70f05a6ca5b396c1..0000000000000000000000000000000000000000 --- a/lib/manager/nvm/update.js +++ /dev/null @@ -1,10 +0,0 @@ -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { - logger.debug(`nvm.updateDependency(): ${upgrade.newVersions}`); - return `${upgrade.newValue}\n`; -} diff --git a/lib/manager/nvm/update.ts b/lib/manager/nvm/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd6d4eefb51e124468a85054b989b807049d4468 --- /dev/null +++ b/lib/manager/nvm/update.ts @@ -0,0 +1,7 @@ +import { logger } from '../../logger'; +import { Upgrade } from '../common'; + +export function updateDependency(_fileContent: string, upgrade: Upgrade) { + logger.debug(`nvm.updateDependency(): ${upgrade.newVersion}`); + return `${upgrade.newValue}\n`; +} diff --git a/lib/manager/pip_requirements/extract.js b/lib/manager/pip_requirements/extract.ts similarity index 74% rename from lib/manager/pip_requirements/extract.js rename to lib/manager/pip_requirements/extract.ts index af13cfd3f8a31abfcead56d61c39e646fc4865eb..fde9321fbea43874eff9a9aa842528906f6f6214 100644 --- a/lib/manager/pip_requirements/extract.js +++ b/lib/manager/pip_requirements/extract.ts @@ -1,26 +1,31 @@ // based on https://www.python.org/dev/peps/pep-0508/#names -const packagePattern = '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]'; -const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?'; -const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN; +import { RANGE_PATTERN as rangePattern } from '@renovate/pep440/lib/specifier'; +import { logger } from '../../logger'; +import { isSkipComment } from '../../util/ignore'; +import { isValid, isSingleVersion } from '../../versioning/pep440'; +import { + ExtractConfig, + Registry, + PackageDependency, + PackageFile, +} from '../common'; -const { logger } = require('../../logger'); -const { isSkipComment } = require('../../util/ignore'); +export const packagePattern = + '[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]'; +const extrasPattern = '(?:\\s*\\[[^\\]]+\\])?'; const specifierPartPattern = `\\s*${rangePattern.replace(/\?<\w+>/g, '?:')}`; const specifierPattern = `${specifierPartPattern}(?:\\s*,${specifierPartPattern})*`; -const dependencyPattern = `(${packagePattern})(${extrasPattern})(${specifierPattern})`; -const { isValid, isSingleVersion } = require('../../versioning/pep440'); - -module.exports = { - dependencyPattern, - packagePattern, - extractPackageFile, -}; +export const dependencyPattern = `(${packagePattern})(${extrasPattern})(${specifierPattern})`; -function extractPackageFile(content, _, config) { +export function extractPackageFile( + content: string, + _: string, + config: ExtractConfig +) { logger.trace('pip_requirements.extractPackageFile()'); - let indexUrl; + let indexUrl: string; const extraUrls = []; content.split('\n').forEach(line => { if (line.startsWith('--index-url ')) { @@ -33,7 +38,7 @@ function extractPackageFile(content, _, config) { extraUrls.push(extraUrl); } }); - let registryUrls = []; + let registryUrls: (string | Registry)[] = []; if (indexUrl) { // index url in file takes precedence registryUrls.push(indexUrl); @@ -50,7 +55,7 @@ function extractPackageFile(content, _, config) { const deps = content .split('\n') .map((rawline, lineNumber) => { - let dep = {}; + let dep: PackageDependency = {}; const [line, comment] = rawline.split('#').map(part => part.trim()); if (isSkipComment(comment)) { dep.skipReason = 'ignored'; @@ -81,7 +86,7 @@ function extractPackageFile(content, _, config) { if (!deps.length) { return null; } - const res = { deps }; + const res: PackageFile = { deps }; if (registryUrls.length > 0) { res.registryUrls = registryUrls; } diff --git a/lib/manager/pip_requirements/index.js b/lib/manager/pip_requirements/index.js deleted file mode 100644 index ef1eea7cd6720949886e064a13cada1e51520af8..0000000000000000000000000000000000000000 --- a/lib/manager/pip_requirements/index.js +++ /dev/null @@ -1,12 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { getRangeStrategy } = require('./range'); - -const language = 'python'; - -module.exports = { - extractPackageFile, - getRangeStrategy, - language, - updateDependency, -}; diff --git a/lib/manager/pip_requirements/index.ts b/lib/manager/pip_requirements/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4737e5fb3745bb06a14167c5aec73a45e3ce0444 --- /dev/null +++ b/lib/manager/pip_requirements/index.ts @@ -0,0 +1,5 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; +export { getRangeStrategy } from './range'; + +export const language = 'python'; diff --git a/lib/manager/pip_requirements/range.js b/lib/manager/pip_requirements/range.js deleted file mode 100644 index 06dcb2b9aec54d25166a44f8e5fb2a3200d17d53..0000000000000000000000000000000000000000 --- a/lib/manager/pip_requirements/range.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - getRangeStrategy, -}; - -function getRangeStrategy(config) { - if (config.rangeStrategy === 'auto') { - return 'pin'; - } - return config.rangeStrategy; -} diff --git a/lib/manager/pip_requirements/range.ts b/lib/manager/pip_requirements/range.ts new file mode 100644 index 0000000000000000000000000000000000000000..e45e36ec71fcf4282857354e26f7b5192bc4b65b --- /dev/null +++ b/lib/manager/pip_requirements/range.ts @@ -0,0 +1,9 @@ +import { RangeConfig } from '../common'; +import { RangeStrategy } from '../../versioning'; + +export function getRangeStrategy(config: RangeConfig): RangeStrategy { + if (config.rangeStrategy === 'auto') { + return 'pin'; + } + return config.rangeStrategy; +} diff --git a/lib/manager/pip_requirements/update.js b/lib/manager/pip_requirements/update.ts similarity index 83% rename from lib/manager/pip_requirements/update.js rename to lib/manager/pip_requirements/update.ts index 7809aa63a8eb5b784bd9c4de043523668b766863..34061f6bb981c0d97e4f313f9d67e2b3d4fef76d 100644 --- a/lib/manager/pip_requirements/update.js +++ b/lib/manager/pip_requirements/update.ts @@ -1,11 +1,11 @@ -const { logger } = require('../../logger'); -const { dependencyPattern } = require('./extract'); +import { logger } from '../../logger'; +import { dependencyPattern } from './extract'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { logger.debug(`pip_requirements.updateDependency(): ${upgrade.newValue}`); const lines = fileContent.split('\n'); diff --git a/lib/manager/pip_setup/extract.js b/lib/manager/pip_setup/extract.ts similarity index 77% rename from lib/manager/pip_setup/extract.js rename to lib/manager/pip_setup/extract.ts index f419e58ac74f9439193b4b7ecbfd6c691dc1a56f..1e3309cf83692df0b15678a3b7131667cbbff269 100644 --- a/lib/manager/pip_setup/extract.js +++ b/lib/manager/pip_setup/extract.ts @@ -1,25 +1,19 @@ -const { join } = require('upath'); -const { exec } = require('../../util/exec'); -const { logger } = require('../../logger'); -const { isSkipComment } = require('../../util/ignore'); -const { dependencyPattern } = require('../pip_requirements/extract'); +import { join } from 'upath'; +import { exec } from '../../util/exec'; +import { logger } from '../../logger'; +import { isSkipComment } from '../../util/ignore'; +import { dependencyPattern } from '../pip_requirements/extract'; +import { ExtractConfig, PackageFile, PackageDependency } from '../common'; -const pythonVersions = ['python', 'python3', 'python3.7']; -let pythonAlias = null; -module.exports = { - extractPackageFile, - extractSetupFile, - parsePythonVersion, - getPythonAlias, - pythonVersions, -}; +export const pythonVersions = ['python', 'python3', 'python3.7']; +let pythonAlias: string = null; -function parsePythonVersion(str) { +export function parsePythonVersion(str: string) { const arr = str.split(' ')[1].split('.'); return [parseInt(arr[0], 10), parseInt(arr[1], 10)]; } -async function getPythonAlias() { +export async function getPythonAlias() { if (pythonAlias) { return pythonAlias; } @@ -37,10 +31,17 @@ async function getPythonAlias() { } return pythonAlias; } - -async function extractSetupFile(content, packageFile, config) { +interface PythonSetup { + extras_require: string[]; + install_requires: string[]; +} +export async function extractSetupFile( + _content: string, + packageFile: string, + config: ExtractConfig +): Promise<PythonSetup> { const cwd = config.localDir; - let cmd; + let cmd: string; const args = [join(__dirname, 'extract.py'), packageFile]; // istanbul ignore if if (config.binarySource === 'docker') { @@ -84,16 +85,20 @@ async function extractSetupFile(content, packageFile, config) { return JSON.parse(res.stdout); } -async function extractPackageFile(content, packageFile, config) { +export async function extractPackageFile( + content: string, + packageFile: string, + config: ExtractConfig +): Promise<PackageFile> { logger.debug('pip_setup.extractPackageFile()'); - let setup; + let setup: PythonSetup; try { setup = await extractSetupFile(content, packageFile, config); } catch (err) { logger.warn({ err, content, packageFile }, 'Failed to read setup.py file'); return null; } - const requires = []; + const requires: string[] = []; if (setup.install_requires) { requires.push(...setup.install_requires); } @@ -111,7 +116,7 @@ async function extractPackageFile(content, packageFile, config) { return null; } const rawline = lines[lineNumber]; - let dep = {}; + let dep: PackageDependency = {}; const [, comment] = rawline.split('#').map(part => part.trim()); if (isSkipComment(comment)) { dep.skipReason = 'ignored'; diff --git a/lib/manager/pip_setup/index.js b/lib/manager/pip_setup/index.js deleted file mode 100644 index a6af78689a4f6a4c33747f28a3d4225461635416..0000000000000000000000000000000000000000 --- a/lib/manager/pip_setup/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('../pip_requirements/update'); - -const language = 'python'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/pip_setup/index.ts b/lib/manager/pip_setup/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..816d4c0336b38314f237d5f222b339fc27b8eb05 --- /dev/null +++ b/lib/manager/pip_setup/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from '../pip_requirements/update'; + +export const language = 'python'; diff --git a/lib/manager/pipenv/artifacts.js b/lib/manager/pipenv/artifacts.ts similarity index 66% rename from lib/manager/pipenv/artifacts.js rename to lib/manager/pipenv/artifacts.ts index df1b7d66761860ebdd4902be3c251f3ba09614b7..f4af20c5f8af7b33b300384a1f41e80ae059e5e4 100644 --- a/lib/manager/pipenv/artifacts.js +++ b/lib/manager/pipenv/artifacts.ts @@ -1,24 +1,20 @@ -const fs = require('fs-extra'); -const upath = require('upath'); -const { exec } = require('../../util/exec'); -const { getChildProcessEnv } = require('../../util/env'); -const { logger } = require('../../logger'); +import { ensureDir, outputFile, readFile } from 'fs-extra'; +import { join, dirname } from 'upath'; +import { exec } from '../../util/exec'; +import { getChildProcessEnv } from '../../util/env'; +import { logger } from '../../logger'; +import { UpdateArtifactsResult, UpdateArtifactsConfig } from '../common'; -module.exports = { - updateArtifacts, -}; - -async function updateArtifacts( - pipfileName, - updatedDeps, - newPipfileContent, - config -) { +export async function updateArtifacts( + pipfileName: string, + _updatedDeps: string[], + newPipfileContent: string, + config: UpdateArtifactsConfig +): Promise<UpdateArtifactsResult[]> { logger.debug(`pipenv.updateArtifacts(${pipfileName})`); process.env.PIPENV_CACHE_DIR = - process.env.PIPENV_CACHE_DIR || - upath.join(config.cacheDir, './others/pipenv'); - await fs.ensureDir(process.env.PIPENV_CACHE_DIR); + process.env.PIPENV_CACHE_DIR || join(config.cacheDir, './others/pipenv'); + await ensureDir(process.env.PIPENV_CACHE_DIR); logger.debug('Using pipenv cache ' + process.env.PIPENV_CACHE_DIR); const lockFileName = pipfileName + '.lock'; const existingLockFileContent = await platform.getFile(lockFileName); @@ -26,16 +22,16 @@ async function updateArtifacts( logger.debug('No Pipfile.lock found'); return null; } - const cwd = upath.join(config.localDir, upath.dirname(pipfileName)); - let stdout; - let stderr; + const cwd = join(config.localDir, dirname(pipfileName)); + let stdout: string; + let stderr: string; try { - const localPipfileFileName = upath.join(config.localDir, pipfileName); - await fs.outputFile(localPipfileFileName, newPipfileContent); - const localLockFileName = upath.join(config.localDir, lockFileName); + const localPipfileFileName = join(config.localDir, pipfileName); + await outputFile(localPipfileFileName, newPipfileContent); + const localLockFileName = join(config.localDir, lockFileName); const env = getChildProcessEnv(['LC_ALL', 'LANG', 'PIPENV_CACHE_DIR']); const startTime = process.hrtime(); - let cmd; + let cmd: string; if (config.binarySource === 'docker') { logger.info('Running pipenv via docker'); cmd = `docker run --rm `; @@ -71,7 +67,7 @@ async function updateArtifacts( { file: { name: lockFileName, - contents: await fs.readFile(localLockFileName, 'utf8'), + contents: await readFile(localLockFileName, 'utf8'), }, }, ]; diff --git a/lib/manager/pipenv/extract.js b/lib/manager/pipenv/extract.ts similarity index 75% rename from lib/manager/pipenv/extract.js rename to lib/manager/pipenv/extract.ts index e5b6d392a9a51cfe8de232df298a1ca45e50bd0f..75eaeef9aaa08143ae7a20b3a47d0e6d36b18e70 100644 --- a/lib/manager/pipenv/extract.js +++ b/lib/manager/pipenv/extract.ts @@ -1,30 +1,49 @@ import is from '@sindresorhus/is'; - -const toml = require('toml'); +import toml from 'toml'; +import { RANGE_PATTERN } from '@renovate/pep440/lib/specifier'; +import { logger } from '../../logger'; +import { PackageFile, PackageDependency } from '../common'; // based on https://www.python.org/dev/peps/pep-0508/#names const packageRegex = /^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$/i; -const rangePattern = require('@renovate/pep440/lib/specifier').RANGE_PATTERN; -const { logger } = require('../../logger'); +const rangePattern = RANGE_PATTERN; const specifierPartPattern = `\\s*${rangePattern.replace( /\?<\w+>/g, '?:' )}\\s*`; const specifierPattern = `${specifierPartPattern}(?:,${specifierPartPattern})*`; +interface PipSource { + name: string; + url: string; +} -export { extractPackageFile }; +interface PipFile { + source: PipSource[]; + + packages?: Record<string, PipRequirement>; + 'dev-packages'?: Record<string, PipRequirement>; +} -function extractPackageFile(content) { +interface PipRequirement { + index?: string; + version?: string; + path?: string; + file?: string; + git?: string; +} + +export function extractPackageFile(content: string): PackageFile { logger.debug('pipenv.extractPackageFile()'); - let pipfile; + + let pipfile: PipFile; try { pipfile = toml.parse(content); } catch (err) { logger.debug({ err }, 'Error parsing Pipfile'); return null; } - const res = {}; + const res: PackageFile = { deps: [] }; if (pipfile.source) { res.registryUrls = pipfile.source.map(source => source.url); } @@ -39,7 +58,10 @@ function extractPackageFile(content) { return null; } -function extractFromSection(pipfile, section) { +function extractFromSection( + pipfile: PipFile, + section: 'packages' | 'dev-packages' +): PackageDependency[] { if (!(section in pipfile)) { return []; } @@ -49,9 +71,9 @@ function extractFromSection(pipfile, section) { const deps = Object.entries(pipfileSection) .map(x => { const [depName, requirements] = x; - let currentValue; - let nestedVersion; - let skipReason; + let currentValue: string; + let nestedVersion: boolean; + let skipReason: string; if (requirements.git) { skipReason = 'git-dependency'; } else if (requirements.file) { @@ -85,7 +107,7 @@ function extractFromSection(pipfile, section) { skipReason = 'invalid-version'; } } - const dep = { + const dep: PackageDependency = { depType: section, depName, managerData: {}, diff --git a/lib/manager/pipenv/index.js b/lib/manager/pipenv/index.js deleted file mode 100644 index 28b8605f087b5d287f54b7f9cf580d73298c6cac..0000000000000000000000000000000000000000 --- a/lib/manager/pipenv/index.js +++ /dev/null @@ -1,12 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { updateArtifacts } = require('./artifacts'); - -const language = 'python'; - -module.exports = { - extractPackageFile, - updateDependency, - updateArtifacts, - language, -}; diff --git a/lib/manager/pipenv/index.ts b/lib/manager/pipenv/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..29e3d697e21f093db11a549556a2c568b1ad1d9c --- /dev/null +++ b/lib/manager/pipenv/index.ts @@ -0,0 +1,5 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; +export { updateArtifacts } from './artifacts'; + +export const language = 'python'; diff --git a/lib/manager/pipenv/update.js b/lib/manager/pipenv/update.ts similarity index 80% rename from lib/manager/pipenv/update.js rename to lib/manager/pipenv/update.ts index c4b95b953ebd6d06885da0e0e62d04b6bd32f888..b283af298bad14c8a9a080a09835a1259b7e8527 100644 --- a/lib/manager/pipenv/update.js +++ b/lib/manager/pipenv/update.ts @@ -1,18 +1,20 @@ -const _ = require('lodash'); -const toml = require('toml'); -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; +import { isEqual } from 'lodash'; +import { parse } from 'toml'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; // Return true if the match string is found at index in content -function matchAt(content, index, match) { +function matchAt(content: string, index: number, match: string) { return content.substring(index, index + match.length) === match; } // Replace oldString with newString at location index of content -function replaceAt(content, index, oldString, newString) { +function replaceAt( + content: string, + index: number, + oldString: string, + newString: string +) { logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`); return ( content.substr(0, index) + @@ -21,13 +23,16 @@ function replaceAt(content, index, oldString, newString) { ); } -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { const { depType, depName, newValue, managerData = {} } = upgrade; const { nestedVersion } = managerData; logger.debug(`pipenv.updateDependency(): ${newValue}`); - const parsedContents = toml.parse(fileContent); - let oldVersion; + const parsedContents = parse(fileContent); + let oldVersion: string; if (nestedVersion) { oldVersion = parsedContents[depType][depName].version; } else { @@ -58,7 +63,7 @@ function updateDependency(fileContent, upgrade) { newString ); // Compare the parsed toml structure of old and new - if (_.isEqual(parsedContents, toml.parse(testContent))) { + if (isEqual(parsedContents, parse(testContent))) { newFileContent = testContent; break; } else { diff --git a/lib/manager/poetry/artifacts.js b/lib/manager/poetry/artifacts.ts similarity index 65% rename from lib/manager/poetry/artifacts.js rename to lib/manager/poetry/artifacts.ts index 1c8096c6b41339f9bf8c6912ea1bc9d7c4fd0834..7a165c214e2bd4f85ac15b50ffae63b583b1966f 100644 --- a/lib/manager/poetry/artifacts.js +++ b/lib/manager/poetry/artifacts.ts @@ -1,32 +1,28 @@ -const upath = require('upath'); -const process = require('process'); -const fs = require('fs-extra'); -const { exec } = require('../../util/exec'); -const { getChildProcessEnv } = require('../../util/env'); +import { parse, join } from 'upath'; +import { hrtime } from 'process'; +import { outputFile, readFile } from 'fs-extra'; +import { exec } from '../../util/exec'; +import { getChildProcessEnv } from '../../util/env'; +import { logger } from '../../logger'; +import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common'; -const { logger } = require('../../logger'); - -module.exports = { - updateArtifacts, -}; - -async function updateArtifacts( - packageFileName, - updatedDeps, - newPackageFileContent, - config -) { +export async function updateArtifacts( + packageFileName: string, + updatedDeps: string[], + newPackageFileContent: string, + config: UpdateArtifactsConfig +): Promise<UpdateArtifactsResult[]> { await logger.debug(`poetry.updateArtifacts(${packageFileName})`); if (updatedDeps === undefined || updatedDeps.length < 1) { logger.debug('No updated poetry deps - returning null'); return null; } - const subDirectory = upath.parse(packageFileName).dir; - const lockFileName = upath.join(subDirectory, 'poetry.lock'); + const subDirectory = parse(packageFileName).dir; + const lockFileName = join(subDirectory, 'poetry.lock'); let existingLockFileContent = await platform.getFile(lockFileName); - let oldLockFileName; + let oldLockFileName: string; if (!existingLockFileContent) { - oldLockFileName = upath.join(subDirectory, 'pyproject.lock'); + oldLockFileName = join(subDirectory, 'pyproject.lock'); existingLockFileContent = await platform.getFile(oldLockFileName); // istanbul ignore if if (existingLockFileContent) { @@ -36,17 +32,17 @@ async function updateArtifacts( return null; } } - const localPackageFileName = upath.join(config.localDir, packageFileName); - const localLockFileName = upath.join(config.localDir, lockFileName); - let stdout; - let stderr; - const startTime = process.hrtime(); + const localPackageFileName = join(config.localDir, packageFileName); + const localLockFileName = join(config.localDir, lockFileName); + let stdout: string; + let stderr: string; + const startTime = hrtime(); try { - await fs.outputFile(localPackageFileName, newPackageFileContent); + await outputFile(localPackageFileName, newPackageFileContent); logger.debug(`Updating ${lockFileName}`); - const cwd = upath.join(config.localDir, subDirectory); + const cwd = join(config.localDir, subDirectory); const env = getChildProcessEnv(); - let cmd; + let cmd: string; // istanbul ignore if if (config.binarySource === 'docker') { logger.info('Running poetry via docker'); @@ -69,19 +65,19 @@ async function updateArtifacts( env, })); } - const duration = process.hrtime(startTime); + const duration = hrtime(startTime); const seconds = Math.round(duration[0] + duration[1] / 1e9); logger.info( { seconds, type: `${lockFileName}`, stdout, stderr }, 'Updated lockfile' ); logger.debug(`Returning updated ${lockFileName}`); - const newPoetryLockContent = await fs.readFile(localLockFileName, 'utf8'); + const newPoetryLockContent = await readFile(localLockFileName, 'utf8'); if (existingLockFileContent === newPoetryLockContent) { logger.debug(`${lockFileName} is unchanged`); return null; } - let fileName; + let fileName: string; // istanbul ignore if if (oldLockFileName) { fileName = oldLockFileName; diff --git a/lib/manager/poetry/extract.js b/lib/manager/poetry/extract.ts similarity index 67% rename from lib/manager/poetry/extract.js rename to lib/manager/poetry/extract.ts index 309124250797358c39cfa23947cb27f9f784c7ab..478ddad293ec32eaee86472bd4eedb39c6d201e7 100644 --- a/lib/manager/poetry/extract.js +++ b/lib/manager/poetry/extract.ts @@ -1,16 +1,17 @@ -const toml = require('toml'); -const semver = require('../../versioning/poetry'); -const { logger } = require('../../logger'); +import { parse } from 'toml'; +import { isValid } from '../../versioning/poetry'; +import { logger } from '../../logger'; +import { PackageFile, PackageDependency } from '../common'; +import { PoetryFile, PoetrySection } from './types'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content, fileName) { +export function extractPackageFile( + content: string, + fileName: string +): PackageFile { logger.trace(`poetry.extractPackageFile(${fileName})`); - let pyprojectfile; + let pyprojectfile: PoetryFile; try { - pyprojectfile = toml.parse(content); + pyprojectfile = parse(content); } catch (err) { logger.debug({ err }, 'Error parsing pyproject.toml file'); return null; @@ -30,20 +31,23 @@ function extractPackageFile(content, fileName) { return { deps }; } -function extractFromSection(parsedFile, section) { +function extractFromSection( + parsedFile: PoetryFile, + section: keyof PoetrySection +): PackageDependency[] { const deps = []; const sectionContent = parsedFile.tool.poetry[section]; if (!sectionContent) { return []; } Object.keys(sectionContent).forEach(depName => { - let skipReason; + let skipReason: string; let currentValue = sectionContent[depName]; let nestedVersion = false; if (typeof currentValue !== 'string') { - const version = sectionContent[depName].version; - const path = sectionContent[depName].path; - const git = sectionContent[depName].git; + const version = currentValue.version; + const path = currentValue.path; + const git = currentValue.git; if (version) { currentValue = version; nestedVersion = true; @@ -64,16 +68,16 @@ function extractFromSection(parsedFile, section) { skipReason = 'multiple-constraint-dep'; } } - const dep = { + const dep: PackageDependency = { depName, depType: section, - currentValue, + currentValue: currentValue as string, managerData: { nestedVersion }, datasource: 'pypi', }; if (skipReason) { dep.skipReason = skipReason; - } else if (!semver.isValid(dep.currentValue)) { + } else if (!isValid(dep.currentValue)) { dep.skipReason = 'unknown-version'; } deps.push(dep); diff --git a/lib/manager/poetry/index.js b/lib/manager/poetry/index.js deleted file mode 100644 index 5a4a763d731301f9d109c41dea2ab3e65ef0d4b3..0000000000000000000000000000000000000000 --- a/lib/manager/poetry/index.js +++ /dev/null @@ -1,14 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); -const { updateArtifacts } = require('./artifacts'); - -const language = 'python'; - -module.exports = { - extractPackageFile, - updateArtifacts, - language, - updateDependency, - // TODO: Support this - supportsLockFileMaintenance: false, -}; diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..62e8aafece55f975fffabd4264350ffbaabcee61 --- /dev/null +++ b/lib/manager/poetry/index.ts @@ -0,0 +1,6 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; +export { updateArtifacts } from './artifacts'; + +export const language = 'python'; +export const supportsLockFileMaintenance = false; diff --git a/lib/manager/poetry/types.ts b/lib/manager/poetry/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e409718d83cdfe9d36bd66d84899b468fb533190 --- /dev/null +++ b/lib/manager/poetry/types.ts @@ -0,0 +1,17 @@ +export interface PoetrySection { + dependencies: Record<string, PoetryDependency | string>; + 'dev-dependencies': Record<string, PoetryDependency | string>; + extras: Record<string, PoetryDependency | string>; +} + +export interface PoetryFile { + tool?: { + poetry?: PoetrySection; + }; +} + +export interface PoetryDependency { + path?: string; + git?: string; + version?: string; +} diff --git a/lib/manager/poetry/update.js b/lib/manager/poetry/update.ts similarity index 81% rename from lib/manager/poetry/update.js rename to lib/manager/poetry/update.ts index a826d1a453ffe470dc23a432cad24e4df9edfc48..b1321b17152aab04a76d80df3aae85398b08cc94 100644 --- a/lib/manager/poetry/update.js +++ b/lib/manager/poetry/update.ts @@ -1,20 +1,22 @@ -const _ = require('lodash'); -const toml = require('toml'); - -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; +import { isEqual } from 'lodash'; +import { parse } from 'toml'; +import { logger } from '../../logger'; +import { Upgrade } from '../common'; +import { PoetryFile } from './types'; // TODO: Maybe factor out common code from pipenv.updateDependency and poetry.updateDependency // Return true if the match string is found at index in content -function matchAt(content, index, match) { +function matchAt(content: string, index: number, match: string) { return content.substring(index, index + match.length) === match; } // Replace oldString with newString at location index of content -function replaceAt(content, index, oldString, newString) { +function replaceAt( + content: string, + index: number, + oldString: string, + newString: string +) { logger.debug(`Replacing ${oldString} with ${newString} at index ${index}`); return ( content.substr(0, index) + @@ -23,14 +25,17 @@ function replaceAt(content, index, oldString, newString) { ); } -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade<{ nestedVersion?: boolean }> +): string { logger.trace({ config: upgrade }, 'poetry.updateDependency()'); if (!upgrade) { return null; } const { depType, depName, newValue, managerData } = upgrade; const { nestedVersion } = managerData; - const parsedContents = toml.parse(fileContent); + const parsedContents: PoetryFile = parse(fileContent); if (!parsedContents.tool.poetry[depType]) { logger.info( { config: upgrade }, @@ -38,7 +43,7 @@ function updateDependency(fileContent, upgrade) { ); return null; } - let oldVersion; + let oldVersion: string; if (nestedVersion) { const oldDep = parsedContents.tool.poetry[depType][depName]; if (!oldDep) { @@ -84,7 +89,7 @@ function updateDependency(fileContent, upgrade) { newString ); // Compare the parsed toml structure of old and new - if (_.isEqual(parsedContents, toml.parse(testContent))) { + if (isEqual(parsedContents, parse(testContent))) { newFileContent = testContent; break; } else { diff --git a/lib/manager/pub/extract.js b/lib/manager/pub/extract.ts similarity index 58% rename from lib/manager/pub/extract.js rename to lib/manager/pub/extract.ts index 99bce6dc9bb805a1dfff923d9ef9dca42cb13613..f2aa0ffb05d0434863b11567130ed26c77625c78 100644 --- a/lib/manager/pub/extract.js +++ b/lib/manager/pub/extract.ts @@ -1,12 +1,12 @@ -const yaml = require('js-yaml'); -const npm = require('../../versioning/npm/index'); -const { logger } = require('../../logger'); - -module.exports = { - extractPackageFile, -}; - -function getDeps(depsObj, preset = {}) { +import { safeLoad } from 'js-yaml'; +import { isValid } from '../../versioning/npm/index'; +import { logger } from '../../logger'; +import { PackageDependency, PackageFile } from '../common'; + +function getDeps( + depsObj: { [x: string]: any }, + preset: { depType: string } +): PackageDependency[] { if (!depsObj) return []; return Object.keys(depsObj).reduce((acc, depName) => { if (depName === 'meta') return acc; @@ -14,16 +14,15 @@ function getDeps(depsObj, preset = {}) { const section = depsObj[depName]; let currentValue = null; - if (section && npm.isValid(section.toString())) { + if (section && isValid(section.toString())) { currentValue = section.toString(); } - if (section.version && npm.isValid(section.version.toString())) { + if (section.version && isValid(section.version.toString())) { currentValue = section.version.toString(); } - /** @type any */ - const dep = { ...preset, depName, currentValue }; + const dep: PackageDependency = { ...preset, depName, currentValue }; if (!currentValue) { dep.skipReason = 'not-a-version'; } @@ -32,9 +31,12 @@ function getDeps(depsObj, preset = {}) { }, []); } -function extractPackageFile(content, packageFile) { +export function extractPackageFile( + content: string, + packageFile: string +): PackageFile { try { - const doc = yaml.safeLoad(content); + const doc = safeLoad(content); const deps = [ ...getDeps(doc.dependencies, { depType: 'dependencies', diff --git a/lib/manager/pub/index.js b/lib/manager/pub/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/pub/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/pub/index.ts b/lib/manager/pub/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/pub/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/pub/update.js b/lib/manager/pub/update.ts similarity index 68% rename from lib/manager/pub/update.js rename to lib/manager/pub/update.ts index ff1ff78481b127abb02909c6d392736c31214fa8..53c3680346732cd3ebd6cdef4812e9de848d466c 100644 --- a/lib/manager/pub/update.js +++ b/lib/manager/pub/update.ts @@ -1,29 +1,29 @@ -const yaml = require('js-yaml'); +import { load } from 'js-yaml'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { const { depName, depType, currentValue, newValue } = upgrade; if (currentValue === newValue) return fileContent; const sectionBeginRegExp = new RegExp(`^${depType}:`); - const isSectionBegin = line => sectionBeginRegExp.test(line); - const isSectionEnd = line => /^[^\s]/.test(line); + const isSectionBegin = (line: string) => sectionBeginRegExp.test(line); + const isSectionEnd = (line: string) => /^[^\s]/.test(line); const simpleDepRegExp = new RegExp(`^\\s+${depName}:\\s*[^\\s]+\\s*$`); - const isOneLineDep = line => simpleDepRegExp.test(line); + const isOneLineDep = (line: string) => simpleDepRegExp.test(line); const multilineDepRegExp = new RegExp(`^\\s+${depName}:\\s*$`); - const isMultilineDepRegExp = line => multilineDepRegExp.test(line); + const isMultilineDepRegExp = (line: string) => multilineDepRegExp.test(line); const versionRegExp = new RegExp('^\\s+version:\\s*[^\\s]+\\s*$'); - const isVersionLine = line => versionRegExp.test(line); + const isVersionLine = (line: string) => versionRegExp.test(line); - const isValidVersion = line => { - const version = yaml.load(line.replace(/^.*:\s*/, '')).toString(); + const isValidVersion = (line: string) => { + const version = load(line.replace(/^.*:\s*/, '')).toString(); return version === currentValue; }; diff --git a/lib/manager/ruby-version/extract.js b/lib/manager/ruby-version/extract.js deleted file mode 100644 index f999ecbc598e56014b7623f9ac53ca7aafbf0289..0000000000000000000000000000000000000000 --- a/lib/manager/ruby-version/extract.js +++ /dev/null @@ -1,19 +0,0 @@ -const ruby = require('../../versioning/ruby'); -const { logger } = require('../../logger'); - -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { - logger.trace('ruby-version.extractPackageFile()'); - const dep = { - depName: 'ruby', - currentValue: content.trim(), - datasource: 'rubyVersion', - }; - if (!ruby.isValid(dep.currentValue)) { - dep.skipReason = 'unsupported-version'; - } - return { deps: [dep] }; -} diff --git a/lib/manager/ruby-version/extract.ts b/lib/manager/ruby-version/extract.ts new file mode 100644 index 0000000000000000000000000000000000000000..54fe52bcf66f603588da794503e99b4efa597ad7 --- /dev/null +++ b/lib/manager/ruby-version/extract.ts @@ -0,0 +1,16 @@ +import { isValid } from '../../versioning/ruby'; +import { logger } from '../../logger'; +import { PackageDependency, PackageFile } from '../common'; + +export function extractPackageFile(content: string): PackageFile { + logger.trace('ruby-version.extractPackageFile()'); + const dep: PackageDependency = { + depName: 'ruby', + currentValue: content.trim(), + datasource: 'rubyVersion', + }; + if (!isValid(dep.currentValue)) { + dep.skipReason = 'unsupported-version'; + } + return { deps: [dep] }; +} diff --git a/lib/manager/ruby-version/index.js b/lib/manager/ruby-version/index.js deleted file mode 100644 index 8ad1ffee8f458457c2a7271493621dc6e6eb0ced..0000000000000000000000000000000000000000 --- a/lib/manager/ruby-version/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -const language = 'ruby'; - -module.exports = { - extractPackageFile, - language, - updateDependency, -}; diff --git a/lib/manager/ruby-version/index.ts b/lib/manager/ruby-version/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c09a2db01cf681112a02f94a94bf95c5f17b0c7 --- /dev/null +++ b/lib/manager/ruby-version/index.ts @@ -0,0 +1,4 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; + +export const language = 'ruby'; diff --git a/lib/manager/ruby-version/update.js b/lib/manager/ruby-version/update.js deleted file mode 100644 index d84012f0e9c2c312d4457b75a963db5575ff80dd..0000000000000000000000000000000000000000 --- a/lib/manager/ruby-version/update.js +++ /dev/null @@ -1,10 +0,0 @@ -const { logger } = require('../../logger'); - -module.exports = { - updateDependency, -}; - -function updateDependency(fileContent, upgrade) { - logger.debug(`ruby-version.updateDependency(): ${upgrade.newValue}`); - return `${upgrade.newValue}\n`; -} diff --git a/lib/manager/ruby-version/update.ts b/lib/manager/ruby-version/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..3734bf268bbbb422df2687c07c2154b455fa6227 --- /dev/null +++ b/lib/manager/ruby-version/update.ts @@ -0,0 +1,10 @@ +import { logger } from '../../logger'; +import { Upgrade } from '../common'; + +export function updateDependency( + _fileContent: string, + upgrade: Upgrade +): string { + logger.debug(`ruby-version.updateDependency(): ${upgrade.newValue}`); + return `${upgrade.newValue}\n`; +} diff --git a/lib/manager/sbt/extract.js b/lib/manager/sbt/extract.ts similarity index 75% rename from lib/manager/sbt/extract.js rename to lib/manager/sbt/extract.ts index 07bf40d5e03b318142bef27f031b043e36c07247..9d74af885f5903d80175a95b28f98a4e4927e72f 100644 --- a/lib/manager/sbt/extract.js +++ b/lib/manager/sbt/extract.ts @@ -1,36 +1,38 @@ -const { DEFAULT_MAVEN_REPO } = require('../maven/extract'); +import { DEFAULT_MAVEN_REPO } from '../maven/extract'; +import { PackageFile, PackageDependency } from '../common'; -const isComment = str => /^\s*\/\//.test(str); +const isComment = (str: string) => /^\s*\/\//.test(str); -const isSingleLineDep = str => +const isSingleLineDep = (str: string) => /^\s*(libraryDependencies|dependencyOverrides)\s*\+=\s*/.test(str); -const isDepsBegin = str => +const isDepsBegin = (str: string) => /^\s*(libraryDependencies|dependencyOverrides)\s*\+\+=\s*/.test(str); -const isPluginDep = str => /^\s*addSbtPlugin\s*\(.*\)\s*$/.test(str); +const isPluginDep = (str: string) => /^\s*addSbtPlugin\s*\(.*\)\s*$/.test(str); -const isStringLiteral = str => /^"[^"]*"$/.test(str); +const isStringLiteral = (str: string) => /^"[^"]*"$/.test(str); -const isScalaVersion = str => /^\s*scalaVersion\s*:=\s*"[^"]*"\s*$/.test(str); -const getScalaVersion = str => +const isScalaVersion = (str: string) => + /^\s*scalaVersion\s*:=\s*"[^"]*"\s*$/.test(str); +const getScalaVersion = (str: string) => str.replace(/^\s*scalaVersion\s*:=\s*"/, '').replace(/"\s*$/, ''); -const isResolver = str => +const isResolver = (str: string) => /^\s*(resolvers\s*\+\+?=\s*(Seq\()?)?"[^"]*"\s*at\s*"[^"]*"[\s,)]*$/.test( str ); -const getResolverUrl = str => +const getResolverUrl = (str: string) => str .replace(/^\s*(resolvers\s*\+\+?=\s*(Seq\()?)?"[^"]*"\s*at\s*"/, '') .replace(/"[\s,)]*$/, ''); -const isVarDef = str => +const isVarDef = (str: string) => /^\s*val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*"[^"]*"\s*$/.test(str); -const getVarName = str => +const getVarName = (str: string) => str.replace(/^\s*val\s+/, '').replace(/\s*=\s*"[^"]*"\s*$/, ''); -const isVarName = str => /^[_a-zA-Z][_a-zA-Z0-9]*$/.test(str); -const getVarInfo = (str, ctx) => { +const isVarName = (str: string) => /^[_a-zA-Z][_a-zA-Z0-9]*$/.test(str); +const getVarInfo = (str: string, ctx: ParseContext) => { const { fileOffset } = ctx; const rightPart = str.replace(/^\s*val\s+[_a-zA-Z][_a-zA-Z0-9]*\s*=\s*"/, ''); const fileReplacePosition = str.search(rightPart) + fileOffset; @@ -38,14 +40,21 @@ const getVarInfo = (str, ctx) => { return { val, fileReplacePosition }; }; -function parseDepExpr(expr, ctx) { +interface ParseContext { + fileOffset: number; + scalaVersion: string; + variables: any; + depType?: string; +} + +function parseDepExpr(expr: string, ctx: ParseContext) { const { scalaVersion, fileOffset, variables } = ctx; let { depType } = ctx; - const isValidToken = str => + const isValidToken = (str: string) => isStringLiteral(str) || (isVarName(str) && !!variables[str]); - const resolveToken = str => + const resolveToken = (str: string) => isStringLiteral(str) ? str.replace(/^"/, '').replace(/"$/, '') : variables[str].val; @@ -85,7 +94,7 @@ function parseDepExpr(expr, ctx) { depType = rawScope.replace(/^"/, '').replace(/"$/, ''); } - let fileReplacePosition; + let fileReplacePosition: number; if (isStringLiteral(rawVersion)) { // Calculate fileReplacePosition incrementally // help us to avoid errors in updating phase. @@ -101,7 +110,7 @@ function parseDepExpr(expr, ctx) { fileReplacePosition = variables[rawVersion].fileReplacePosition; } - const result = { + const result: PackageDependency = { depName, currentValue, fileReplacePosition, @@ -113,19 +122,30 @@ function parseDepExpr(expr, ctx) { return result; } +interface ParseOptions { + fileOffset?: number; + isMultiDeps?: boolean; + scalaVersion?: string; + variables?: Record<string, any>; +} -function parseSbtLine(acc, line, lineIndex, lines) { +function parseSbtLine( + acc: PackageFile & ParseOptions, + line: string, + lineIndex: number, + lines: string[] +): PackageFile & ParseOptions { const { deps, registryUrls, fileOffset, variables } = acc; let { isMultiDeps, scalaVersion } = acc; - const ctx = { + const ctx: ParseContext = { scalaVersion, fileOffset, variables, }; - let dep = null; + let dep: PackageDependency = null; if (!isComment(line)) { if (isScalaVersion(line)) { isMultiDeps = false; @@ -170,7 +190,7 @@ function parseSbtLine(acc, line, lineIndex, lines) { if (dep) deps.push({ datasource: 'sbt', - registryUrls, + registryUrls: registryUrls as string[], ...dep, }); @@ -185,7 +205,7 @@ function parseSbtLine(acc, line, lineIndex, lines) { return null; } -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { if (!content) return null; const lines = content.split(/\n/); return lines.reduce(parseSbtLine, { @@ -197,7 +217,3 @@ function extractPackageFile(content) { variables: {}, }); } - -module.exports = { - extractPackageFile, -}; diff --git a/lib/manager/sbt/index.js b/lib/manager/sbt/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/sbt/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/sbt/index.ts b/lib/manager/sbt/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/sbt/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/sbt/update.js b/lib/manager/sbt/update.js deleted file mode 100644 index 5ab2e6e4e8da00366929311bf6c25b88ecbcc6a0..0000000000000000000000000000000000000000 --- a/lib/manager/sbt/update.js +++ /dev/null @@ -1,5 +0,0 @@ -const { updateAtPosition } = require('../maven/update'); - -module.exports = { - updateDependency: updateAtPosition, -}; diff --git a/lib/manager/sbt/update.ts b/lib/manager/sbt/update.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d7226b3719017a03587f2e58bcea9c91930eeb1 --- /dev/null +++ b/lib/manager/sbt/update.ts @@ -0,0 +1 @@ +export { updateAtPosition as updateDependency } from '../maven/update'; diff --git a/lib/manager/swift/extract.js b/lib/manager/swift/extract.ts similarity index 93% rename from lib/manager/swift/extract.js rename to lib/manager/swift/extract.ts index bc5cbb9dce7badcb81f0babf3c1c10ed7a46ab8c..c55b10b1d3d1433f3d011ce37561b38c56db0ff8 100644 --- a/lib/manager/swift/extract.js +++ b/lib/manager/swift/extract.ts @@ -1,4 +1,5 @@ -const { isValid } = require('../../versioning/swift'); +import { isValid } from '../../versioning/swift'; +import { PackageFile, PackageDependency } from '../common'; const regExps = { wildcard: /^.*?/, @@ -86,8 +87,14 @@ function searchKeysForState(state) { return [DEPS]; } } +interface MatchResult { + idx: number; + len: number; + label: string; + substr: string; +} -function getMatch(str, state) { +function getMatch(str: string, state: string): MatchResult { const keys = searchKeysForState(state); let result = null; for (let i = 0; i < keys.length; i += 1) { @@ -110,7 +117,7 @@ function getMatch(str, state) { return result; } -function getDepName(url) { +function getDepName(url: string) { try { const { host, pathname } = new URL(url); if (host === 'github.com' || host === 'gitlab.com') { @@ -125,27 +132,31 @@ function getDepName(url) { } } -function extractPackageFile(content, packageFile = null) { +export function extractPackageFile( + content: string, + packageFile: string = null +): PackageFile { if (!content) return null; - const result = { + const result: PackageFile = { packageFile, + deps: null, }; - const deps = []; + const deps: PackageDependency[] = []; let offset = 0; let restStr = content; - let state = null; + let state: string = null; let match = getMatch(restStr, state); - let lookupName = null; - let currentValue = null; - let fileReplacePosition = null; + let lookupName: string = null; + let currentValue: string = null; + let fileReplacePosition: number = null; function yieldDep() { const depName = getDepName(lookupName); if (depName && currentValue && fileReplacePosition) { - const dep = { + const dep: PackageDependency = { datasource: 'gitTags', depName, lookupName, @@ -340,7 +351,3 @@ function extractPackageFile(content, packageFile = null) { } return deps.length ? { ...result, deps } : null; } - -module.exports = { - extractPackageFile, -}; diff --git a/lib/manager/swift/index.js b/lib/manager/swift/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/swift/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/swift/index.ts b/lib/manager/swift/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/swift/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/swift/update.js b/lib/manager/swift/update.ts similarity index 81% rename from lib/manager/swift/update.js rename to lib/manager/swift/update.ts index 09b2baa68c4902af34d01c81a03b376feaf7735b..66131fc9568673a488c64405b7564efefa6e649e 100644 --- a/lib/manager/swift/update.js +++ b/lib/manager/swift/update.ts @@ -1,8 +1,12 @@ -const { isVersion } = require('../../versioning/swift'); +import { isVersion } from '../../versioning/swift'; +import { Upgrade } from '../common'; const fromParam = /^\s*from\s*:\s*"([^"]+)"\s*$/; -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { const { currentValue, newValue, fileReplacePosition } = upgrade; const leftPart = fileContent.slice(0, fileReplacePosition); const rightPart = fileContent.slice(fileReplacePosition); @@ -24,7 +28,3 @@ function updateDependency(fileContent, upgrade) { } return null; } - -module.exports = { - updateDependency, -}; diff --git a/lib/manager/terraform/extract.js b/lib/manager/terraform/extract.ts similarity index 89% rename from lib/manager/terraform/extract.js rename to lib/manager/terraform/extract.ts index 79c531664b7746feb8860cb2326e00043ea75cc6..808a67e9ca9ed34879be1fbb5b25cfa4dcd1f79c 100644 --- a/lib/manager/terraform/extract.js +++ b/lib/manager/terraform/extract.ts @@ -1,16 +1,13 @@ -const { logger } = require('../../logger'); -const { isValid, isVersion } = require('../../versioning/hashicorp'); +import { logger } from '../../logger'; +import { isValid, isVersion } from '../../versioning/hashicorp'; +import { PackageDependency, PackageFile } from '../common'; -module.exports = { - extractPackageFile, -}; - -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { logger.trace({ content }, 'terraform.extractPackageFile()'); if (!content.includes('module "')) { return null; } - const deps = []; + const deps: PackageDependency[] = []; try { const lines = content.split('\n'); for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { @@ -18,7 +15,7 @@ function extractPackageFile(content) { const module = line.match(/^module\s+"([^"]+)"\s+{\s*$/); if (module) { logger.trace(`Matched module on line ${lineNumber}`); - const dep = { + const dep: PackageDependency = { moduleName: module[1], managerData: {}, }; diff --git a/lib/manager/terraform/index.js b/lib/manager/terraform/index.js deleted file mode 100644 index 749cae6f4db0ec27bb7cde5845780752ce144ac9..0000000000000000000000000000000000000000 --- a/lib/manager/terraform/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { updateDependency } = require('./update'); - -module.exports = { - extractPackageFile, - updateDependency, -}; diff --git a/lib/manager/terraform/index.ts b/lib/manager/terraform/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..730b5b60ba42a35b24b351e0793557e86f185454 --- /dev/null +++ b/lib/manager/terraform/index.ts @@ -0,0 +1,2 @@ +export { extractPackageFile } from './extract'; +export { updateDependency } from './update'; diff --git a/lib/manager/terraform/update.js b/lib/manager/terraform/update.ts similarity index 85% rename from lib/manager/terraform/update.js rename to lib/manager/terraform/update.ts index 07f132aec63bb9218bfb36c32b6f876f43bba783..f7d08539b34b100924a5dddab8d83fac8e6fe6b1 100644 --- a/lib/manager/terraform/update.js +++ b/lib/manager/terraform/update.ts @@ -1,10 +1,10 @@ -const { logger } = require('../../logger'); +import { logger } from '../../logger'; +import { Upgrade } from '../common'; -module.exports = { - updateDependency, -}; - -function updateDependency(currentFileContent, upgrade) { +export function updateDependency( + currentFileContent: string, + upgrade: Upgrade +): string { try { logger.debug(`terraform.updateDependency: ${upgrade.newValue}`); const lines = currentFileContent.split('\n'); diff --git a/lib/manager/travis/extract.js b/lib/manager/travis/extract.ts similarity index 58% rename from lib/manager/travis/extract.js rename to lib/manager/travis/extract.ts index 682f7506f700c1d02674d9d09a15149e1a4a7d61..d30076c36be7534c48d75bdd2cc663f10a2631fb 100644 --- a/lib/manager/travis/extract.js +++ b/lib/manager/travis/extract.ts @@ -1,12 +1,10 @@ import is from '@sindresorhus/is'; +import yaml from 'js-yaml'; +import { PackageFile, PackageDependency } from '../common'; -const yaml = require('js-yaml'); - -export { extractPackageFile }; - -function extractPackageFile(content) { +export function extractPackageFile(content: string): PackageFile { const doc = yaml.safeLoad(content); - let deps = []; + let deps: PackageDependency[] = []; if (doc && is.array(doc.node_js)) { deps = [ { diff --git a/lib/manager/travis/index.js b/lib/manager/travis/index.js deleted file mode 100644 index 460b84a0d18a8c671da6f8f605346b2eade67f09..0000000000000000000000000000000000000000 --- a/lib/manager/travis/index.js +++ /dev/null @@ -1,12 +0,0 @@ -const { extractPackageFile } = require('./extract'); -const { getPackageUpdates } = require('./package'); -const { updateDependency } = require('./update'); - -const language = 'node'; - -module.exports = { - extractPackageFile, - getPackageUpdates, - language, - updateDependency, -}; diff --git a/lib/manager/travis/index.ts b/lib/manager/travis/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..91796056c605fd2c5cb365f4c2b6986bec1c04c5 --- /dev/null +++ b/lib/manager/travis/index.ts @@ -0,0 +1,5 @@ +export { extractPackageFile } from './extract'; +export { getPackageUpdates } from './package'; +export { updateDependency } from './update'; + +export const language = 'node'; diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.ts similarity index 69% rename from lib/manager/travis/package.js rename to lib/manager/travis/package.ts index bb5370eba139200b2ab1c092dc9ea799b353b0a7..558309c46649f32dedb5e4dd0a272f3fc724cbde 100644 --- a/lib/manager/travis/package.js +++ b/lib/manager/travis/package.ts @@ -1,15 +1,29 @@ import is from '@sindresorhus/is'; +import { isEqual } from 'lodash'; +import { logger } from '../../logger'; +import { getPkgReleases } from '../../datasource'; +import { isVersion, maxSatisfyingVersion } from '../../versioning/semver'; +import nodeJsSchedule from '../../../data/node-js-schedule.json'; +import { PackageUpdateConfig, PackageUpdateResult } from '../common'; -const { isEqual } = require('lodash'); -const { getPkgReleases } = require('../../datasource'); -const { isVersion, maxSatisfyingVersion } = require('../../versioning/semver'); -const { logger } = require('../../logger'); -const nodeJsSchedule = require('../../../data/node-js-schedule.json'); - -export { getPackageUpdates }; +interface NodeJsPolicies { + all: number[]; + lts: number[]; + active: number[]; + lts_active: number[]; + lts_latest: number[]; + current: number[]; +} +interface NodeJsSchedule { + lts: string; + maintenance: string; + end: string; + start: string; +} +type NodeJsData = Record<string, NodeJsSchedule>; -let policies; -let refreshDate; +let policies: NodeJsPolicies; +let refreshDate: Date; function generatePolicies() { policies = { @@ -23,7 +37,7 @@ function generatePolicies() { const now = new Date(); - for (const [vRelease, data] of Object.entries(nodeJsSchedule)) { + for (const [vRelease, data] of Object.entries(nodeJsSchedule as NodeJsData)) { const isAlive = new Date(data.start) < now && new Date(data.end) > now; if (isAlive) { const release = parseInt(vRelease.replace(/^v/, ''), 10); @@ -49,7 +63,7 @@ function checkPolicies() { generatePolicies(); refreshDate = new Date('3000-01-01'); // y3k const now = new Date(); - for (const data of Object.values(nodeJsSchedule)) { + for (const data of Object.values(nodeJsSchedule as NodeJsData)) { const fields = ['start', 'lts', 'maintenance', 'end']; for (const field of fields) { const fieldDate = new Date(data[field]); @@ -61,7 +75,9 @@ function checkPolicies() { logger.debug('Node.js policies refresh date: ' + refreshDate); } -async function getPackageUpdates(config) { +export async function getPackageUpdates( + config: PackageUpdateConfig +): Promise<PackageUpdateResult[]> { logger.trace('travis.getPackageUpdates()'); const { supportPolicy } = config; if (!(supportPolicy && supportPolicy.length)) { @@ -75,7 +91,8 @@ async function getPackageUpdates(config) { } } logger.debug({ supportPolicy }, `supportPolicy`); - let newValue = supportPolicy + // TODO: `newValue` is a (string | number)[] ! + let newValue: any[] = (supportPolicy as (keyof NodeJsPolicies)[]) .map(policy => policies[policy]) .reduce((result, policy) => result.concat(policy), []) .sort((a, b) => a - b); @@ -94,7 +111,9 @@ async function getPackageUpdates(config) { newValue = newValue.map(val => `${val}`); } newValue.sort((a, b) => a - b); - config.currentValue.sort((a, b) => a - b); + + // TODO: `config.currentValue` is a string! + (config.currentValue as any).sort((a, b) => a - b); if (isEqual(config.currentValue, newValue)) { return []; } diff --git a/lib/manager/travis/update.js b/lib/manager/travis/update.ts similarity index 67% rename from lib/manager/travis/update.js rename to lib/manager/travis/update.ts index 44e8d31a165616ec18065e4888fbc20443e04a2d..e39c66691d9c9860c1e6189af5bc05defd6e97c2 100644 --- a/lib/manager/travis/update.js +++ b/lib/manager/travis/update.ts @@ -1,15 +1,16 @@ import is from '@sindresorhus/is'; +import detectIndent from 'detect-indent'; +import { Upgrade } from '../common'; +import { logger } from '../../logger'; -const detectIndent = require('detect-indent'); -const { logger } = require('../../logger'); - -export { updateDependency }; - -function updateDependency(fileContent, upgrade) { +export function updateDependency( + fileContent: string, + upgrade: Upgrade +): string { try { logger.debug(`travis.updateDependency(): ${upgrade.newValue}`); const indent = detectIndent(fileContent).indent || ' '; - let quote; + let quote: string; if (is.string(upgrade.currentValue[0])) { quote = fileContent.split(`'`).length > fileContent.split(`"`).length @@ -19,7 +20,8 @@ function updateDependency(fileContent, upgrade) { quote = ''; } let newString = `node_js:\n`; - upgrade.newValue.forEach(version => { + // TODO: `newValue` is a string! + (upgrade.newValue as any).forEach(version => { newString += `${indent}- ${quote}${version}${quote}\n`; }); return fileContent.replace(/node_js:(\n\s+-[^\n]+)+\n/, newString); diff --git a/lib/types/github-url-from-git.d.ts b/lib/types/github-url-from-git.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..faf18841c4f32a37d7c5f78395e9beaa0aac1a40 --- /dev/null +++ b/lib/types/github-url-from-git.d.ts @@ -0,0 +1,7 @@ +declare module 'github-url-from-git' { + interface Options { + extraBaseUrls?: string[]; + } + function parse(uri: string, options?: Options): string; + export = parse; +} diff --git a/lib/types/yawn-yaml.d.ts b/lib/types/yawn-yaml.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..37d6f205e0087c2683bd5b538b8c0eebf88d3916 --- /dev/null +++ b/lib/types/yawn-yaml.d.ts @@ -0,0 +1,19 @@ +declare module 'yawn-yaml' { + export default class YAWN { + constructor(content: string); + + json: any; + + yaml: string; + } +} + +declare module 'yawn-yaml/cjs' { + export default class YAWN { + constructor(content: string); + + json: any; + + yaml: string; + } +} diff --git a/lib/versioning/common.ts b/lib/versioning/common.ts index cc31d41e48f9506484f009443b96a59f47b1d988..0c22d1d2c76277aa9fe9864d258e7709003cf946 100644 --- a/lib/versioning/common.ts +++ b/lib/versioning/common.ts @@ -3,6 +3,7 @@ import { SemVer, Range } from 'semver'; export type RangeStrategy = | 'auto' | 'bump' + | 'future' | 'pin' | 'replace' | 'update-lockfile' diff --git a/package.json b/package.json index f30f54bb6e8cadbe7b11a3c189d31953f54b9ab1..95647b34c31a788439d9e3825ccbd0143458523a 100644 --- a/package.json +++ b/package.json @@ -162,15 +162,20 @@ "@babel/preset-env": "7.5.5", "@babel/preset-typescript": "7.3.3", "@types/bunyan": "1.8.6", + "@types/chai": "4.1.7", "@types/convert-hrtime": "2.0.0", "@types/fs-extra": "8.0.0", "@types/got": "9.6.2", "@types/jest": "24.0.15", + "@types/js-yaml": "3.12.1", + "@types/lodash": "4.14.136", + "@types/luxon": "1.15.2", "@types/node": "11.13.18", "@types/parse-link-header": "1.0.0", "@types/semver": "6.0.1", "@types/shelljs": "0.8.5", "@types/tmp": "0.1.0", + "@types/xmldoc": "1.1.4", "@typescript-eslint/eslint-plugin": "1.12.0", "@typescript-eslint/parser": "1.12.0", "babel-jest": "24.8.0", diff --git a/test/.eslintrc.js b/test/.eslintrc.js index ab1eca82ccbee6608ff40ca220237687f87007d6..195c79c4fbbe5c9f1ce55780ae526e013fc3eccc 100644 --- a/test/.eslintrc.js +++ b/test/.eslintrc.js @@ -12,5 +12,7 @@ module.exports = { 'import/no-extraneous-dependencies': 0, 'import/no-named-as-default-member': 0, 'global-require': 0, + + '@typescript-eslint/no-object-literal-type-assertion': 0, }, }; diff --git a/test/manager/ansible/__snapshots__/extract.spec.js.snap b/test/manager/ansible/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/ansible/__snapshots__/extract.spec.js.snap rename to test/manager/ansible/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/ansible/extract.spec.js b/test/manager/ansible/extract.spec.ts similarity index 80% rename from test/manager/ansible/extract.spec.js rename to test/manager/ansible/extract.spec.ts index 4683256ded6690b27bdce7ba5ddcdd20e3b45b9e..832a02c757666dcac8df7a4cc50961e5cdecfbaf 100644 --- a/test/manager/ansible/extract.spec.js +++ b/test/manager/ansible/extract.spec.ts @@ -1,11 +1,11 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/ansible/extract'); +import { readFileSync } from 'fs'; +import extractPackageFile from '../../../lib/manager/ansible/extract'; -const yamlFile1 = fs.readFileSync( +const yamlFile1 = readFileSync( 'test/manager/ansible/_fixtures/main1.yaml', 'utf8' ); -const yamlFile2 = fs.readFileSync( +const yamlFile2 = readFileSync( 'test/manager/ansible/_fixtures/main2.yaml', 'utf8' ); diff --git a/test/manager/ansible/update.spec.js b/test/manager/ansible/update.spec.ts similarity index 74% rename from test/manager/ansible/update.spec.js rename to test/manager/ansible/update.spec.ts index b00f9e2ae3f731a2fcddbe31898655968fda2be8..44a444ed46d6f435b62d778d800acad642d18d7c 100644 --- a/test/manager/ansible/update.spec.js +++ b/test/manager/ansible/update.spec.ts @@ -1,11 +1,11 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/ansible/update'); +import { readFileSync } from 'fs'; +import updateDependency from '../../../lib/manager/ansible/update'; -const yamlFile1 = fs.readFileSync( +const yamlFile1 = readFileSync( 'test/manager/ansible/_fixtures/main1.yaml', 'utf8' ); -const yamlFile2 = fs.readFileSync( +const yamlFile2 = readFileSync( 'test/manager/ansible/_fixtures/main2.yaml', 'utf8' ); @@ -19,7 +19,7 @@ describe('manager/ansible/update', () => { newValue: '1.29.3', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile1, upgrade); + const res = updateDependency(yamlFile1, upgrade); expect(res).not.toEqual(yamlFile1); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -30,7 +30,7 @@ describe('manager/ansible/update', () => { newValue: '11.5.1', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile2, upgrade); + const res = updateDependency(yamlFile2, upgrade); expect(res).not.toEqual(yamlFile2); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -40,7 +40,7 @@ describe('manager/ansible/update', () => { depName: 'sameersbn/redis', newValue: '4.0.9-1', }; - const res = dcUpdate.updateDependency(yamlFile2, upgrade); + const res = updateDependency(yamlFile2, upgrade); expect(res).toEqual(yamlFile2); }); it('returns null if mismatch', () => { @@ -48,11 +48,11 @@ describe('manager/ansible/update', () => { managerData: { lineNumber: 52 }, newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile2, upgrade); + const res = updateDependency(yamlFile2, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/bazel/__snapshots__/extract.spec.js.snap b/test/manager/bazel/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/bazel/__snapshots__/extract.spec.js.snap rename to test/manager/bazel/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/bazel/__snapshots__/update.spec.js.snap b/test/manager/bazel/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/bazel/__snapshots__/update.spec.js.snap rename to test/manager/bazel/__snapshots__/update.spec.ts.snap diff --git a/test/manager/bazel/extract.spec.js b/test/manager/bazel/extract.spec.ts similarity index 93% rename from test/manager/bazel/extract.spec.js rename to test/manager/bazel/extract.spec.ts index 8d529f1222b827483b279d69ca07118708ec7adc..4844a4835b4d1f33c4eb47d0890047e99bd4dcee 100644 --- a/test/manager/bazel/extract.spec.js +++ b/test/manager/bazel/extract.spec.ts @@ -1,12 +1,12 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/bazel/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/bazel/extract'; -const workspaceFile = fs.readFileSync( +const workspaceFile = readFileSync( 'test/manager/bazel/_fixtures/WORKSPACE1', 'utf8' ); -const fileWithBzlExtension = fs.readFileSync( +const fileWithBzlExtension = readFileSync( 'test/manager/bazel/_fixtures/repositories.bzl', 'utf8' ); diff --git a/test/manager/bazel/update.spec.js b/test/manager/bazel/update.spec.ts similarity index 82% rename from test/manager/bazel/update.spec.js rename to test/manager/bazel/update.spec.ts index c55954a40e0fe785c12be6da351ad6d713bb098c..ab7ec4c0e67bfa09af82a71c513d13459c486889 100644 --- a/test/manager/bazel/update.spec.js +++ b/test/manager/bazel/update.spec.ts @@ -1,23 +1,24 @@ -const fs = require('fs'); -/** @type any */ -const hasha = require('hasha'); -const path = require('path'); -const bazelfile = require('../../../lib/manager/bazel/update'); +import { readFileSync } from 'fs'; +import { fromStream as _fromStream } from 'hasha'; +import { resolve } from 'path'; +import { updateDependency } from '../../../lib/manager/bazel/update'; jest.mock('hasha'); jest.mock('../../../lib/util/got'); -const content = fs.readFileSync( - path.resolve('test/manager/bazel/_fixtures/WORKSPACE1'), +const fromStream: jest.Mock<Promise<string>> = _fromStream as any; + +const content = readFileSync( + resolve('test/manager/bazel/_fixtures/WORKSPACE1'), 'utf8' ); -const contentContainerPull = fs.readFileSync( - path.resolve('test/manager/bazel/_fixtures/container_pull'), +const contentContainerPull = readFileSync( + resolve('test/manager/bazel/_fixtures/container_pull'), 'utf8' ); -const fileWithBzlExtension = fs.readFileSync( +const fileWithBzlExtension = readFileSync( 'test/manager/bazel/_fixtures/repositories.bzl', 'utf8' ); @@ -45,7 +46,7 @@ describe('manager/bazel/update', () => { currentValue: '0.1.8', newValue: '0.2.0', }; - const res = await bazelfile.updateDependency(content, upgrade); + const res = await updateDependency(content, upgrade); expect(res).not.toEqual(content); }); @@ -70,10 +71,7 @@ describe('manager/bazel/update', () => { 'sha256:2c29ba015faef92a3f55b37632fc373a7fbc2c9fddd31e317bf07113391c640b', newValue: 'v1.0.0-alpha42.cli-migrations', }; - const res = await bazelfile.updateDependency( - contentContainerPull, - upgrade - ); + const res = await updateDependency(contentContainerPull, upgrade); expect(res).toMatchSnapshot(); expect(res).not.toEqual(contentContainerPull); expect(res.includes('# v1.0.0-alpha31.cli-migrations 11/28')).toBe(true); @@ -97,7 +95,7 @@ describe('manager/bazel/update', () => { newValue: 'v1.0.3', updateType: 'major', }; - const res = await bazelfile.updateDependency(content, upgrade); + const res = await updateDependency(content, upgrade); expect(res).toMatchSnapshot(); expect(res).not.toEqual(content); expect( @@ -114,8 +112,8 @@ describe('manager/bazel/update', () => { }, newDigest: '033387ac8853e6cc1cd47df6c346bc53cbc490d8', }; - hasha.fromStream.mockReturnValueOnce('abc123'); - const res = await bazelfile.updateDependency(content, upgrade); + fromStream.mockResolvedValueOnce('abc123'); + const res = await updateDependency(content, upgrade); expect(res).not.toEqual(content); }); it('updates http archive with content other then WORKSPACE', async () => { @@ -134,11 +132,8 @@ describe('manager/bazel/update', () => { currentValue: '0.6.0', newValue: '0.8.0', }; - hasha.fromStream.mockReturnValueOnce('abc123'); - const res = await bazelfile.updateDependency( - fileWithBzlExtension, - upgrade - ); + fromStream.mockResolvedValueOnce('abc123'); + const res = await updateDependency(fileWithBzlExtension, upgrade); expect(res).not.toEqual(fileWithBzlExtension); expect(res.indexOf('0.8.0')).not.toBe(-1); }); @@ -158,11 +153,8 @@ describe('manager/bazel/update', () => { currentValue: '0.6.0', newValue: '0.8.0', }; - hasha.fromStream.mockReturnValueOnce('abc123'); - const res = await bazelfile.updateDependency( - fileWithBzlExtension, - upgrade - ); + fromStream.mockResolvedValueOnce('abc123'); + const res = await updateDependency(fileWithBzlExtension, upgrade); expect(res).not.toEqual(fileWithBzlExtension); expect(res.indexOf('0.8.0')).not.toBe(-1); }); @@ -182,10 +174,7 @@ describe('manager/bazel/update', () => { currentValue: '0.6.0', newValue: '0.8.0', }; - const res = await bazelfile.updateDependency( - fileWithBzlExtension, - upgrade - ); + const res = await updateDependency(fileWithBzlExtension, upgrade); expect(res).toBeNull(); }); it('errors for http_archive without urls', async () => { @@ -206,8 +195,8 @@ http_archive( currentValue: '0.5.0', newValue: '0.6.2', }; - hasha.fromStream.mockReturnValueOnce('abc123'); - const res = await bazelfile.updateDependency(content, upgrade); + fromStream.mockResolvedValueOnce('abc123'); + const res = await updateDependency(content, upgrade); expect(res).toBeNull(); }); it('updates http_archive with urls array', async () => { @@ -232,8 +221,8 @@ http_archive( currentValue: '0.5.0', newValue: '0.6.2', }; - hasha.fromStream.mockReturnValueOnce('abc123'); - const res = await bazelfile.updateDependency(content, upgrade); + fromStream.mockResolvedValueOnce('abc123'); + const res = await updateDependency(content, upgrade); expect(res).not.toEqual(content); expect(res.indexOf('0.5.0')).toBe(-1); expect(res.indexOf('0.6.2')).not.toBe(-1); diff --git a/test/manager/buildkite/__snapshots__/extract.spec.js.snap b/test/manager/buildkite/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/buildkite/__snapshots__/extract.spec.js.snap rename to test/manager/buildkite/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/buildkite/__snapshots__/update.spec.js.snap b/test/manager/buildkite/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/buildkite/__snapshots__/update.spec.js.snap rename to test/manager/buildkite/__snapshots__/update.spec.ts.snap diff --git a/test/manager/buildkite/extract.spec.js b/test/manager/buildkite/extract.spec.ts similarity index 82% rename from test/manager/buildkite/extract.spec.js rename to test/manager/buildkite/extract.spec.ts index 0a06072b78f663397383b658ccc4333b3ca5da47..54cce560f552edbe37220fdf842bb3a59feb28c9 100644 --- a/test/manager/buildkite/extract.spec.js +++ b/test/manager/buildkite/extract.spec.ts @@ -1,21 +1,19 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/buildkite/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/buildkite/extract'; -const pipeline1 = fs.readFileSync( +const pipeline1 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline1.yml', 'utf8' ); -const pipeline2 = fs.readFileSync( +const pipeline2 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline2.yml', 'utf8' ); -const pipeline3 = fs.readFileSync( +const pipeline3 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline3.yml', 'utf8' ); -const pipeline4 = fs.readFileSync( +const pipeline4 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline4.yml', 'utf8' ); diff --git a/test/manager/buildkite/update.spec.js b/test/manager/buildkite/update.spec.ts similarity index 72% rename from test/manager/buildkite/update.spec.js rename to test/manager/buildkite/update.spec.ts index c1e80933e0d08a10815cb6cc7064b246651099f4..d846c0d2b131a620367718527ab02094165c0b3e 100644 --- a/test/manager/buildkite/update.spec.js +++ b/test/manager/buildkite/update.spec.ts @@ -1,15 +1,15 @@ -const fs = require('fs'); -const bkUpdate = require('../../../lib/manager/buildkite/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/buildkite/update'; -const pipeline1 = fs.readFileSync( +const pipeline1 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline1.yml', 'utf8' ); -const pipeline2 = fs.readFileSync( +const pipeline2 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline2.yml', 'utf8' ); -const pipeline4 = fs.readFileSync( +const pipeline4 = readFileSync( 'test/manager/buildkite/_fixtures/pipeline4.yml', 'utf8' ); @@ -21,7 +21,7 @@ describe('manager/buildkite/update', () => { managerData: { lineNumber: 2 }, newValue: 'v2.2.0', }; - const res = bkUpdate.updateDependency(pipeline1, upgrade); + const res = updateDependency(pipeline1, upgrade); expect(res).not.toEqual(pipeline1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -30,7 +30,7 @@ describe('manager/buildkite/update', () => { managerData: { lineNumber: 10 }, newValue: 'v2.2.0', }; - const res = bkUpdate.updateDependency(pipeline4, upgrade); + const res = updateDependency(pipeline4, upgrade); expect(res).not.toEqual(pipeline4); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -39,14 +39,14 @@ describe('manager/buildkite/update', () => { managerData: { lineNumber: 4 }, newValue: 'v1.5.0', }; - const res1 = bkUpdate.updateDependency(pipeline2, upgrade1); + const res1 = updateDependency(pipeline2, upgrade1); expect(res1).not.toEqual(pipeline2); expect(res1.includes(upgrade1.newValue)).toBe(true); const upgrade2 = { managerData: { lineNumber: 15 }, newValue: 'v1.5.0', }; - const res2 = bkUpdate.updateDependency(res1, upgrade2); + const res2 = updateDependency(res1, upgrade2); expect(res2).not.toEqual(res1); expect(res2).toMatchSnapshot(); }); @@ -55,7 +55,7 @@ describe('manager/buildkite/update', () => { managerData: { lineNumber: 2 }, newValue: 'v2.0.0', }; - const res = bkUpdate.updateDependency(pipeline1, upgrade); + const res = updateDependency(pipeline1, upgrade); expect(res).toEqual(pipeline1); }); it('returns null if mismatch', () => { @@ -63,11 +63,11 @@ describe('manager/buildkite/update', () => { managerData: { lineNumber: 3 }, newValue: 'v2.2.0', }; - const res = bkUpdate.updateDependency(pipeline1, upgrade); + const res = updateDependency(pipeline1, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = bkUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/bundler/__snapshots__/extract.spec.js.snap b/test/manager/bundler/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/bundler/__snapshots__/extract.spec.js.snap rename to test/manager/bundler/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/bundler/artifacts.spec.js b/test/manager/bundler/artifacts.spec.ts similarity index 57% rename from test/manager/bundler/artifacts.spec.js rename to test/manager/bundler/artifacts.spec.ts index 08cfdee3d0a977598242dc28e5d604a3563b85e4..247879677e1a4597b84eb42566baaf8d8ad5b25b 100644 --- a/test/manager/bundler/artifacts.spec.js +++ b/test/manager/bundler/artifacts.spec.ts @@ -1,4 +1,4 @@ -const cargo = require('../../../lib/manager/bundler/artifacts'); +import { updateArtifacts } from '../../../lib/manager/bundler/artifacts'; let config; @@ -8,6 +8,6 @@ describe('bundler.updateArtifacts()', () => { config = {}; }); it('returns null by default', async () => { - expect(await cargo.updateArtifacts('', [], '', config)).toBeNull(); + expect(await updateArtifacts('', [], '', config)).toBeNull(); }); }); diff --git a/test/manager/bundler/extract.spec.js b/test/manager/bundler/extract.spec.ts similarity index 79% rename from test/manager/bundler/extract.spec.js rename to test/manager/bundler/extract.spec.ts index 220c6fcb0214add1aa43a54b796c4e575634e6e3..7c6c295f8110c12d0cebe6baf1c9c6dc0b72afb7 100644 --- a/test/manager/bundler/extract.spec.js +++ b/test/manager/bundler/extract.spec.ts @@ -1,19 +1,18 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/bundler/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/bundler/extract'; -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; -const railsGemfile = fs.readFileSync( +const railsGemfile = readFileSync( 'test/manager/bundler/_fixtures/Gemfile.rails', 'utf8' ); -const railsGemfileLock = fs.readFileSync( +const railsGemfileLock = readFileSync( 'test/manager/bundler/_fixtures/Gemfile.rails.lock', 'utf8' ); -const sourceGroupGemfile = fs.readFileSync( +const sourceGroupGemfile = readFileSync( 'test/manager/bundler/_fixtures/Gemfile.sourceGroup', 'utf8' ); diff --git a/test/manager/bundler/range.spec.js b/test/manager/bundler/range.spec.ts similarity index 74% rename from test/manager/bundler/range.spec.js rename to test/manager/bundler/range.spec.ts index 2b69f36a7ed7899381831d7d7b930674e4657477..9983e51d5df5e743888d0537e40874dac6f155bf 100644 --- a/test/manager/bundler/range.spec.js +++ b/test/manager/bundler/range.spec.ts @@ -1,4 +1,4 @@ -const { getRangeStrategy } = require('../../../lib/manager/bundler'); +import { getRangeStrategy } from '../../../lib/manager/bundler'; describe('lib/manager/bundler/range', () => { describe('getRangeStrategy()', () => { diff --git a/test/manager/bundler/update.spec.js b/test/manager/bundler/update.spec.ts similarity index 91% rename from test/manager/bundler/update.spec.js rename to test/manager/bundler/update.spec.ts index 3aee0a21e2c05626e3f0116ee29b51a5e6823353..ff4db0833d76547d40a99d9c7fe94afc18fa34b3 100644 --- a/test/manager/bundler/update.spec.js +++ b/test/manager/bundler/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const { updateDependency } = require('../../../lib/manager/bundler/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/bundler/update'; -const railsGemfile = fs.readFileSync( +const railsGemfile = readFileSync( 'test/manager/bundler/_fixtures/Gemfile.rails', 'utf8' ); diff --git a/test/manager/cargo/__snapshots__/artifacts.spec.js.snap b/test/manager/cargo/__snapshots__/artifacts.spec.ts.snap similarity index 100% rename from test/manager/cargo/__snapshots__/artifacts.spec.js.snap rename to test/manager/cargo/__snapshots__/artifacts.spec.ts.snap diff --git a/test/manager/cargo/__snapshots__/extract.spec.js.snap b/test/manager/cargo/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/cargo/__snapshots__/extract.spec.js.snap rename to test/manager/cargo/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/cargo/__snapshots__/update.spec.js.snap b/test/manager/cargo/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/cargo/__snapshots__/update.spec.js.snap rename to test/manager/cargo/__snapshots__/update.spec.ts.snap diff --git a/test/manager/cargo/artifacts.spec.js b/test/manager/cargo/artifacts.spec.ts similarity index 73% rename from test/manager/cargo/artifacts.spec.js rename to test/manager/cargo/artifacts.spec.ts index baa4021e74875f4f4586be12e8342fb6080c7ae1..7d6047401b164396cea6e28809d68480aafb709f 100644 --- a/test/manager/cargo/artifacts.spec.js +++ b/test/manager/cargo/artifacts.spec.ts @@ -1,14 +1,12 @@ +import _fs from 'fs-extra'; +import * as cargo from '../../../lib/manager/cargo/artifacts'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); - -/** @type any */ -const fs = require('fs-extra'); -/** @type any */ const { exec } = require('../../../lib/util/exec'); -const cargo = require('../../../lib/manager/cargo/artifacts'); -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; +const fs: any = _fs; const config = { localDir: '/tmp/github/some/repo', @@ -22,12 +20,7 @@ describe('.updateArtifacts()', () => { delete global.trustLevel; }); it('returns null if no Cargo.lock found', async () => { - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( await cargo.updateArtifacts('Cargo.toml', updatedDeps, '', config) ).toBeNull(); @@ -44,12 +37,7 @@ describe('.updateArtifacts()', () => { stderror: '', }); fs.readFile = jest.fn(() => 'Current Cargo.lock'); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( await cargo.updateArtifacts('Cargo.toml', updatedDeps, '', config) ).toBeNull(); @@ -61,12 +49,7 @@ describe('.updateArtifacts()', () => { stderror: '', }); fs.readFile = jest.fn(() => 'New Cargo.lock'); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; global.trustLevel = 'high'; expect( await cargo.updateArtifacts('Cargo.toml', updatedDeps, '{}', config) @@ -77,12 +60,7 @@ describe('.updateArtifacts()', () => { fs.outputFile = jest.fn(() => { throw new Error('not found'); }); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( await cargo.updateArtifacts('Cargo.toml', updatedDeps, '{}', config) ).toMatchSnapshot(); diff --git a/test/manager/cargo/extract.spec.js b/test/manager/cargo/extract.spec.ts similarity index 87% rename from test/manager/cargo/extract.spec.js rename to test/manager/cargo/extract.spec.ts index 41a5a2c5986ec4f17a43e2df99bb9b3f4fceae71..9694f6682c33d8f485b4e9f0790acb76e16edd44 100644 --- a/test/manager/cargo/extract.spec.js +++ b/test/manager/cargo/extract.spec.ts @@ -1,23 +1,23 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/cargo/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/cargo/extract'; -const cargo1toml = fs.readFileSync( +const cargo1toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.1.toml', 'utf8' ); -const cargo2toml = fs.readFileSync( +const cargo2toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.2.toml', 'utf8' ); -const cargo3toml = fs.readFileSync( +const cargo3toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.3.toml', 'utf8' ); -const cargo4toml = fs.readFileSync( +const cargo4toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.4.toml', 'utf8' ); -const cargo5toml = fs.readFileSync( +const cargo5toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.5.toml', 'utf8' ); diff --git a/test/manager/cargo/update.spec.js b/test/manager/cargo/update.spec.ts similarity index 96% rename from test/manager/cargo/update.spec.js rename to test/manager/cargo/update.spec.ts index 733a313ca1596abd13b289aa6fd2f63b35dcdce7..d74c3657cd6cc260919f1f5d760a7345c5b09f3b 100644 --- a/test/manager/cargo/update.spec.js +++ b/test/manager/cargo/update.spec.ts @@ -1,15 +1,15 @@ -const fs = require('fs'); -const { updateDependency } = require('../../../lib/manager/cargo/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/cargo/update'; -const cargo1toml = fs.readFileSync( +const cargo1toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.1.toml', 'utf8' ); -const cargo4toml = fs.readFileSync( +const cargo4toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.4.toml', 'utf8' ); -const cargo5toml = fs.readFileSync( +const cargo5toml = readFileSync( 'test/manager/cargo/_fixtures/Cargo.5.toml', 'utf8' ); diff --git a/test/manager/circleci/__snapshots__/extract.spec.js.snap b/test/manager/circleci/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/circleci/__snapshots__/extract.spec.js.snap rename to test/manager/circleci/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/circleci/extract.spec.js b/test/manager/circleci/extract.spec.ts similarity index 80% rename from test/manager/circleci/extract.spec.js rename to test/manager/circleci/extract.spec.ts index 92a66b5784373128555fa30d0a88f9b07abeb7c1..35c2b5e6ebd94612d2c9260c6413cc0756032150 100644 --- a/test/manager/circleci/extract.spec.js +++ b/test/manager/circleci/extract.spec.ts @@ -1,11 +1,11 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/circleci/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/circleci/extract'; -const file1 = fs.readFileSync( +const file1 = readFileSync( 'test/manager/circleci/_fixtures/config.yml', 'utf8' ); -const file2 = fs.readFileSync( +const file2 = readFileSync( 'test/manager/circleci/_fixtures/config2.yml', 'utf8' ); diff --git a/test/manager/circleci/update.spec.js b/test/manager/circleci/update.spec.ts similarity index 94% rename from test/manager/circleci/update.spec.js rename to test/manager/circleci/update.spec.ts index a4357ba3b61d99545fcd27179345a0da95bd59d3..6c22cfd3638e7d335039c560d5a84c905db2fa5c 100644 --- a/test/manager/circleci/update.spec.js +++ b/test/manager/circleci/update.spec.ts @@ -1,11 +1,11 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/circleci/update'); +import { readFileSync } from 'fs'; +import * as dcUpdate from '../../../lib/manager/circleci/update'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/circleci/_fixtures/config.yml', 'utf8' ); -const yamlFile2 = fs.readFileSync( +const yamlFile2 = readFileSync( 'test/manager/circleci/_fixtures/config2.yml', 'utf8' ); diff --git a/test/manager/composer/__snapshots__/artifacts.spec.js.snap b/test/manager/composer/__snapshots__/artifacts.spec.ts.snap similarity index 100% rename from test/manager/composer/__snapshots__/artifacts.spec.js.snap rename to test/manager/composer/__snapshots__/artifacts.spec.ts.snap diff --git a/test/manager/composer/__snapshots__/extract.spec.js.snap b/test/manager/composer/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/composer/__snapshots__/extract.spec.js.snap rename to test/manager/composer/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/composer/artifacts.spec.js b/test/manager/composer/artifacts.spec.ts similarity index 95% rename from test/manager/composer/artifacts.spec.js rename to test/manager/composer/artifacts.spec.ts index 01980647dbd0551d7040d329353bb94cc22250d0..215b9a5a6176f7da1677e83f1ac73a3dfdd320aa 100644 --- a/test/manager/composer/artifacts.spec.js +++ b/test/manager/composer/artifacts.spec.ts @@ -1,17 +1,15 @@ +import _fs from 'fs-extra'; +import * as composer from '../../../lib/manager/composer/artifacts'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); jest.mock('../../../lib/util/host-rules'); -/** @type any */ -const fs = require('fs-extra'); -/** @type any */ const { exec } = require('../../../lib/util/exec'); -const composer = require('../../../lib/manager/composer/artifacts'); -/** @type any */ const hostRules = require('../../../lib/util/host-rules'); -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; +const fs: any = _fs; const config = { localDir: '/tmp/github/some/repo', diff --git a/test/manager/composer/extract.spec.js b/test/manager/composer/extract.spec.ts similarity index 80% rename from test/manager/composer/extract.spec.js rename to test/manager/composer/extract.spec.ts index c01ce51f071f7fe8e6cf63652ca1980a11e30915..380bfb27908e720e33eab97fe8f1f5ec43c7a0a3 100644 --- a/test/manager/composer/extract.spec.js +++ b/test/manager/composer/extract.spec.ts @@ -1,30 +1,29 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/composer/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/composer/extract'; -/** @type any */ -const platform = global.platform; +const platform: jest.Mocked<typeof global.platform> = global.platform as any; -const requirements1 = fs.readFileSync( +const requirements1 = readFileSync( 'test/manager/composer/_fixtures/composer1.json', 'utf8' ); -const requirements2 = fs.readFileSync( +const requirements2 = readFileSync( 'test/manager/composer/_fixtures/composer2.json', 'utf8' ); -const requirements3 = fs.readFileSync( +const requirements3 = readFileSync( 'test/manager/composer/_fixtures/composer3.json', 'utf8' ); -const requirements4 = fs.readFileSync( +const requirements4 = readFileSync( 'test/manager/composer/_fixtures/composer4.json', 'utf8' ); -const requirements5 = fs.readFileSync( +const requirements5 = readFileSync( 'test/manager/composer/_fixtures/composer5.json', 'utf8' ); -const requirements5Lock = fs.readFileSync( +const requirements5Lock = readFileSync( 'test/manager/composer/_fixtures/composer5.lock', 'utf8' ); @@ -61,13 +60,13 @@ describe('lib/manager/composer/extract', () => { expect(res.registryUrls).toHaveLength(1); }); it('extracts object repositories and registryUrls with lock file', async () => { - platform.getFile.mockReturnValueOnce(requirements5Lock); + platform.getFile.mockResolvedValue(requirements5Lock); const res = await extractPackageFile(requirements5, packageFile); expect(res).toMatchSnapshot(); expect(res.registryUrls).toHaveLength(1); }); it('extracts dependencies with lock file', async () => { - platform.getFile.mockReturnValueOnce('some content'); + platform.getFile.mockResolvedValue('some content'); const res = await extractPackageFile(requirements1, packageFile); expect(res).toMatchSnapshot(); }); diff --git a/test/manager/composer/range.spec.js b/test/manager/composer/range.spec.ts similarity index 67% rename from test/manager/composer/range.spec.js rename to test/manager/composer/range.spec.ts index 985f3daf3a8ef32259e2cf384eaef863fa1b0953..c7a01066b25848a75d1f84a665ea944495ad01a5 100644 --- a/test/manager/composer/range.spec.js +++ b/test/manager/composer/range.spec.ts @@ -1,16 +1,20 @@ -const { getRangeStrategy } = require('../../../lib/manager/composer'); +import { getRangeStrategy } from '../../../lib/manager/composer'; +import { RangeConfig } from '../../../lib/manager/common'; describe('getRangeStrategy', () => { it('returns same if not auto', () => { - const config = { rangeStrategy: 'widen' }; + const config: RangeConfig = { rangeStrategy: 'widen' }; expect(getRangeStrategy(config)).toEqual('widen'); }); it('pins require-dev', () => { - const config = { rangeStrategy: 'auto', depType: 'require-dev' }; + const config: RangeConfig = { + rangeStrategy: 'auto', + depType: 'require-dev', + }; expect(getRangeStrategy(config)).toEqual('pin'); }); it('pins project require', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'auto', managerData: { composerJsonType: 'project' }, depType: 'require', @@ -18,7 +22,7 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('pin'); }); it('widens complex ranges', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require', currentValue: '^1.6.0 || ^2.0.0', @@ -26,7 +30,7 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('widen'); }); it('widens complex bump', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'bump', depType: 'require', currentValue: '^1.6.0 || ^2.0.0', @@ -34,7 +38,7 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('widen'); }); it('defaults to replace', () => { - const config = { rangeStrategy: 'auto', depType: 'require' }; + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' }; expect(getRangeStrategy(config)).toEqual('replace'); }); }); diff --git a/test/manager/deps-edn/__snapshots__/extract.spec.js.snap b/test/manager/deps-edn/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/deps-edn/__snapshots__/extract.spec.js.snap rename to test/manager/deps-edn/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/deps-edn/extract.spec.js b/test/manager/deps-edn/extract.spec.js deleted file mode 100644 index e5b1856ddb5649d635d6897fe3162bd42831e2ad..0000000000000000000000000000000000000000 --- a/test/manager/deps-edn/extract.spec.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable no-template-curly-in-string */ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/deps-edn/extract'); - -const depsEdn = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/deps.edn`), - 'utf8' -); - -describe('manager/deps-edn/extract', () => { - it('extractPackageFile', () => { - expect(extractPackageFile(depsEdn)).toMatchSnapshot(); - }); -}); diff --git a/test/manager/deps-edn/extract.spec.ts b/test/manager/deps-edn/extract.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d3f41c6263ba66d37f4859274c6badaf150d85a6 --- /dev/null +++ b/test/manager/deps-edn/extract.spec.ts @@ -0,0 +1,15 @@ +/* eslint-disable no-template-curly-in-string */ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/deps-edn/extract'; + +const depsEdn = readFileSync( + resolve(__dirname, `./_fixtures/deps.edn`), + 'utf8' +); + +describe('manager/deps-edn/extract', () => { + it('extractPackageFile', () => { + expect(extractPackageFile(depsEdn)).toMatchSnapshot(); + }); +}); diff --git a/test/manager/deps-edn/update.spec.js b/test/manager/deps-edn/update.spec.ts similarity index 64% rename from test/manager/deps-edn/update.spec.js rename to test/manager/deps-edn/update.spec.ts index 61ac28a57b1d5b09085fcdad9d995f343dbd9de0..4d71d698d3ed22ee23738bd6ff801639945b0585 100644 --- a/test/manager/deps-edn/update.spec.js +++ b/test/manager/deps-edn/update.spec.ts @@ -1,11 +1,11 @@ /* eslint-disable no-template-curly-in-string */ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/deps-edn/extract'); -const { updateDependency } = require('../../../lib/manager/deps-edn/update'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/deps-edn/extract'; +import { updateDependency } from '../../../lib/manager/deps-edn/update'; -const depsEdn = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/deps.edn`), +const depsEdn = readFileSync( + resolve(__dirname, `./_fixtures/deps.edn`), 'utf8' ); diff --git a/test/manager/docker-compose/__snapshots__/extract.spec.js.snap b/test/manager/docker-compose/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/docker-compose/__snapshots__/extract.spec.js.snap rename to test/manager/docker-compose/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/docker-compose/extract.spec.js b/test/manager/docker-compose/extract.spec.ts similarity index 76% rename from test/manager/docker-compose/extract.spec.js rename to test/manager/docker-compose/extract.spec.ts index 51bf755ecaed3972c933c8a6034c3b227c90c02f..40875f90f57da59053ef0dcfa885b41f281c3599 100644 --- a/test/manager/docker-compose/extract.spec.js +++ b/test/manager/docker-compose/extract.spec.ts @@ -1,9 +1,7 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/docker-compose/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/docker-compose/extract'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/docker-compose/_fixtures/docker-compose.1.yml', 'utf8' ); diff --git a/test/manager/docker-compose/update.spec.js b/test/manager/docker-compose/update.spec.ts similarity index 72% rename from test/manager/docker-compose/update.spec.js rename to test/manager/docker-compose/update.spec.ts index b23a1543aded026eafc019a7bb0d4e5d700b29b2..4b215593181dfabe33378bb70a9223f1658e571e 100644 --- a/test/manager/docker-compose/update.spec.js +++ b/test/manager/docker-compose/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/docker-compose/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/docker-compose/update'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/docker-compose/_fixtures/docker-compose.1.yml', 'utf8' ); @@ -15,7 +15,7 @@ describe('manager/docker-compose/update', () => { newValue: '9.6.8', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -25,7 +25,7 @@ describe('manager/docker-compose/update', () => { depName: 'quay.io/something/redis', newValue: 'alpine', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('returns null if mismatch', () => { @@ -33,11 +33,11 @@ describe('manager/docker-compose/update', () => { managerData: { lineNumber: 17 }, newFrom: 'postgres:9.6.8@sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/dockerfile/__snapshots__/extract.spec.js.snap b/test/manager/dockerfile/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/dockerfile/__snapshots__/extract.spec.js.snap rename to test/manager/dockerfile/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/dockerfile/__snapshots__/update.spec.js.snap b/test/manager/dockerfile/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/dockerfile/__snapshots__/update.spec.js.snap rename to test/manager/dockerfile/__snapshots__/update.spec.ts.snap diff --git a/test/manager/dockerfile/extract.spec.js b/test/manager/dockerfile/extract.spec.ts similarity index 97% rename from test/manager/dockerfile/extract.spec.js rename to test/manager/dockerfile/extract.spec.ts index e348ea6fc2e5862d938d911a6b94176ec2382628..310d7cadff9aea2a98f2a31eee7442985882ee90 100644 --- a/test/manager/dockerfile/extract.spec.js +++ b/test/manager/dockerfile/extract.spec.ts @@ -1,9 +1,7 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/dockerfile/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/dockerfile/extract'; -const d1 = fs.readFileSync( +const d1 = readFileSync( 'test/manager/dockerfile/_fixtures/Dockerfile1', 'utf8' ); diff --git a/test/manager/dockerfile/update.spec.js b/test/manager/dockerfile/update.spec.ts similarity index 98% rename from test/manager/dockerfile/update.spec.js rename to test/manager/dockerfile/update.spec.ts index 5a9280a9423bada45e71ed26c1832e02ab7b573d..c9a65e8b918dc4687d76772472a3fd3789c91f58 100644 --- a/test/manager/dockerfile/update.spec.js +++ b/test/manager/dockerfile/update.spec.ts @@ -1,4 +1,4 @@ -const dockerfile = require('../../../lib/manager/dockerfile/update'); +import * as dockerfile from '../../../lib/manager/dockerfile/update'; describe('manager/dockerfile/update', () => { describe('updateDependency', () => { diff --git a/test/manager/github-actions/__snapshots__/extract.spec.js.snap b/test/manager/github-actions/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/github-actions/__snapshots__/extract.spec.js.snap rename to test/manager/github-actions/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/github-actions/extract.spec.js b/test/manager/github-actions/extract.spec.ts similarity index 76% rename from test/manager/github-actions/extract.spec.js rename to test/manager/github-actions/extract.spec.ts index c5fa9d75fdf9d657ce1a1cfb1790ed4c2f9e8eab..73b920be4deffe38586f3062d147956f0e28687d 100644 --- a/test/manager/github-actions/extract.spec.js +++ b/test/manager/github-actions/extract.spec.ts @@ -1,9 +1,7 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/github-actions/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/github-actions/extract'; -const workflow1 = fs.readFileSync( +const workflow1 = readFileSync( 'test/manager/github-actions/_fixtures/main.workflow.1', 'utf8' ); diff --git a/test/manager/github-actions/update.spec.js b/test/manager/github-actions/update.spec.ts similarity index 71% rename from test/manager/github-actions/update.spec.js rename to test/manager/github-actions/update.spec.ts index 1022c4e3be720dcf1df2b7865781cd4115446200..b260273f3eebf63798af6197255207fa36ab1c4b 100644 --- a/test/manager/github-actions/update.spec.js +++ b/test/manager/github-actions/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/github-actions/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/github-actions/update'; -const workflow1 = fs.readFileSync( +const workflow1 = readFileSync( 'test/manager/github-actions/_fixtures/main.workflow.1', 'utf8' ); @@ -14,7 +14,7 @@ describe('manager/github-actions/update', () => { depName: 'replicated/dockerfilelint', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(workflow1, upgrade); + const res = updateDependency(workflow1, upgrade); expect(res).not.toEqual(workflow1); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -23,7 +23,7 @@ describe('manager/github-actions/update', () => { managerData: { lineNumber: 11 }, depName: 'replicated/dockerfilelint', }; - const res = dcUpdate.updateDependency(workflow1, upgrade); + const res = updateDependency(workflow1, upgrade); expect(res).toEqual(workflow1); }); it('returns null if mismatch', () => { @@ -31,11 +31,11 @@ describe('manager/github-actions/update', () => { managerData: { lineNumber: 12 }, newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(workflow1, upgrade); + const res = updateDependency(workflow1, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/gitlabci-include/__snapshots__/extract.spec.js.snap b/test/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/gitlabci-include/__snapshots__/extract.spec.js.snap rename to test/manager/gitlabci-include/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/gitlabci-include/extract.spec.js b/test/manager/gitlabci-include/extract.spec.ts similarity index 77% rename from test/manager/gitlabci-include/extract.spec.js rename to test/manager/gitlabci-include/extract.spec.ts index bb479bd4beaf20438fac6c1728511be9e5cef483..57458c8e5a43cbfc06604ac10306268f747ee104 100644 --- a/test/manager/gitlabci-include/extract.spec.js +++ b/test/manager/gitlabci-include/extract.spec.ts @@ -1,7 +1,6 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/gitlabci-include/extract'); +import fs from 'fs'; +import { extractPackageFile } from '../../../lib/manager/gitlabci-include/extract'; +import { ExtractConfig } from '../../../lib/manager/common'; const yamlFile = fs.readFileSync( 'test/manager/gitlabci-include/_fixtures/gitlab-ci.yaml', @@ -10,7 +9,7 @@ const yamlFile = fs.readFileSync( describe('lib/manager/gitlabci-include/extract', () => { describe('extractPackageFile()', () => { - let config; + let config: ExtractConfig; beforeEach(() => { config = { endpoint: 'http://gitlab.test/api/v4/', diff --git a/test/manager/gitlabci-include/update.spec.js b/test/manager/gitlabci-include/update.spec.ts similarity index 70% rename from test/manager/gitlabci-include/update.spec.js rename to test/manager/gitlabci-include/update.spec.ts index a3fb903afc0f1d91e6c275d1ac5f1a30c21043c3..6c3dddff72de8d9f2d832a7d20591fed51f78de5 100644 --- a/test/manager/gitlabci-include/update.spec.js +++ b/test/manager/gitlabci-include/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/gitlabci-include/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/gitlabci-include/update'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/gitlabci-include/_fixtures/gitlab-ci.yaml', 'utf8' ); @@ -14,7 +14,7 @@ describe('manager/gitlabci-include/update', () => { depName: 'mikebryant/include-source-example', newValue: '1.0.1', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -24,11 +24,11 @@ describe('manager/gitlabci-include/update', () => { depName: 'mikebryant/include-source-example', newValue: '1.0.0', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/gitlabci/__snapshots__/extract.spec.js.snap b/test/manager/gitlabci/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/gitlabci/__snapshots__/extract.spec.js.snap rename to test/manager/gitlabci/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/gitlabci/extract.spec.js b/test/manager/gitlabci/extract.spec.ts similarity index 76% rename from test/manager/gitlabci/extract.spec.js rename to test/manager/gitlabci/extract.spec.ts index b86f618fcea0da574ee4f9cd636b45d25f9dc84f..51201ee49bb7ae66d04494a760364162e6754cfd 100644 --- a/test/manager/gitlabci/extract.spec.js +++ b/test/manager/gitlabci/extract.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/gitlabci/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/gitlabci/extract'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/gitlabci/_fixtures/gitlab-ci.yaml', 'utf8' ); diff --git a/test/manager/gitlabci/update.spec.js b/test/manager/gitlabci/update.spec.ts similarity index 78% rename from test/manager/gitlabci/update.spec.js rename to test/manager/gitlabci/update.spec.ts index b08a0b58327a365237187291888610cc5c745323..9f0032abc51072c2253a694c3245bc1b5c7c4dd3 100644 --- a/test/manager/gitlabci/update.spec.js +++ b/test/manager/gitlabci/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/gitlabci/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/gitlabci/update'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/gitlabci/_fixtures/gitlab-ci.yaml', 'utf8' ); @@ -16,7 +16,7 @@ describe('manager/gitlabci/update', () => { newValue: '7.0.0', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -27,7 +27,7 @@ describe('manager/gitlabci/update', () => { depName: 'hadolint/hadolint', newValue: 'latest', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('returns null if mismatch', () => { @@ -38,7 +38,7 @@ describe('manager/gitlabci/update', () => { newValue: '9.6.8', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toBeNull(); }); it('replaces image-name value', () => { @@ -48,7 +48,7 @@ describe('manager/gitlabci/update', () => { depName: 'image-name-test', newValue: '1.35', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); }); it('returns same image-name value', () => { @@ -58,7 +58,7 @@ describe('manager/gitlabci/update', () => { depName: 'image-name-test', newValue: '1.15', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('replaces service-image update', () => { @@ -69,7 +69,7 @@ describe('manager/gitlabci/update', () => { newValue: '7.0.0', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -81,7 +81,7 @@ describe('manager/gitlabci/update', () => { newValue: '9.6.8', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toBeNull(); }); it('returns service-image same', () => { @@ -91,11 +91,11 @@ describe('manager/gitlabci/update', () => { depName: 'docker', newValue: 'dind', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/gomod/__snapshots__/artifacts.spec.js.snap b/test/manager/gomod/__snapshots__/artifacts.spec.ts.snap similarity index 100% rename from test/manager/gomod/__snapshots__/artifacts.spec.js.snap rename to test/manager/gomod/__snapshots__/artifacts.spec.ts.snap diff --git a/test/manager/gomod/__snapshots__/extract.spec.js.snap b/test/manager/gomod/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/gomod/__snapshots__/extract.spec.js.snap rename to test/manager/gomod/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/gomod/__snapshots__/update.spec.js.snap b/test/manager/gomod/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/gomod/__snapshots__/update.spec.js.snap rename to test/manager/gomod/__snapshots__/update.spec.ts.snap diff --git a/test/manager/gomod/artifacts.spec.js b/test/manager/gomod/artifacts.spec.ts similarity index 95% rename from test/manager/gomod/artifacts.spec.js rename to test/manager/gomod/artifacts.spec.ts index acecb96d2e5afe2f1aefeb910e5bcd0fb0311fb2..b05158629b47ebe87202175bbf201963fd7f1237 100644 --- a/test/manager/gomod/artifacts.spec.js +++ b/test/manager/gomod/artifacts.spec.ts @@ -1,17 +1,15 @@ +import _fs from 'fs-extra'; +import * as gomod from '../../../lib/manager/gomod/artifacts'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); jest.mock('../../../lib/util/host-rules'); -/** @type any */ -const fs = require('fs-extra'); -/** @type any */ const { exec } = require('../../../lib/util/exec'); -const gomod = require('../../../lib/manager/gomod/artifacts'); -/** @type any */ const hostRules = require('../../../lib/util/host-rules'); -/** @type any */ -const platform = global.platform; +const fs: any = _fs; +const platform: any = global.platform; const gomod1 = `module github.com/renovate-tests/gomod1 diff --git a/test/manager/gomod/extract.spec.js b/test/manager/gomod/extract.spec.ts similarity index 74% rename from test/manager/gomod/extract.spec.js rename to test/manager/gomod/extract.spec.ts index 0b01a595b4e436cfb099feec3f449aa6fdce6c34..405070a926d66c3e71e12f924918032ac3f5a362 100644 --- a/test/manager/gomod/extract.spec.js +++ b/test/manager/gomod/extract.spec.ts @@ -1,8 +1,8 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/gomod/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/gomod/extract'; -const gomod1 = fs.readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8'); -const gomod2 = fs.readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8'); +const gomod1 = readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8'); +const gomod2 = readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8'); describe('lib/manager/gomod/extract', () => { describe('extractPackageFile()', () => { diff --git a/test/manager/gomod/update.spec.js b/test/manager/gomod/update.spec.ts similarity index 83% rename from test/manager/gomod/update.spec.js rename to test/manager/gomod/update.spec.ts index 7e723cef9b380a7cb20cc88a9d8bb1fb8acacc89..261c0d585e1c590b2c905e0c423e40a64e4441a0 100644 --- a/test/manager/gomod/update.spec.js +++ b/test/manager/gomod/update.spec.ts @@ -1,8 +1,8 @@ -const fs = require('fs'); -const goUpdate = require('../../../lib/manager/gomod/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/gomod/update'; -const gomod1 = fs.readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8'); -const gomod2 = fs.readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8'); +const gomod1 = readFileSync('test/manager/gomod/_fixtures/1/go.mod', 'utf8'); +const gomod2 = readFileSync('test/manager/gomod/_fixtures/2/go.mod', 'utf8'); describe('manager/gomod/update', () => { describe('updateDependency', () => { @@ -13,7 +13,7 @@ describe('manager/gomod/update', () => { newValue: 'v0.8.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -24,7 +24,7 @@ describe('manager/gomod/update', () => { newValue: 'v0.8.0', depType: 'require', }; - const res1 = goUpdate.updateDependency(gomod1, upgrade1); + const res1 = updateDependency(gomod1, upgrade1); expect(res1).not.toEqual(gomod1); expect(res1.includes(upgrade1.newValue)).toBe(true); const upgrade2 = { @@ -33,7 +33,7 @@ describe('manager/gomod/update', () => { newValue: 'v1.15.36', depType: 'require', }; - const res2 = goUpdate.updateDependency(res1, upgrade2); + const res2 = updateDependency(res1, upgrade2); expect(res2).not.toEqual(res1); expect(res2).toMatchSnapshot(); }); @@ -43,7 +43,7 @@ describe('manager/gomod/update', () => { managerData: { lineNumber: 2 }, newValue: 'v0.7.0', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).toEqual(gomod1); }); it('replaces major updates > 1', () => { @@ -56,7 +56,7 @@ describe('manager/gomod/update', () => { newValue: 'v2.0.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); expect(res.includes('github.com/pkg/errors/v2')).toBe(true); @@ -71,7 +71,7 @@ describe('manager/gomod/update', () => { newValue: 'v2.0.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).toMatchSnapshot(); expect(res).not.toEqual(gomod2); expect(res.includes('gopkg.in/russross/blackfriday.v2 v2.0.0')).toBe( @@ -84,11 +84,11 @@ describe('manager/gomod/update', () => { managerData: { lineNumber: 2 }, newValue: 'v1.15.36', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = goUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); it('replaces multiline', () => { @@ -98,7 +98,7 @@ describe('manager/gomod/update', () => { newValue: 'v1.8.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -109,7 +109,7 @@ describe('manager/gomod/update', () => { newValue: 'v4.8.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).toMatchSnapshot(); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); @@ -124,7 +124,7 @@ describe('manager/gomod/update', () => { updateType: 'major', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); expect(res.includes('github.com/emirpasic/gods/v2')).toBe(true); @@ -139,7 +139,7 @@ describe('manager/gomod/update', () => { updateType: 'major', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); expect(res.includes('github.com/src-d/gcfg/v3')).toBe(true); @@ -154,7 +154,7 @@ describe('manager/gomod/update', () => { newDigest: '123456123456abcdef', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newDigest)).toBe(false); expect(res.includes(upgrade.newDigest.substring(0, 12))).toBe(true); @@ -169,7 +169,7 @@ describe('manager/gomod/update', () => { newDigest: '14d3d4c51834000000', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).toEqual(gomod2); }); it('handles multiline mismatch', () => { @@ -179,7 +179,7 @@ describe('manager/gomod/update', () => { newValue: 'v1.8.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod2, upgrade); + const res = updateDependency(gomod2, upgrade); expect(res).toBeNull(); }); it('handles +incompatible tag', () => { @@ -189,7 +189,7 @@ describe('manager/gomod/update', () => { newValue: 'v26.0.0', depType: 'require', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod1); // Assert that the version still contains +incompatible tag. expect(res.includes(upgrade.newValue + '+incompatible')).toBe(true); @@ -201,7 +201,7 @@ describe('manager/gomod/update', () => { newValue: 'v0.0.1', depType: 'replace', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -215,7 +215,7 @@ describe('manager/gomod/update', () => { newMajor: 2, updateType: 'major', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -231,7 +231,7 @@ describe('manager/gomod/update', () => { currentDigest: '14d3d4c51834', newDigest: '123456123456abcdef', }; - const res = goUpdate.updateDependency(gomod1, upgrade); + const res = updateDependency(gomod1, upgrade); expect(res).not.toEqual(gomod1); expect(res.includes(upgrade.newDigest.substring(0, 12))).toBe(true); }); diff --git a/test/manager/gradle-wrapper/__snapshots__/extract.spec.js.snap b/test/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/gradle-wrapper/__snapshots__/extract.spec.js.snap rename to test/manager/gradle-wrapper/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/gradle-wrapper/__snapshots__/update.spec.js.snap b/test/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/gradle-wrapper/__snapshots__/update.spec.js.snap rename to test/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap diff --git a/test/manager/gradle-wrapper/extract.spec.js b/test/manager/gradle-wrapper/extract.spec.ts similarity index 77% rename from test/manager/gradle-wrapper/extract.spec.js rename to test/manager/gradle-wrapper/extract.spec.ts index 08a4af42b2e3037cf17162adf0bc9c00a8202818..419c468fa6d7b9bd9515ea43bec4258eff1d9f5d 100644 --- a/test/manager/gradle-wrapper/extract.spec.js +++ b/test/manager/gradle-wrapper/extract.spec.ts @@ -1,13 +1,11 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/gradle-wrapper/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/gradle-wrapper/extract'; -const propertiesFile1 = fs.readFileSync( +const propertiesFile1 = readFileSync( 'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-1.properties', 'utf8' ); -const propertiesFile2 = fs.readFileSync( +const propertiesFile2 = readFileSync( 'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-2.properties', 'utf8' ); diff --git a/test/manager/gradle-wrapper/update.spec.js b/test/manager/gradle-wrapper/update.spec.ts similarity index 87% rename from test/manager/gradle-wrapper/update.spec.js rename to test/manager/gradle-wrapper/update.spec.ts index 1c4730b796c459cdc920c4bfe014704c65f7f057..8a89d6c54d9e7f4eecb03f735732732eb6d83f40 100644 --- a/test/manager/gradle-wrapper/update.spec.js +++ b/test/manager/gradle-wrapper/update.spec.ts @@ -1,9 +1,11 @@ -const fs = require('fs'); -const got = require('../../../lib/util/got'); -const dcUpdate = require('../../../lib/manager/gradle-wrapper/update'); +import fs from 'fs'; +import * as dcUpdate from '../../../lib/manager/gradle-wrapper'; +import * as _got from '../../../lib/util/got'; jest.mock('../../../lib/util/got'); +const got: jest.Mock<any> = _got as any; + const propertiesFile2 = fs.readFileSync( 'test/datasource/gradle-wrapper/_fixtures/gradle-wrapper-2.properties', 'utf8' @@ -72,18 +74,18 @@ describe('manager/gradle-wrapper/update', () => { const upgrade = { toVersion: '4.10.3', version: '4.10.3', - lineNumber: 5, - checksumLineNumber: 6, + managerData: { + lineNumber: 5, + checksumLineNumber: 6, + }, downloadUrl: 'https://services.gradle.org/distributions/gradle-4.10.3-all.zip', checksumUrl: 'https://services.gradle.org/distributions/gradle-4.10.3-all.zip.sha256', }; - got.mockImplementation(() => - Promise.reject({ - statusCode: 404, - }) - ); + got.mockRejectedValueOnce({ + statusCode: 404, + }); const res = await dcUpdate.updateDependency(propertiesFile2, upgrade); expect(res).toBeNull(); }); @@ -92,16 +94,16 @@ describe('manager/gradle-wrapper/update', () => { const upgrade = { toVersion: '4.10.3', version: '4.10.3', - lineNumber: 5, - checksumLineNumber: 6, + managerData: { + lineNumber: 5, + checksumLineNumber: 6, + }, downloadUrl: 'https://services.gradle.org/distributions/gradle-4.10.3-all.zip', checksumUrl: 'https://services.gradle.org/distributions/gradle-4.10.3-all.zip.sha256', }; - got.mockImplementation(() => { - throw new Error(); - }); + got.mockRejectedValueOnce(new Error()); const res = await dcUpdate.updateDependency(propertiesFile2, upgrade); expect(res).toBeNull(); }); diff --git a/test/manager/gradle/__snapshots__/index.spec.js.snap b/test/manager/gradle/__snapshots__/index.spec.ts.snap similarity index 100% rename from test/manager/gradle/__snapshots__/index.spec.js.snap rename to test/manager/gradle/__snapshots__/index.spec.ts.snap diff --git a/test/manager/gradle/build-gradle.spec.js b/test/manager/gradle/build-gradle.spec.ts similarity index 84% rename from test/manager/gradle/build-gradle.spec.js rename to test/manager/gradle/build-gradle.spec.ts index 514973395a74eb9dcf2926f63da7249d5a2822f6..da7d7c86cfe40aae7bf194a3f903b245365ce370 100644 --- a/test/manager/gradle/build-gradle.spec.js +++ b/test/manager/gradle/build-gradle.spec.ts @@ -1,23 +1,23 @@ -const gradle = require('../../../lib/manager/gradle/build-gradle'); +import { + init, + updateGradleVersion, + collectVersionVariables, +} from '../../../lib/manager/gradle/build-gradle'; describe('lib/manager/gradle/updateGradleVersion', () => { beforeEach(() => { - gradle.init(); + init(); }); it('returns the same file if dependency is null', () => { const gradleFile = "runtime('mysql:mysql-connector-java:6.0.5')"; - const updatedGradleFile = gradle.updateGradleVersion( - gradleFile, - null, - null - ); + const updatedGradleFile = updateGradleVersion(gradleFile, null, null); expect(updatedGradleFile).toEqual(gradleFile); }); it('returns the same file if version is not found', () => { const gradleFile = "runtime('mysql:mysql-connector-java:6.0.5')"; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'org.codehaus.groovy', name: 'groovy', version: '2.4.9' }, '7.0.0' @@ -27,7 +27,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { it('returns a file updated if the version is found', () => { const gradleFile = "runtime ( 'mysql:mysql-connector-java:6.0.5' )"; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' }, '7.0.0' @@ -40,7 +40,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { it('should returns a file updated with keeping an extension if the version is found', () => { const gradleFile = "runtime ( 'com.crashlytics.sdk.android:crashlytics:2.8.0@aar' )"; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'com.crashlytics.sdk.android', @@ -56,7 +56,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { it('should returns a file updated with keeping a classifier and an extension if the version is found', () => { const gradleFile = "runtime ( 'junit:junit:4.0:javadoc@jar' )"; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'junit', name: 'junit', version: '4.0' }, '5.0' @@ -70,7 +70,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { const gradleFile = `compile group : 'mysql' , name : 'mysql-connector-java', version: '6.0.5'`; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' }, '7.0.0' @@ -86,7 +86,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { const gradleFile = `String mysqlVersion= "6.0.5" runtime ( "mysql:mysql-connector-java:$mysqlVersion" ) `; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' }, '7.0.0' @@ -100,7 +100,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { const gradleFile = `String mysqlVersion = "6.0.5" runtime ( "mysql:mysql-connector-java:\${mysqlVersion}" ) `; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' }, '7.0.0' @@ -116,7 +116,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => { name : 'mysql-connector-java', version : mysqlVersion `; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleFile, { group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' }, '7.0.0' @@ -139,10 +139,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => { name: 'mysql-connector-java', version: '6.0.5', }; - gradle.collectVersionVariables([mysqlDependency], gradleFile); + collectVersionVariables([mysqlDependency], gradleFile); const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"'; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleWithVersionFile, mysqlDependency, '7.0.0' @@ -159,10 +159,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => { name: 'mysql-connector-java', version: '6.0.5', }; - gradle.collectVersionVariables([mysqlDependency], gradleFile); + collectVersionVariables([mysqlDependency], gradleFile); const propertyFile = 'mysqlVersion=6.0.5'; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( propertyFile, mysqlDependency, '7.0.0' @@ -181,10 +181,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => { name: 'mysql-connector-java', version: '6.0.5', }; - gradle.collectVersionVariables([mysqlDependency], gradleFile); + collectVersionVariables([mysqlDependency], gradleFile); const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"'; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleWithVersionFile, mysqlDependency, '7.0.0' @@ -201,10 +201,10 @@ describe('lib/manager/gradle/updateGradleVersion', () => { name: 'mysql-connector-java', version: '6.0.5', }; - gradle.collectVersionVariables([mysqlDependency], gradleFile); + collectVersionVariables([mysqlDependency], gradleFile); const gradleWithVersionFile = 'String mysqlVersion = "6.0.5"'; - const updatedGradleFile = gradle.updateGradleVersion( + const updatedGradleFile = updateGradleVersion( gradleWithVersionFile, mysqlDependency, '7.0.0' diff --git a/test/manager/gradle/index.spec.js b/test/manager/gradle/index.spec.ts similarity index 81% rename from test/manager/gradle/index.spec.js rename to test/manager/gradle/index.spec.ts index 0cf393329945e9e52e6bfae4fc53711ed67acd07..f2f27b37ab6cbf679a416c3035bdf6dca82e9b69 100644 --- a/test/manager/gradle/index.spec.js +++ b/test/manager/gradle/index.spec.ts @@ -1,17 +1,15 @@ +import { toUnix } from 'upath'; +import _fs from 'fs-extra'; +import fsReal from 'fs'; +import { exec as _exec } from '../../../lib/util/exec'; +import * as manager from '../../../lib/manager/gradle'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); -const { toUnix } = require('upath'); -/** @type any */ -const fs = require('fs-extra'); -const fsReal = require('fs'); -/** @type any */ -const { exec } = require('../../../lib/util/exec'); - -const manager = require('../../../lib/manager/gradle/index'); - -/** @type any */ -const platform = global.platform; +const _platform: jest.Mocked<typeof global.platform> = global.platform as any; +const fs: jest.Mocked<typeof _fs> = _fs as any; +const exec: jest.Mock<typeof _exec> = _exec as any; const config = { localDir: 'localDir', @@ -28,11 +26,11 @@ const updatesDependenciesReport = fsReal.readFileSync( describe('manager/gradle', () => { beforeEach(() => { jest.resetAllMocks(); - fs.readFile.mockReturnValue(updatesDependenciesReport); - fs.mkdir.mockReturnValue(true); - fs.exists.mockReturnValue(true); - exec.mockReturnValue({ stdout: 'gradle output', stderr: '' }); - platform.getFile.mockReturnValue('some content'); + fs.readFile.mockResolvedValue(updatesDependenciesReport as any); + fs.mkdir.mockResolvedValue(); + fs.exists.mockResolvedValue(true); + exec.mockResolvedValue({ stdout: 'gradle output', stderr: '' } as never); + _platform.getFile.mockResolvedValue('some content'); }); describe('extractPackageFile', () => { @@ -45,12 +43,10 @@ describe('manager/gradle', () => { }); it('should return empty if there are no dependencies', async () => { - fs.readFile.mockReturnValue( - fsReal.readFileSync( - 'test/datasource/gradle/_fixtures/updatesReportEmpty.json', - 'utf8' - ) - ); + fs.readFile.mockResolvedValue(fsReal.readFileSync( + 'test/datasource/gradle/_fixtures/updatesReportEmpty.json', + 'utf8' + ) as any); const dependencies = await manager.extractAllPackageFiles(config, [ 'build.gradle', ]); @@ -68,7 +64,7 @@ describe('manager/gradle', () => { }); it('should return empty if there is no dependency report', async () => { - fs.exists.mockReturnValue(false); + fs.exists.mockResolvedValue(false); const dependencies = await manager.extractAllPackageFiles(config, [ 'build.gradle', ]); @@ -80,7 +76,7 @@ describe('manager/gradle', () => { const renovateReport = ` Invalid JSON] `; - fs.readFile.mockReturnValue(renovateReport); + fs.readFile.mockResolvedValue(renovateReport as any); const dependencies = await manager.extractAllPackageFiles(config, [ 'build.gradle', @@ -93,7 +89,7 @@ describe('manager/gradle', () => { 'test/datasource/gradle/_fixtures/MultiProjectUpdatesReport.json', 'utf8' ); - fs.readFile.mockReturnValue(multiProjectUpdatesReport); + fs.readFile.mockResolvedValue(multiProjectUpdatesReport as any); const dependencies = await manager.extractAllPackageFiles(config, [ 'build.gradle', @@ -125,7 +121,7 @@ describe('manager/gradle', () => { it('should configure the renovate report plugin', async () => { await manager.extractAllPackageFiles(config, ['build.gradle']); - expect(toUnix(fs.writeFile.mock.calls[0][0])).toBe( + expect(toUnix(fs.writeFile.mock.calls[0][0] as string)).toBe( 'localDir/renovate-plugin.gradle' ); }); diff --git a/test/manager/homebrew/__snapshots__/extract.spec.js.snap b/test/manager/homebrew/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/homebrew/__snapshots__/extract.spec.js.snap rename to test/manager/homebrew/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/homebrew/__snapshots__/update.spec.js.snap b/test/manager/homebrew/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/homebrew/__snapshots__/update.spec.js.snap rename to test/manager/homebrew/__snapshots__/update.spec.ts.snap diff --git a/test/manager/homebrew/extract.spec.js b/test/manager/homebrew/extract.spec.ts similarity index 98% rename from test/manager/homebrew/extract.spec.js rename to test/manager/homebrew/extract.spec.ts index f5bd5fd101c101234af58d8cafe93b464c28b80c..1993ba0bd471d095e1a9466a513eb8b55f2f5dbf 100644 --- a/test/manager/homebrew/extract.spec.js +++ b/test/manager/homebrew/extract.spec.ts @@ -1,5 +1,5 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/homebrew/extract'); +import fs from 'fs'; +import { extractPackageFile } from '../../../lib/manager/homebrew/extract'; const aalib = fs.readFileSync( 'test/manager/homebrew/_fixtures/aalib.rb', diff --git a/test/manager/homebrew/update.spec.js b/test/manager/homebrew/update.spec.ts similarity index 98% rename from test/manager/homebrew/update.spec.js rename to test/manager/homebrew/update.spec.ts index 6d7e1515b57d00bef481e0e1970d2a32dd89c132..06cc5e01e9003188ab139546bed42987f2987f3d 100644 --- a/test/manager/homebrew/update.spec.js +++ b/test/manager/homebrew/update.spec.ts @@ -1,6 +1,7 @@ -const fs = require('fs'); +import fs from 'fs'; +import { updateDependency } from '../../../lib/manager/homebrew/update'; + const got = require('../../../lib/util/got'); -const { updateDependency } = require('../../../lib/manager/homebrew/update'); jest.mock('../../../lib/util/got'); diff --git a/test/manager/homebrew/util.spec.js b/test/manager/homebrew/util.spec.ts similarity index 81% rename from test/manager/homebrew/util.spec.js rename to test/manager/homebrew/util.spec.ts index 4f4fea0b7fb1471c0e5d49222cb0ed96ce8e5dab..7276dd7bf989ec2adc6379c52254e9ba69faa3b8 100644 --- a/test/manager/homebrew/util.spec.js +++ b/test/manager/homebrew/util.spec.ts @@ -1,4 +1,4 @@ -const { skip } = require('../../../lib/manager/homebrew/util'); +import { skip } from '../../../lib/manager/homebrew/util'; describe('lib/manager/homebrew/util', () => { describe('skip()', () => { diff --git a/test/manager/index.spec.js b/test/manager/index.spec.ts similarity index 51% rename from test/manager/index.spec.js rename to test/manager/index.spec.ts index 87a08361965002f61b96ea9a34c76bea1810dbe7..2b847612c171e96077f5737add98243e830ff02d 100644 --- a/test/manager/index.spec.js +++ b/test/manager/index.spec.ts @@ -1,4 +1,4 @@ -const manager = require('../../lib/manager'); +import * as manager from '../../lib/manager'; describe('manager', () => { describe('get()', () => { @@ -18,10 +18,26 @@ describe('manager', () => { }); describe('extractAllPackageFiles()', () => { it('returns null', () => { - expect(manager.extractAllPackageFiles('dockerfile', [])).toBeNull(); + expect( + manager.extractAllPackageFiles('dockerfile', {} as any, []) + ).toBeNull(); }); it('returns non-null', () => { - expect(manager.extractAllPackageFiles('npm', {}, [])).not.toBeNull(); + expect( + manager.extractAllPackageFiles('npm', {} as any, []) + ).not.toBeNull(); + }); + }); + + describe('extractPackageFile()', () => { + it('returns null', () => { + expect(manager.extractPackageFile('unknown', null)).toBeNull(); + }); + }); + + describe('getPackageUpdates', () => { + it('returns null', () => { + expect(manager.getPackageUpdates('unknown', null)).toBeNull(); }); }); }); diff --git a/test/manager/kubernetes/__snapshots__/extract.spec.js.snap b/test/manager/kubernetes/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/kubernetes/__snapshots__/extract.spec.js.snap rename to test/manager/kubernetes/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/kubernetes/__snapshots__/update.spec.js.snap b/test/manager/kubernetes/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/kubernetes/__snapshots__/update.spec.js.snap rename to test/manager/kubernetes/__snapshots__/update.spec.ts.snap diff --git a/test/manager/kubernetes/extract.spec.js b/test/manager/kubernetes/extract.spec.ts similarity index 77% rename from test/manager/kubernetes/extract.spec.js rename to test/manager/kubernetes/extract.spec.ts index 2a51d6ff4258826231bb7fcc014b2dc543541153..ba871d08ec51018dd1f44c2c069f5e4595c10775 100644 --- a/test/manager/kubernetes/extract.spec.js +++ b/test/manager/kubernetes/extract.spec.ts @@ -1,24 +1,22 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/kubernetes/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/kubernetes/extract'; -const kubernetesImagesFile = fs.readFileSync( +const kubernetesImagesFile = readFileSync( 'test/manager/kubernetes/_fixtures/kubernetes.yaml', 'utf8' ); -const kubernetesConfigMapFile = fs.readFileSync( +const kubernetesConfigMapFile = readFileSync( 'test/manager/kubernetes/_fixtures/configmap.yaml', 'utf8' ); -const kubernetesArraySyntaxFile = fs.readFileSync( +const kubernetesArraySyntaxFile = readFileSync( 'test/manager/kubernetes/_fixtures/array-syntax.yaml', 'utf8' ); -const otherYamlFile = fs.readFileSync( +const otherYamlFile = readFileSync( 'test/manager/kubernetes/_fixtures/gitlab-ci.yaml', 'utf8' ); diff --git a/test/manager/kubernetes/update.spec.js b/test/manager/kubernetes/update.spec.ts similarity index 73% rename from test/manager/kubernetes/update.spec.js rename to test/manager/kubernetes/update.spec.ts index df19b6fb6bedfc69a1523ec11568aef68f6c81dc..036a82fa14cb5d445acd4fc11960ca5b231db57a 100644 --- a/test/manager/kubernetes/update.spec.js +++ b/test/manager/kubernetes/update.spec.ts @@ -1,12 +1,12 @@ -const fs = require('fs'); -const dcUpdate = require('../../../lib/manager/kubernetes/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/kubernetes/update'; -const yamlFile = fs.readFileSync( +const yamlFile = readFileSync( 'test/manager/kubernetes/_fixtures/kubernetes.yaml', 'utf8' ); -const arraySyntaxFile = fs.readFileSync( +const arraySyntaxFile = readFileSync( 'test/manager/kubernetes/_fixtures/array-syntax.yaml', 'utf8' ); @@ -20,7 +20,7 @@ describe('manager/kubernetes/update', () => { newValue: '1.15.1', newDigest: 'sha256:abcdefghijklmnop', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).not.toEqual(yamlFile); expect(res.includes(upgrade.newDigest)).toBe(true); }); @@ -30,7 +30,7 @@ describe('manager/kubernetes/update', () => { depName: 'k8s.gcr.io/kube-proxy-amd64', newValue: 'v1.11.1', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toEqual(yamlFile); }); it('returns null if mismatch', () => { @@ -38,11 +38,11 @@ describe('manager/kubernetes/update', () => { managerData: { lineNumber: 1 }, newFrom: 'k8s.gcr.io/kube-proxy-amd64:v1.11.1', }; - const res = dcUpdate.updateDependency(yamlFile, upgrade); + const res = updateDependency(yamlFile, upgrade); expect(res).toBeNull(); }); it('returns null if error', () => { - const res = dcUpdate.updateDependency(null, null); + const res = updateDependency(null, null); expect(res).toBeNull(); }); it('replaces image inside YAML array', () => { @@ -51,7 +51,7 @@ describe('manager/kubernetes/update', () => { depName: 'quay.io/external_storage/local-volume-provisioner', newValue: 'v2.2.0', }; - const res = dcUpdate.updateDependency(arraySyntaxFile, upgrade); + const res = updateDependency(arraySyntaxFile, upgrade); expect(res).not.toEqual(arraySyntaxFile); expect(res).toMatchSnapshot(); }); diff --git a/test/manager/leiningen/__snapshots__/extract.spec.js.snap b/test/manager/leiningen/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/leiningen/__snapshots__/extract.spec.js.snap rename to test/manager/leiningen/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/leiningen/extract.spec.js b/test/manager/leiningen/extract.spec.ts similarity index 85% rename from test/manager/leiningen/extract.spec.js rename to test/manager/leiningen/extract.spec.ts index 378f21f8e1e34c5228e01f9401e51a6ab9d4f2ea..1652dabfcf1eced2ea87d02f2719ce100f6390a3 100644 --- a/test/manager/leiningen/extract.spec.js +++ b/test/manager/leiningen/extract.spec.ts @@ -1,14 +1,14 @@ /* eslint-disable no-template-curly-in-string */ -const fs = require('fs'); -const path = require('path'); -const { +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { trimAtKey, extractFromVectors, extractPackageFile, -} = require('../../../lib/manager/leiningen/extract'); +} from '../../../lib/manager/leiningen/extract'; -const leinProjectClj = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/project.clj`), +const leinProjectClj = readFileSync( + resolve(__dirname, `./_fixtures/project.clj`), 'utf8' ); diff --git a/test/manager/leiningen/update.spec.js b/test/manager/leiningen/update.spec.ts similarity index 64% rename from test/manager/leiningen/update.spec.js rename to test/manager/leiningen/update.spec.ts index ea9e752222964aab7635cbf7f514df2cfa0dbc07..10d7452ee8e1a185106c959b32f32cafc90a451f 100644 --- a/test/manager/leiningen/update.spec.js +++ b/test/manager/leiningen/update.spec.ts @@ -1,13 +1,11 @@ /* eslint-disable no-template-curly-in-string */ -const fs = require('fs'); -const path = require('path'); -const { - extractPackageFile, -} = require('../../../lib/manager/leiningen/extract'); -const { updateDependency } = require('../../../lib/manager/leiningen/update'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/leiningen/extract'; +import { updateDependency } from '../../../lib/manager/leiningen/update'; -const leinProjectClj = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/project.clj`), +const leinProjectClj = readFileSync( + resolve(__dirname, `./_fixtures/project.clj`), 'utf8' ); diff --git a/test/manager/manager-docs.spec.js b/test/manager/manager-docs.spec.ts similarity index 75% rename from test/manager/manager-docs.spec.js rename to test/manager/manager-docs.spec.ts index 6f20bc6c5490daf5bcaa83c4f7164cf5546da970..5adc4a66319de333a5cd82de71454daa7e469e94 100644 --- a/test/manager/manager-docs.spec.js +++ b/test/manager/manager-docs.spec.ts @@ -1,15 +1,15 @@ -const fs = require('fs-extra'); +import { readdir, readFile } from 'fs-extra'; describe('manager readmes', () => { it('has same questions for all managers', async () => { - const managers = (await fs.readdir('lib/manager')).filter( + const managers = (await readdir('lib/manager')).filter( item => !item.includes('.') ); - let expectedHeaders; + let expectedHeaders: string[]; for (const manager of managers) { - let readme; + let readme: string; try { - readme = await fs.readFile( + readme = await readFile( 'lib/manager/' + manager + '/readme.md', 'utf8' ); diff --git a/test/manager/maven/__snapshots__/extract.spec.js.snap b/test/manager/maven/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/maven/__snapshots__/extract.spec.js.snap rename to test/manager/maven/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/maven/__snapshots__/index.spec.js.snap b/test/manager/maven/__snapshots__/index.spec.ts.snap similarity index 100% rename from test/manager/maven/__snapshots__/index.spec.js.snap rename to test/manager/maven/__snapshots__/index.spec.ts.snap diff --git a/test/manager/maven/extract.spec.js b/test/manager/maven/extract.spec.ts similarity index 66% rename from test/manager/maven/extract.spec.js rename to test/manager/maven/extract.spec.ts index 5728f6def5875d3c8e29bac32ec78fb135ab4cee..3447194b61758d0e2b8ebd85f546d7c0872dea07 100644 --- a/test/manager/maven/extract.spec.js +++ b/test/manager/maven/extract.spec.ts @@ -1,17 +1,17 @@ /* eslint-disable no-template-curly-in-string */ -const fs = require('fs'); -const path = require('path'); -const { extractPackage } = require('../../../lib/manager/maven/extract'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackage } from '../../../lib/manager/maven/extract'; -const simpleContent = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/simple.pom.xml`), +const simpleContent = readFileSync( + resolve(__dirname, `./_fixtures/simple.pom.xml`), 'utf8' ); describe('manager/maven/extract', () => { describe('extractDependencies', () => { it('returns null for invalid XML', () => { - expect(extractPackage()).toBeNull(); + expect(extractPackage(undefined)).toBeNull(); expect(extractPackage('invalid xml content')).toBeNull(); expect(extractPackage('<foobar></foobar>')).toBeNull(); expect(extractPackage('<project></project>')).toBeNull(); diff --git a/test/manager/maven/index.spec.js b/test/manager/maven/index.spec.ts similarity index 89% rename from test/manager/maven/index.spec.js rename to test/manager/maven/index.spec.ts index 412a1b27dc0f21b8c1ff2031e0f6ae4fbc465bb1..783d0ac3bffc2ed92b0d202b918a2bb33889b785 100644 --- a/test/manager/maven/index.spec.js +++ b/test/manager/maven/index.spec.ts @@ -1,34 +1,34 @@ -const fs = require('fs'); -const { +import { readFileSync } from 'fs'; +import { extractPackage, resolveProps, -} = require('../../../lib/manager/maven/extract'); -const { +} from '../../../lib/manager/maven/extract'; +import { extractAllPackageFiles, updateDependency, -} = require('../../../lib/manager/maven/index'); +} from '../../../lib/manager/maven/index'; +import { PackageDependency, PackageFile } from '../../../lib/manager/common'; -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; -const pomContent = fs.readFileSync( +const pomContent = readFileSync( 'test/manager/maven/_fixtures/simple.pom.xml', 'utf8' ); -const pomParent = fs.readFileSync( +const pomParent = readFileSync( 'test/manager/maven/_fixtures/parent.pom.xml', 'utf8' ); -const pomChild = fs.readFileSync( +const pomChild = readFileSync( 'test/manager/maven/_fixtures/child.pom.xml', 'utf8' ); -const origContent = fs.readFileSync( +const origContent = readFileSync( 'test/manager/maven/_fixtures/grouping.pom.xml', 'utf8' ); -function selectDep(deps, name = 'org.example:quuz') { +function selectDep(deps: PackageDependency[], name = 'org.example:quuz') { return deps.find(dep => dep.depName === name); } @@ -67,7 +67,8 @@ describe('manager/maven', () => { }); it('should update existing dependency defined via properties', () => { - const finder = ({ depName }) => depName === 'org.example:quux'; + const finder = ({ depName }: PackageDependency) => + depName === 'org.example:quux'; const newValue = '9.9.9.9-final'; const packages = resolveProps([ @@ -154,7 +155,8 @@ describe('manager/maven', () => { }); it('should update ranges', () => { const newValue = '[1.2.3]'; - const select = depSet => selectDep(depSet.deps, 'org.example:hard-range'); + const select = (depSet: PackageFile) => + selectDep(depSet.deps, 'org.example:hard-range'); const oldContent = extractPackage(pomContent); const dep = select(oldContent); const upgrade = { ...dep, newValue }; @@ -164,7 +166,7 @@ describe('manager/maven', () => { }); it('should preserve ranges', () => { const newValue = '[1.0.0]'; - const select = depSet => + const select = (depSet: PackageFile) => depSet && depSet.deps ? selectDep(depSet.deps, 'org.example:hard-range') : null; diff --git a/test/manager/meteor/__snapshots__/extract.spec.js.snap b/test/manager/meteor/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/meteor/__snapshots__/extract.spec.js.snap rename to test/manager/meteor/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/meteor/__snapshots__/update.spec.js.snap b/test/manager/meteor/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/meteor/__snapshots__/update.spec.js.snap rename to test/manager/meteor/__snapshots__/update.spec.ts.snap diff --git a/test/manager/meteor/extract.spec.js b/test/manager/meteor/extract.spec.ts similarity index 64% rename from test/manager/meteor/extract.spec.js rename to test/manager/meteor/extract.spec.ts index 2b26dbd2f82a407c2f4f8725c73e76b408c3e7e8..e4b9a6818877469b5f635fbca551b0c101c8ccea 100644 --- a/test/manager/meteor/extract.spec.js +++ b/test/manager/meteor/extract.spec.ts @@ -1,12 +1,9 @@ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/meteor/extract'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/meteor/extract'; -function readFixture(fixture) { - return fs.readFileSync( - path.resolve(__dirname, `./_fixtures/${fixture}`), - 'utf8' - ); +function readFixture(fixture: string) { + return readFileSync(resolve(__dirname, `./_fixtures/${fixture}`), 'utf8'); } const input01Content = readFixture('package-1.js'); diff --git a/test/manager/meteor/update.spec.js b/test/manager/meteor/update.spec.ts similarity index 59% rename from test/manager/meteor/update.spec.js rename to test/manager/meteor/update.spec.ts index 5918fe368b73421e245af4f9aa29e8785d8460e0..5c7acc426bc732e42fdc6265e8e40373ca6a5204 100644 --- a/test/manager/meteor/update.spec.js +++ b/test/manager/meteor/update.spec.ts @@ -1,12 +1,9 @@ -const fs = require('fs'); -const path = require('path'); -const meteorUpdater = require('../../../lib/manager/meteor/update'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { updateDependency } from '../../../lib/manager/meteor/update'; -function readFixture(fixture) { - return fs.readFileSync( - path.resolve(__dirname, `./_fixtures/${fixture}`), - 'utf8' - ); +function readFixture(fixture: string) { + return readFileSync(resolve(__dirname, `./_fixtures/${fixture}`), 'utf8'); } const input01Content = readFixture('package-1.js'); @@ -20,10 +17,7 @@ describe('workers/branch/package-js', () => { currentValue: '0.1.19', newValue: '0.22.1', }; - const testContent = meteorUpdater.updateDependency( - input01Content, - upgrade - ); + const testContent = updateDependency(input01Content, upgrade); expect(testContent).toMatchSnapshot(); }); it('handles alternative quotes and white space', () => { @@ -32,10 +26,7 @@ describe('workers/branch/package-js', () => { currentValue: '0.1.19', newValue: '0.22.1', }; - const testContent = meteorUpdater.updateDependency( - input02Content, - upgrade - ); + const testContent = updateDependency(input02Content, upgrade); expect(testContent).toMatchSnapshot(); }); it('handles the case where the desired version is already supported', () => { @@ -44,11 +35,8 @@ describe('workers/branch/package-js', () => { currentValue: '0.2.0', newValue: '0.2.0', }; - const testContent = meteorUpdater.updateDependency( - input01Content, - upgrade - ); - testContent.should.equal(input01Content); + const testContent = updateDependency(input01Content, upgrade); + expect(testContent).toEqual(input01Content); }); }); }); diff --git a/test/manager/npm/__snapshots__/update.spec.js.snap b/test/manager/npm/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/npm/__snapshots__/update.spec.js.snap rename to test/manager/npm/__snapshots__/update.spec.ts.snap diff --git a/test/manager/npm/extract/__snapshots__/index.spec.js.snap b/test/manager/npm/extract/__snapshots__/index.spec.ts.snap similarity index 100% rename from test/manager/npm/extract/__snapshots__/index.spec.js.snap rename to test/manager/npm/extract/__snapshots__/index.spec.ts.snap diff --git a/test/manager/npm/extract/__snapshots__/locked-versions.spec.js.snap b/test/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap similarity index 100% rename from test/manager/npm/extract/__snapshots__/locked-versions.spec.js.snap rename to test/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap diff --git a/test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap b/test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap similarity index 98% rename from test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap rename to test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap index 6ed2ee7b2ee51ec19cb0b7d809400aa736341a3a..0da8b05c551d31764f284f5c0263e207964a6a8e 100644 --- a/test/manager/npm/extract/__snapshots__/monorepo.spec.js.snap +++ b/test/manager/npm/extract/__snapshots__/monorepo.spec.ts.snap @@ -100,7 +100,7 @@ Array [ "npmLock": undefined, "packageFile": "packages/a/package.json", "packageJsonName": "@org/a", - "yarnLock": true, + "yarnLock": "yarn.lock", }, Object { "internalPackages": Array [ diff --git a/test/manager/npm/extract/__snapshots__/npm.spec.js.snap b/test/manager/npm/extract/__snapshots__/npm.spec.ts.snap similarity index 100% rename from test/manager/npm/extract/__snapshots__/npm.spec.js.snap rename to test/manager/npm/extract/__snapshots__/npm.spec.ts.snap diff --git a/test/manager/npm/extract/__snapshots__/yarn.spec.js.snap b/test/manager/npm/extract/__snapshots__/yarn.spec.ts.snap similarity index 100% rename from test/manager/npm/extract/__snapshots__/yarn.spec.js.snap rename to test/manager/npm/extract/__snapshots__/yarn.spec.ts.snap diff --git a/test/manager/npm/extract/index.spec.js b/test/manager/npm/extract/index.spec.ts similarity index 96% rename from test/manager/npm/extract/index.spec.js rename to test/manager/npm/extract/index.spec.ts index 0fa99863b7144088fe44872240fc618fd93ba65a..e3e20b8484287f2bf45f642141739c547b1ecd05 100644 --- a/test/manager/npm/extract/index.spec.js +++ b/test/manager/npm/extract/index.spec.ts @@ -1,10 +1,10 @@ -const fs = require('fs'); -const path = require('path'); -const npmExtract = require('../../../../lib/manager/npm/extract'); -const defaultConfig = require('../../../../lib/config/defaults').getConfig(); +import fs from 'fs'; +import path from 'path'; +import * as npmExtract from '../../../../lib/manager/npm/extract'; +import { getConfig } from '../../../../lib/config/defaults'; -/** @type any */ -const platform = global.platform; +const defaultConfig = getConfig(); +const platform: any = global.platform; function readFixture(fixture) { return fs.readFileSync( diff --git a/test/manager/npm/extract/locked-versions.spec.js b/test/manager/npm/extract/locked-versions.spec.ts similarity index 95% rename from test/manager/npm/extract/locked-versions.spec.js rename to test/manager/npm/extract/locked-versions.spec.ts index 21401bf27d6c9a41b262725cfd0880212c80e427..3ec6d05d27a2480fd9e5f99aafd0b51879ea59e7 100644 --- a/test/manager/npm/extract/locked-versions.spec.js +++ b/test/manager/npm/extract/locked-versions.spec.ts @@ -1,6 +1,4 @@ -const { - getLockedVersions, -} = require('../../../../lib/manager/npm/extract/locked-versions'); +import { getLockedVersions } from '../../../../lib/manager/npm/extract/locked-versions'; /** @type any */ const npm = require('../../../../lib/manager/npm/extract/npm'); diff --git a/test/manager/npm/extract/monorepo.spec.js b/test/manager/npm/extract/monorepo.spec.ts similarity index 84% rename from test/manager/npm/extract/monorepo.spec.js rename to test/manager/npm/extract/monorepo.spec.ts index b1dd7f4f37d251fd3b5d9420169ab42f959bf447..0eb257519a3d50269aadf5cf0706c5f8ce49f505 100644 --- a/test/manager/npm/extract/monorepo.spec.js +++ b/test/manager/npm/extract/monorepo.spec.ts @@ -1,6 +1,4 @@ -const { - detectMonorepos, -} = require('../../../../lib/manager/npm/extract/monorepo'); +import { detectMonorepos } from '../../../../lib/manager/npm/extract/monorepo'; describe('manager/npm/extract', () => { describe('.extractPackageFile()', () => { @@ -23,7 +21,7 @@ describe('manager/npm/extract', () => { await detectMonorepos(packageFiles); expect(packageFiles).toMatchSnapshot(); expect(packageFiles[1].lernaDir).toEqual('.'); - expect(packageFiles[1].internalPackages).toEqual(['@org/b']); + expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']); }); it('uses yarn workspaces package settings', async () => { const packageFiles = [ @@ -46,7 +44,7 @@ describe('manager/npm/extract', () => { await detectMonorepos(packageFiles); expect(packageFiles).toMatchSnapshot(); expect(packageFiles[1].lernaDir).toEqual('.'); - expect(packageFiles[1].internalPackages).toEqual(['@org/b']); + expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']); }); it('uses yarn workspaces package settings', async () => { const packageFiles = [ @@ -57,7 +55,7 @@ describe('manager/npm/extract', () => { { packageFile: 'packages/a/package.json', packageJsonName: '@org/a', - yarnLock: true, + yarnLock: 'yarn.lock', }, { packageFile: 'packages/b/package.json', @@ -66,7 +64,7 @@ describe('manager/npm/extract', () => { ]; await detectMonorepos(packageFiles); expect(packageFiles).toMatchSnapshot(); - expect(packageFiles[1].internalPackages).toEqual(['@org/b']); + expect((packageFiles[1] as any).internalPackages).toEqual(['@org/b']); }); }); }); diff --git a/test/manager/npm/extract/npm.spec.js b/test/manager/npm/extract/npm.spec.ts similarity index 61% rename from test/manager/npm/extract/npm.spec.js rename to test/manager/npm/extract/npm.spec.ts index f3127623ccd3bd07dbd5fd72e94589556fe4f4aa..ccc7cd6209e10871eea44c16b4b1afa4bbd62077 100644 --- a/test/manager/npm/extract/npm.spec.js +++ b/test/manager/npm/extract/npm.spec.ts @@ -1,8 +1,7 @@ -const fs = require('fs'); -const { getNpmLock } = require('../../../../lib/manager/npm/extract/npm'); +import { readFileSync } from 'fs'; +import { getNpmLock } from '../../../../lib/manager/npm/extract/npm'; -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; describe('manager/npm/extract/npm', () => { describe('.getNpmLock()', () => { @@ -12,7 +11,7 @@ describe('manager/npm/extract/npm', () => { expect(Object.keys(res)).toHaveLength(0); }); it('extracts', async () => { - const plocktest1Lock = fs.readFileSync( + const plocktest1Lock = readFileSync( 'test/config/npm/_fixtures/plocktest1/package-lock.json' ); platform.getFile.mockReturnValueOnce(plocktest1Lock); @@ -20,5 +19,10 @@ describe('manager/npm/extract/npm', () => { expect(res).toMatchSnapshot(); expect(Object.keys(res)).toHaveLength(7); }); + it('returns empty if no deps', async () => { + platform.getFile.mockResolvedValueOnce('{}'); + const res = await getNpmLock('package.json'); + expect(Object.keys(res)).toHaveLength(0); + }); }); }); diff --git a/test/manager/npm/extract/type.spec.js b/test/manager/npm/extract/type.spec.ts similarity index 86% rename from test/manager/npm/extract/type.spec.js rename to test/manager/npm/extract/type.spec.ts index 881eba25571c3286c068b6ffbaf61059b1853367..fffc6565eebbb5269816c767aaf2429ef9702231 100644 --- a/test/manager/npm/extract/type.spec.js +++ b/test/manager/npm/extract/type.spec.ts @@ -1,6 +1,4 @@ -const { - mightBeABrowserLibrary, -} = require('../../../../lib/manager/npm/extract/type'); +import { mightBeABrowserLibrary } from '../../../../lib/manager/npm/extract/type'; describe('manager/npm/extract/type', () => { describe('.mightBeABrowserLibrary()', () => { diff --git a/test/manager/npm/extract/yarn.spec.js b/test/manager/npm/extract/yarn.spec.ts similarity index 76% rename from test/manager/npm/extract/yarn.spec.js rename to test/manager/npm/extract/yarn.spec.ts index 6e6c844648504074882deaa947da7f1a74bba08f..6103d22f0733ac58cc7574ef091e14d23a7e3739 100644 --- a/test/manager/npm/extract/yarn.spec.js +++ b/test/manager/npm/extract/yarn.spec.ts @@ -1,8 +1,7 @@ -const fs = require('fs'); -const { getYarnLock } = require('../../../../lib/manager/npm/extract/yarn'); +import { readFileSync } from 'fs'; +import { getYarnLock } from '../../../../lib/manager/npm/extract/yarn'; -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; describe('manager/npm/extract/yarn', () => { describe('.getYarnLock()', () => { @@ -12,7 +11,7 @@ describe('manager/npm/extract/yarn', () => { expect(Object.keys(res)).toHaveLength(0); }); it('extracts', async () => { - const plocktest1Lock = fs.readFileSync( + const plocktest1Lock = readFileSync( 'test/config/npm/_fixtures/plocktest1/yarn.lock', 'utf8' ); diff --git a/test/manager/npm/range.spec.js b/test/manager/npm/range.spec.ts similarity index 63% rename from test/manager/npm/range.spec.js rename to test/manager/npm/range.spec.ts index 5ffa9f9f186decba36337ba419b43cdbb3677ebd..fcf4314cd59b0688c12cb4c3ddab3f8fe525c5a6 100644 --- a/test/manager/npm/range.spec.js +++ b/test/manager/npm/range.spec.ts @@ -1,16 +1,20 @@ -const { getRangeStrategy } = require('../../../lib/manager/npm'); +import { getRangeStrategy } from '../../../lib/manager/npm'; +import { RangeConfig } from '../../../lib/manager/common'; describe('getRangeStrategy', () => { it('returns same if not auto', () => { - const config = { rangeStrategy: 'widen' }; + const config: RangeConfig = { rangeStrategy: 'widen' }; expect(getRangeStrategy(config)).toEqual('widen'); }); it('pins devDependencies', () => { - const config = { rangeStrategy: 'auto', depType: 'devDependencies' }; + const config: RangeConfig = { + rangeStrategy: 'auto', + depType: 'devDependencies', + }; expect(getRangeStrategy(config)).toEqual('pin'); }); it('pins app dependencies', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'dependencies', packageJsonType: 'app', @@ -18,11 +22,14 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('pin'); }); it('widens peerDependencies', () => { - const config = { rangeStrategy: 'auto', depType: 'peerDependencies' }; + const config: RangeConfig = { + rangeStrategy: 'auto', + depType: 'peerDependencies', + }; expect(getRangeStrategy(config)).toEqual('widen'); }); it('widens complex ranges', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'dependencies', currentValue: '^1.6.0 || ^2.0.0', @@ -30,7 +37,7 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('widen'); }); it('widens complex bump', () => { - const config = { + const config: RangeConfig = { rangeStrategy: 'bump', depType: 'dependencies', currentValue: '^1.6.0 || ^2.0.0', @@ -38,7 +45,10 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('widen'); }); it('defaults to replace', () => { - const config = { rangeStrategy: 'auto', depType: 'dependencies' }; + const config: RangeConfig = { + rangeStrategy: 'auto', + depType: 'dependencies', + }; expect(getRangeStrategy(config)).toEqual('replace'); }); }); diff --git a/test/manager/npm/update.spec.js b/test/manager/npm/update.spec.ts similarity index 97% rename from test/manager/npm/update.spec.js rename to test/manager/npm/update.spec.ts index 5f124f9de2d37ae92f87563f915fdbaa3f3325b4..da7cebc1f706a7d864b5ad5ce05c15dd6df15698 100644 --- a/test/manager/npm/update.spec.js +++ b/test/manager/npm/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); -const npmUpdater = require('../../../lib/manager/npm/update'); +import fs from 'fs'; +import path from 'path'; +import semver from 'semver'; +import * as npmUpdater from '../../../lib/manager/npm/update'; function readFixture(fixture) { return fs.readFileSync( @@ -192,7 +192,7 @@ describe('workers/branch/package-json', () => { semver.inc = jest.fn(() => { throw new Error('semver inc'); }); - const res = npmUpdater.bumpPackageVersion(content, '0.0.2', true); + const res = npmUpdater.bumpPackageVersion(content, '0.0.2', true as any); expect(res).toEqual(content); }); }); diff --git a/test/manager/nuget/__snapshots__/extract.spec.js.snap b/test/manager/nuget/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/nuget/__snapshots__/extract.spec.js.snap rename to test/manager/nuget/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/nuget/extract.spec.js b/test/manager/nuget/extract.spec.ts similarity index 78% rename from test/manager/nuget/extract.spec.js rename to test/manager/nuget/extract.spec.ts index d07d9e6b5ac69a5779ae5cb2b80e4f0551132563..959918f94f50df069c64715670a47949d02efbbf 100644 --- a/test/manager/nuget/extract.spec.js +++ b/test/manager/nuget/extract.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/nuget/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/nuget/extract'; -const sample = fs.readFileSync( +const sample = readFileSync( 'test/datasource/nuget/_fixtures/sample.csproj', 'utf8' ); diff --git a/test/manager/nuget/update.spec.js b/test/manager/nuget/update.spec.ts similarity index 65% rename from test/manager/nuget/update.spec.js rename to test/manager/nuget/update.spec.ts index 351a11da65bb2e24e98b1b9e9052e39d3e60274a..77550785acbfedc6211392ca56f84e3611ef0ace 100644 --- a/test/manager/nuget/update.spec.js +++ b/test/manager/nuget/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const nugetUpdater = require('../../../lib/manager/nuget/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/nuget/update'; -const csProj = fs.readFileSync( +const csProj = readFileSync( 'test/datasource/nuget/_fixtures/sample.csproj', 'utf8' ); @@ -13,7 +13,7 @@ describe('manager/nuget/update', () => { managerData: { lineNumber: 13 }, newVersion: '5.0.0', }; - const res = nugetUpdater.updateDependency(csProj, upgrade); + const res = updateDependency(csProj, upgrade); expect(res).not.toEqual(csProj); }); it('keeps intact when same version', () => { @@ -21,11 +21,11 @@ describe('manager/nuget/update', () => { managerData: { lineNumber: 13 }, newVersion: '4.1.0', }; - const res = nugetUpdater.updateDependency(csProj, upgrade); + const res = updateDependency(csProj, upgrade); expect(res).toEqual(csProj); }); it('returns null on errors', () => { - const res = nugetUpdater.updateDependency(csProj, null); + const res = updateDependency(csProj, null); expect(res).toBeNull(); }); }); diff --git a/test/manager/nvm/__snapshots__/extract.spec.js.snap b/test/manager/nvm/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/nvm/__snapshots__/extract.spec.js.snap rename to test/manager/nvm/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/nvm/__snapshots__/update.spec.js.snap b/test/manager/nvm/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/nvm/__snapshots__/update.spec.js.snap rename to test/manager/nvm/__snapshots__/update.spec.ts.snap diff --git a/test/manager/nvm/extract.spec.js b/test/manager/nvm/extract.spec.ts similarity index 86% rename from test/manager/nvm/extract.spec.js rename to test/manager/nvm/extract.spec.ts index e2c88ff6a53fd438b9a514b80900aef6d8083aad..72c24462facde82b92d9864f255cf6c28fdc7026 100644 --- a/test/manager/nvm/extract.spec.js +++ b/test/manager/nvm/extract.spec.ts @@ -1,4 +1,4 @@ -const { extractPackageFile } = require('../../../lib/manager/nvm/extract'); +import { extractPackageFile } from '../../../lib/manager/nvm/extract'; describe('lib/manager/nvm/extract', () => { describe('extractPackageFile()', () => { diff --git a/test/manager/ruby-version/update.spec.js b/test/manager/nvm/update.spec.ts similarity index 76% rename from test/manager/ruby-version/update.spec.js rename to test/manager/nvm/update.spec.ts index 3a4335866af02ee8e7c0962fff4400e67f2e1fad..93fd26b5e66b7230cf27479aa5f73c75987f3343 100644 --- a/test/manager/ruby-version/update.spec.js +++ b/test/manager/nvm/update.spec.ts @@ -1,6 +1,4 @@ -const { - updateDependency, -} = require('../../../lib/manager/ruby-version/update'); +import { updateDependency } from '../../../lib/manager/nvm/update'; describe('manager/nvm/update', () => { describe('updateDependency', () => { diff --git a/test/manager/pip_requirements/__snapshots__/extract.spec.js.snap b/test/manager/pip_requirements/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/pip_requirements/__snapshots__/extract.spec.js.snap rename to test/manager/pip_requirements/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/pip_requirements/__snapshots__/update.spec.js.snap b/test/manager/pip_requirements/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/pip_requirements/__snapshots__/update.spec.js.snap rename to test/manager/pip_requirements/__snapshots__/update.spec.ts.snap diff --git a/test/manager/pip_requirements/extract.spec.js b/test/manager/pip_requirements/extract.spec.ts similarity index 89% rename from test/manager/pip_requirements/extract.spec.js rename to test/manager/pip_requirements/extract.spec.ts index e191eb7cf76c9b539ecb2b8e4b853a911d212692..bbc50d8101f4480b58389510b2c1c93c2369a17a 100644 --- a/test/manager/pip_requirements/extract.spec.js +++ b/test/manager/pip_requirements/extract.spec.ts @@ -1,32 +1,30 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/pip_requirements/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/pip_requirements/extract'; -const requirements1 = fs.readFileSync( +const requirements1 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements1.txt', 'utf8' ); -const requirements2 = fs.readFileSync( +const requirements2 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements2.txt', 'utf8' ); -const requirements3 = fs.readFileSync( +const requirements3 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements3.txt', 'utf8' ); -const requirements4 = fs.readFileSync( +const requirements4 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements4.txt', 'utf8' ); -const requirements5 = fs.readFileSync( +const requirements5 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements5.txt', 'utf8' ); -const requirements6 = fs.readFileSync( +const requirements6 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements6.txt', 'utf8' ); diff --git a/test/manager/pip_requirements/range.spec.js b/test/manager/pip_requirements/range.spec.js deleted file mode 100644 index 0c8fea1f6e0a04c14122f1d6624a7cd88c3a91ed..0000000000000000000000000000000000000000 --- a/test/manager/pip_requirements/range.spec.js +++ /dev/null @@ -1,12 +0,0 @@ -const { getRangeStrategy } = require('../../../lib/manager/pip_requirements'); - -describe('getRangeStrategy', () => { - it('returns same if not auto', () => { - const config = { rangeStrategy: 'widen' }; - expect(getRangeStrategy(config)).toEqual('widen'); - }); - it('pins if auto', () => { - const config = { rangeStrategy: 'auto' }; - expect(getRangeStrategy(config)).toEqual('pin'); - }); -}); diff --git a/test/manager/pip_requirements/range.spec.ts b/test/manager/pip_requirements/range.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1aa41f835df3609e54b871d6254d656773452233 --- /dev/null +++ b/test/manager/pip_requirements/range.spec.ts @@ -0,0 +1,13 @@ +import { getRangeStrategy } from '../../../lib/manager/pip_requirements'; +import { RangeConfig } from '../../../lib/manager/common'; + +describe('getRangeStrategy', () => { + it('returns same if not auto', () => { + const config: RangeConfig = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toEqual('widen'); + }); + it('pins if auto', () => { + const config: RangeConfig = { rangeStrategy: 'auto' }; + expect(getRangeStrategy(config)).toEqual('pin'); + }); +}); diff --git a/test/manager/pip_requirements/update.spec.js b/test/manager/pip_requirements/update.spec.ts similarity index 90% rename from test/manager/pip_requirements/update.spec.js rename to test/manager/pip_requirements/update.spec.ts index d2d00561134d5cbb44d850ab08c9fb692a69ceee..4a2d12ad00967dd60c9cbec6bb9572901bfebf33 100644 --- a/test/manager/pip_requirements/update.spec.js +++ b/test/manager/pip_requirements/update.spec.ts @@ -1,29 +1,27 @@ -const fs = require('fs'); -const { - updateDependency, -} = require('../../../lib/manager/pip_requirements/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/pip_requirements/update'; -const requirements = fs.readFileSync( +const requirements = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements1.txt', 'utf8' ); -const requirements3 = fs.readFileSync( +const requirements3 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements3.txt', 'utf8' ); -const requirements4 = fs.readFileSync( +const requirements4 = readFileSync( 'test/manager/pip_requirements/_fixtures/requirements4.txt', 'utf8' ); -const setupPy1 = fs.readFileSync( +const setupPy1 = readFileSync( 'test/manager/pip_setup/_fixtures/setup.py', 'utf-8' ); -const setupPy2 = fs.readFileSync( +const setupPy2 = readFileSync( 'test/manager/pip_setup/_fixtures/setup-2.py', 'utf-8' ); diff --git a/test/manager/pip_setup/__snapshots__/extract.spec.js.snap b/test/manager/pip_setup/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/pip_setup/__snapshots__/extract.spec.js.snap rename to test/manager/pip_setup/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/pip_setup/extract.spec.js b/test/manager/pip_setup/extract.spec.ts similarity index 91% rename from test/manager/pip_setup/extract.spec.js rename to test/manager/pip_setup/extract.spec.ts index ab62c6f6fab521b6c6d3ef2716d83b3eb591f9e6..9841596cb4c150ca5541fba8b703318299cef1e7 100644 --- a/test/manager/pip_setup/extract.spec.js +++ b/test/manager/pip_setup/extract.spec.ts @@ -1,23 +1,22 @@ -const fs = require('fs'); -const tmp = require('tmp-promise'); -const { relative } = require('path'); -const { exec } = require('../../../lib/util/exec'); -const { +import { readFileSync } from 'fs'; +import { file as _file } from 'tmp-promise'; +import { relative } from 'path'; +import { exec } from '../../../lib/util/exec'; +import { extractPackageFile, parsePythonVersion, getPythonAlias, pythonVersions, - // extractSetupFile, -} = require('../../../lib/manager/pip_setup/extract'); +} from '../../../lib/manager/pip_setup/extract'; const packageFile = 'test/manager/pip_setup/_fixtures/setup.py'; -const content = fs.readFileSync(packageFile, 'utf8'); +const content = readFileSync(packageFile, 'utf8'); const config = { localDir: '.', }; async function tmpFile() { - const file = await tmp.file({ postfix: '.py' }); + const file = await _file({ postfix: '.py' }); return relative('.', file.path); } diff --git a/test/manager/pipenv/__snapshots__/artifacts.spec.js.snap b/test/manager/pipenv/__snapshots__/artifacts.spec.ts.snap similarity index 100% rename from test/manager/pipenv/__snapshots__/artifacts.spec.js.snap rename to test/manager/pipenv/__snapshots__/artifacts.spec.ts.snap diff --git a/test/manager/pipenv/__snapshots__/extract.spec.js.snap b/test/manager/pipenv/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/pipenv/__snapshots__/extract.spec.js.snap rename to test/manager/pipenv/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/pipenv/__snapshots__/update.spec.js.snap b/test/manager/pipenv/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/pipenv/__snapshots__/update.spec.js.snap rename to test/manager/pipenv/__snapshots__/update.spec.ts.snap diff --git a/test/manager/pipenv/artifacts.spec.js b/test/manager/pipenv/artifacts.spec.ts similarity index 89% rename from test/manager/pipenv/artifacts.spec.js rename to test/manager/pipenv/artifacts.spec.ts index 0351652543621200bfd892368b9c97c5dedd1140..51f26782e4fe9cd6cb7a2a6c05d7843843697ae0 100644 --- a/test/manager/pipenv/artifacts.spec.js +++ b/test/manager/pipenv/artifacts.spec.ts @@ -1,15 +1,15 @@ +import _fs from 'fs-extra'; +import { exec as _exec } from '../../../lib/util/exec'; +import * as pipenv from '../../../lib/manager/pipenv/artifacts'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); jest.mock('../../../lib/util/host-rules'); -/** @type any */ -const fs = require('fs-extra'); -/** @type any */ -const { exec } = require('../../../lib/util/exec'); -const pipenv = require('../../../lib/manager/pipenv/artifacts'); +const fs: any = _fs; +const exec: any = _exec; -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; const config = { localDir: '/tmp/github/some/repo', diff --git a/test/manager/pipenv/extract.spec.js b/test/manager/pipenv/extract.spec.ts similarity index 97% rename from test/manager/pipenv/extract.spec.js rename to test/manager/pipenv/extract.spec.ts index eb95ac3238a39bd166999cd4b23b0dcb3eb0cc4a..e730c0916ea289350d983e944e8a2bd7995fb3dd 100644 --- a/test/manager/pipenv/extract.spec.js +++ b/test/manager/pipenv/extract.spec.ts @@ -1,5 +1,5 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/pipenv/extract'); +import fs from 'fs'; +import { extractPackageFile } from '../../../lib/manager/pipenv/extract'; const pipfile1 = fs.readFileSync( 'test/manager/pipenv/_fixtures/Pipfile1', diff --git a/test/manager/pipenv/update.spec.js b/test/manager/pipenv/update.spec.ts similarity index 89% rename from test/manager/pipenv/update.spec.js rename to test/manager/pipenv/update.spec.ts index f9f5c76b0eb9dd8cd43626c72b5f10f71b91f283..64ecd91cb581702296f3883647a7a0bba7498de3 100644 --- a/test/manager/pipenv/update.spec.js +++ b/test/manager/pipenv/update.spec.ts @@ -1,10 +1,7 @@ -const fs = require('fs'); -const { updateDependency } = require('../../../lib/manager/pipenv/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/pipenv/update'; -const pipfile = fs.readFileSync( - 'test/manager/pipenv/_fixtures/Pipfile1', - 'utf8' -); +const pipfile = readFileSync('test/manager/pipenv/_fixtures/Pipfile1', 'utf8'); describe('manager/pipenv/update', () => { describe('updateDependency', () => { diff --git a/test/manager/poetry/__snapshots__/artifacts.spec.js.snap b/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap similarity index 100% rename from test/manager/poetry/__snapshots__/artifacts.spec.js.snap rename to test/manager/poetry/__snapshots__/artifacts.spec.ts.snap diff --git a/test/manager/poetry/__snapshots__/extract.spec.js.snap b/test/manager/poetry/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/poetry/__snapshots__/extract.spec.js.snap rename to test/manager/poetry/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/poetry/__snapshots__/update.spec.js.snap b/test/manager/poetry/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/poetry/__snapshots__/update.spec.js.snap rename to test/manager/poetry/__snapshots__/update.spec.ts.snap diff --git a/test/manager/poetry/artifacts.spec.js b/test/manager/poetry/artifacts.spec.ts similarity index 53% rename from test/manager/poetry/artifacts.spec.js rename to test/manager/poetry/artifacts.spec.ts index fe40806d7f9dfa715f6800f3dd087c92c85b5246..644d06bb40ae8cca0046dc636193b7e2411263dc 100644 --- a/test/manager/poetry/artifacts.spec.js +++ b/test/manager/poetry/artifacts.spec.ts @@ -1,14 +1,13 @@ +import _fs from 'fs-extra'; +import { exec as _exec } from '../../../lib/util/exec'; +import { updateArtifacts } from '../../../lib/manager/poetry/artifacts'; + jest.mock('fs-extra'); jest.mock('../../../lib/util/exec'); -/** @type any */ -const fs = require('fs-extra'); -/** @type any */ -const { exec } = require('../../../lib/util/exec'); -const poetry = require('../../../lib/manager/poetry/artifacts'); - -/** @type any */ -const platform = global.platform; +const platform: any = global.platform; +const exec: any = _exec; +const fs: any = _fs; const config = { localDir: '/tmp/github/some/repo', @@ -22,20 +21,13 @@ describe('.updateArtifacts()', () => { delete global.trustLevel; }); it('returns null if no poetry.lock found', async () => { - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( - await poetry.updateArtifacts('pyproject.toml', updatedDeps, '', config) + await updateArtifacts('pyproject.toml', updatedDeps, '', config) ).toBeNull(); }); it('returns null if updatedDeps is empty', async () => { - expect( - await poetry.updateArtifacts('pyproject.toml', [], '', config) - ).toBeNull(); + expect(await updateArtifacts('pyproject.toml', [], '', config)).toBeNull(); }); it('returns null if unchanged', async () => { platform.getFile.mockReturnValueOnce('Current poetry.lock'); @@ -44,14 +36,9 @@ describe('.updateArtifacts()', () => { stderror: '', }); fs.readFile = jest.fn(() => 'Current poetry.lock'); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( - await poetry.updateArtifacts('pyproject.toml', updatedDeps, '', config) + await updateArtifacts('pyproject.toml', updatedDeps, '', config) ).toBeNull(); }); it('returns updated poetry.lock', async () => { @@ -61,15 +48,10 @@ describe('.updateArtifacts()', () => { stderror: '', }); fs.readFile = jest.fn(() => 'New poetry.lock'); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; global.trustLevel = 'high'; expect( - await poetry.updateArtifacts('pyproject.toml', updatedDeps, '{}', config) + await updateArtifacts('pyproject.toml', updatedDeps, '{}', config) ).not.toBeNull(); }); it('catches errors', async () => { @@ -77,14 +59,9 @@ describe('.updateArtifacts()', () => { fs.outputFile = jest.fn(() => { throw new Error('not found'); }); - const updatedDeps = [ - { - depName: 'dep1', - currentValue: '1.2.3', - }, - ]; + const updatedDeps = ['dep1']; expect( - await poetry.updateArtifacts('pyproject.toml', updatedDeps, '{}', config) + await updateArtifacts('pyproject.toml', updatedDeps, '{}', config) ).toMatchSnapshot(); }); }); diff --git a/test/manager/poetry/extract.spec.js b/test/manager/poetry/extract.spec.ts similarity index 91% rename from test/manager/poetry/extract.spec.js rename to test/manager/poetry/extract.spec.ts index b60af388ca68862195e166ab749b9b5f4c023a9b..17b792c08edff6ca0e3d96b30ecc692a9aac11c6 100644 --- a/test/manager/poetry/extract.spec.js +++ b/test/manager/poetry/extract.spec.ts @@ -1,27 +1,27 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/poetry/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/poetry/extract'; -const pyproject1toml = fs.readFileSync( +const pyproject1toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.1.toml', 'utf8' ); -const pyproject2toml = fs.readFileSync( +const pyproject2toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.2.toml', 'utf8' ); -const pyproject3toml = fs.readFileSync( +const pyproject3toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.3.toml', 'utf8' ); -const pyproject4toml = fs.readFileSync( +const pyproject4toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.4.toml', 'utf8' ); -const pyproject5toml = fs.readFileSync( +const pyproject5toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.5.toml', 'utf8' ); diff --git a/test/manager/poetry/update.spec.js b/test/manager/poetry/update.spec.ts similarity index 96% rename from test/manager/poetry/update.spec.js rename to test/manager/poetry/update.spec.ts index a937cfe7e17104f09ae5e6ca304f447cf0ec1fba..6166108ac1e928878cfb80096fdcf3ac54ae288c 100644 --- a/test/manager/poetry/update.spec.js +++ b/test/manager/poetry/update.spec.ts @@ -1,12 +1,12 @@ -const fs = require('fs'); -const { updateDependency } = require('../../../lib/manager/poetry/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/poetry/update'; -const pyproject1toml = fs.readFileSync( +const pyproject1toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.1.toml', 'utf8' ); -const pyproject2toml = fs.readFileSync( +const pyproject2toml = readFileSync( 'test/manager/poetry/_fixtures/pyproject.2.toml', 'utf8' ); diff --git a/test/manager/pub/__snapshots__/extract.spec.js.snap b/test/manager/pub/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/pub/__snapshots__/extract.spec.js.snap rename to test/manager/pub/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/pub/__snapshots__/update.spec.js.snap b/test/manager/pub/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/pub/__snapshots__/update.spec.js.snap rename to test/manager/pub/__snapshots__/update.spec.ts.snap diff --git a/test/manager/pub/extract.spec.js b/test/manager/pub/extract.spec.ts similarity index 80% rename from test/manager/pub/extract.spec.js rename to test/manager/pub/extract.spec.ts index 961676dc1b1a245d739e8e373dc2d352655542c4..be3ddbb4e452aacd3c88baac1453a5805a30c48d 100644 --- a/test/manager/pub/extract.spec.js +++ b/test/manager/pub/extract.spec.ts @@ -1,12 +1,12 @@ -const fs = require('fs'); -const { extractPackageFile } = require('../../../lib/manager/pub'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/pub'; -const brokenYaml = fs.readFileSync( +const brokenYaml = readFileSync( 'test/manager/pub/_fixtures/update.yaml', 'utf8' ); -const packageFile = fs.readFileSync( +const packageFile = readFileSync( 'test/manager/pub/_fixtures/extract.yaml', 'utf8' ); diff --git a/test/manager/pub/update.spec.js b/test/manager/pub/update.spec.ts similarity index 92% rename from test/manager/pub/update.spec.js rename to test/manager/pub/update.spec.ts index 35fd8b036a504f3fb962424bac4fea21ebec3956..39d811fbd375056cae2fad6a448c55dd64040079 100644 --- a/test/manager/pub/update.spec.js +++ b/test/manager/pub/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const { updateDependency } = require('../../../lib/manager/pub'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/pub'; -const fileContent = fs.readFileSync( +const fileContent = readFileSync( 'test/manager/pub/_fixtures/update.yaml', 'utf8' ); diff --git a/test/manager/range.spec.js b/test/manager/range.spec.ts similarity index 57% rename from test/manager/range.spec.js rename to test/manager/range.spec.ts index 1f45419e2f4144c2700c75684a760d1b114d37e4..4d26d8efe65ff039f2904473e1501436861d6996 100644 --- a/test/manager/range.spec.js +++ b/test/manager/range.spec.ts @@ -1,12 +1,13 @@ -const { getRangeStrategy } = require('../../lib/manager'); +import { getRangeStrategy } from '../../lib/manager'; +import { RangeConfig } from '../../lib/manager/common'; describe('getRangeStrategy', () => { it('returns same if not auto', () => { - const config = { manager: 'npm', rangeStrategy: 'widen' }; + const config: RangeConfig = { manager: 'npm', rangeStrategy: 'widen' }; expect(getRangeStrategy(config)).toEqual('widen'); }); it('returns manager strategy', () => { - const config = { + const config: RangeConfig = { manager: 'npm', rangeStrategy: 'auto', depType: 'dependencies', @@ -15,11 +16,17 @@ describe('getRangeStrategy', () => { expect(getRangeStrategy(config)).toEqual('pin'); }); it('defaults to replace', () => { - const config = { manager: 'circleci', rangeStrategy: 'auto' }; + const config: RangeConfig = { + manager: 'circleci', + rangeStrategy: 'auto', + }; expect(getRangeStrategy(config)).toEqual('replace'); }); it('returns rangeStrategy if not auto', () => { - const config = { manager: 'circleci', rangeStrategy: 'future' }; + const config: RangeConfig = { + manager: 'circleci', + rangeStrategy: 'future', + }; expect(getRangeStrategy(config)).toEqual('future'); }); }); diff --git a/test/manager/ruby-version/__snapshots__/extract.spec.js.snap b/test/manager/ruby-version/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/ruby-version/__snapshots__/extract.spec.js.snap rename to test/manager/ruby-version/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/ruby-version/__snapshots__/update.spec.js.snap b/test/manager/ruby-version/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/ruby-version/__snapshots__/update.spec.js.snap rename to test/manager/ruby-version/__snapshots__/update.spec.ts.snap diff --git a/test/manager/ruby-version/extract.spec.js b/test/manager/ruby-version/extract.spec.ts similarity index 85% rename from test/manager/ruby-version/extract.spec.js rename to test/manager/ruby-version/extract.spec.ts index bfd5126be46bd8034fbd9375c65a716ef4a62980..2f7788601c3e0bcc2373a33e40dde5b9347db4d7 100644 --- a/test/manager/ruby-version/extract.spec.js +++ b/test/manager/ruby-version/extract.spec.ts @@ -1,6 +1,4 @@ -const { - extractPackageFile, -} = require('../../../lib/manager/ruby-version/extract'); +import { extractPackageFile } from '../../../lib/manager/ruby-version/extract'; describe('lib/manager/ruby-version/extract', () => { describe('extractPackageFile()', () => { diff --git a/test/manager/nvm/update.spec.js b/test/manager/ruby-version/update.spec.ts similarity index 63% rename from test/manager/nvm/update.spec.js rename to test/manager/ruby-version/update.spec.ts index b2c120ebefdb5b9696b46d76c4694f5993d64dc7..40dc7c078b82528c39e850a926cac9cf002bfbce 100644 --- a/test/manager/nvm/update.spec.js +++ b/test/manager/ruby-version/update.spec.ts @@ -1,4 +1,4 @@ -const nodefile = require('../../../lib/manager/nvm/update'); +import { updateDependency } from '../../../lib/manager/ruby-version/update'; describe('manager/nvm/update', () => { describe('updateDependency', () => { @@ -6,7 +6,7 @@ describe('manager/nvm/update', () => { const upgrade = { newValue: '8.9.1', }; - const res = nodefile.updateDependency('8.9.0\n', upgrade); + const res = updateDependency('8.9.0\n', upgrade); expect(res).toMatchSnapshot(); }); }); diff --git a/test/manager/sbt/__snapshots__/extract.spec.js.snap b/test/manager/sbt/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/sbt/__snapshots__/extract.spec.js.snap rename to test/manager/sbt/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/sbt/extract.spec.js b/test/manager/sbt/extract.spec.ts similarity index 79% rename from test/manager/sbt/extract.spec.js rename to test/manager/sbt/extract.spec.ts index 6118f88f4a3892326df4cd11fb3cb3536e0351ce..e13352031d6da6fdacfffad9707d1d66a5fc6e0f 100644 --- a/test/manager/sbt/extract.spec.js +++ b/test/manager/sbt/extract.spec.ts @@ -1,13 +1,10 @@ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/sbt/extract'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/sbt/extract'; -const sbt = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/sample.sbt`), - 'utf8' -); -const sbtMissingScalaVersion = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/missing-scala-version.sbt`), +const sbt = readFileSync(resolve(__dirname, `./_fixtures/sample.sbt`), 'utf8'); +const sbtMissingScalaVersion = readFileSync( + resolve(__dirname, `./_fixtures/missing-scala-version.sbt`), 'utf8' ); diff --git a/test/manager/sbt/update.spec.js b/test/manager/sbt/update.spec.ts similarity index 74% rename from test/manager/sbt/update.spec.js rename to test/manager/sbt/update.spec.ts index 2be448ec81b10d764d4b4a1bf244bf4d4d3dc2cb..01ee5206d8ebb11abef638c634fed42585fcbd59 100644 --- a/test/manager/sbt/update.spec.js +++ b/test/manager/sbt/update.spec.ts @@ -1,23 +1,24 @@ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/sbt/extract'); -const { updateDependency } = require('../../../lib/manager/sbt/update'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/sbt/extract'; +import { updateDependency } from '../../../lib/manager/sbt/update'; +import { Upgrade } from '../../../lib/manager/common'; -const sbtPath = path.resolve(__dirname, `./_fixtures/sample.sbt`); -const fileContent = fs.readFileSync(sbtPath, 'utf8'); +const sbtPath = resolve(__dirname, `./_fixtures/sample.sbt`); +const fileContent = readFileSync(sbtPath, 'utf8'); describe('lib/manager/terraform/extract', () => { describe('updateDependency()', () => { it('returns content untouched if versions are same', () => { const { deps } = extractPackageFile(fileContent); - const upgrade = deps.shift(); + const upgrade: Upgrade = deps.shift(); upgrade.newValue = upgrade.currentValue; const newFileContent = updateDependency(fileContent, upgrade); expect(newFileContent).toBe(fileContent); }); it('returns null if content has been updated somewhere', () => { const { deps } = extractPackageFile(fileContent); - const upgrade = deps.shift(); + const upgrade: Upgrade = deps.shift(); upgrade.newValue = '0.1.1'; const newFileContent = updateDependency( fileContent.replace('0.0.1', '0.1.0'), diff --git a/test/manager/swift/__snapshots__/index.spec.js.snap b/test/manager/swift/__snapshots__/index.spec.ts.snap similarity index 100% rename from test/manager/swift/__snapshots__/index.spec.js.snap rename to test/manager/swift/__snapshots__/index.spec.ts.snap diff --git a/test/manager/swift/index.spec.js b/test/manager/swift/index.spec.ts similarity index 96% rename from test/manager/swift/index.spec.js rename to test/manager/swift/index.spec.ts index 15ab7c4bb9407e879518ffab2db7a62a326b652d..8ce0c6c76784bd11f85b1cd66d1815aaf1f6d912 100644 --- a/test/manager/swift/index.spec.js +++ b/test/manager/swift/index.spec.ts @@ -1,10 +1,10 @@ -const fs = require('fs'); -const path = require('path'); -const { extractPackageFile } = require('../../../lib/manager/swift/extract'); -const { updateDependency } = require('../../../lib/manager/swift/update'); +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { extractPackageFile } from '../../../lib/manager/swift/extract'; +import { updateDependency } from '../../../lib/manager/swift/update'; -const pkgContent = fs.readFileSync( - path.resolve(__dirname, `./_fixtures/SamplePackage.swift`), +const pkgContent = readFileSync( + resolve(__dirname, `./_fixtures/SamplePackage.swift`), 'utf8' ); diff --git a/test/manager/terraform/__snapshots__/extract.spec.js.snap b/test/manager/terraform/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/terraform/__snapshots__/extract.spec.js.snap rename to test/manager/terraform/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/terraform/extract.spec.js b/test/manager/terraform/extract.spec.ts similarity index 76% rename from test/manager/terraform/extract.spec.js rename to test/manager/terraform/extract.spec.ts index d4be1dd9f1374f8186fb2e36cb64043055bfe3fe..014fea46fd52d0f97c0b3b80c8212dfac0addea9 100644 --- a/test/manager/terraform/extract.spec.js +++ b/test/manager/terraform/extract.spec.ts @@ -1,9 +1,7 @@ -const fs = require('fs'); -const { - extractPackageFile, -} = require('../../../lib/manager/terraform/extract'); +import { readFileSync } from 'fs'; +import { extractPackageFile } from '../../../lib/manager/terraform/extract'; -const tf1 = fs.readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8'); +const tf1 = readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8'); const tf2 = `module "relative" { source = "../../modules/fe" } diff --git a/test/manager/terraform/update.spec.js b/test/manager/terraform/update.spec.ts similarity index 82% rename from test/manager/terraform/update.spec.js rename to test/manager/terraform/update.spec.ts index 6fdab55761e2554f625a5135b524bf4410d79bee..fdf353c3ff0a6b2aa97dec50558ea5435cdc4fd9 100644 --- a/test/manager/terraform/update.spec.js +++ b/test/manager/terraform/update.spec.ts @@ -1,7 +1,7 @@ -const fs = require('fs'); -const tfUpdate = require('../../../lib/manager/terraform/update'); +import { readFileSync } from 'fs'; +import { updateDependency } from '../../../lib/manager/terraform/update'; -const tf1 = fs.readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8'); +const tf1 = readFileSync('test/datasource/terraform/_fixtures/1.tf', 'utf8'); describe('manager/terraform/update', () => { describe('updateDependency', () => { @@ -13,7 +13,7 @@ describe('manager/terraform/update', () => { depNameShort: 'hashicorp/example', newValue: 'v1.0.1', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).not.toEqual(tf1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -25,7 +25,7 @@ describe('manager/terraform/update', () => { depNameShort: 'hashicorp/example', newValue: 'v1.0.0', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).toEqual(tf1); }); it('returns null if wrong line', () => { @@ -36,7 +36,7 @@ describe('manager/terraform/update', () => { depNameShort: 'hashicorp/example', newValue: 'v1.0.0', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).toBeNull(); }); it('updates github versions', () => { @@ -51,7 +51,7 @@ describe('manager/terraform/update', () => { source: 'github.com/tieto-cem/terraform-aws-ecs-task-definition//modules/container-definition?ref=v0.1.0', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).not.toEqual(tf1); expect(res.includes(upgrade.newValue)).toBe(true); }); @@ -66,7 +66,7 @@ describe('manager/terraform/update', () => { source: 'hashicorp/consul/aws', newValue: '0.4.0', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).toBeNull(); }); it('updates terraform versions', () => { @@ -80,7 +80,7 @@ describe('manager/terraform/update', () => { source: 'hashicorp/consul/aws', newValue: '0.4.0', }; - const res = tfUpdate.updateDependency(tf1, upgrade); + const res = updateDependency(tf1, upgrade); expect(res).not.toEqual(tf1); expect(res.includes(upgrade.newValue)).toBe(true); }); diff --git a/test/manager/travis/__snapshots__/extract.spec.js.snap b/test/manager/travis/__snapshots__/extract.spec.ts.snap similarity index 100% rename from test/manager/travis/__snapshots__/extract.spec.js.snap rename to test/manager/travis/__snapshots__/extract.spec.ts.snap diff --git a/test/manager/travis/__snapshots__/package.spec.js.snap b/test/manager/travis/__snapshots__/package.spec.ts.snap similarity index 100% rename from test/manager/travis/__snapshots__/package.spec.js.snap rename to test/manager/travis/__snapshots__/package.spec.ts.snap diff --git a/test/manager/travis/__snapshots__/update.spec.js.snap b/test/manager/travis/__snapshots__/update.spec.ts.snap similarity index 100% rename from test/manager/travis/__snapshots__/update.spec.js.snap rename to test/manager/travis/__snapshots__/update.spec.ts.snap diff --git a/test/manager/travis/extract.spec.js b/test/manager/travis/extract.spec.ts similarity index 84% rename from test/manager/travis/extract.spec.js rename to test/manager/travis/extract.spec.ts index 8798027fb01ee2d681b365efdd99d28bc14ce767..2721e90482d679758c1b7c58f43d216743de9a39 100644 --- a/test/manager/travis/extract.spec.js +++ b/test/manager/travis/extract.spec.ts @@ -1,4 +1,4 @@ -const { extractPackageFile } = require('../../../lib/manager/travis/extract'); +import { extractPackageFile } from '../../../lib/manager/travis/extract'; describe('lib/manager/travis/extract', () => { describe('extractPackageFile()', () => { diff --git a/test/manager/travis/package.spec.js b/test/manager/travis/package.spec.ts similarity index 65% rename from test/manager/travis/package.spec.js rename to test/manager/travis/package.spec.ts index a85168e47a70b2336d817884620710757c645c89..7129210bd72a8a17fe7d5acb1b6e3dff83fd61e4 100644 --- a/test/manager/travis/package.spec.js +++ b/test/manager/travis/package.spec.ts @@ -1,13 +1,16 @@ -const node = require('../../../lib/manager/travis/package'); -const defaultConfig = require('../../../lib/config/defaults').getConfig(); -/** @type any */ -const githubDatasource = require('../../../lib/datasource/github'); +import { getPackageUpdates } from '../../../lib/manager/travis/package'; +import { getPkgReleases as _getPkgReleases } from '../../../lib/datasource/github'; +import { getConfig } from '../../../lib/config/defaults'; + +const defaultConfig = getConfig(); +const getPkgReleases: any = _getPkgReleases; jest.mock('../../../lib/datasource/github'); describe('lib/manager/node/package', () => { describe('getPackageUpdates', () => { - let config; + // TODO: should be `PackageUpdateConfig` + let config: any; beforeEach(() => { config = { ...defaultConfig, @@ -15,27 +18,27 @@ describe('lib/manager/node/package', () => { }); it('returns empty if missing supportPolicy', async () => { config.currentValue = ['6', '8']; - expect(await node.getPackageUpdates(config)).toEqual([]); + expect(await getPackageUpdates(config)).toEqual([]); }); it('returns empty if invalid supportPolicy', async () => { config.currentValue = ['6', '8']; config.supportPolicy = ['foo']; - expect(await node.getPackageUpdates(config)).toEqual([]); + expect(await getPackageUpdates(config)).toEqual([]); }); it('returns empty if matching', async () => { config.currentValue = ['10']; config.supportPolicy = ['lts_active']; - expect(await node.getPackageUpdates(config)).toEqual([]); + expect(await getPackageUpdates(config)).toEqual([]); }); it('returns result if needing updates', async () => { config.currentValue = ['6', '8', '10']; config.supportPolicy = ['lts']; - expect(await node.getPackageUpdates(config)).toMatchSnapshot(); + expect(await getPackageUpdates(config)).toMatchSnapshot(); }); it('detects pinning', async () => { config.currentValue = ['6.1.0', '8.4.0', '10.0.0']; config.supportPolicy = ['lts']; - githubDatasource.getPkgReleases.mockReturnValueOnce({ + getPkgReleases.mockReturnValueOnce({ releases: [ { version: '4.4.4', @@ -60,7 +63,7 @@ describe('lib/manager/node/package', () => { }, ], }); - expect(await node.getPackageUpdates(config)).toMatchSnapshot(); + expect(await getPackageUpdates(config)).toMatchSnapshot(); }); }); }); diff --git a/test/manager/travis/update.spec.js b/test/manager/travis/update.spec.js deleted file mode 100644 index b33c87eae9a118cd4c9ccd007983035645d2d403..0000000000000000000000000000000000000000 --- a/test/manager/travis/update.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const nodefile = require('../../../lib/manager/travis/update'); - -const content = fs.readFileSync( - path.resolve('test/manager/travis/_fixtures/travis.yml'), - 'utf8' -); - -describe('manager/travis/update', () => { - describe('updateDependency', () => { - it('updates values', () => { - const upgrade = { - currentValue: ['8', '6', '4'], - newValue: [6, 8], - }; - const res = nodefile.updateDependency(content, upgrade); - expect(res).toMatchSnapshot(); - }); - it('falls back to 2 spaces', () => { - const upgrade = { - currentValue: [8, 6, 4], - newValue: [6, 8], - }; - const res = nodefile.updateDependency('hello: world', upgrade); - expect(res).toMatchSnapshot(); - }); - it('it uses double quotes', () => { - const upgrade = { - currentValue: ['6'], - newValue: [6, 8], - }; - const res = nodefile.updateDependency('node_js:\n - "6"\n', upgrade); - expect(res).toMatchSnapshot(); - }); - it('returns null if error', () => { - const upgrade = { - currentValue: [8, 6, 4], - newValue: '6', - }; - const res = nodefile.updateDependency(content, upgrade); - expect(res).toBeNull(); - }); - }); -}); diff --git a/test/manager/travis/update.spec.ts b/test/manager/travis/update.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f09e94852c0057d514709e493d73679435e684c2 --- /dev/null +++ b/test/manager/travis/update.spec.ts @@ -0,0 +1,49 @@ +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { updateDependency } from '../../../lib/manager/travis/update'; + +const content = readFileSync( + resolve('test/manager/travis/_fixtures/travis.yml'), + 'utf8' +); + +describe('manager/travis/update', () => { + describe('updateDependency', () => { + it('updates values', () => { + // TODO: should be `Upgrade` + const upgrade: any = { + currentValue: ['8', '6', '4'], + newValue: [6, 8], + }; + const res = updateDependency(content, upgrade); + expect(res).toMatchSnapshot(); + }); + it('falls back to 2 spaces', () => { + // TODO: should be `Upgrade` + const upgrade: any = { + currentValue: [8, 6, 4], + newValue: [6, 8], + }; + const res = updateDependency('hello: world', upgrade); + expect(res).toMatchSnapshot(); + }); + it('it uses double quotes', () => { + // TODO: should be `Upgrade` + const upgrade: any = { + currentValue: ['6'], + newValue: [6, 8], + }; + const res = updateDependency('node_js:\n - "6"\n', upgrade); + expect(res).toMatchSnapshot(); + }); + it('returns null if error', () => { + // TODO: should be `Upgrade` + const upgrade: any = { + currentValue: [8, 6, 4], + newValue: '6', + }; + const res = updateDependency(content, upgrade); + expect(res).toBeNull(); + }); + }); +}); diff --git a/test/workers/branch/get-updated.spec.js b/test/workers/branch/get-updated.spec.js index 503c0bf8fa1cbfed6319b8a63eb1bcf87a17bcdb..72e3dfb7b31c9df889c21760f2ee93873b83db09 100644 --- a/test/workers/branch/get-updated.spec.js +++ b/test/workers/branch/get-updated.spec.js @@ -7,6 +7,9 @@ const { } = require('../../../lib/workers/branch/get-updated'); const defaultConfig = require('../../../lib/config/defaults').getConfig(); +jest.mock('../../../lib/manager/composer'); +jest.mock('../../../lib/manager/npm'); + /** @type any */ const platform = global.platform; @@ -18,8 +21,6 @@ describe('workers/branch/get-updated', () => { ...defaultConfig, upgrades: [], }; - composer.updateDependency = jest.fn(); - composer.updateArtifacts = jest.fn(); npm.updateDependency = jest.fn(); platform.getFile.mockReturnValueOnce('existing content'); }); diff --git a/test/workers/branch/lock-files/yarn.spec.js b/test/workers/branch/lock-files/yarn.spec.js index 97dad7f1c21663e14fe76d8b3e632ec9948ec86d..77d0e1a6c7764e75c43865ba445ce75433568edd 100644 --- a/test/workers/branch/lock-files/yarn.spec.js +++ b/test/workers/branch/lock-files/yarn.spec.js @@ -24,6 +24,7 @@ describe('generateLockFile', () => { it('generates lock files', async () => { getInstalledPath.mockReturnValueOnce('node_modules/yarn'); fs.readFile = jest.fn(() => 'package-lock-contents'); + /** @type {NodeJS.ProcessEnv} */ const env = {}; const config = { postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'], diff --git a/test/workers/repository/extract/manager-files.spec.js b/test/workers/repository/extract/manager-files.spec.js index 259300fc657f913468a45f75b2b17eff6435cd2e..9246d56b47f137b3e01c6fb6df1cb3fcf13cd949 100644 --- a/test/workers/repository/extract/manager-files.spec.js +++ b/test/workers/repository/extract/manager-files.spec.js @@ -3,11 +3,13 @@ const { } = require('../../../../lib/workers/repository/extract/manager-files'); /** @type any */ const fileMatch = require('../../../../lib/workers/repository/extract/file-match'); +/** @type any */ const npm = require('../../../../lib/manager/npm'); /** @type any */ const dockerfile = require('../../../../lib/manager/dockerfile'); jest.mock('../../../../lib/workers/repository/extract/file-match'); +jest.mock('../../../../lib/manager/dockerfile'); /** @type any */ const platform = global.platform; diff --git a/test/workers/repository/process/fetch.spec.js b/test/workers/repository/process/fetch.spec.js index a722fb3a290eb82da4d82234899653e901c04e1b..056b2e8b8bdb523d4459fcba34d7b5c67fad6dab 100644 --- a/test/workers/repository/process/fetch.spec.js +++ b/test/workers/repository/process/fetch.spec.js @@ -1,10 +1,12 @@ -const { - fetchUpdates, -} = require('../../../../lib/workers/repository/process/fetch'); +import { fetchUpdates } from '../../../../lib/workers/repository/process/fetch'; +import * as _npm from '../../../../lib/manager/npm'; +import { lookupUpdates as _lookupUpdates } from '../../../../lib/workers/repository/process/lookup'; -const npm = require('../../../../lib/manager/npm'); /** @type any */ -const lookup = require('../../../../lib/workers/repository/process/lookup'); +const npm = _npm; + +/** @type any */ +const lookupUpdates = _lookupUpdates; jest.mock('../../../../lib/workers/repository/process/lookup'); @@ -73,7 +75,7 @@ describe('workers/repository/process/fetch', () => { }, ], }; - lookup.lookupUpdates.mockReturnValue(['a', 'b']); + lookupUpdates.mockReturnValue(['a', 'b']); npm.getPackageUpdates = jest.fn(() => ['a', 'b']); await fetchUpdates(config, packageFiles); expect(packageFiles).toMatchSnapshot(); diff --git a/yarn.lock b/yarn.lock index c70dd10c93977dd92b4ed4cdd96abf7ce8e0b8ed..003d4f21708f9cedd16615a7e45c37888862e5da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1100,6 +1100,11 @@ dependencies: "@types/node" "*" +"@types/chai@4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" + integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== + "@types/convert-hrtime@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/convert-hrtime/-/convert-hrtime-2.0.0.tgz#48d8215750e602a8ea439591c741cc927c116bb1" @@ -1172,6 +1177,21 @@ dependencies: "@types/jest-diff" "*" +"@types/js-yaml@3.12.1": + version "3.12.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" + integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== + +"@types/lodash@4.14.136": + version "4.14.136" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f" + integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA== + +"@types/luxon@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.15.2.tgz#528f11f7d6dc08cec0445d4bea8065a5bb6989b2" + integrity sha512-zHPoyVrLvNaiMRYdhmh88Rn489ZgAgbc6iLxR5Yi0VCNfeNYHcszbhJV2vDHLNrVGy35BPtWBRn4OP2F9BBvFw== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1230,6 +1250,11 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.5.tgz#9da44ed75571999b65c37b60c9b2b88db54c585d" integrity sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg== +"@types/xmldoc@1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/xmldoc/-/xmldoc-1.1.4.tgz#5867d4e29739719c633bf16413c5a4a4c1c3c802" + integrity sha512-a/ONNCf9itbmzEz1ohx0Fv5TLJzXIPQTapxFu+DlYlDtn9UcAa1OhnrOOMwbU8125hFjrkJKL3qllD7vO5Bivw== + "@types/yargs@^12.0.2", "@types/yargs@^12.0.9": version "12.0.12" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916"