docker-metadata-action/src/annotation.ts
Brendon Smith de96cf9194
feat: enable customization of annotations+labels
Signed-off-by: Brendon Smith <bws@bws.bio>
2026-03-14 16:39:36 -04:00

97 lines
2.6 KiB
TypeScript

import {parse} from 'csv-parse/sync';
import * as core from '@actions/core';
export interface Annotation {
name: string;
value: string | null;
enable: boolean;
}
export function Transform(inputs: string[]): Annotation[] {
let annotations: Annotation[] = [];
for (const input of inputs) {
const annotation: Annotation = {name: '', value: null, enable: true};
const fields = parse(input, {
relaxColumnCount: true,
relaxQuotes: true,
skipEmptyLines: true
})[0];
let usesAttributes = false;
for (const field of fields) {
const parts = field
.toString()
.split('=')
.map(item => item.trim());
if (parts.length > 0) {
const key = parts[0].toLowerCase();
if (['name', 'value', 'enable'].includes(key)) {
usesAttributes = true;
break;
}
}
}
if (usesAttributes) {
for (const field of fields) {
const parts = field
.toString()
.split('=')
.map(item => item.trim());
if (parts.length === 1) {
annotation.name = parts[0];
} else {
const key = parts[0].toLowerCase();
const value = parts.slice(1).join('='); // preserve '=' in values if any
switch (key) {
case 'name': {
annotation.name = value;
break;
}
case 'value': {
annotation.value = value;
break;
}
case 'enable': {
if (!['true', 'false'].includes(value.toLowerCase())) {
throw new Error(`Invalid enable attribute value: ${input}`);
}
annotation.enable = /true/i.test(value);
break;
}
default: {
throw new Error(`Unknown annotation attribute: ${input}`);
}
}
}
}
} else {
const idx = input.indexOf('=');
if (idx === -1) {
annotation.name = input.trim();
} else {
annotation.name = input.substring(0, idx).trim();
annotation.value = input.substring(idx + 1).trim();
}
annotation.enable = true;
}
if (annotation.name.length === 0) {
throw new Error(`Annotation name attribute empty: ${input}`);
}
annotations.push(annotation);
}
return output(annotations);
}
function output(annotations: Annotation[]): Annotation[] {
core.startGroup(`Processing annotations input`);
for (const annotation of annotations) {
core.info(`name=${annotation.name},value=${annotation.value},enable=${annotation.enable}`);
}
core.endGroup();
return annotations;
}