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  }