renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
154 lines • 5.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DockerHubTagsPage = exports.DockerHubTag = exports.ManifestJson = exports.Manifest = exports.DistributionListManifest = exports.DistributionManifest = exports.OciImageIndexManifest = exports.OciImageManifest = exports.OciHelmConfig = exports.OciImageConfig = exports.Descriptor = exports.ManifestObject = void 0;
const zod_1 = require("zod");
const logger_1 = require("../../../logger");
const schema_utils_1 = require("../../../util/schema-utils");
// OCI manifests
/**
* OCI manifest object
*/
exports.ManifestObject = zod_1.z.object({
schemaVersion: zod_1.z.literal(2),
mediaType: zod_1.z.string().nullish(),
});
/**
* Oci descriptor
* https://github.com/opencontainers/image-spec/blob/main/descriptor.md
*/
exports.Descriptor = zod_1.z.object({
mediaType: zod_1.z.string(),
digest: zod_1.z.string(),
size: zod_1.z.number().int().gte(0).nullish(),
});
/**
* OCI platform properties
* https://github.com/opencontainers/image-spec/blob/main/image-index.md
*/
const OciPlatform = zod_1.z
.object({
architecture: zod_1.z.string().nullish(),
})
.nullish();
/**
* OCI Image Configuration.
*
* Compatible with old docker configiguration.
* https://github.com/opencontainers/image-spec/blob/main/config.md
*/
exports.OciImageConfig = zod_1.z.object({
// This is required by the spec, but probably not present in the wild.
architecture: zod_1.z.string().nullish(),
config: zod_1.z.object({ Labels: zod_1.z.record(zod_1.z.string()).nullish() }).nullish(),
});
/**
* OCI Helm Configuration
* https://helm.sh/docs/topics/charts/#the-chartyaml-file
*/
exports.OciHelmConfig = zod_1.z.object({
name: zod_1.z.string(),
version: zod_1.z.string(),
home: zod_1.z.string().nullish(),
sources: zod_1.z.array(zod_1.z.string()).nullish(),
});
/**
* OCI Image Manifest
* The same structure as docker image manifest, but mediaType is not required and is not present in the wild.
* https://github.com/opencontainers/image-spec/blob/main/manifest.md
*/
exports.OciImageManifest = exports.ManifestObject.extend({
mediaType: zod_1.z.literal('application/vnd.oci.image.manifest.v1+json'),
config: exports.Descriptor.extend({
mediaType: zod_1.z.enum([
'application/vnd.oci.image.config.v1+json',
'application/vnd.cncf.helm.config.v1+json',
'application/vnd.devcontainers',
'application/vnd.oci.empty.v1+json',
'application/vnd.cncf.flux.config.v1+json',
]),
}),
annotations: zod_1.z.record(zod_1.z.string()).nullish(),
});
/**
* OCI Image List
* mediaType is not required.
* https://github.com/opencontainers/image-spec/blob/main/image-index.md
*/
exports.OciImageIndexManifest = exports.ManifestObject.extend({
mediaType: zod_1.z.literal('application/vnd.oci.image.index.v1+json'),
manifests: (0, schema_utils_1.LooseArray)(exports.Descriptor.extend({
mediaType: zod_1.z.enum([
'application/vnd.oci.image.manifest.v1+json',
'application/vnd.oci.image.index.v1+json',
]),
platform: OciPlatform,
})),
annotations: zod_1.z.record(zod_1.z.string()).nullish(),
});
// Old Docker manifests
/**
* Image Manifest
* https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest
*/
exports.DistributionManifest = exports.ManifestObject.extend({
mediaType: zod_1.z.literal('application/vnd.docker.distribution.manifest.v2+json'),
config: exports.Descriptor.extend({
mediaType: zod_1.z.literal('application/vnd.docker.container.image.v1+json'),
}),
});
/**
* Manifest List
* https://docs.docker.com/registry/spec/manifest-v2-2/#manifest-list
*/
exports.DistributionListManifest = exports.ManifestObject.extend({
mediaType: zod_1.z.literal('application/vnd.docker.distribution.manifest.list.v2+json'),
manifests: zod_1.z.array(exports.Descriptor.extend({
mediaType: zod_1.z.literal('application/vnd.docker.distribution.manifest.v2+json'),
platform: OciPlatform,
})),
});
// Combined manifests
exports.Manifest = exports.ManifestObject.passthrough()
.transform((value, ctx) => {
if (value.mediaType === undefined) {
if ('config' in value) {
value.mediaType = 'application/vnd.oci.image.manifest.v1+json';
}
else if ('manifests' in value) {
value.mediaType = 'application/vnd.oci.image.index.v1+json';
}
else {
ctx.addIssue({
code: 'custom',
message: 'Invalid manifest, missing mediaType.',
});
return zod_1.z.NEVER;
}
}
return value;
})
.pipe(zod_1.z.discriminatedUnion('mediaType', [
exports.DistributionManifest,
exports.DistributionListManifest,
exports.OciImageManifest,
exports.OciImageIndexManifest,
]));
exports.ManifestJson = schema_utils_1.Json.pipe(exports.Manifest);
exports.DockerHubTag = zod_1.z.object({
id: zod_1.z.number(),
last_updated: zod_1.z.string().datetime(),
name: zod_1.z.string(),
tag_last_pushed: zod_1.z.string().datetime().nullable().catch(null),
digest: zod_1.z.string().nullable().catch(null),
});
exports.DockerHubTagsPage = zod_1.z.object({
count: zod_1.z.number(),
next: zod_1.z.string().nullable().catch(null),
results: (0, schema_utils_1.LooseArray)(exports.DockerHubTag, {
/* v8 ignore next 6 -- TODO: add test */
onError: ({ error }) => {
logger_1.logger.debug({ error }, 'Docker: Failed to parse some tags from Docker Hub');
},
}),
});
//# sourceMappingURL=schema.js.map