/* eslint-disable */ /** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * From React 16.0.0 * @noflow */ import { unitlessNumbers as isUnitlessNumber } from '../unitlessNumbers/index' import { normalizeValueWithProperty } from '../../StyleSheet/compiler/normalizeValueWithProperty' /** * Convert a value into the proper css writable value. The style name `name` * should be logical (no hyphens), as specified * in `CSSProperty.isUnitlessNumber`. * * @param {string} name CSS property name such as `topMargin`. * @param {*} value CSS property value such as `10px`. * @return {string} Normalized style value with dimensions applied. */ export function dangerousStyleValue(name, value, isCustomProperty) { // Note that we've removed escapeTextForBrowser() calls here since the // whole string will be escaped when the attribute is injected into // the markup. If you provide unsafe user data here they can inject // arbitrary CSS which may be problematic (I couldn't repro this): // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ // This is not an XSS hole but instead a potential CSS injection issue // which has lead to a greater discussion about how we're going to // trust URLs moving forward. See #2115901 var isEmpty = value == null || typeof value === 'boolean' || value === '' if (isEmpty) { return '' } // handle Animated.Value objects that have __getValue if (typeof value === 'object' && typeof value.__getValue === 'function') { value = value.__getValue() } // handle transform arrays: [{ translateY: 10 }, { scale: 2 }] if (name === 'transform' && Array.isArray(value)) { return value .map((t) => { const key = Object.keys(t)[0] let val = t[key] // resolve nested Animated.Value if (typeof val === 'object' && typeof val.__getValue === 'function') { val = val.__getValue() } if (key === 'matrix' || key === 'matrix3d') { return `${key}(${val.join(',')})` } return `${key}(${normalizeValueWithProperty(val, key)})` }) .join(' ') } if ( !isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) ) { return value + 'px' // Presumes implicit 'px' suffix for unitless numbers } return ('' + value).trim() }