mirror of https://github.com/portainer/portainer
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import _ from 'lodash';
|
|
import YAML from 'yaml';
|
|
|
|
/**
|
|
* Extracts all container names from a Docker Compose YAML string
|
|
* @param yaml - The YAML content to parse
|
|
* @returns Array of unique container names found in the YAML
|
|
*/
|
|
export function extractContainerNames(yaml = ''): string[] {
|
|
let yamlObject;
|
|
|
|
try {
|
|
yamlObject = YAML.parse(yaml, { maxAliasCount: 10000 });
|
|
} catch (err) {
|
|
return [];
|
|
}
|
|
|
|
return extractContainerNamesFromYaml(yamlObject);
|
|
}
|
|
|
|
/**
|
|
* Extracts all container names from a Docker Compose YAML object
|
|
* @param yaml - The YAML object
|
|
* @returns Array of unique container names found in the YAML
|
|
*/
|
|
export function extractContainerNamesFromYaml(yaml: unknown): string[] {
|
|
return _.uniq(findDeepAll<string>(yaml, 'container_name'));
|
|
}
|
|
|
|
/**
|
|
* Recursively finds all values for a given key in a nested object structure
|
|
* @param obj - The object to search
|
|
* @param target - The key to find
|
|
* @param res - Accumulator for results (used internally)
|
|
* @returns Array of all values found for the target key
|
|
*/
|
|
function findDeepAll<T = unknown>(
|
|
obj: unknown,
|
|
target: string,
|
|
res: T[] = []
|
|
): T[] {
|
|
if (typeof obj === 'object' && obj !== null) {
|
|
_.forEach(obj as Record<string, unknown>, (child, key) => {
|
|
if (key === target) {
|
|
res.push(child as T);
|
|
}
|
|
if (typeof child === 'object' && child !== null) {
|
|
findDeepAll(child, target, res);
|
|
}
|
|
});
|
|
}
|
|
return res;
|
|
}
|