UNPKG

renovate

Version:

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

211 lines • 8.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitRepositoryToPackageDep = exports.RuleToBazelModulePackageDep = void 0; exports.bazelModulePackageDepToPackageDependency = bazelModulePackageDepToPackageDependency; exports.processModulePkgDeps = processModulePkgDeps; exports.toPackageDependencies = toPackageDependencies; const tslib_1 = require("tslib"); const is_1 = tslib_1.__importDefault(require("@sindresorhus/is")); const github_url_from_git_1 = tslib_1.__importDefault(require("github-url-from-git")); const zod_1 = require("zod"); const logger_1 = require("../../../logger"); const clone_1 = require("../../../util/clone"); const regex_1 = require("../../../util/regex"); const bazel_1 = require("../../datasource/bazel"); const github_tags_1 = require("../../datasource/github-tags"); const fragments_1 = require("./parser/fragments"); function isOverride(value) { return 'bazelDepSkipReason' in value; } function isMerge(value) { return 'bazelDepMergeFields' in value; } // This function exists to remove properties that are specific to // BazelModulePackageDep. In theory, there is no harm in leaving the properties // as it does not invalidate the PackageDependency interface. However, it might // be surprising to someone outside the bazel-module code to see the extra // properties. function bazelModulePackageDepToPackageDependency(bmpd) { const copy = (0, clone_1.clone)(bmpd); if (isOverride(copy)) { const partial = copy; delete partial.bazelDepSkipReason; } if (isMerge(copy)) { const partial = copy; delete partial.bazelDepMergeFields; } return copy; } const BazelDepToPackageDep = fragments_1.RuleFragment.extend({ rule: zod_1.z.literal('bazel_dep'), children: zod_1.z.object({ name: fragments_1.StringFragment, version: fragments_1.StringFragment.optional(), }), }).transform(({ rule, children: { name, version } }) => ({ datasource: bazel_1.BazelDatasource.id, depType: rule, depName: name.value, currentValue: version?.value, ...(version ? {} : { skipReason: 'unspecified-version' }), })); const GitOverrideToPackageDep = fragments_1.RuleFragment.extend({ rule: zod_1.z.literal('git_override'), children: zod_1.z.object({ module_name: fragments_1.StringFragment, remote: fragments_1.StringFragment, commit: fragments_1.StringFragment, }), }).transform(({ rule, children: { module_name: moduleName, remote, commit }, }) => { const override = { depType: rule, depName: moduleName.value, bazelDepSkipReason: 'git-dependency', currentDigest: commit.value, }; const ghPackageName = githubPackageName(remote.value); if (is_1.default.nonEmptyString(ghPackageName)) { override.datasource = github_tags_1.GithubTagsDatasource.id; override.packageName = ghPackageName; } else { override.skipReason = 'unsupported-datasource'; } return override; }); const SingleVersionOverrideToPackageDep = fragments_1.RuleFragment.extend({ rule: zod_1.z.literal('single_version_override'), children: zod_1.z.object({ module_name: fragments_1.StringFragment, version: fragments_1.StringFragment.optional(), registry: fragments_1.StringFragment.optional(), }), }).transform(({ rule, children: { module_name: moduleName, version, registry }, }) => { const base = { depType: rule, depName: moduleName.value, skipReason: 'ignored', }; // If a version is specified, then add a skipReason to bazel_dep if (version) { const override = base; override.bazelDepSkipReason = 'is-pinned'; override.currentValue = version.value; } // If a registry is specified, then merge it into the bazel_dep if (registry) { const merge = base; merge.bazelDepMergeFields = ['registryUrls']; merge.registryUrls = [registry.value]; } return base; }); const UnsupportedOverrideToPackageDep = fragments_1.RuleFragment.extend({ rule: zod_1.z.enum(['archive_override', 'local_path_override']), children: zod_1.z.object({ module_name: fragments_1.StringFragment, }), }).transform(({ rule, children: { module_name: moduleName } }) => { let bazelDepSkipReason = 'unsupported'; switch (rule) { case 'archive_override': bazelDepSkipReason = 'file-dependency'; break; case 'local_path_override': bazelDepSkipReason = 'local-dependency'; break; } return { depType: rule, depName: moduleName.value, skipReason: 'unsupported-datasource', bazelDepSkipReason, }; }); exports.RuleToBazelModulePackageDep = zod_1.z.union([ BazelDepToPackageDep, GitOverrideToPackageDep, SingleVersionOverrideToPackageDep, UnsupportedOverrideToPackageDep, ]); const githubRemoteRegex = (0, regex_1.regEx)(/^https:\/\/github\.com\/(?<packageName>[^/]+\/.+)$/); function githubPackageName(remote) { return (0, github_url_from_git_1.default)(remote)?.match(githubRemoteRegex)?.groups?.packageName; } function collectByModule(packageDeps) { const rulesByModule = new Map(); for (const pkgDep of packageDeps) { const bmi = rulesByModule.get(pkgDep.depName) ?? []; bmi.push(pkgDep); rulesByModule.set(pkgDep.depName, bmi); } return Array.from(rulesByModule.values()); } function processModulePkgDeps(packageDeps) { if (!packageDeps.length) { return []; } const moduleName = packageDeps[0].depName; const bazelDep = packageDeps.find((pd) => pd.depType === 'bazel_dep'); if (!bazelDep) { logger_1.logger.debug(`A 'bazel_dep' was not found for '${moduleName}'.`); return []; } // Create a new bazelDep that will be modified. We do not want to change the // input. const bazelDepOut = { ...bazelDep }; const deps = [bazelDepOut]; const merges = packageDeps.filter(isMerge); for (const merge of merges) { merge.bazelDepMergeFields.forEach((k) => (bazelDepOut[k] = merge[k])); } const overrides = packageDeps.filter(isOverride); if (overrides.length === 0) { return deps; } // It is an error for more than one override to exist for a module. We will // ignore the overrides if there is more than one. if (overrides.length > 1) { const depTypes = overrides.map((o) => o.depType); logger_1.logger.debug({ depName: moduleName, depTypes }, 'More than one override for a module was found'); return deps; } const override = overrides[0]; deps.push(bazelModulePackageDepToPackageDependency(override)); bazelDepOut.skipReason = override.bazelDepSkipReason; return deps; } function toPackageDependencies(packageDeps) { return collectByModule(packageDeps).map(processModulePkgDeps).flat(); } exports.GitRepositoryToPackageDep = fragments_1.RuleFragment.extend({ rule: zod_1.z.union([zod_1.z.literal('git_repository'), zod_1.z.literal('new_git_repository')]), children: zod_1.z.object({ name: fragments_1.StringFragment, remote: fragments_1.StringFragment, commit: fragments_1.StringFragment.optional(), tag: fragments_1.StringFragment.optional(), }), }).transform(({ rule, children: { name, remote, commit, tag } }) => { const gitRepo = { depType: rule, depName: name.value, }; if (commit?.value) { gitRepo.currentDigest = commit.value; } if (tag?.value) { gitRepo.currentValue = tag.value; } const ghPackageName = githubPackageName(remote.value); if (is_1.default.nonEmptyString(ghPackageName)) { gitRepo.datasource = github_tags_1.GithubTagsDatasource.id; gitRepo.packageName = ghPackageName; } else { gitRepo.skipReason = 'unsupported-datasource'; } return gitRepo; }); //# sourceMappingURL=rules.js.map