main
js 124 lines 3.05 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8 // 'msTransform' is correct, but the other prefixes should be capitalized
9 const badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
10 const msPattern = /^-ms-/;
11 const hyphenPattern = /-(.)/g;
12
13 // style values shouldn't contain a semicolon
14 const badStyleValueWithSemicolonPattern = /;\s*$/;
15
16 const warnedStyleNames = {};
17 const warnedStyleValues = {};
18 let warnedForNaNValue = false;
19 let warnedForInfinityValue = false;
20
21 function camelize(string) {
22 return string.replace(hyphenPattern, function (_, character) {
23 return character.toUpperCase();
24 });
25 }
26
27 function warnHyphenatedStyleName(name) {
28 if (__DEV__) {
29 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
30 return;
31 }
32
33 warnedStyleNames[name] = true;
34 console.error(
35 'Unsupported style property %s. Did you mean %s?',
36 name,
37 // As Andi Smith suggests
38 // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
39 // is converted to lowercase `ms`.
40 camelize(name.replace(msPattern, 'ms-')),
41 );
42 }
43 }
44
45 function warnBadVendoredStyleName(name) {
46 if (__DEV__) {
47 if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
48 return;
49 }
50
51 warnedStyleNames[name] = true;
52 console.error(
53 'Unsupported vendor-prefixed style property %s. Did you mean %s?',
54 name,
55 name.charAt(0).toUpperCase() + name.slice(1),
56 );
57 }
58 }
59
60 function warnStyleValueWithSemicolon(name, value) {
61 if (__DEV__) {
62 if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
63 return;
64 }
65
66 warnedStyleValues[value] = true;
67 console.error(
68 "Style property values shouldn't contain a semicolon. " +
69 'Try "%s: %s" instead.',
70 name,
71 value.replace(badStyleValueWithSemicolonPattern, ''),
72 );
73 }
74 }
75
76 function warnStyleValueIsNaN(name, value) {
77 if (__DEV__) {
78 if (warnedForNaNValue) {
79 return;
80 }
81
82 warnedForNaNValue = true;
83 console.error(
84 '`NaN` is an invalid value for the `%s` css style property.',
85 name,
86 );
87 }
88 }
89
90 function warnStyleValueIsInfinity(name, value) {
91 if (__DEV__) {
92 if (warnedForInfinityValue) {
93 return;
94 }
95
96 warnedForInfinityValue = true;
97 console.error(
98 '`Infinity` is an invalid value for the `%s` css style property.',
99 name,
100 );
101 }
102 }
103
104 function warnValidStyle(name, value) {
105 if (__DEV__) {
106 if (name.indexOf('-') > -1) {
107 warnHyphenatedStyleName(name);
108 } else if (badVendoredStyleNamePattern.test(name)) {
109 warnBadVendoredStyleName(name);
110 } else if (badStyleValueWithSemicolonPattern.test(value)) {
111 warnStyleValueWithSemicolon(name, value);
112 }
113
114 if (typeof value === 'number') {
115 if (isNaN(value)) {
116 warnStyleValueIsNaN(name, value);
117 } else if (!isFinite(value)) {
118 warnStyleValueIsInfinity(name, value);
119 }
120 }
121 }
122 }
123
124 export default warnValidStyle;