import { CustomFieldValue } from '@atlassian/forge-graphql-types'; import { isEqual, sortBy } from 'lodash'; export const isCustomFieldValueEqual = ( value1: CustomFieldValue, value2: CustomFieldValue, ): boolean => { // Case: multi_select values are an array of option UUID strings // check for array equality, ignoring order if (Array.isArray(value1) && Array.isArray(value2)) { if (value1.length !== value2.length) { return false; } return isEqual(sortBy(value1), sortBy(value2)); } // Case: empty array values should be treated equal to null or undefined value if (Array.isArray(value1) && !value1.length) { return value2 === undefined || value2 === null; } if (Array.isArray(value2) && !value2.length) { return value1 === undefined || value1 === null; } // Case: both values are the same non-array type // note: typeof `null` === typeof `Array` === 'object' so we perform this check after previous one if (typeof value1 === typeof value2) { return value1 === value2; } // Case: mixed types, check boolean equality return !!value1 === !!value2; }; export const hasValue = (value: CustomFieldValue): boolean => value !== undefined && value !== null;