Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 43x 43x 43x 97x 97x 97x 1x 97x 97x 97x 43x 43x 97x 583x 43x 43x 43x 43x 43x 43x 43x 43x | /*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
 */
 
import { StringKeys, useStrings } from 'framework/strings'
import SideNav from '@cf/components/SideNav/SideNav'
import type { SidebarContext } from '@common/navigation/SidebarProvider'
 
export type OperatorOption = {
  label: string
  value: string
  single?: boolean
}
 
export type IsSingleValued = (operatorValue: string) => boolean
 
export const useOperators = (
  i18nFn: (key: StringKeys) => string,
  keyMapper: (key: string) => StringKeys = x => x as StringKeys,
  extraOperators: OperatorOption[] = []
): [OperatorOption[], IsSingleValued] => {
  const getString = i18nFn
  const base = [
    { label: getString(keyMapper('startsWith')), value: 'starts_with', single: true },
    { label: getString(keyMapper('endsWith')), value: 'ends_with', single: true },
    { label: getString(keyMapper('contains')), value: 'contains', single: false },
    { label: getString(keyMapper('equal')), value: 'equal', single: true },
    { label: getString(keyMapper('equalSensitive')), value: 'equal_sensitive', single: true },
    { label: getString(keyMapper('in')), value: 'in', single: false }
  ]
 
  const extra = extraOperators.map(({ label, value, single = false }) => {
    return {
      label: getString(keyMapper(label)),
      value,
      single
    }
  })
 
  const opList = base.concat(extra)
  const isSingleValued: IsSingleValued = (operatorValue: string) =>
    opList.find(op => op.value === operatorValue)?.single || false
  return [opList, isSingleValued]
}
 
const operatorStringMap: Record<string, StringKeys> = {
  and: 'cf.clause.operators.and',
  in: 'cf.clause.operators.in',
  startsWith: 'cf.clause.operators.startsWith',
  endsWith: 'cf.clause.operators.endsWith',
  match: 'cf.clause.operators.match',
  contains: 'cf.clause.operators.contains',
  equal: 'cf.clause.operators.equal',
  equalSensitive: 'cf.clause.operators.equalSensitive',
  matchSegment: 'cf.clause.operators.matchSegment'
}
 
export const useOperatorsFromYaml = (extraOperators: OperatorOption[] = []): [OperatorOption[], IsSingleValued] => {
  const { getString } = useStrings()
  return useOperators(getString, key => operatorStringMap[key], extraOperators)
}
 
export const extraOperatorReference: Record<string, Record<string, OperatorOption>> = {
  customRules: {
    matchSegment: {
      label: 'matchSegment',
      value: 'segmentMatch',
      single: false
    }
  }
}
 
export const extraOperators: Record<string, OperatorOption[]> = Object.entries(extraOperatorReference).reduce(
  (acc: Record<string, OperatorOption[]>, [key, value]: [string, Record<string, OperatorOption>]) => {
    acc[key] = Object.values(value)
    return acc
  },
  {} as Record<string, OperatorOption[]>
)
 
export const CFVariationColors = [
  '#4065A0',
  '#65DEF2',
  '#E3B14F',
  '#42AB45',
  '#D9DAE5',
  '#00ADE4',
  '#f78383',
  '#e59c0b',
  '#7c8d9f',
  '#8c78ed',
  '#ff8f3f',
  '#ed61b5'
]
 
export const CFSideNavProps: SidebarContext = {
  navComponent: SideNav,
  title: 'Feature Flags',
  icon: 'cf-main'
}
 
export const DEFAULT_FLAG_GIT_REPO_PATH = '/flags.yaml'
 
export const PERCENTAGE_ROLLOUT_VALUE = 'Percentage Rollout'
  |