/
base.ts
70 lines (61 loc) · 2.25 KB
/
base.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
import is from '@sindresorhus/is';
import { regEx } from '../../../util/regex';
import { TerraformProviderDatasource } from '../../datasource/terraform-provider';
import type { ExtractConfig, PackageDependency } from '../types';
import type { TerraformDefinitionFile } from './hcl/types';
import type { ProviderLock } from './lockfile/types';
import { getLockedVersion, massageProviderLookupName } from './util';
export abstract class DependencyExtractor {
/**
* Get a list of signals which can be used to scan for potential processable content
* @return a list of content signals
*/
abstract getCheckList(): string[];
/**
* Extract dependencies from a HCL object
* @param hclRoot HCL parsing artifact.
* @param locks currently existing locks
*/
abstract extract(
hclRoot: TerraformDefinitionFile,
locks: ProviderLock[],
config: ExtractConfig
): PackageDependency[];
}
export abstract class TerraformProviderExtractor extends DependencyExtractor {
sourceExtractionRegex = regEx(
/^(?:(?<hostname>(?:[a-zA-Z0-9-_]+\.+)+[a-zA-Z0-9-_]+)\/)?(?:(?<namespace>[^/]+)\/)?(?<type>[^/]+)/
);
protected analyzeTerraformProvider(
dep: PackageDependency,
locks: ProviderLock[],
depType: string
): PackageDependency {
dep.depType = depType;
dep.depName = dep.managerData?.moduleName;
dep.datasource = TerraformProviderDatasource.id;
if (is.nonEmptyString(dep.managerData?.source)) {
// TODO #7154
const source = this.sourceExtractionRegex.exec(dep.managerData!.source);
if (!source?.groups) {
dep.skipReason = 'unsupported-url';
return dep;
}
// buildin providers https://github.com/terraform-providers
if (source.groups.namespace === 'terraform-providers') {
dep.registryUrls = [`https://releases.hashicorp.com`];
} else if (source.groups.hostname) {
dep.registryUrls = [`https://${source.groups.hostname}`];
dep.packageName = `${source.groups.namespace}/${source.groups.type}`;
} else {
dep.packageName = dep.managerData?.source;
}
}
massageProviderLookupName(dep);
dep.lockedVersion = getLockedVersion(dep, locks);
if (!dep.currentValue) {
dep.skipReason = 'no-version';
}
return dep;
}
}