forked from renovatebot/renovate
/
extract.ts
79 lines (73 loc) · 2.42 KB
/
extract.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import yaml from 'js-yaml';
import { logger } from '../../logger';
import { id as dockerVersioning } from '../../versioning/docker';
import { getDep } from '../dockerfile/extract';
import type { PackageDependency, PackageFile } from '../types';
import {
HelmDockerImageDependency,
matchesHelmValuesDockerHeuristic,
} from './util';
function getHelmDep({
registry,
repository,
tag,
}: {
registry: string;
repository: string;
tag: string;
}): PackageDependency {
const dep = getDep(`${registry}${repository}:${tag}`, false);
dep.replaceString = tag;
dep.versioning = dockerVersioning;
dep.autoReplaceStringTemplate =
'{{newValue}}{{#if newDigest}}@{{newDigest}}{{/if}}';
return dep;
}
/**
* Recursively find all supported dependencies in the yaml object.
*
* @param parsedContent
*/
function findDependencies(
parsedContent: Record<string, unknown> | HelmDockerImageDependency,
packageDependencies: Array<PackageDependency>
): Array<PackageDependency> {
if (!parsedContent || typeof parsedContent !== 'object') {
return packageDependencies;
}
Object.keys(parsedContent).forEach((key) => {
if (matchesHelmValuesDockerHeuristic(key, parsedContent[key])) {
const currentItem = parsedContent[key];
let registry: string = currentItem.registry;
registry = registry ? `${registry}/` : '';
const repository = String(currentItem.repository);
const tag = String(currentItem.tag);
packageDependencies.push(getHelmDep({ repository, tag, registry }));
} else {
findDependencies(parsedContent[key], packageDependencies);
}
});
return packageDependencies;
}
export function extractPackageFile(content: string): PackageFile {
let parsedContent: Record<string, unknown> | HelmDockerImageDependency;
try {
// a parser that allows extracting line numbers would be preferable, with
// the current approach we need to match anything we find again during the update
// TODO: fix me (#9610)
parsedContent = yaml.safeLoad(content, { json: true }) as any;
} catch (err) {
logger.debug({ err }, 'Failed to parse helm-values YAML');
return null;
}
try {
const deps = findDependencies(parsedContent, []);
if (deps.length) {
logger.debug({ deps }, 'Found dependencies in helm-values');
return { deps };
}
} catch (err) /* istanbul ignore next */ {
logger.error({ err }, 'Error parsing helm-values parsed content');
}
return null;
}