UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

181 lines • 8.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChangeLogSource = void 0; const tslib_1 = require("tslib"); const is_1 = tslib_1.__importDefault(require("@sindresorhus/is")); const logger_1 = require("../../../../../logger"); const datasource_1 = require("../../../../../modules/datasource"); const allVersioning = tslib_1.__importStar(require("../../../../../modules/versioning")); const packageCache = tslib_1.__importStar(require("../../../../../util/cache/package")); const memoize_1 = require("../../../../../util/memoize"); const regex_1 = require("../../../../../util/regex"); const url_1 = require("../../../../../util/url"); const common_1 = require("./common"); const release_notes_1 = require("./release-notes"); const releases_1 = require("./releases"); class ChangeLogSource { platform; datasource; cacheNamespace; constructor(platform, datasource) { this.platform = platform; this.datasource = datasource; this.cacheNamespace = `changelog-${platform}-release`; } async getAllTags(endpoint, repository) { const tags = (await (0, datasource_1.getPkgReleases)({ registryUrls: [endpoint], datasource: this.datasource, packageName: repository, versioning: 'regex:(?<major>\\d+)(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?', }))?.releases; if (is_1.default.nullOrUndefined(tags) || is_1.default.emptyArray(tags)) { logger_1.logger.debug(`No ${this.datasource} tags found for repository: ${repository}`); return []; } return tags.map(({ version }) => version); } async getChangeLogJSON(config) { logger_1.logger.trace(`getChangeLogJSON for ${this.platform}`); const versioning = config.versioning; const currentVersion = config.currentVersion; const newVersion = config.newVersion; const sourceUrl = config.sourceUrl; const packageName = config.packageName; const depName = config.depName; const sourceDirectory = config.sourceDirectory; const versioningApi = allVersioning.get(versioning); if (this.shouldSkipPackage(config)) { return null; } const baseUrl = this.getBaseUrl(config); const apiBaseUrl = this.getAPIBaseUrl(config); const repository = this.getRepositoryFromUrl(config); const tokenResponse = this.hasValidToken(config); if (!tokenResponse.isValid) { if (tokenResponse.error) { return { error: tokenResponse.error, }; } return null; } if (is_1.default.falsy(this.hasValidRepository(repository))) { logger_1.logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`); return null; } const releases = config.releases ?? (await (0, releases_1.getInRangeReleases)(config)); if (!releases?.length) { logger_1.logger.debug('No releases'); return null; } // This extra filter/sort should not be necessary, but better safe than sorry const validReleases = [...releases] .filter((release) => versioningApi.isVersion(release.version)) .sort((a, b) => versioningApi.sortVersions(a.version, b.version)); if (validReleases.length < 2) { logger_1.logger.debug(`Not enough valid releases for dep ${depName} (${packageName})`); return null; } const changelogReleases = []; // Check if `v` belongs to the range (currentVersion, newVersion] const inRange = (v) => versioningApi.isGreaterThan(v, currentVersion) && !versioningApi.isGreaterThan(v, newVersion); const getTags = (0, memoize_1.memoize)(() => this.getAllTags(apiBaseUrl, repository)); for (let i = 1; i < validReleases.length; i += 1) { const prev = validReleases[i - 1]; const next = validReleases[i]; if (!inRange(next.version)) { continue; } let release = await packageCache.get(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version)); if (!release) { release = { version: next.version, date: next.releaseTimestamp, gitRef: next.gitRef, // put empty changes so that existing templates won't break changes: [], compare: {}, }; const tags = await getTags(); const prevHead = this.getRef(versioningApi, packageName, depName, prev, tags); const nextHead = this.getRef(versioningApi, packageName, depName, next, tags); if (is_1.default.nonEmptyString(prevHead) && is_1.default.nonEmptyString(nextHead)) { release.compare.url = this.getCompareURL(baseUrl, repository, prevHead, nextHead); } const cacheMinutes = 55; await packageCache.set(this.cacheNamespace, this.getCacheKey(sourceUrl, packageName, prev.version, next.version), release, cacheMinutes); } changelogReleases.unshift(release); } let res = { project: { apiBaseUrl, baseUrl, type: this.platform, repository, sourceUrl, sourceDirectory, packageName, depName, }, versions: changelogReleases, }; res = await (0, release_notes_1.addReleaseNotes)(res, config); return res; } findTagOfRelease(versioningApi, packageName, depName, depNewVersion, tags) { const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`; const regex = (0, regex_1.regEx)(releaseRegexPrefix, undefined, false); const exactReleaseRegex = (0, regex_1.regEx)(`${releaseRegexPrefix}${depNewVersion}`); const exactTagsList = tags.filter((tag) => { return exactReleaseRegex.test(tag); }); const tagList = exactTagsList.length ? exactTagsList : tags; return tagList .filter((tag) => versioningApi.isVersion(tag.replace(regex, ''))) .find((tag) => versioningApi.equals(tag.replace(regex, ''), depNewVersion)); } getRef(versioningApi, packageName, depName, release, tags) { const tagName = this.findTagOfRelease(versioningApi, packageName, depName, release.version, tags); if (is_1.default.nonEmptyString(tagName)) { return tagName; } if (is_1.default.nonEmptyString(release.gitRef)) { return release.gitRef; } return null; } getCacheKey(sourceUrl, packageName, prev, next) { return `${(0, common_1.slugifyUrl)(sourceUrl)}:${packageName}:${prev}:${next}`; } getBaseUrl(config) { const parsedUrl = (0, url_1.parseUrl)(config.sourceUrl); if (is_1.default.nullOrUndefined(parsedUrl)) { return ''; } const protocol = parsedUrl.protocol.replace((0, regex_1.regEx)(/^git\+/), ''); const host = parsedUrl.host; return `${protocol}//${host}/`; } getRepositoryFromUrl(config) { const parsedUrl = (0, url_1.parseUrl)(config.sourceUrl); if (is_1.default.nullOrUndefined(parsedUrl)) { return ''; } const pathname = parsedUrl.pathname; return (0, url_1.trimSlashes)(pathname).replace((0, regex_1.regEx)(/\.git$/), ''); } hasValidToken(config) { return { isValid: true }; } shouldSkipPackage(config) { return false; } hasValidRepository(repository) { return repository.split('/').length === 2; } } exports.ChangeLogSource = ChangeLogSource; //# sourceMappingURL=source.js.map