UNPKG

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
"use strict"; 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;