@stylexjs/shared 0.1.0-beta.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = styleXCreateSet;
7
+ var _convertToClassName = _interopRequireDefault(require("./convert-to-className"));
8
+ var _expandShorthands = _interopRequireDefault(require("./expand-shorthands"));
9
+ var _objectUtils = require("./utils/object-utils");
10
+ var messages = _interopRequireWildcard(require("./messages"));
11
+ var _stylexInclude = require("./stylex-include");
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ /**
16
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
17
+ *
18
+ * This source code is licensed under the MIT license found in the
19
+ * LICENSE file in the root directory of this source tree.
20
+ *
21
+ *
22
+ */
23
+
24
+ // This takes the object of styles passed to `stylex.create` and transforms it.
25
+ // The transformation replaces style values with classNames.
26
+ //
27
+ // It also collects all injected styles along the way.
28
+ // It then returns a tuple of the transformed style Object and an object of injected styles.
29
+ //
30
+ // This function does some basic validation, and then uses `styleXCreateNamespace` to transform
31
+ // each namespace within,
32
+ //
33
+ // Before returning, it ensures that there are no duplicate styles being injected.
34
+ function styleXCreateSet(namespaces) {
35
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
36
+ const resolvedNamespaces = {};
37
+ const injectedStyles = {};
38
+ for (const namespaceName of Object.keys(namespaces)) {
39
+ const namespace = namespaces[namespaceName];
40
+ if (typeof namespace !== 'object' || Array.isArray(namespace)) {
41
+ throw new Error(messages.ILLEGAL_NAMESPACE_VALUE);
42
+ }
43
+ const [resolvedNamespace, injected] = styleXCreateNamespace(namespace, options);
44
+ resolvedNamespaces[namespaceName] = (0, _objectUtils.flattenObject)(resolvedNamespace);
45
+ for (const cn of Object.keys(injected)) {
46
+ if (injectedStyles[cn] == null) {
47
+ injectedStyles[cn] = injected[cn];
48
+ }
49
+ }
50
+ }
51
+ return [resolvedNamespaces, injectedStyles];
52
+ }
53
+
54
+ // Transforms a single style namespace.
55
+ // e.g. Something along the lines of:
56
+ // {color: 'red', margin: '10px'} =>
57
+ // {
58
+ // color: 'color-red',
59
+ // marginTop: 'margin-top-10px',
60
+ // marginBottom: 'margin-bottom-10px',
61
+ // marginStart: 'margin-start-10px',
62
+ // marginEnd: 'margin-end-10px'
63
+ // }
64
+ //
65
+ // First, it expands shorthand properties. (margin => marginTop, marginBottom, marginStart, marginEnd)
66
+ // Then, it converts each style value to a className.
67
+ // Then, it returns the transformed style Object and an object of injected styles.
68
+ function styleXCreateNamespace(style, options) {
69
+ const namespaceEntries = (0, _objectUtils.objEntries)(style);
70
+
71
+ // First the shorthand properties are expanded.
72
+ // e.g. `margin` gets expanded to `marginTop`, `marginBottom`, `marginStart`, `marginEnd`.
73
+ // `entries` is an array of [key, value] pairs.
74
+ const entries = namespaceEntries.flatMap(_ref => {
75
+ let [key, value] = _ref;
76
+ if (value instanceof _stylexInclude.IncludedStyles) {
77
+ return [[key, value]];
78
+ }
79
+ if (value != null && typeof value === 'object' && !Array.isArray(value)) {
80
+ if (!key.startsWith(':') && !key.startsWith('@')) {
81
+ throw new Error(messages.INVALID_PSEUDO);
82
+ }
83
+ return [[key, (0, _objectUtils.objFromEntries)((0, _objectUtils.objEntries)(value).flatMap(_ref2 => {
84
+ let [innerKey, innerValue] = _ref2;
85
+ if (innerValue != null && typeof innerValue === 'object' && !Array.isArray(innerValue)) {
86
+ throw new Error(messages.ILLEGAL_NESTED_PSEUDO);
87
+ }
88
+ return (0, _expandShorthands.default)([innerKey, innerValue]);
89
+ }))]];
90
+ } else {
91
+ if (typeof value !== 'string' && typeof value !== 'number' && !Array.isArray(value)) {
92
+ throw new Error(messages.ILLEGAL_PROP_VALUE);
93
+ }
94
+ if (Array.isArray(value) && value.some(val => typeof val === 'object')) {
95
+ throw new Error(messages.ILLEGAL_PROP_ARRAY_VALUE);
96
+ }
97
+ return (0, _expandShorthands.default)([key, value]);
98
+ }
99
+ });
100
+
101
+ // Now each [key, value] pair is considered a single atomic style.
102
+ // This atomic style is converted to a className by hashing
103
+ //
104
+ // The [key, className] pair is then added to the output Object: `resolvedNamespace`.
105
+ // While hashing, the CSS rule that the className is generated from is also added to the output Object: `injectedStyles`.
106
+ const resolvedNamespace = {};
107
+ const injectedStyles = {};
108
+ for (const [key, val] of entries) {
109
+ if (val instanceof _stylexInclude.IncludedStyles) {
110
+ resolvedNamespace[key] = val;
111
+ } else if (val != null && typeof val === 'object' && !Array.isArray(val)) {
112
+ const pseudo = key;
113
+ const innerObj = {};
114
+ for (const [innerKey, innerVal] of (0, _objectUtils.objEntries)(val)) {
115
+ const [updatedKey, className, cssRule] = (0, _convertToClassName.default)([innerKey, innerVal], pseudo, options);
116
+ innerObj[updatedKey] = className;
117
+ injectedStyles[updatedKey + pseudo] = [className, cssRule];
118
+ }
119
+ resolvedNamespace[key] = innerObj;
120
+ } else {
121
+ const [updatedKey, className, cssRule] = (0, _convertToClassName.default)([key, val], undefined, options);
122
+ resolvedNamespace[updatedKey] = className;
123
+ injectedStyles[updatedKey] = [className, cssRule];
124
+ }
125
+ }
126
+ const finalInjectedStyles = (0, _objectUtils.objFromEntries)((0, _objectUtils.objValues)(injectedStyles));
127
+ return [resolvedNamespace, finalInjectedStyles];
128
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = stylexFirstThatWorks;
7
+ /**
8
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
9
+ *
10
+ * This source code is licensed under the MIT license found in the
11
+ * LICENSE file in the root directory of this source tree.
12
+ *
13
+ *
14
+ *
15
+ */
16
+
17
+ function stylexFirstThatWorks() {
18
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
19
+ args[_key] = arguments[_key];
20
+ }
21
+ return [...args].reverse();
22
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.IncludedStyles = void 0;
7
+ exports.default = stylexInclude;
8
+ var messages = _interopRequireWildcard(require("./messages"));
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
+ /**
12
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
13
+ *
14
+ * This source code is licensed under the MIT license found in the
15
+ * LICENSE file in the root directory of this source tree.
16
+ *
17
+ *
18
+ *
19
+ */
20
+
21
+ let number = 0;
22
+ function uuid() {
23
+ return `__included_${++number}__`;
24
+ }
25
+ class IncludedStyles {
26
+ constructor(astNode) {
27
+ this.astNode = astNode;
28
+ }
29
+ }
30
+ exports.IncludedStyles = IncludedStyles;
31
+ function stylexInclude(firstArg) {
32
+ if ((arguments.length <= 1 ? 0 : arguments.length - 1) > 0) {
33
+ throw new Error(messages.ILLEGAL_ARGUMENT_LENGTH);
34
+ }
35
+ return {
36
+ [uuid()]: new IncludedStyles(firstArg.node)
37
+ };
38
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = styleXKeyframes;
7
+ var _hash = _interopRequireDefault(require("./hash"));
8
+ var _expandShorthands = _interopRequireDefault(require("./expand-shorthands"));
9
+ var _generateLtr = _interopRequireDefault(require("./physical-rtl/generate-ltr"));
10
+ var _generateRtl = _interopRequireDefault(require("./physical-rtl/generate-rtl"));
11
+ var _transformValue = _interopRequireDefault(require("./transform-value"));
12
+ var _dashify = _interopRequireDefault(require("./utils/dashify"));
13
+ var _objectUtils = require("./utils/object-utils");
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ /**
16
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
17
+ *
18
+ * This source code is licensed under the MIT license found in the
19
+ * LICENSE file in the root directory of this source tree.
20
+ *
21
+ *
22
+ */
23
+
24
+ // Similar to `stylex.create` it takes an object of keyframes
25
+ // and returns a string after hashing it.
26
+ //
27
+ // It also expands shorthand properties to maintain parity with
28
+ // `stylex.create`.
29
+ function styleXKeyframes(frames) {
30
+ let {
31
+ stylexSheetName = '<>',
32
+ classNamePrefix = 'x'
33
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
34
+ const expandedObject = (0, _objectUtils.objMap)(frames, frame => _objectUtils.Pipe.create(frame).pipe(expandFrameShorthands).pipe(x => (0, _objectUtils.objMapKeys)(x, _dashify.default)).pipe(x => (0, _objectUtils.objMap)(x, (value, key) => (0, _transformValue.default)(key, value))).done());
35
+ const ltrStyles = (0, _objectUtils.objMap)(expandedObject, frame => (0, _objectUtils.objMapEntry)(frame, _generateLtr.default));
36
+ const rtlStyles = (0, _objectUtils.objMap)(expandedObject, frame => (0, _objectUtils.objMapEntry)(frame, entry => (0, _generateRtl.default)(entry) ?? entry));
37
+ const ltrString = constructKeyframesObj(ltrStyles);
38
+ const rtlString = constructKeyframesObj(rtlStyles);
39
+
40
+ // This extra `-B` is kept for some idiosyncratic legacy compatibility for now.
41
+ const animationName = classNamePrefix + (0, _hash.default)(stylexSheetName + ltrString) + '-B';
42
+ const ltr = `@keyframes ${animationName}{${ltrString}}`;
43
+ const rtl = ltrString === rtlString ? null : `@keyframes ${animationName}{${rtlString}}`;
44
+ return [animationName, {
45
+ ltr,
46
+ rtl,
47
+ priority: 1
48
+ }];
49
+ }
50
+ function expandFrameShorthands(frame) {
51
+ return (0, _objectUtils.objFromEntries)((0, _objectUtils.objEntries)(frame).flatMap(pair => (0, _expandShorthands.default)(pair)));
52
+ }
53
+
54
+ // Create t
55
+ function constructKeyframesObj(frames) {
56
+ return (0, _objectUtils.objEntries)(frames).map(_ref => {
57
+ let [key, value] = _ref;
58
+ return `${key}{${(0, _objectUtils.objEntries)(value).map(_ref2 => {
59
+ let [k, v] = _ref2;
60
+ return `${k}:${v};`;
61
+ }).join('')}}`;
62
+ }).join('');
63
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = transformValue;
7
+ var _normalizeValue = _interopRequireDefault(require("./utils/normalize-value"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
+ /**
10
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
11
+ *
12
+ * This source code is licensed under the MIT license found in the
13
+ * LICENSE file in the root directory of this source tree.
14
+ *
15
+ */
16
+
17
+ /**
18
+ * Convert a CSS value in JS to the final CSS string value
19
+ */
20
+ function transformValue(key, rawValue) {
21
+ const value = typeof rawValue === 'number' ? String(Math.round(rawValue * 10000) / 10000) + getNumberSuffix(key) : rawValue;
22
+
23
+ // content is one of the values that needs to wrapped in quotes.
24
+ // Users may write `''` without thinking about it, so we fix that.
25
+ if (key === 'content' && typeof value === 'string') {
26
+ const val = value.trim();
27
+ if (val.match(/^attr\([a-zA-Z0-9-]+\)$/)) {
28
+ return val;
29
+ }
30
+ if (!(val.startsWith('"') && val.endsWith('"') || val.startsWith("'") && val.endsWith("'"))) {
31
+ return `"${val}"`;
32
+ }
33
+ }
34
+ return (0, _normalizeValue.default)(value, key);
35
+ }
36
+ function getNumberSuffix(key) {
37
+ if (unitlessNumberProperties.has(key)) {
38
+ return '';
39
+ }
40
+ const suffix = numberPropertySuffixes[key];
41
+ if (suffix == null) {
42
+ return 'px';
43
+ } else {
44
+ return suffix;
45
+ }
46
+ }
47
+ const unitlessNumberProperties = new Set(['animationIterationCount', 'borderImageOutset', 'borderImageSlice', 'borderImageWidth', 'columnCount', 'flex',
48
+ // Unsupported
49
+ 'flexGrow', 'flexPositive', 'flexShrink', 'flexOrder', 'gridRow', 'gridColumn', 'fontWeight', 'lineClamp', 'lineHeight', 'opacity', 'order', 'orphans', 'tabSize', 'widows', 'zIndex', 'fillOpacity', 'floodOpacity', 'stopOpacity', 'strokeDasharray', 'strokeDashoffset', 'strokeMiterlimit', 'strokeOpacity', 'strokeWidth']);
50
+
51
+ // List of properties that have custom suffixes for numbers
52
+ const numberPropertySuffixes = {
53
+ animationDelay: 'ms',
54
+ animationDuration: 'ms',
55
+ transitionDelay: 'ms',
56
+ transitionDuration: 'ms',
57
+ voiceDuration: 'ms'
58
+ };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = dashify;
7
+ /**
8
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
9
+ *
10
+ * This source code is licensed under the MIT license found in the
11
+ * LICENSE file in the root directory of this source tree.
12
+ *
13
+ */
14
+
15
+ function dashify(str) {
16
+ return str.replace(/(^|[a-z])([A-Z])/g, '$1-$2').toLowerCase();
17
+ }
@@ -0,0 +1,24 @@
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
+ *
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.default = generateCSSRule;
17
+ function generateCSSRule(className, decls, pseudo) {
18
+ if (pseudo === '::thumb') {
19
+ const selector = THUMB_VARIANTS.map(suffix => '.' + className + suffix).join(', ');
20
+ return `${selector}{${decls}}`;
21
+ }
22
+ return pseudo != null && pseudo[0] === '@' ? `${pseudo}{.${className}.${className}{${decls}}}` : pseudo != null && pseudo[0] === ':' ? `.${className}${pseudo}{${decls}}` : `.${className}{${decls}}`;
23
+ }
24
+ const THUMB_VARIANTS = ['::-webkit-slider-thumb', '::-moz-range-thumb', '::-ms-thumb'];
@@ -0,0 +1,32 @@
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
+ *
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.default = normalizeValue;
17
+ var _fontSizePxToRem = _interopRequireDefault(require("./normalizers/font-size-px-to-rem"));
18
+ var _leadingZero = _interopRequireDefault(require("./normalizers/leading-zero"));
19
+ var _quotes = _interopRequireDefault(require("./normalizers/quotes"));
20
+ var _timings = _interopRequireDefault(require("./normalizers/timings"));
21
+ var _whitespace = _interopRequireDefault(require("./normalizers/whitespace"));
22
+ var _zeroDimensions = _interopRequireDefault(require("./normalizers/zero-dimensions"));
23
+ var _detectUnclosedFns = _interopRequireDefault(require("./normalizers/detect-unclosed-fns"));
24
+ var _postcssValueParser = _interopRequireDefault(require("postcss-value-parser"));
25
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
+ // `Timings` should be before `LeadingZero`, because it
27
+ // changes 500ms to 0.5s, then `LeadingZero` makes it .5s
28
+ const normalizers = [_detectUnclosedFns.default, _whitespace.default, _timings.default, _zeroDimensions.default, _leadingZero.default, _quotes.default, _fontSizePxToRem.default];
29
+ function normalizeValue(value, key) {
30
+ const parsedAST = (0, _postcssValueParser.default)(value);
31
+ return normalizers.reduce((ast, fn) => fn(ast, key), parsedAST).toString();
32
+ }
@@ -0,0 +1,29 @@
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
+ */
9
+
10
+ 'use strict';
11
+
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: true
14
+ });
15
+ exports.default = detectUnclosedFns;
16
+ var messages = _interopRequireWildcard(require("../../messages"));
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+ /**
20
+ * Remove leading zeros from numbers
21
+ */
22
+ function detectUnclosedFns(ast, _) {
23
+ ast.walk(node => {
24
+ if (node.type === 'function' && node.unclosed) {
25
+ throw new Error(messages.LINT_UNCLOSED_FUNCTION);
26
+ }
27
+ });
28
+ return ast;
29
+ }
@@ -0,0 +1,34 @@
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
+ */
9
+
10
+ 'use strict';
11
+
12
+ const parser = require('postcss-value-parser');
13
+ const ROOT_FONT_SIZE = 16;
14
+
15
+ /**
16
+ * Convert font sizes from absolute unit `px` to relative unit `rem`.
17
+ * This will allow developers to continue thinking and using what's familiar
18
+ * while we output font sizes that are adjustable
19
+ */
20
+ module.exports = function convertFontSizeToRem(ast, key) {
21
+ if (key !== 'fontSize') {
22
+ return ast;
23
+ }
24
+ ast.walk(node => {
25
+ if (node.type !== 'word') {
26
+ return;
27
+ }
28
+ const dimension = parser.unit(node.value);
29
+ if (dimension && dimension.unit === 'px') {
30
+ node.value = `${parseFloat(dimension.number) / ROOT_FONT_SIZE}rem`;
31
+ }
32
+ });
33
+ return ast;
34
+ };
@@ -0,0 +1,36 @@
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
+ */
9
+
10
+ 'use strict';
11
+
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: true
14
+ });
15
+ exports.default = normalizeLeadingZero;
16
+ var _postcssValueParser = _interopRequireDefault(require("postcss-value-parser"));
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ /**
19
+ * Remove leading zeros from numbers
20
+ */
21
+ function normalizeLeadingZero(ast, _) {
22
+ ast.walk(node => {
23
+ if (node.type !== 'word') {
24
+ return;
25
+ }
26
+ const value = Number.parseFloat(node.value);
27
+ if (Number.isNaN(value)) {
28
+ return;
29
+ }
30
+ const dimension = _postcssValueParser.default.unit(node.value);
31
+ if (value < 1 && value >= 0) {
32
+ node.value = value.toString().replace('0.', '.') + (dimension ? dimension.unit : '');
33
+ }
34
+ });
35
+ return ast;
36
+ }
@@ -0,0 +1,30 @@
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
+ *
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ /**
14
+ * Make empty strings use consistent double quotes
15
+ */
16
+ Object.defineProperty(exports, "__esModule", {
17
+ value: true
18
+ });
19
+ exports.default = normalizeQuotes;
20
+ function normalizeQuotes(ast, _) {
21
+ ast.walk(node => {
22
+ if (node.type !== 'string') {
23
+ return;
24
+ }
25
+ if (node.value === '') {
26
+ node.quote = '"';
27
+ }
28
+ });
29
+ return ast;
30
+ }
@@ -0,0 +1,39 @@
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
+ *
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ Object.defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.default = normalizeTimings;
17
+ var _postcssValueParser = _interopRequireDefault(require("postcss-value-parser"));
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ /**
20
+ * Turn millisecond values to seconds (shorter), except when < 10ms
21
+ */
22
+
23
+ function normalizeTimings(ast, _) {
24
+ ast.walk(node => {
25
+ if (node.type !== 'word') {
26
+ return;
27
+ }
28
+ const value = Number.parseFloat(node.value);
29
+ if (Number.isNaN(value)) {
30
+ return;
31
+ }
32
+ const dimension = _postcssValueParser.default.unit(node.value);
33
+ if (!dimension || dimension.unit !== 'ms' || value < 10) {
34
+ return;
35
+ }
36
+ node.value = value / 1000 + 's';
37
+ });
38
+ return ast;
39
+ }
@@ -0,0 +1,59 @@
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
+ *
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ /**
14
+ * Use single spaces and remove spaces when not needed: around functions,
15
+ * commas. But preserve spece around + and - as they are required in calc()
16
+ */
17
+ Object.defineProperty(exports, "__esModule", {
18
+ value: true
19
+ });
20
+ exports.default = normalizeWhitespace;
21
+ function normalizeWhitespace(ast, _) {
22
+ // trim
23
+ if (ast.nodes[0].type === 'space') {
24
+ ast.nodes.shift();
25
+ }
26
+ if (ast.nodes[ast.nodes.length - 1].type === 'space') {
27
+ ast.nodes.pop();
28
+ }
29
+ ast.walk((node, idx) => {
30
+ switch (node.type) {
31
+ case 'space':
32
+ {
33
+ node.value = ' ';
34
+ break;
35
+ }
36
+ case 'div':
37
+ case 'function':
38
+ {
39
+ node.before = '';
40
+ node.after = '';
41
+ break;
42
+ }
43
+ case 'word':
44
+ {
45
+ if (node.value === '!important') {
46
+ if (ast.nodes[idx - 1] && ast.nodes[idx - 1].type === 'space') {
47
+ ast.nodes.splice(idx - 1, 1);
48
+ }
49
+ }
50
+ break;
51
+ }
52
+ default:
53
+ {
54
+ break;
55
+ }
56
+ }
57
+ });
58
+ return ast;
59
+ }
@@ -0,0 +1,44 @@
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
+ */
9
+
10
+ 'use strict';
11
+
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: true
14
+ });
15
+ exports.default = normalizeZeroDimensions;
16
+ var _postcssValueParser = _interopRequireDefault(require("postcss-value-parser"));
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ const angles = ['deg', 'grad', 'turn', 'rad'];
19
+ const timings = ['ms', 's'];
20
+
21
+ /**
22
+ * Remove units in zero values, except when required: in angles and timings,
23
+ * in which case make them consistent 0deg and 0s.
24
+ */
25
+
26
+ function normalizeZeroDimensions(ast, _) {
27
+ ast.walk(node => {
28
+ if (node.type !== 'word') {
29
+ return;
30
+ }
31
+ const dimension = _postcssValueParser.default.unit(node.value);
32
+ if (!dimension || dimension.number !== '0') {
33
+ return;
34
+ }
35
+ if (angles.indexOf(dimension.unit) !== -1) {
36
+ node.value = '0deg';
37
+ } else if (timings.indexOf(dimension.unit) !== -1) {
38
+ node.value = '0s';
39
+ } else {
40
+ node.value = '0';
41
+ }
42
+ });
43
+ return ast;
44
+ }