cssstyle 4.2.1 → 4.3.1
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 +3 -7
- package/lib/implementedProperties.js +1 -1
- package/lib/parsers.js +77 -7
- package/lib/properties/backgroundColor.js +1 -4
- package/lib/properties/backgroundImage.js +1 -7
- package/lib/properties/borderColor.js +11 -12
- package/lib/properties/bottom.js +1 -1
- package/lib/properties/left.js +1 -1
- package/lib/properties/right.js +1 -1
- package/lib/properties/top.js +1 -1
- package/lib/properties.js +17 -19
- package/package.json +12 -13
package/README.md
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
# CSSStyleDeclaration
|
|
2
2
|
|
|
3
|
-
A Node
|
|
3
|
+
A Node.js implementation of the CSS Object Model [`CSSStyleDeclaration` class](https://drafts.csswg.org/cssom/#the-cssstyledeclaration-interface).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Background
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
#### Background
|
|
10
|
-
|
|
11
|
-
This package is an extension of the CSSStyleDeclaration class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM) with added support for CSS 2 & 3 properties. The primary use case is for testing browser code in a Node environment.
|
|
7
|
+
This package is an extension of the `CSSStyleDeclaration` class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM), with added support for modern specifications. The primary use case is for testing browser code in a Node environment.
|
|
12
8
|
|
|
13
9
|
It was originally created by Chad Walker, it is now maintained by the jsdom community.
|
|
14
10
|
|
package/lib/parsers.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
********************************************************************/
|
|
5
5
|
'use strict';
|
|
6
6
|
|
|
7
|
-
const {
|
|
7
|
+
const { resolve: resolveColor, utils } = require('@asamuzakjp/css-color');
|
|
8
|
+
const { cssCalc, isColor, isGradient, splitValue } = utils;
|
|
8
9
|
|
|
9
10
|
exports.TYPES = {
|
|
10
11
|
INTEGER: 1,
|
|
@@ -19,6 +20,7 @@ exports.TYPES = {
|
|
|
19
20
|
NULL_OR_EMPTY_STR: 10,
|
|
20
21
|
CALC: 11,
|
|
21
22
|
VAR: 12,
|
|
23
|
+
GRADIENT: 13,
|
|
22
24
|
};
|
|
23
25
|
|
|
24
26
|
// regular expressions
|
|
@@ -31,7 +33,7 @@ var lengthRegEx = new RegExp(
|
|
|
31
33
|
);
|
|
32
34
|
var percentRegEx = new RegExp(`^${NUMBER}%$`);
|
|
33
35
|
var angleRegEx = new RegExp(`^${NUMBER}(?:deg|g?rad|turn)$`);
|
|
34
|
-
var urlRegEx = /^url\(\s*([^)]*)\s*\)$/;
|
|
36
|
+
var urlRegEx = /^url\(\s*((?:[^)]|\\\))*)\s*\)$/;
|
|
35
37
|
var stringRegEx = /^("[^"]*"|'[^']*')$/;
|
|
36
38
|
var varRegEx = /^var\(|(?<=[*/\s(])var\(/;
|
|
37
39
|
var calcRegEx =
|
|
@@ -78,6 +80,9 @@ exports.valueType = function valueType(val) {
|
|
|
78
80
|
if (isColor(val)) {
|
|
79
81
|
return exports.TYPES.COLOR;
|
|
80
82
|
}
|
|
83
|
+
if (isGradient(val)) {
|
|
84
|
+
return exports.TYPES.GRADIENT;
|
|
85
|
+
}
|
|
81
86
|
|
|
82
87
|
switch (val.toLowerCase()) {
|
|
83
88
|
// the following are deprecated in CSS3
|
|
@@ -184,6 +189,16 @@ exports.parseMeasurement = function parseMeasurement(val) {
|
|
|
184
189
|
return exports.parsePercent(val);
|
|
185
190
|
};
|
|
186
191
|
|
|
192
|
+
exports.parseInheritingMeasurement = function parseInheritingMeasurement(v) {
|
|
193
|
+
if (String(v).toLowerCase() === 'auto') {
|
|
194
|
+
return 'auto';
|
|
195
|
+
}
|
|
196
|
+
if (String(v).toLowerCase() === 'inherit') {
|
|
197
|
+
return 'inherit';
|
|
198
|
+
}
|
|
199
|
+
return exports.parseMeasurement(v);
|
|
200
|
+
};
|
|
201
|
+
|
|
187
202
|
exports.parseUrl = function parseUrl(val) {
|
|
188
203
|
var type = exports.valueType(val);
|
|
189
204
|
if (type === exports.TYPES.NULL_OR_EMPTY_STR) {
|
|
@@ -203,24 +218,45 @@ exports.parseUrl = function parseUrl(val) {
|
|
|
203
218
|
str = str.substr(1, str.length - 2);
|
|
204
219
|
}
|
|
205
220
|
|
|
221
|
+
var urlstr = '';
|
|
222
|
+
var escaped = false;
|
|
206
223
|
var i;
|
|
207
224
|
for (i = 0; i < str.length; i++) {
|
|
208
225
|
switch (str[i]) {
|
|
226
|
+
case '\\':
|
|
227
|
+
if (escaped) {
|
|
228
|
+
urlstr += '\\\\';
|
|
229
|
+
escaped = false;
|
|
230
|
+
} else {
|
|
231
|
+
escaped = true;
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
209
234
|
case '(':
|
|
210
235
|
case ')':
|
|
211
236
|
case ' ':
|
|
212
237
|
case '\t':
|
|
213
238
|
case '\n':
|
|
214
239
|
case "'":
|
|
240
|
+
if (!escaped) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
urlstr += str[i];
|
|
244
|
+
escaped = false;
|
|
245
|
+
break;
|
|
215
246
|
case '"':
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
247
|
+
if (!escaped) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
urlstr += '\\"';
|
|
251
|
+
escaped = false;
|
|
219
252
|
break;
|
|
253
|
+
default:
|
|
254
|
+
urlstr += str[i];
|
|
255
|
+
escaped = false;
|
|
220
256
|
}
|
|
221
257
|
}
|
|
222
258
|
|
|
223
|
-
return 'url(' +
|
|
259
|
+
return 'url("' + urlstr + '")';
|
|
224
260
|
};
|
|
225
261
|
|
|
226
262
|
exports.parseString = function parseString(val) {
|
|
@@ -258,7 +294,7 @@ exports.parseColor = function parseColor(val) {
|
|
|
258
294
|
if (/^[a-z]+$/i.test(val) && type === exports.TYPES.COLOR) {
|
|
259
295
|
return val;
|
|
260
296
|
}
|
|
261
|
-
var res =
|
|
297
|
+
var res = resolveColor(val, {
|
|
262
298
|
format: 'specifiedValue',
|
|
263
299
|
});
|
|
264
300
|
if (res) {
|
|
@@ -310,6 +346,40 @@ exports.parseKeyword = function parseKeyword(val, valid_keywords) {
|
|
|
310
346
|
return undefined;
|
|
311
347
|
};
|
|
312
348
|
|
|
349
|
+
exports.parseImage = function parseImage(val) {
|
|
350
|
+
if (/^(?:none|inherit)$/i.test(val)) {
|
|
351
|
+
return val;
|
|
352
|
+
}
|
|
353
|
+
var type = exports.valueType(val);
|
|
354
|
+
if (type === exports.TYPES.NULL_OR_EMPTY_STR || type === exports.TYPES.VAR) {
|
|
355
|
+
return val;
|
|
356
|
+
}
|
|
357
|
+
var values = splitValue(val, ',');
|
|
358
|
+
var isImage = !!values.length;
|
|
359
|
+
var i;
|
|
360
|
+
for (i = 0; i < values.length; i++) {
|
|
361
|
+
var image = values[i];
|
|
362
|
+
var t = exports.valueType(image);
|
|
363
|
+
if (t === exports.TYPES.NULL_OR_EMPTY_STR) {
|
|
364
|
+
return image;
|
|
365
|
+
}
|
|
366
|
+
if (t === exports.TYPES.GRADIENT || /^(?:none|inherit)$/i.test(image)) {
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
var imageUrl = exports.parseUrl(image);
|
|
370
|
+
if (exports.valueType(imageUrl) === exports.TYPES.URL) {
|
|
371
|
+
values[i] = imageUrl;
|
|
372
|
+
} else {
|
|
373
|
+
isImage = false;
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (isImage) {
|
|
378
|
+
return values.join(', ');
|
|
379
|
+
}
|
|
380
|
+
return undefined;
|
|
381
|
+
};
|
|
382
|
+
|
|
313
383
|
// utility to translate from border-width to borderWidth
|
|
314
384
|
var dashedToCamelCase = function (dashed) {
|
|
315
385
|
var i;
|
|
@@ -7,10 +7,7 @@ var parse = function parse(v) {
|
|
|
7
7
|
if (parsed !== undefined) {
|
|
8
8
|
return parsed;
|
|
9
9
|
}
|
|
10
|
-
if (
|
|
11
|
-
parsers.valueType(v) === parsers.TYPES.KEYWORD &&
|
|
12
|
-
(v.toLowerCase() === 'transparent' || v.toLowerCase() === 'inherit')
|
|
13
|
-
) {
|
|
10
|
+
if (parsers.valueType(v) === parsers.TYPES.KEYWORD && v.toLowerCase() === 'inherit') {
|
|
14
11
|
return v;
|
|
15
12
|
}
|
|
16
13
|
return undefined;
|
|
@@ -3,16 +3,10 @@
|
|
|
3
3
|
var parsers = require('../parsers');
|
|
4
4
|
|
|
5
5
|
var parse = function parse(v) {
|
|
6
|
-
var parsed = parsers.
|
|
6
|
+
var parsed = parsers.parseImage(v);
|
|
7
7
|
if (parsed !== undefined) {
|
|
8
8
|
return parsed;
|
|
9
9
|
}
|
|
10
|
-
if (
|
|
11
|
-
parsers.valueType(v) === parsers.TYPES.KEYWORD &&
|
|
12
|
-
(v.toLowerCase() === 'none' || v.toLowerCase() === 'inherit')
|
|
13
|
-
) {
|
|
14
|
-
return v;
|
|
15
|
-
}
|
|
16
10
|
return undefined;
|
|
17
11
|
};
|
|
18
12
|
|
|
@@ -3,23 +3,22 @@
|
|
|
3
3
|
var parsers = require('../parsers');
|
|
4
4
|
var implicitSetter = require('../parsers').implicitSetter;
|
|
5
5
|
|
|
6
|
-
module.exports.isValid = function parse(v) {
|
|
7
|
-
if (typeof v !== 'string') {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
return (
|
|
11
|
-
v === '' || v.toLowerCase() === 'transparent' || parsers.valueType(v) === parsers.TYPES.COLOR
|
|
12
|
-
);
|
|
13
|
-
};
|
|
14
|
-
var isValid = module.exports.isValid;
|
|
15
|
-
|
|
16
6
|
var parser = function (v) {
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
var parsed = parsers.parseColor(v);
|
|
8
|
+
if (parsed !== undefined) {
|
|
9
|
+
return parsed;
|
|
10
|
+
}
|
|
11
|
+
if (parsers.valueType(v) === parsers.TYPES.KEYWORD && v.toLowerCase() === 'inherit') {
|
|
12
|
+
return v;
|
|
19
13
|
}
|
|
20
14
|
return undefined;
|
|
21
15
|
};
|
|
22
16
|
|
|
17
|
+
module.exports.isValid = function parse(v) {
|
|
18
|
+
return parser(v) !== undefined;
|
|
19
|
+
};
|
|
20
|
+
var isValid = module.exports.isValid;
|
|
21
|
+
|
|
23
22
|
module.exports.definition = {
|
|
24
23
|
set: implicitSetter('border', 'color', isValid, parser),
|
|
25
24
|
get: function () {
|
package/lib/properties/bottom.js
CHANGED
package/lib/properties/left.js
CHANGED
package/lib/properties/right.js
CHANGED
package/lib/properties/top.js
CHANGED
package/lib/properties.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// autogenerated -
|
|
3
|
+
// autogenerated - 4/20/2025
|
|
4
4
|
|
|
5
5
|
/*
|
|
6
6
|
*
|
|
@@ -75,7 +75,7 @@ var backgroundColor_local_var_parse = function parse(v) {
|
|
|
75
75
|
if (parsed !== undefined) {
|
|
76
76
|
return parsed;
|
|
77
77
|
}
|
|
78
|
-
if (external_dependency_parsers_0.valueType(v) === external_dependency_parsers_0.TYPES.KEYWORD &&
|
|
78
|
+
if (external_dependency_parsers_0.valueType(v) === external_dependency_parsers_0.TYPES.KEYWORD && v.toLowerCase() === 'inherit') {
|
|
79
79
|
return v;
|
|
80
80
|
}
|
|
81
81
|
return undefined;
|
|
@@ -99,13 +99,10 @@ backgroundColor_export_definition = {
|
|
|
99
99
|
};
|
|
100
100
|
var backgroundImage_export_isValid, backgroundImage_export_definition;
|
|
101
101
|
var backgroundImage_local_var_parse = function parse(v) {
|
|
102
|
-
var parsed = external_dependency_parsers_0.
|
|
102
|
+
var parsed = external_dependency_parsers_0.parseImage(v);
|
|
103
103
|
if (parsed !== undefined) {
|
|
104
104
|
return parsed;
|
|
105
105
|
}
|
|
106
|
-
if (external_dependency_parsers_0.valueType(v) === external_dependency_parsers_0.TYPES.KEYWORD && (v.toLowerCase() === 'none' || v.toLowerCase() === 'inherit')) {
|
|
107
|
-
return v;
|
|
108
|
-
}
|
|
109
106
|
return undefined;
|
|
110
107
|
};
|
|
111
108
|
backgroundImage_export_isValid = function isValid(v) {
|
|
@@ -297,19 +294,20 @@ borderStyle_export_definition = {
|
|
|
297
294
|
configurable: true
|
|
298
295
|
};
|
|
299
296
|
var borderColor_export_isValid, borderColor_export_definition;
|
|
300
|
-
borderColor_export_isValid = function parse(v) {
|
|
301
|
-
if (typeof v !== 'string') {
|
|
302
|
-
return false;
|
|
303
|
-
}
|
|
304
|
-
return v === '' || v.toLowerCase() === 'transparent' || external_dependency_parsers_0.valueType(v) === external_dependency_parsers_0.TYPES.COLOR;
|
|
305
|
-
};
|
|
306
|
-
var borderColor_local_var_isValid = borderColor_export_isValid;
|
|
307
297
|
var borderColor_local_var_parser = function (v) {
|
|
308
|
-
|
|
309
|
-
|
|
298
|
+
var parsed = external_dependency_parsers_0.parseColor(v);
|
|
299
|
+
if (parsed !== undefined) {
|
|
300
|
+
return parsed;
|
|
301
|
+
}
|
|
302
|
+
if (external_dependency_parsers_0.valueType(v) === external_dependency_parsers_0.TYPES.KEYWORD && v.toLowerCase() === 'inherit') {
|
|
303
|
+
return v;
|
|
310
304
|
}
|
|
311
305
|
return undefined;
|
|
312
306
|
};
|
|
307
|
+
borderColor_export_isValid = function parse(v) {
|
|
308
|
+
return borderColor_local_var_parser(v) !== undefined;
|
|
309
|
+
};
|
|
310
|
+
var borderColor_local_var_isValid = borderColor_export_isValid;
|
|
313
311
|
borderColor_export_definition = {
|
|
314
312
|
set: external_dependency_parsers_0.implicitSetter('border', 'color', borderColor_local_var_isValid, borderColor_local_var_parser),
|
|
315
313
|
get: function () {
|
|
@@ -678,7 +676,7 @@ borderTop_export_definition = {
|
|
|
678
676
|
var bottom_export_definition;
|
|
679
677
|
bottom_export_definition = {
|
|
680
678
|
set: function (v) {
|
|
681
|
-
this._setProperty('bottom', external_dependency_parsers_0.
|
|
679
|
+
this._setProperty('bottom', external_dependency_parsers_0.parseInheritingMeasurement(v));
|
|
682
680
|
},
|
|
683
681
|
get: function () {
|
|
684
682
|
return this.getPropertyValue('bottom');
|
|
@@ -1054,7 +1052,7 @@ height_export_definition = {
|
|
|
1054
1052
|
var left_export_definition;
|
|
1055
1053
|
left_export_definition = {
|
|
1056
1054
|
set: function (v) {
|
|
1057
|
-
this._setProperty('left', external_dependency_parsers_0.
|
|
1055
|
+
this._setProperty('left', external_dependency_parsers_0.parseInheritingMeasurement(v));
|
|
1058
1056
|
},
|
|
1059
1057
|
get: function () {
|
|
1060
1058
|
return this.getPropertyValue('left');
|
|
@@ -1335,7 +1333,7 @@ paddingTop_export_definition = {
|
|
|
1335
1333
|
var right_export_definition;
|
|
1336
1334
|
right_export_definition = {
|
|
1337
1335
|
set: function (v) {
|
|
1338
|
-
this._setProperty('right', external_dependency_parsers_0.
|
|
1336
|
+
this._setProperty('right', external_dependency_parsers_0.parseInheritingMeasurement(v));
|
|
1339
1337
|
},
|
|
1340
1338
|
get: function () {
|
|
1341
1339
|
return this.getPropertyValue('right');
|
|
@@ -1390,7 +1388,7 @@ textUnderlineColor_export_definition = {
|
|
|
1390
1388
|
var top_export_definition;
|
|
1391
1389
|
top_export_definition = {
|
|
1392
1390
|
set: function (v) {
|
|
1393
|
-
this._setProperty('top', external_dependency_parsers_0.
|
|
1391
|
+
this._setProperty('top', external_dependency_parsers_0.parseInheritingMeasurement(v));
|
|
1394
1392
|
},
|
|
1395
1393
|
get: function () {
|
|
1396
1394
|
return this.getPropertyValue('top');
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"CSSStyleDeclaration",
|
|
7
7
|
"StyleSheet"
|
|
8
8
|
],
|
|
9
|
-
"version": "4.
|
|
9
|
+
"version": "4.3.1",
|
|
10
10
|
"homepage": "https://github.com/jsdom/cssstyle",
|
|
11
11
|
"maintainers": [
|
|
12
12
|
{
|
|
@@ -37,20 +37,20 @@
|
|
|
37
37
|
],
|
|
38
38
|
"main": "./lib/CSSStyleDeclaration.js",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@asamuzakjp/css-color": "^
|
|
40
|
+
"@asamuzakjp/css-color": "^3.1.2",
|
|
41
41
|
"rrweb-cssom": "^0.8.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@babel/generator": "^7.26.
|
|
45
|
-
"@babel/parser": "^7.26.
|
|
46
|
-
"@babel/traverse": "^7.26.
|
|
47
|
-
"@babel/types": "^7.26.
|
|
48
|
-
"eslint": "^9.
|
|
49
|
-
"eslint-config-prettier": "^
|
|
50
|
-
"eslint-plugin-prettier": "^5.2.
|
|
51
|
-
"globals": "^
|
|
44
|
+
"@babel/generator": "^7.26.9",
|
|
45
|
+
"@babel/parser": "^7.26.9",
|
|
46
|
+
"@babel/traverse": "^7.26.9",
|
|
47
|
+
"@babel/types": "^7.26.9",
|
|
48
|
+
"eslint": "^9.22.0",
|
|
49
|
+
"eslint-config-prettier": "^10.1.1",
|
|
50
|
+
"eslint-plugin-prettier": "^5.2.3",
|
|
51
|
+
"globals": "^16.0.0",
|
|
52
52
|
"npm-run-all": "^4.1.5",
|
|
53
|
-
"prettier": "^3.
|
|
53
|
+
"prettier": "^3.5.3",
|
|
54
54
|
"resolve": "^1.22.10"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
@@ -62,8 +62,7 @@
|
|
|
62
62
|
"lint:fix": "eslint --fix --max-warnings 0",
|
|
63
63
|
"prepublishOnly": "npm run lint && npm run test",
|
|
64
64
|
"test": "npm run generate && node --test",
|
|
65
|
-
"test-ci": "npm run lint && npm run test"
|
|
66
|
-
"update-authors": "git log --format=\"%aN <%aE>\" | sort -f | uniq > AUTHORS"
|
|
65
|
+
"test-ci": "npm run lint && npm run test"
|
|
67
66
|
},
|
|
68
67
|
"license": "MIT",
|
|
69
68
|
"engines": {
|