argo-cd
58 строк · 1.6 Кб
1const pattern = /^(.*):([a-zA-Z0-9._-]*)$/;
2
3export interface Image {
4name: string;
5newName?: string;
6newTag?: string;
7digest?: string;
8}
9
10function parseOverwrite(arg: string, overwriteImage: boolean): {name: string; digest?: string; tag?: string} {
11// match <image>@<digest>
12const parts = arg.split('@');
13if (parts.length > 1) {
14return {name: parts[0], digest: parts[1]};
15}
16
17// match <image>:<tag>
18const groups = pattern.exec(arg);
19if (groups && groups.length === 3) {
20return {name: groups[1], tag: groups[2]};
21}
22
23// match <image>
24if (arg.length > 0 && overwriteImage) {
25return {name: arg};
26}
27return {name: arg};
28}
29
30export function parse(arg: string): Image {
31// matches if there is an image name to overwrite
32// <image>=<new-image><:|@><new-tag>
33const parts = arg.split('=');
34if (parts.length === 2) {
35const overwrite = parseOverwrite(parts[1], true);
36return {
37name: parts[0],
38newName: overwrite.name,
39newTag: overwrite.tag,
40digest: overwrite.digest
41};
42}
43
44// matches only for <tag|digest> overwrites
45// <image><:|@><new-tag>
46const p = parseOverwrite(arg, false);
47return {name: p.name, newTag: p.tag, digest: p.digest};
48}
49
50export function format(image: Image) {
51const imageName = image.newName ? `${image.name}=${image.newName}` : image.name;
52if (image.newTag) {
53return `${imageName}:${image.newTag}`;
54} else if (image.digest) {
55return `${imageName}@${image.digest}`;
56}
57return imageName;
58}
59