github.com/argoproj/argo-cd/v3@v3.2.1/ui/src/app/applications/components/label-selector.ts (about) 1 /* eslint-disable no-prototype-builtins */ 2 type operatorFn = (labels: {[name: string]: string}, key: string, values: string[]) => boolean; 3 4 const operators: {[type: string]: operatorFn} = { 5 '!=': (labels, key, values) => labels[key] !== values[0], 6 '==': (labels, key, values) => labels[key] === values[0], 7 '=': (labels, key, values) => labels[key] === values[0], 8 '[\\W]notin[\\W]': (labels, key, values) => !values.includes(labels[key]), 9 '[\\W]in[\\W]': (labels, key, values) => values.includes(labels[key]), 10 '[\\W]gt[\\W]': (labels, key, values) => parseFloat(labels[key]) > parseFloat(values[0]), 11 '[\\W]lt[\\W]': (labels, key, values) => parseFloat(labels[key]) < parseFloat(values[0]) 12 }; 13 14 function split(input: string, delimiter: string | RegExp): string[] { 15 return input 16 .split(delimiter) 17 .map(part => part.trim()) 18 .filter(part => part !== ''); 19 } 20 21 export type LabelSelector = (labels: {[name: string]: string}) => boolean; 22 23 export function parse(selector: string): LabelSelector { 24 for (const type of Object.keys(operators)) { 25 const operator = operators[type]; 26 const parts = split(selector, new RegExp(type)); 27 if (parts.length > 1) { 28 const values = split(parts[1], ','); 29 return labels => operator(labels, parts[0], values); 30 } 31 } 32 if (selector.startsWith('!')) { 33 return labels => !labels.hasOwnProperty(selector.slice(1)); 34 } 35 return labels => labels.hasOwnProperty(selector); 36 } 37 38 export function match(selector: string, labels: {[name: string]: string}): boolean { 39 return parse(selector)(labels || {}); 40 }