-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathextract.ts
More file actions
88 lines (76 loc) · 2.7 KB
/
extract.ts
File metadata and controls
88 lines (76 loc) · 2.7 KB
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
80
81
82
83
84
85
86
87
88
import upath from 'upath';
import { logger } from '../../../logger';
import { isNotNullOrUndefined } from '../../../util/array';
import { LooseArray } from '../../../util/schema-utils';
import type { PackageDependency, PackageFileContent } from '../types';
import * as bazelrc from './bazelrc';
import { parse } from './parser';
import type { ResultFragment } from './parser/fragments';
import { RuleToMavenPackageDep, fillRegistryUrls } from './parser/maven';
import { RuleToDockerPackageDep } from './parser/oci';
import { RulesImgPullToDockerPackageDep } from './parser/rules-img';
import {
GitRepositoryToPackageDep,
RuleToBazelModulePackageDep,
} from './rules';
import * as rules from './rules';
export async function extractPackageFile(
content: string,
packageFile: string,
): Promise<PackageFileContent | null> {
try {
const records = parse(content);
const pfc = await extractBazelPfc(records, packageFile);
const gitRepositoryDeps = extractGitRepositoryDeps(records);
const mavenDeps = extractMavenDeps(records);
const dockerDeps = LooseArray(RuleToDockerPackageDep).parse(records);
const rulesImgDeps = extractRulesImgDeps(records);
if (gitRepositoryDeps.length) {
pfc.deps.push(...gitRepositoryDeps);
}
if (mavenDeps.length) {
pfc.deps.push(...mavenDeps);
}
if (dockerDeps.length) {
pfc.deps.push(...dockerDeps);
}
if (rulesImgDeps.length) {
pfc.deps.push(...rulesImgDeps);
}
return pfc.deps.length ? pfc : null;
} catch (err) {
logger.debug({ err, packageFile }, 'Failed to parse bazel module file.');
return null;
}
}
async function extractBazelPfc(
records: ResultFragment[],
packageFile: string,
): Promise<PackageFileContent> {
const pfc: PackageFileContent = LooseArray(RuleToBazelModulePackageDep)
.transform(rules.toPackageDependencies)
.transform((deps) => ({ deps }))
.parse(records);
const registryUrls = (await bazelrc.read(upath.dirname(packageFile)))
// Ignore any entries for custom configurations
.filter((ce) => ce.config === undefined)
.map((ce) => ce.getOption('registry')?.value)
.filter(isNotNullOrUndefined);
if (registryUrls.length) {
pfc.registryUrls = registryUrls;
}
return pfc;
}
function extractGitRepositoryDeps(
records: ResultFragment[],
): PackageDependency[] {
return LooseArray(GitRepositoryToPackageDep).parse(records);
}
function extractMavenDeps(records: ResultFragment[]): PackageDependency[] {
return LooseArray(RuleToMavenPackageDep)
.transform(fillRegistryUrls)
.parse(records);
}
function extractRulesImgDeps(records: ResultFragment[]): PackageDependency[] {
return LooseArray(RulesImgPullToDockerPackageDep).parse(records);
}