-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
index.ts
84 lines (75 loc) · 2.27 KB
/
index.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
80
81
82
83
84
import is from '@sindresorhus/is';
import { regEx } from '../../util/regex';
import { logger } from '../../logger';
import { Http } from '../../util/http';
import {
DatasourceError,
GetReleasesConfig,
ReleaseResult,
Release,
} from '../common';
export const id = 'gradle-version';
const http = new Http(id);
const GradleVersionsServiceUrl = 'https://services.gradle.org/versions/all';
interface GradleRelease {
snapshot?: boolean;
nightly?: boolean;
rcFor?: string;
version: string;
buildTime?: string;
}
const buildTimeRegex = regEx(
'^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\+\\d\\d\\d\\d)$'
);
function formatBuildTime(timeStr: string): string | null {
if (!timeStr) {
return null;
}
if (buildTimeRegex.test(timeStr)) {
return timeStr.replace(buildTimeRegex, '$1-$2-$3T$4:$5:$6$7');
}
return null;
}
export async function getReleases({
registryUrls,
}: GetReleasesConfig): Promise<ReleaseResult> {
const versionsUrls = is.nonEmptyArray(registryUrls)
? registryUrls
: [GradleVersionsServiceUrl];
const allReleases: Release[][] = await Promise.all(
versionsUrls.map(async (url) => {
try {
const response = await http.getJson<GradleRelease[]>(url);
const releases = response.body
.filter((release) => !release.snapshot && !release.nightly)
.filter(
(release) =>
// some milestone have wrong metadata and need to be filtered by version name content
release.rcFor === '' && !release.version.includes('milestone')
)
.map((release) => ({
version: release.version,
releaseTimestamp: formatBuildTime(release.buildTime),
}));
return releases;
} catch (err) /* istanbul ignore next */ {
// istanbul ignore if
if (err.host === 'services.gradle.org') {
throw new DatasourceError(err);
}
logger.debug({ err }, 'gradle-version err');
return null;
}
})
);
const res: ReleaseResult = {
releases: Array.prototype.concat.apply([], allReleases).filter(Boolean),
homepage: 'https://gradle.org',
sourceUrl: 'https://github.com/gradle/gradle',
};
if (res.releases.length) {
return res;
}
// istanbul ignore next
return null;
}