@projectwallace/css-parser 0.13.3 → 0.13.4

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/dist/arena.d.ts CHANGED
@@ -37,6 +37,7 @@ export declare const LAYER_NAME = 37;
37
37
  export declare const PRELUDE_OPERATOR = 38;
38
38
  export declare const FEATURE_RANGE = 39;
39
39
  export declare const AT_RULE_PRELUDE = 40;
40
+ export declare const PRELUDE_SELECTORLIST = 41;
40
41
  export declare const VALUE = 50;
41
42
  export declare const FLAG_IMPORTANT: number;
42
43
  export declare const FLAG_HAS_ERROR: number;
package/dist/arena.js CHANGED
@@ -38,6 +38,7 @@ const LAYER_NAME = 37;
38
38
  const PRELUDE_OPERATOR = 38;
39
39
  const FEATURE_RANGE = 39;
40
40
  const AT_RULE_PRELUDE = 40;
41
+ const PRELUDE_SELECTORLIST = 41;
41
42
  const VALUE = 50;
42
43
  const FLAG_IMPORTANT = 1 << 0;
43
44
  const FLAG_HAS_ERROR = 1 << 1;
@@ -286,4 +287,4 @@ class CSSDataArena {
286
287
  }
287
288
  }
288
289
 
289
- export { ATTRIBUTE_SELECTOR, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, ATTR_FLAG_NONE, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_NONE, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, AT_RULE, AT_RULE_PRELUDE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, CSSDataArena, DECLARATION, DIMENSION, FEATURE_RANGE, FLAG_BROWSERHACK, FLAG_HAS_BLOCK, FLAG_HAS_DECLARATIONS, FLAG_HAS_ERROR, FLAG_HAS_PARENS, FLAG_IMPORTANT, FLAG_LENGTH_OVERFLOW, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NUMBER, OPERATOR, PARENTHESIS, PRELUDE_OPERATOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, SELECTOR, SELECTOR_LIST, STRING, STYLESHEET, STYLE_RULE, SUPPORTS_QUERY, TYPE_SELECTOR, UNICODE_RANGE, UNIVERSAL_SELECTOR, URL, VALUE };
290
+ export { ATTRIBUTE_SELECTOR, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, ATTR_FLAG_NONE, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_NONE, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, AT_RULE, AT_RULE_PRELUDE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, CSSDataArena, DECLARATION, DIMENSION, FEATURE_RANGE, FLAG_BROWSERHACK, FLAG_HAS_BLOCK, FLAG_HAS_DECLARATIONS, FLAG_HAS_ERROR, FLAG_HAS_PARENS, FLAG_IMPORTANT, FLAG_LENGTH_OVERFLOW, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NUMBER, OPERATOR, PARENTHESIS, PRELUDE_OPERATOR, PRELUDE_SELECTORLIST, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, SELECTOR, SELECTOR_LIST, STRING, STYLESHEET, STYLE_RULE, SUPPORTS_QUERY, TYPE_SELECTOR, UNICODE_RANGE, UNIVERSAL_SELECTOR, URL, VALUE };
@@ -1,5 +1,5 @@
1
1
  import { Lexer } from './tokenize.js';
2
- import { CSSDataArena, PRELUDE_OPERATOR, MEDIA_TYPE, MEDIA_QUERY, MEDIA_FEATURE, FUNCTION, IDENTIFIER, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, STRING, URL, DIMENSION, NUMBER, FEATURE_RANGE } from './arena.js';
2
+ import { CSSDataArena, PRELUDE_OPERATOR, MEDIA_TYPE, MEDIA_QUERY, MEDIA_FEATURE, FUNCTION, IDENTIFIER, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, STRING, URL, DIMENSION, NUMBER, PRELUDE_SELECTORLIST, FEATURE_RANGE } from './arena.js';
3
3
  import { TOKEN_COMMA, TOKEN_IDENT, TOKEN_LEFT_PAREN, TOKEN_RIGHT_PAREN, TOKEN_FUNCTION, TOKEN_EOF, TOKEN_WHITESPACE, TOKEN_STRING, TOKEN_URL, TOKEN_DIMENSION, TOKEN_PERCENTAGE, TOKEN_NUMBER } from './token-types.js';
4
4
  import { strip_vendor_prefix, str_equals, CHAR_LESS_THAN, CHAR_GREATER_THAN, CHAR_EQUALS, CHAR_COLON, is_whitespace } from './string-utils.js';
5
5
  import { skip_whitespace_and_comments_forward, trim_boundaries } from './parse-utils.js';
@@ -24,23 +24,35 @@ class AtRulePreludeParser {
24
24
  }
25
25
  // Dispatch to appropriate parser based on at-rule type
26
26
  parse_prelude_dispatch(at_rule_name) {
27
- let normalized_name = strip_vendor_prefix(at_rule_name);
28
- if (str_equals("media", normalized_name)) {
29
- return this.parse_media_query_list();
30
- } else if (str_equals("container", normalized_name)) {
31
- return this.parse_container_query();
32
- } else if (str_equals("supports", normalized_name)) {
33
- return this.parse_supports_query();
34
- } else if (str_equals("layer", normalized_name)) {
35
- return this.parse_layer_names();
36
- } else if (str_equals("keyframes", normalized_name)) {
37
- return this.parse_identifier();
38
- } else if (str_equals("property", normalized_name)) {
39
- return this.parse_identifier();
40
- } else if (str_equals("import", normalized_name)) {
41
- return this.parse_import_prelude();
42
- } else if (str_equals("charset", normalized_name)) {
43
- return this.parse_charset_prelude();
27
+ let normalized_name = strip_vendor_prefix(at_rule_name).toLowerCase();
28
+ switch (normalized_name) {
29
+ case "media":
30
+ return this.parse_media_query_list();
31
+ case "container":
32
+ return this.parse_container_query();
33
+ case "supports":
34
+ return this.parse_supports_query();
35
+ case "layer":
36
+ return this.parse_layer_names();
37
+ case "keyframes":
38
+ case "property":
39
+ case "counter-style":
40
+ case "color-profile":
41
+ case "font-palette-values":
42
+ case "position-try":
43
+ case "font-feature-values":
44
+ case "page":
45
+ return this.parse_identifier();
46
+ case "import":
47
+ return this.parse_import_prelude();
48
+ case "charset":
49
+ return this.parse_charset_prelude();
50
+ case "namespace":
51
+ return this.parse_namespace_prelude();
52
+ case "scope":
53
+ return this.parse_scope_prelude();
54
+ case "custom-media":
55
+ return this.parse_custom_media_prelude();
44
56
  }
45
57
  return [];
46
58
  }
@@ -524,6 +536,76 @@ class AtRulePreludeParser {
524
536
  this.lexer = saved_lexer;
525
537
  return nodes;
526
538
  }
539
+ // Parse @namespace prelude: [prefix] url("...") | "..."
540
+ // e.g. @namespace url("http://www.w3.org/1999/xhtml");
541
+ // e.g. @namespace svg url("http://www.w3.org/2000/svg");
542
+ parse_namespace_prelude() {
543
+ let nodes = [];
544
+ this.skip_whitespace();
545
+ if (this.lexer.pos >= this.prelude_end) return [];
546
+ const saved = this.lexer.save_position();
547
+ this.next_token();
548
+ if (this.lexer.token_type === TOKEN_IDENT) {
549
+ nodes.push(this.create_node(IDENTIFIER, this.lexer.token_start, this.lexer.token_end));
550
+ this.skip_whitespace();
551
+ } else {
552
+ this.lexer.restore_position(saved);
553
+ }
554
+ const url_node = this.parse_import_url();
555
+ if (url_node !== null) nodes.push(url_node);
556
+ return nodes;
557
+ }
558
+ // Parse @scope prelude: [(<scope-start>)] [to (<scope-end>)]
559
+ // e.g. @scope (.parent) to (.child) { }
560
+ parse_scope_prelude() {
561
+ let nodes = [];
562
+ while (this.lexer.pos < this.prelude_end) {
563
+ this.skip_whitespace();
564
+ if (this.lexer.pos >= this.prelude_end) break;
565
+ const token_type = this.peek_token_type();
566
+ if (token_type === TOKEN_LEFT_PAREN) {
567
+ this.next_token();
568
+ let paren_start = this.lexer.token_start;
569
+ let content_start = this.lexer.pos;
570
+ let depth = 1;
571
+ while (this.lexer.pos < this.prelude_end && depth > 0) {
572
+ this.next_token();
573
+ if (this.lexer.token_type === TOKEN_LEFT_PAREN) depth++;
574
+ else if (this.lexer.token_type === TOKEN_RIGHT_PAREN) depth--;
575
+ }
576
+ let content_end = this.lexer.token_start;
577
+ let paren_end = this.lexer.token_end;
578
+ let scope_node = this.create_node(PRELUDE_SELECTORLIST, paren_start, paren_end);
579
+ let trimmed = trim_boundaries(this.source, content_start, content_end);
580
+ if (trimmed) {
581
+ this.arena.set_value_start_delta(scope_node, trimmed[0] - paren_start);
582
+ this.arena.set_value_length(scope_node, trimmed[1] - trimmed[0]);
583
+ }
584
+ nodes.push(scope_node);
585
+ } else if (token_type === TOKEN_IDENT) {
586
+ this.next_token();
587
+ let text = this.source.substring(this.lexer.token_start, this.lexer.token_end);
588
+ if (str_equals("to", text)) {
589
+ nodes.push(this.create_node(PRELUDE_OPERATOR, this.lexer.token_start, this.lexer.token_end));
590
+ }
591
+ } else {
592
+ this.next_token();
593
+ }
594
+ }
595
+ return nodes;
596
+ }
597
+ // Parse @custom-media prelude: --name <media-condition>
598
+ // e.g. @custom-media --small (max-width: 30em);
599
+ parse_custom_media_prelude() {
600
+ let nodes = [];
601
+ this.skip_whitespace();
602
+ if (this.lexer.pos >= this.prelude_end) return [];
603
+ this.next_token();
604
+ if (this.lexer.token_type !== TOKEN_IDENT) return [];
605
+ nodes.push(this.create_node(IDENTIFIER, this.lexer.token_start, this.lexer.token_end));
606
+ nodes.push(...this.parse_media_query_list());
607
+ return nodes;
608
+ }
527
609
  // Parse media feature range syntax: (50px <= width <= 100px)
528
610
  parse_feature_range(feature_start, feature_end, content_start, content_end) {
529
611
  let range_node = this.create_node(FEATURE_RANGE, feature_start, feature_end);
package/dist/parse.js CHANGED
@@ -8,8 +8,8 @@ import { TOKEN_EOF, TOKEN_AT_KEYWORD, TOKEN_LEFT_BRACE, TOKEN_RIGHT_BRACE, TOKEN
8
8
  import { trim_boundaries } from './parse-utils.js';
9
9
  import { CHAR_PERIOD, CHAR_GREATER_THAN, CHAR_PLUS, CHAR_TILDE, CHAR_AMPERSAND } from './string-utils.js';
10
10
 
11
- let DECLARATION_AT_RULES = /* @__PURE__ */ new Set(["font-face", "font-feature-values", "page", "property", "counter-style"]);
12
- let CONDITIONAL_AT_RULES = /* @__PURE__ */ new Set(["media", "supports", "container", "layer", "nest"]);
11
+ let DECLARATION_AT_RULES = /* @__PURE__ */ new Set(["font-face", "font-feature-values", "page", "property", "counter-style", "color-profile", "font-palette-values", "position-try", "view-transition"]);
12
+ let CONDITIONAL_AT_RULES = /* @__PURE__ */ new Set(["media", "supports", "container", "layer", "nest", "scope", "starting-style"]);
13
13
  class Parser {
14
14
  source;
15
15
  lexer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectwallace/css-parser",
3
- "version": "0.13.3",
3
+ "version": "0.13.4",
4
4
  "description": "High-performance CSS lexer and parser, optimized for CSS inspection and analysis",
5
5
  "author": "Bart Veneman <bart@projectwallace.com>",
6
6
  "license": "MIT",