@stylexjs/shared 0.2.0-beta.8 → 0.2.0-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/lib/expand-shorthands.js +246 -303
- package/lib/generate-css-rule.js +6 -34
- package/lib/index.d.ts +1 -1
- package/lib/index.js.flow +5 -0
- package/lib/messages.js +3 -5
- package/lib/namespace-transforms/__tests__/preflatten.test.js +120 -0
- package/lib/namespace-transforms/preflatten.js +89 -0
- package/lib/preprocess-rules/application-order.js +259 -0
- package/lib/preprocess-rules/expand-shorthands.js +156 -0
- package/lib/preprocess-rules/index.js +39 -0
- package/lib/preprocess-rules/legacy-expand-shorthands.js +169 -0
- package/lib/preprocess-rules/null-out-longhand.js +310 -0
- package/lib/preprocess-rules/property-specificity.js +135 -0
- package/lib/preprocess-rules/react-native-web.js +142 -0
- package/lib/stylex-create.js +17 -13
- package/lib/stylex-keyframes.js +22 -10
- package/lib/utils/Rule.js +71 -0
- package/lib/utils/normalize-value.js +3 -0
- package/lib/utils/property-priorities.js +116 -0
- package/lib/utils/split-css-value.js +47 -0
- package/package.json +1 -1
@@ -0,0 +1,156 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = void 0;
|
7
|
+
var _splitCssValue = _interopRequireDefault(require("../utils/split-css-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
|
+
// TODO: to be added later.
|
19
|
+
// const aliases = {
|
20
|
+
// marginInlineStart: (rawValue) => [['marginStart', rawValue]],
|
21
|
+
// marginInlineEnd: (rawValue) => [['marginEnd', rawValue]],
|
22
|
+
// marginInline: (rawValue) => [
|
23
|
+
// ['marginStart', rawValue],
|
24
|
+
// ['marginEnd', rawValue],
|
25
|
+
// ],
|
26
|
+
// paddingInlineStart: (rawValue) => [['paddingStart', rawValue]],
|
27
|
+
// paddingInlineEnd: (rawValue) => [['paddingEnd', rawValue]],
|
28
|
+
// paddingInline: (rawValue) => [
|
29
|
+
// ['paddingStart', rawValue],
|
30
|
+
// ['paddingEnd', rawValue],
|
31
|
+
// ],
|
32
|
+
// // 'borderInlineStart': (rawValue) => [['borderStart', rawValue]],
|
33
|
+
// // 'borderInlineEnd': (rawValue) => [['borderEnd', rawValue]],
|
34
|
+
// // // This will need to change.
|
35
|
+
// // 'borderInline': (rawValue) => [
|
36
|
+
// // ['borderStart', rawValue],
|
37
|
+
// // ['borderEnd', rawValue],
|
38
|
+
// // ],
|
39
|
+
// };
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Shorthand properties:
|
43
|
+
* - [x] all - Should be banned
|
44
|
+
* - [ ] animation
|
45
|
+
* - [ ] background
|
46
|
+
* - [-] border
|
47
|
+
* - [x] border-block-end
|
48
|
+
* - [x] border-block-start
|
49
|
+
* - [ ] border-bottom
|
50
|
+
* - [x] border-color
|
51
|
+
* - [x] border-image
|
52
|
+
* - [x] border-inline-end
|
53
|
+
* - [x] border-inline-start
|
54
|
+
* - [ ] border-left
|
55
|
+
* - [x] border-radius
|
56
|
+
* - [ ] border-right
|
57
|
+
* - [x] border-style
|
58
|
+
* - [ ] border-top
|
59
|
+
* - [x] border-width
|
60
|
+
* - [ ] column-rule
|
61
|
+
* - [ ] columns
|
62
|
+
* - [ ] flex
|
63
|
+
* - [ ] flex-flow
|
64
|
+
* - [ ] font
|
65
|
+
* - [ ] gap
|
66
|
+
* - [ ] grid
|
67
|
+
* - [ ] grid-area
|
68
|
+
* - [ ] grid-column
|
69
|
+
* - [ ] grid-row
|
70
|
+
* - [ ] grid-template
|
71
|
+
* - [ ] list-style
|
72
|
+
* - [x] margin
|
73
|
+
* - [ ] mask
|
74
|
+
* - [ ] offset
|
75
|
+
* - [ ] outline
|
76
|
+
* - [x] overflow
|
77
|
+
* - [x] padding
|
78
|
+
* - [ ] place-content
|
79
|
+
* - [ ] place-items
|
80
|
+
* - [ ] place-self
|
81
|
+
* - [ ] scroll-margin
|
82
|
+
* - [ ] scroll-padding
|
83
|
+
* - [ ] text-decoration
|
84
|
+
* - [ ] text-emphasis
|
85
|
+
* - [ ] transition
|
86
|
+
*/
|
87
|
+
|
88
|
+
const expansions = {
|
89
|
+
// ...aliases,
|
90
|
+
border: rawValue => {
|
91
|
+
return [['borderTop', rawValue], ['borderEnd', rawValue], ['borderBottom', rawValue], ['borderStart', rawValue]];
|
92
|
+
},
|
93
|
+
/*
|
94
|
+
// Add this later, as this will be a breaking change
|
95
|
+
border: (rawValue: string): Array<[string, string]> => {
|
96
|
+
if (typeof rawValue === 'number') {
|
97
|
+
return expansions.borderWidth(rawValue);
|
98
|
+
}
|
99
|
+
const [width, style, color] = splitValue(rawValue);
|
100
|
+
return [
|
101
|
+
...expansions.borderWidth(width),
|
102
|
+
...expansions.borderStyle(style),
|
103
|
+
...expansions.borderColor(color),
|
104
|
+
];
|
105
|
+
}
|
106
|
+
*/
|
107
|
+
borderColor: rawValue => {
|
108
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
109
|
+
return [['borderTopColor', top], ['borderEndColor', right], ['borderBottomColor', bottom], ['borderStartColor', left]];
|
110
|
+
},
|
111
|
+
borderHorizontal: rawValue => {
|
112
|
+
return [['borderStart', rawValue], ['borderEnd', rawValue]];
|
113
|
+
},
|
114
|
+
borderStyle: rawValue => {
|
115
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
116
|
+
return [['borderTopStyle', top], ['borderEndStyle', right], ['borderBottomStyle', bottom], ['borderStartStyle', left]];
|
117
|
+
},
|
118
|
+
borderVertical: rawValue => {
|
119
|
+
return [['borderTop', rawValue], ['borderBottom', rawValue]];
|
120
|
+
},
|
121
|
+
borderWidth: rawValue => {
|
122
|
+
const [top, right = top, bottom = top, left = right] = typeof rawValue === 'number' ? [rawValue] : (0, _splitCssValue.default)(rawValue);
|
123
|
+
return [['borderTopWidth', top], ['borderEndWidth', right], ['borderBottomWidth', bottom], ['borderStartWidth', left]];
|
124
|
+
},
|
125
|
+
borderRadius: rawValue => {
|
126
|
+
const [top, right = top, bottom = top, left = right] = typeof rawValue === 'string' ? (0, _splitCssValue.default)(rawValue) : typeof rawValue === 'number' ? [rawValue] : rawValue; // remove
|
127
|
+
|
128
|
+
return [['borderTopStartRadius', top], ['borderTopEndRadius', right], ['borderBottomEndRadius', bottom], ['borderBottomStartRadius', left]];
|
129
|
+
},
|
130
|
+
margin: rawValue => {
|
131
|
+
const [top, right = top, bottom = top, left = right] = typeof rawValue === 'number' ? [rawValue] : (0, _splitCssValue.default)(rawValue);
|
132
|
+
return [['marginTop', top], ['marginEnd', right], ['marginBottom', bottom], ['marginStart', left]];
|
133
|
+
},
|
134
|
+
marginHorizontal: rawValue => {
|
135
|
+
return [['marginStart', rawValue], ['marginEnd', rawValue]];
|
136
|
+
},
|
137
|
+
marginVertical: rawValue => {
|
138
|
+
return [['marginTop', rawValue], ['marginBottom', rawValue]];
|
139
|
+
},
|
140
|
+
overflow: rawValue => {
|
141
|
+
const [x, y = x] = (0, _splitCssValue.default)(rawValue);
|
142
|
+
return [['overflowX', x], ['overflowY', y]];
|
143
|
+
},
|
144
|
+
padding: rawValue => {
|
145
|
+
const [top, right = top, bottom = top, left = right] = typeof rawValue === 'number' ? [rawValue] : (0, _splitCssValue.default)(rawValue);
|
146
|
+
return [['paddingTop', top], ['paddingEnd', right], ['paddingBottom', bottom], ['paddingStart', left]];
|
147
|
+
},
|
148
|
+
paddingHorizontal: rawValue => {
|
149
|
+
return [['paddingStart', rawValue], ['paddingEnd', rawValue]];
|
150
|
+
},
|
151
|
+
paddingVertical: rawValue => {
|
152
|
+
return [['paddingTop', rawValue], ['paddingBottom', rawValue]];
|
153
|
+
}
|
154
|
+
};
|
155
|
+
var _default = expansions;
|
156
|
+
exports.default = _default;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = flatMapExpandedShorthands;
|
7
|
+
exports.getExpandedKeys = getExpandedKeys;
|
8
|
+
var _applicationOrder = _interopRequireDefault(require("./application-order"));
|
9
|
+
var _legacyExpandShorthands = _interopRequireDefault(require("./legacy-expand-shorthands"));
|
10
|
+
var _propertySpecificity = _interopRequireDefault(require("./property-specificity"));
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
12
|
+
/**
|
13
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
14
|
+
*
|
15
|
+
* This source code is licensed under the MIT license found in the
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
17
|
+
*
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
|
21
|
+
const expansions = {
|
22
|
+
'application-order': _applicationOrder.default,
|
23
|
+
'property-specificity': _propertySpecificity.default,
|
24
|
+
'legacy-expand-shorthands': _legacyExpandShorthands.default
|
25
|
+
};
|
26
|
+
function getExpandedKeys(options) {
|
27
|
+
return Object.keys(expansions[options.styleResolution ?? 'application-order']);
|
28
|
+
}
|
29
|
+
function flatMapExpandedShorthands(objEntry, options) {
|
30
|
+
const [key, value] = objEntry;
|
31
|
+
const expansion = expansions[options.styleResolution ?? 'application-order'][key];
|
32
|
+
if (expansion) {
|
33
|
+
if (Array.isArray(value)) {
|
34
|
+
throw new Error('Cannot use fallbacks for shorthands. Use the expansion instead.');
|
35
|
+
}
|
36
|
+
return expansion(value);
|
37
|
+
}
|
38
|
+
return [[key, value]];
|
39
|
+
}
|
@@ -0,0 +1,169 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = void 0;
|
7
|
+
var _splitCssValue = _interopRequireDefault(require("../utils/split-css-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
|
+
const borderWidthKeywords = new Set(['thin', 'medium', 'thick']);
|
19
|
+
const borderStyleKeywords = new Set(['none', 'hidden', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inside',
|
20
|
+
// Non-standard
|
21
|
+
'inset', 'outset']);
|
22
|
+
const globalKeywords = new Set(['initial', 'inherit', 'unset']);
|
23
|
+
function borderDetector(borderParts) {
|
24
|
+
const parts = borderParts.filter(Boolean).slice();
|
25
|
+
let suffix = '';
|
26
|
+
for (let i = 0; i < parts.length; i++) {
|
27
|
+
const part = parts[i];
|
28
|
+
if (typeof part === 'string' && part.endsWith('!important')) {
|
29
|
+
parts[i] = part.replace('!important', '').trim();
|
30
|
+
suffix = ' !important';
|
31
|
+
}
|
32
|
+
}
|
33
|
+
if (parts.length === 1 && globalKeywords.has(parts[0])) {
|
34
|
+
return [parts[0], parts[0], parts[0]];
|
35
|
+
}
|
36
|
+
|
37
|
+
// Find the part that starts with a number
|
38
|
+
// This is most likely to be the borderWidth
|
39
|
+
let width = parts.find(part => typeof part === 'number' || part.match(/^\.?\d+/) || borderWidthKeywords.has(part));
|
40
|
+
if (typeof width === 'number') {
|
41
|
+
width = String(width) + 'px';
|
42
|
+
}
|
43
|
+
// console.log('width', width);
|
44
|
+
if (width != null) {
|
45
|
+
parts.splice(parts.indexOf(width), 1);
|
46
|
+
}
|
47
|
+
if (parts.length === 0) {
|
48
|
+
return [String(width) + suffix, null, null];
|
49
|
+
}
|
50
|
+
const style = parts.find(part => typeof part === 'string' && borderStyleKeywords.has(part));
|
51
|
+
if (style != null) {
|
52
|
+
parts.splice(parts.indexOf(style), 1);
|
53
|
+
}
|
54
|
+
if (parts.length === 2 && width == null) {
|
55
|
+
width = parts[0];
|
56
|
+
parts.splice(0, 1);
|
57
|
+
}
|
58
|
+
if (width != null && parts.length > 1) {
|
59
|
+
throw new Error('Invalid border shorthand value');
|
60
|
+
}
|
61
|
+
const color = parts[0];
|
62
|
+
return [width, style, color].map(part => part != null ? part + suffix : null);
|
63
|
+
}
|
64
|
+
const expansions = {
|
65
|
+
border: rawValue => {
|
66
|
+
if (typeof rawValue === 'number') {
|
67
|
+
return expansions.borderWidth(rawValue);
|
68
|
+
}
|
69
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
70
|
+
const [width, style, color] = borderDetector(parts);
|
71
|
+
return [...(width != null ? expansions.borderWidth(width) : []), ...(style != null ? expansions.borderStyle(style) : []), ...(color != null ? expansions.borderColor(color) : [])];
|
72
|
+
},
|
73
|
+
borderTop: rawValue => {
|
74
|
+
if (typeof rawValue === 'number') {
|
75
|
+
return [['borderTopWidth', rawValue]];
|
76
|
+
}
|
77
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
78
|
+
const [width, style, color] = borderDetector(parts);
|
79
|
+
return [width != null ? ['borderTopWidth', width] : null, style != null ? ['borderTopStyle', style] : null, color != null ? ['borderTopColor', color] : null].filter(Boolean);
|
80
|
+
},
|
81
|
+
borderEnd: rawValue => {
|
82
|
+
if (typeof rawValue === 'number') {
|
83
|
+
return [['borderEndWidth', rawValue]];
|
84
|
+
}
|
85
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
86
|
+
const [width, style, color] = borderDetector(parts);
|
87
|
+
return [width != null ? ['borderEndWidth', width] : null, style != null ? ['borderEndStyle', style] : null, color != null ? ['borderEndColor', color] : null].filter(Boolean);
|
88
|
+
},
|
89
|
+
borderRight: rawValue => {
|
90
|
+
if (typeof rawValue === 'number') {
|
91
|
+
return [['borderRightWidth', rawValue]];
|
92
|
+
}
|
93
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
94
|
+
const [width, style, color] = borderDetector(parts);
|
95
|
+
return [width != null ? ['borderRightWidth', width] : null, style != null ? ['borderRightStyle', style] : null, color != null ? ['borderRightColor', color] : null].filter(Boolean);
|
96
|
+
},
|
97
|
+
borderBottom: rawValue => {
|
98
|
+
if (typeof rawValue === 'number') {
|
99
|
+
return [['borderBottomWidth', rawValue]];
|
100
|
+
}
|
101
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
102
|
+
const [width, style, color] = borderDetector(parts);
|
103
|
+
return [width != null ? ['borderBottomWidth', width] : null, style != null ? ['borderBottomStyle', style] : null, color != null ? ['borderBottomColor', color] : null].filter(Boolean);
|
104
|
+
},
|
105
|
+
borderStart: rawValue => {
|
106
|
+
if (typeof rawValue === 'number') {
|
107
|
+
return [['borderStartWidth', rawValue]];
|
108
|
+
}
|
109
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
110
|
+
const [width, style, color] = borderDetector(parts);
|
111
|
+
return [width != null ? ['borderStartWidth', width] : null, style != null ? ['borderStartStyle', style] : null, color != null ? ['borderStartColor', color] : null].filter(Boolean);
|
112
|
+
},
|
113
|
+
borderLeft: rawValue => {
|
114
|
+
if (typeof rawValue === 'number') {
|
115
|
+
return [['borderLeftWidth', rawValue]];
|
116
|
+
}
|
117
|
+
const parts = (0, _splitCssValue.default)(rawValue);
|
118
|
+
const [width, style, color] = borderDetector(parts);
|
119
|
+
return [width != null ? ['borderLeftWidth', width] : null, style != null ? ['borderLeftStyle', style] : null, color != null ? ['borderLeftColor', color] : null].filter(Boolean);
|
120
|
+
},
|
121
|
+
borderColor: rawValue => {
|
122
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
123
|
+
return [['borderTopColor', top], ['borderEndColor', right], ['borderBottomColor', bottom], ['borderStartColor', left]];
|
124
|
+
},
|
125
|
+
borderHorizontal: rawValue => {
|
126
|
+
return [...expansions.borderStart(rawValue), ...expansions.borderEnd(rawValue)];
|
127
|
+
},
|
128
|
+
borderStyle: rawValue => {
|
129
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
130
|
+
return [['borderTopStyle', top], ['borderEndStyle', right], ['borderBottomStyle', bottom], ['borderStartStyle', left]];
|
131
|
+
},
|
132
|
+
borderVertical: rawValue => {
|
133
|
+
return [...expansions.borderTop(rawValue), ...expansions.borderBottom(rawValue)];
|
134
|
+
},
|
135
|
+
borderWidth: rawValue => {
|
136
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
137
|
+
return [['borderTopWidth', top], ['borderEndWidth', right], ['borderBottomWidth', bottom], ['borderStartWidth', left]];
|
138
|
+
},
|
139
|
+
borderRadius: rawValue => {
|
140
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
141
|
+
return [['borderTopStartRadius', top], ['borderTopEndRadius', right], ['borderBottomEndRadius', bottom], ['borderBottomStartRadius', left]];
|
142
|
+
},
|
143
|
+
margin: rawValue => {
|
144
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
145
|
+
return [['marginTop', top], ['marginEnd', right], ['marginBottom', bottom], ['marginStart', left]];
|
146
|
+
},
|
147
|
+
marginHorizontal: rawValue => {
|
148
|
+
return [['marginStart', rawValue], ['marginEnd', rawValue]];
|
149
|
+
},
|
150
|
+
marginVertical: rawValue => {
|
151
|
+
return [['marginTop', rawValue], ['marginBottom', rawValue]];
|
152
|
+
},
|
153
|
+
overflow: rawValue => {
|
154
|
+
const [x, y = x] = (0, _splitCssValue.default)(rawValue);
|
155
|
+
return [['overflowX', x], ['overflowY', y]];
|
156
|
+
},
|
157
|
+
padding: rawValue => {
|
158
|
+
const [top, right = top, bottom = top, left = right] = (0, _splitCssValue.default)(rawValue);
|
159
|
+
return [['paddingTop', top], ['paddingEnd', right], ['paddingBottom', bottom], ['paddingStart', left]];
|
160
|
+
},
|
161
|
+
paddingHorizontal: rawValue => {
|
162
|
+
return [['paddingStart', rawValue], ['paddingEnd', rawValue]];
|
163
|
+
},
|
164
|
+
paddingVertical: rawValue => {
|
165
|
+
return [['paddingTop', rawValue], ['paddingBottom', rawValue]];
|
166
|
+
}
|
167
|
+
};
|
168
|
+
var _default = expansions;
|
169
|
+
exports.default = _default;
|