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 CHANGED
@@ -1,14 +1,10 @@
1
1
  # CSSStyleDeclaration
2
2
 
3
- A Node JS implementation of the CSS Object Model [CSSStyleDeclaration interface](https://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface).
3
+ A Node.js implementation of the CSS Object Model [`CSSStyleDeclaration` class](https://drafts.csswg.org/cssom/#the-cssstyledeclaration-interface).
4
4
 
5
- [![NpmVersion](https://img.shields.io/npm/v/cssstyle.svg)](https://www.npmjs.com/package/cssstyle) [![Build Status](https://travis-ci.org/jsdom/cssstyle.svg?branch=main)](https://travis-ci.org/jsdom/cssstyle) [![codecov](https://codecov.io/gh/jsdom/cssstyle/branch/main/graph/badge.svg)](https://codecov.io/gh/jsdom/cssstyle)
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
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  'use strict';
3
- // autogenerated - 2025-01-09
3
+ // autogenerated - 2025-04-20
4
4
  // https://www.w3.org/Style/CSS/all-properties.en.html
5
5
 
6
6
  module.exports = new Set([
package/lib/parsers.js CHANGED
@@ -4,7 +4,8 @@
4
4
  ********************************************************************/
5
5
  'use strict';
6
6
 
7
- const { cssCalc, isColor, resolve } = require('@asamuzakjp/css-color');
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
- return undefined;
217
- case '\\':
218
- i++;
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(' + str + ')';
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 = resolve(val, {
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.parseUrl(v);
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
- if (isValid(v)) {
18
- return v.toLowerCase();
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 () {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var parseMeasurement = require('../parsers').parseMeasurement;
3
+ var parseMeasurement = require('../parsers').parseInheritingMeasurement;
4
4
 
5
5
  module.exports.definition = {
6
6
  set: function (v) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var parseMeasurement = require('../parsers').parseMeasurement;
3
+ var parseMeasurement = require('../parsers').parseInheritingMeasurement;
4
4
 
5
5
  module.exports.definition = {
6
6
  set: function (v) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var parseMeasurement = require('../parsers').parseMeasurement;
3
+ var parseMeasurement = require('../parsers').parseInheritingMeasurement;
4
4
 
5
5
  module.exports.definition = {
6
6
  set: function (v) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var parseMeasurement = require('../parsers').parseMeasurement;
3
+ var parseMeasurement = require('../parsers').parseInheritingMeasurement;
4
4
 
5
5
  module.exports.definition = {
6
6
  set: function (v) {
package/lib/properties.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- // autogenerated - 1/9/2025
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 && (v.toLowerCase() === 'transparent' || v.toLowerCase() === 'inherit')) {
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.parseUrl(v);
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
- if (borderColor_local_var_isValid(v)) {
309
- return v.toLowerCase();
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.parseMeasurement(v));
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.parseMeasurement(v));
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.parseMeasurement(v));
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.parseMeasurement(v));
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.2.1",
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": "^2.8.2",
40
+ "@asamuzakjp/css-color": "^3.1.2",
41
41
  "rrweb-cssom": "^0.8.0"
42
42
  },
43
43
  "devDependencies": {
44
- "@babel/generator": "^7.26.3",
45
- "@babel/parser": "^7.26.3",
46
- "@babel/traverse": "^7.26.3",
47
- "@babel/types": "^7.26.3",
48
- "eslint": "^9.17.0",
49
- "eslint-config-prettier": "^9.1.0",
50
- "eslint-plugin-prettier": "^5.2.1",
51
- "globals": "^15.14.0",
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.4.2",
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": {