-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
index.ts
80 lines (68 loc) · 2.19 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
import { logger } from '../../logger';
import { ExternalHostError } from '../../types/errors/external-host-error';
import { Http } from '../../util/http';
import * as hexVersioning from '../../versioning/hex';
import type { GetReleasesConfig, ReleaseResult } from '../types';
export const id = 'hex';
export const defaultRegistryUrls = ['https://hex.pm/'];
export const customRegistrySupport = false;
export const defaultVersioning = hexVersioning.id;
const http = new Http(id);
interface HexRelease {
html_url: string;
meta?: { links?: Record<string, string> };
releases?: {
version: string;
inserted_at?: string;
}[];
}
export async function getReleases({
lookupName,
registryUrl,
}: GetReleasesConfig): Promise<ReleaseResult | null> {
// Get dependency name from lookupName.
// If the dependency is private lookupName contains organization name as following:
// hexPackageName:organizationName
// hexPackageName is used to pass it in hex dep url
// organizationName is used for accessing to private deps
const hexPackageName = lookupName.split(':')[0];
const hexUrl = `${registryUrl}api/packages/${hexPackageName}`;
try {
const response = await http.getJson<HexRelease>(hexUrl);
const hexRelease: HexRelease = response.body;
if (!hexRelease) {
logger.warn({ datasource: 'hex', lookupName }, `Invalid response body`);
return null;
}
const { releases = [], html_url: homepage, meta } = hexRelease;
if (releases.length === 0) {
logger.debug(`No versions found for ${hexPackageName} (${hexUrl})`); // prettier-ignore
return null;
}
const result: ReleaseResult = {
releases: releases.map(({ version, inserted_at }) =>
inserted_at
? {
version,
releaseTimestamp: inserted_at,
}
: { version }
),
};
if (homepage) {
result.homepage = homepage;
}
if (meta?.links?.Github) {
result.sourceUrl = hexRelease.meta.links.Github;
}
return result;
} catch (err) {
if (
err.statusCode === 429 ||
(err.statusCode >= 500 && err.statusCode < 600)
) {
throw new ExternalHostError(err);
}
throw err;
}
}