import type { PropertyValue } from '../models'; import { ObjectUtil } from './objectUtil'; export default class PropertyUtil { private static SYSTEM_PROPERTY_KEY_PREFIX = '$'; private static MAX_PROPERTY_VALUE_LENGTH = 1024; static sanitizeValue(key: string, value: any): PropertyValue | null { if ( typeof key === 'string' && key.startsWith(this.SYSTEM_PROPERTY_KEY_PREFIX) ) { return value; } if (!this.isValidValue(value)) { return null; } if (Array.isArray(value)) { return value.filter((it) => this.isValidElement(it)); } return value; } static isValidValue(value: any): value is PropertyValue { if (ObjectUtil.isNullOrUndefined(value)) { return false; } if (typeof value === 'string') { return value.length <= this.MAX_PROPERTY_VALUE_LENGTH; } if (typeof value === 'number') { return !isNaN(value) && isFinite(value); } return typeof value === 'boolean' || Array.isArray(value); } private static isValidElement(element: any): element is string | number { if (ObjectUtil.isNullOrUndefined(element)) { return false; } if (typeof element === 'string') { return ( element.length > 0 && element.length <= this.MAX_PROPERTY_VALUE_LENGTH ); } return typeof element === 'number'; } }