docker-hub-tags
Version:
NodeJS lib, with which you can easily find the latest version of Docker Hub images
80 lines (79 loc) • 3.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DockerHubTags = exports.OFFICIALIMAGES_NAMESPACE = void 0;
const types_1 = require("./types");
const utils_1 = require("./utils");
exports.OFFICIALIMAGES_NAMESPACE = 'library';
class DockerHubTags {
tags = [];
constructor(tags) {
this.tags = tags;
}
static async fetch(namespace, repository, filter, options) {
const PAGESIZE = 100;
const HTTP_HEADERS = { Accept: 'application/json' };
const getUrl = (page = 0) => `https://hub.docker.com/v2/namespaces/${namespace}/repositories/${repository}/tags?page=${page}&page_size=${PAGESIZE}`;
const tags = [];
let page = 0;
tagLimit: while (true) {
page++;
const fetched = await (0, utils_1.fetchRetry)(getUrl(page), options.retry, {
method: 'GET',
mode: 'cors',
headers: HTTP_HEADERS
});
const json = JSON.parse(await fetched.text());
const response = types_1.HubResponse.parse(json);
for (const tag of response.results) {
if (tag.content_type === 'image' && tag.tag_status === 'active' && tag.digest) {
tag.images = tag.images.filter((image) => image.status === 'active' &&
image.digest &&
image.os !== 'unknown' &&
image.architecture !== 'unknown' &&
(!filter.os || image.os === filter.os) &&
(!filter.architecture || image.architecture === filter.architecture) &&
(!filter.variant || image.variant === filter.variant));
if (tag.images.length > 0)
tags.push(tag);
if (options.limit > 0 && tags.length >= options.limit)
break tagLimit;
}
}
if (!response.next)
break;
}
return tags;
}
static init = async (namespace, repository, filter = types_1.defaultDockerHubTagsFilter, options = types_1.defaultDockerHubTagsOptions) => new DockerHubTags(await DockerHubTags.fetch(namespace, repository, Object.assign(types_1.defaultDockerHubTagsFilter, filter), Object.assign(types_1.defaultDockerHubTagsOptions, options)));
static createFromJson = (json) => new DockerHubTags(JSON.parse(json));
exportToJson = () => JSON.stringify(this.tags, undefined, 2);
getAllTags = () => this.tags;
getLatest = () => this.getTag('latest');
getTag = (tag) => {
const tagFound = this.tags.find((t) => tag.localeCompare(t.name) === 0);
if (!tagFound)
return;
return {
...tagFound,
sameTags: this.tags.filter((t) => t.digest === tagFound.digest).map((t) => t.name)
};
};
getRecent = (version) => {
const currentVersion = typeof version === 'string' ? (0, utils_1.parseVersionWithLevel)(version) : version;
if (!currentVersion)
throw new types_1.DockerHubTagsError(`Cannot parse ${version}`);
let resultTag;
for (const t of this.tags) {
const targetVersion = (0, utils_1.parseVersion)(t.name);
if (targetVersion &&
(0, utils_1.isHigherVersion)(currentVersion, targetVersion) &&
(!resultTag || (0, utils_1.isHigherVersion)(resultTag.version, targetVersion)))
resultTag = {
name: t.name,
version: targetVersion
};
}
return resultTag ? this.getTag(resultTag.name) : undefined;
};
}
exports.DockerHubTags = DockerHubTags;