@eslint/css-tree 3.2.0

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.
Files changed (279) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +194 -0
  3. package/cjs/convertor/create.cjs +32 -0
  4. package/cjs/convertor/index.cjs +8 -0
  5. package/cjs/data-patch.cjs +7 -0
  6. package/cjs/data.cjs +120 -0
  7. package/cjs/definition-syntax/SyntaxError.cjs +16 -0
  8. package/cjs/definition-syntax/generate.cjs +139 -0
  9. package/cjs/definition-syntax/index.cjs +13 -0
  10. package/cjs/definition-syntax/parse.cjs +556 -0
  11. package/cjs/definition-syntax/scanner.cjs +113 -0
  12. package/cjs/definition-syntax/walk.cjs +57 -0
  13. package/cjs/generator/create.cjs +102 -0
  14. package/cjs/generator/index.cjs +8 -0
  15. package/cjs/generator/sourceMap.cjs +96 -0
  16. package/cjs/generator/token-before.cjs +170 -0
  17. package/cjs/index.cjs +65 -0
  18. package/cjs/lexer/Lexer.cjs +517 -0
  19. package/cjs/lexer/error.cjs +128 -0
  20. package/cjs/lexer/generic-an-plus-b.cjs +235 -0
  21. package/cjs/lexer/generic-const.cjs +12 -0
  22. package/cjs/lexer/generic-urange.cjs +149 -0
  23. package/cjs/lexer/generic.cjs +589 -0
  24. package/cjs/lexer/index.cjs +7 -0
  25. package/cjs/lexer/match-graph.cjs +530 -0
  26. package/cjs/lexer/match.cjs +632 -0
  27. package/cjs/lexer/prepare-tokens.cjs +54 -0
  28. package/cjs/lexer/search.cjs +65 -0
  29. package/cjs/lexer/structure.cjs +173 -0
  30. package/cjs/lexer/trace.cjs +73 -0
  31. package/cjs/lexer/units.cjs +38 -0
  32. package/cjs/parser/SyntaxError.cjs +74 -0
  33. package/cjs/parser/create.cjs +378 -0
  34. package/cjs/parser/index.cjs +8 -0
  35. package/cjs/parser/parse-selector.cjs +8 -0
  36. package/cjs/parser/sequence.cjs +47 -0
  37. package/cjs/syntax/atrule/container.cjs +32 -0
  38. package/cjs/syntax/atrule/font-face.cjs +12 -0
  39. package/cjs/syntax/atrule/import.cjs +101 -0
  40. package/cjs/syntax/atrule/index.cjs +27 -0
  41. package/cjs/syntax/atrule/layer.cjs +16 -0
  42. package/cjs/syntax/atrule/media.cjs +16 -0
  43. package/cjs/syntax/atrule/nest.cjs +16 -0
  44. package/cjs/syntax/atrule/page.cjs +16 -0
  45. package/cjs/syntax/atrule/scope.cjs +16 -0
  46. package/cjs/syntax/atrule/starting-style.cjs +12 -0
  47. package/cjs/syntax/atrule/supports.cjs +16 -0
  48. package/cjs/syntax/config/generator.cjs +9 -0
  49. package/cjs/syntax/config/lexer.cjs +14 -0
  50. package/cjs/syntax/config/mix.cjs +126 -0
  51. package/cjs/syntax/config/parser-selector.cjs +19 -0
  52. package/cjs/syntax/config/parser.cjs +49 -0
  53. package/cjs/syntax/config/walker.cjs +9 -0
  54. package/cjs/syntax/create.cjs +58 -0
  55. package/cjs/syntax/function/expression.cjs +11 -0
  56. package/cjs/syntax/function/var.cjs +43 -0
  57. package/cjs/syntax/index.cjs +14 -0
  58. package/cjs/syntax/node/AnPlusB.cjs +293 -0
  59. package/cjs/syntax/node/Atrule.cjs +103 -0
  60. package/cjs/syntax/node/AtrulePrelude.cjs +52 -0
  61. package/cjs/syntax/node/AttributeSelector.cjs +148 -0
  62. package/cjs/syntax/node/Block.cjs +96 -0
  63. package/cjs/syntax/node/Brackets.cjs +38 -0
  64. package/cjs/syntax/node/CDC.cjs +26 -0
  65. package/cjs/syntax/node/CDO.cjs +26 -0
  66. package/cjs/syntax/node/ClassSelector.cjs +31 -0
  67. package/cjs/syntax/node/Combinator.cjs +61 -0
  68. package/cjs/syntax/node/Comment.cjs +40 -0
  69. package/cjs/syntax/node/Condition.cjs +120 -0
  70. package/cjs/syntax/node/Declaration.cjs +166 -0
  71. package/cjs/syntax/node/DeclarationList.cjs +62 -0
  72. package/cjs/syntax/node/Dimension.cjs +30 -0
  73. package/cjs/syntax/node/Feature.cjs +101 -0
  74. package/cjs/syntax/node/FeatureFunction.cjs +67 -0
  75. package/cjs/syntax/node/FeatureRange.cjs +133 -0
  76. package/cjs/syntax/node/Function.cjs +45 -0
  77. package/cjs/syntax/node/GeneralEnclosed.cjs +68 -0
  78. package/cjs/syntax/node/Hash.cjs +30 -0
  79. package/cjs/syntax/node/IdSelector.cjs +33 -0
  80. package/cjs/syntax/node/Identifier.cjs +25 -0
  81. package/cjs/syntax/node/Layer.cjs +35 -0
  82. package/cjs/syntax/node/LayerList.cjs +43 -0
  83. package/cjs/syntax/node/MediaQuery.cjs +100 -0
  84. package/cjs/syntax/node/MediaQueryList.cjs +41 -0
  85. package/cjs/syntax/node/NestingSelector.cjs +29 -0
  86. package/cjs/syntax/node/Nth.cjs +54 -0
  87. package/cjs/syntax/node/Number.cjs +25 -0
  88. package/cjs/syntax/node/Operator.cjs +28 -0
  89. package/cjs/syntax/node/Parentheses.cjs +38 -0
  90. package/cjs/syntax/node/Percentage.cjs +25 -0
  91. package/cjs/syntax/node/PseudoClassSelector.cjs +67 -0
  92. package/cjs/syntax/node/PseudoElementSelector.cjs +69 -0
  93. package/cjs/syntax/node/Ratio.cjs +71 -0
  94. package/cjs/syntax/node/Raw.cjs +48 -0
  95. package/cjs/syntax/node/Rule.cjs +58 -0
  96. package/cjs/syntax/node/Scope.cjs +69 -0
  97. package/cjs/syntax/node/Selector.cjs +38 -0
  98. package/cjs/syntax/node/SelectorList.cjs +43 -0
  99. package/cjs/syntax/node/String.cjs +26 -0
  100. package/cjs/syntax/node/StyleSheet.cjs +83 -0
  101. package/cjs/syntax/node/SupportsDeclaration.cjs +38 -0
  102. package/cjs/syntax/node/TypeSelector.cjs +59 -0
  103. package/cjs/syntax/node/UnicodeRange.cjs +158 -0
  104. package/cjs/syntax/node/Url.cjs +54 -0
  105. package/cjs/syntax/node/Value.cjs +26 -0
  106. package/cjs/syntax/node/WhiteSpace.cjs +34 -0
  107. package/cjs/syntax/node/index-generate.cjs +103 -0
  108. package/cjs/syntax/node/index-parse-selector.cjs +39 -0
  109. package/cjs/syntax/node/index-parse.cjs +103 -0
  110. package/cjs/syntax/node/index.cjs +103 -0
  111. package/cjs/syntax/pseudo/index.cjs +60 -0
  112. package/cjs/syntax/pseudo/lang.cjs +37 -0
  113. package/cjs/syntax/scope/atrulePrelude.cjs +9 -0
  114. package/cjs/syntax/scope/default.cjs +76 -0
  115. package/cjs/syntax/scope/index.cjs +11 -0
  116. package/cjs/syntax/scope/selector.cjs +88 -0
  117. package/cjs/syntax/scope/value.cjs +29 -0
  118. package/cjs/tokenizer/OffsetToLocation.cjs +91 -0
  119. package/cjs/tokenizer/TokenStream.cjs +358 -0
  120. package/cjs/tokenizer/adopt-buffer.cjs +13 -0
  121. package/cjs/tokenizer/char-code-definitions.cjs +236 -0
  122. package/cjs/tokenizer/index.cjs +554 -0
  123. package/cjs/tokenizer/names.cjs +32 -0
  124. package/cjs/tokenizer/types.cjs +57 -0
  125. package/cjs/tokenizer/utils.cjs +261 -0
  126. package/cjs/utils/List.cjs +473 -0
  127. package/cjs/utils/clone.cjs +25 -0
  128. package/cjs/utils/create-custom-error.cjs +18 -0
  129. package/cjs/utils/ident.cjs +102 -0
  130. package/cjs/utils/index.cjs +20 -0
  131. package/cjs/utils/names.cjs +113 -0
  132. package/cjs/utils/string.cjs +99 -0
  133. package/cjs/utils/url.cjs +108 -0
  134. package/cjs/version.cjs +5 -0
  135. package/cjs/walker/create.cjs +291 -0
  136. package/cjs/walker/index.cjs +8 -0
  137. package/data/patch.json +874 -0
  138. package/dist/csstree.esm.js +12 -0
  139. package/dist/csstree.js +12 -0
  140. package/dist/data.cjs +1341 -0
  141. package/dist/data.js +1341 -0
  142. package/dist/version.cjs +1 -0
  143. package/dist/version.js +1 -0
  144. package/lib/convertor/create.js +28 -0
  145. package/lib/convertor/index.js +4 -0
  146. package/lib/data-patch.js +6 -0
  147. package/lib/data.js +118 -0
  148. package/lib/definition-syntax/SyntaxError.js +12 -0
  149. package/lib/definition-syntax/generate.js +135 -0
  150. package/lib/definition-syntax/index.js +4 -0
  151. package/lib/definition-syntax/parse.js +552 -0
  152. package/lib/definition-syntax/scanner.js +109 -0
  153. package/lib/definition-syntax/walk.js +53 -0
  154. package/lib/generator/create.js +97 -0
  155. package/lib/generator/index.js +4 -0
  156. package/lib/generator/sourceMap.js +92 -0
  157. package/lib/generator/token-before.js +182 -0
  158. package/lib/index.d.ts +3016 -0
  159. package/lib/index.js +30 -0
  160. package/lib/lexer/Lexer.js +511 -0
  161. package/lib/lexer/error.js +123 -0
  162. package/lib/lexer/generic-an-plus-b.js +238 -0
  163. package/lib/lexer/generic-const.js +8 -0
  164. package/lib/lexer/generic-urange.js +151 -0
  165. package/lib/lexer/generic.js +622 -0
  166. package/lib/lexer/index.js +1 -0
  167. package/lib/lexer/match-graph.js +527 -0
  168. package/lib/lexer/match.js +630 -0
  169. package/lib/lexer/prepare-tokens.js +50 -0
  170. package/lib/lexer/search.js +61 -0
  171. package/lib/lexer/structure.js +169 -0
  172. package/lib/lexer/trace.js +66 -0
  173. package/lib/lexer/units.js +27 -0
  174. package/lib/parser/SyntaxError.js +70 -0
  175. package/lib/parser/create.js +388 -0
  176. package/lib/parser/index.js +4 -0
  177. package/lib/parser/parse-selector.js +4 -0
  178. package/lib/parser/sequence.js +43 -0
  179. package/lib/syntax/atrule/container.js +28 -0
  180. package/lib/syntax/atrule/font-face.js +8 -0
  181. package/lib/syntax/atrule/import.js +104 -0
  182. package/lib/syntax/atrule/index.js +23 -0
  183. package/lib/syntax/atrule/layer.js +12 -0
  184. package/lib/syntax/atrule/media.js +12 -0
  185. package/lib/syntax/atrule/nest.js +12 -0
  186. package/lib/syntax/atrule/page.js +12 -0
  187. package/lib/syntax/atrule/scope.js +12 -0
  188. package/lib/syntax/atrule/starting-style.js +8 -0
  189. package/lib/syntax/atrule/supports.js +12 -0
  190. package/lib/syntax/config/generator.js +5 -0
  191. package/lib/syntax/config/lexer.js +10 -0
  192. package/lib/syntax/config/mix.js +122 -0
  193. package/lib/syntax/config/parser-selector.js +15 -0
  194. package/lib/syntax/config/parser.js +45 -0
  195. package/lib/syntax/config/walker.js +5 -0
  196. package/lib/syntax/create.js +55 -0
  197. package/lib/syntax/function/expression.js +7 -0
  198. package/lib/syntax/function/var.js +39 -0
  199. package/lib/syntax/index.js +10 -0
  200. package/lib/syntax/node/AnPlusB.js +292 -0
  201. package/lib/syntax/node/Atrule.js +100 -0
  202. package/lib/syntax/node/AtrulePrelude.js +47 -0
  203. package/lib/syntax/node/AttributeSelector.js +147 -0
  204. package/lib/syntax/node/Block.js +95 -0
  205. package/lib/syntax/node/Brackets.js +35 -0
  206. package/lib/syntax/node/CDC.js +19 -0
  207. package/lib/syntax/node/CDO.js +19 -0
  208. package/lib/syntax/node/ClassSelector.js +24 -0
  209. package/lib/syntax/node/Combinator.js +54 -0
  210. package/lib/syntax/node/Comment.js +33 -0
  211. package/lib/syntax/node/Condition.js +123 -0
  212. package/lib/syntax/node/Declaration.js +165 -0
  213. package/lib/syntax/node/DeclarationList.js +62 -0
  214. package/lib/syntax/node/Dimension.js +23 -0
  215. package/lib/syntax/node/Feature.js +103 -0
  216. package/lib/syntax/node/FeatureFunction.js +63 -0
  217. package/lib/syntax/node/FeatureRange.js +133 -0
  218. package/lib/syntax/node/Function.js +41 -0
  219. package/lib/syntax/node/GeneralEnclosed.js +66 -0
  220. package/lib/syntax/node/Hash.js +23 -0
  221. package/lib/syntax/node/IdSelector.js +26 -0
  222. package/lib/syntax/node/Identifier.js +18 -0
  223. package/lib/syntax/node/Layer.js +28 -0
  224. package/lib/syntax/node/LayerList.js +36 -0
  225. package/lib/syntax/node/MediaQuery.js +102 -0
  226. package/lib/syntax/node/MediaQueryList.js +34 -0
  227. package/lib/syntax/node/NestingSelector.js +22 -0
  228. package/lib/syntax/node/Nth.js +47 -0
  229. package/lib/syntax/node/Number.js +18 -0
  230. package/lib/syntax/node/Operator.js +21 -0
  231. package/lib/syntax/node/Parentheses.js +34 -0
  232. package/lib/syntax/node/Percentage.js +18 -0
  233. package/lib/syntax/node/PseudoClassSelector.js +65 -0
  234. package/lib/syntax/node/PseudoElementSelector.js +66 -0
  235. package/lib/syntax/node/Ratio.js +68 -0
  236. package/lib/syntax/node/Raw.js +41 -0
  237. package/lib/syntax/node/Rule.js +51 -0
  238. package/lib/syntax/node/Scope.js +66 -0
  239. package/lib/syntax/node/Selector.js +31 -0
  240. package/lib/syntax/node/SelectorList.js +35 -0
  241. package/lib/syntax/node/String.js +19 -0
  242. package/lib/syntax/node/StyleSheet.js +82 -0
  243. package/lib/syntax/node/SupportsDeclaration.js +34 -0
  244. package/lib/syntax/node/TypeSelector.js +52 -0
  245. package/lib/syntax/node/UnicodeRange.js +156 -0
  246. package/lib/syntax/node/Url.js +52 -0
  247. package/lib/syntax/node/Value.js +19 -0
  248. package/lib/syntax/node/WhiteSpace.js +27 -0
  249. package/lib/syntax/node/index-generate.js +49 -0
  250. package/lib/syntax/node/index-parse-selector.js +17 -0
  251. package/lib/syntax/node/index-parse.js +49 -0
  252. package/lib/syntax/node/index.js +49 -0
  253. package/lib/syntax/pseudo/index.js +56 -0
  254. package/lib/syntax/pseudo/lang.js +33 -0
  255. package/lib/syntax/scope/atrulePrelude.js +5 -0
  256. package/lib/syntax/scope/default.js +85 -0
  257. package/lib/syntax/scope/index.js +3 -0
  258. package/lib/syntax/scope/selector.js +94 -0
  259. package/lib/syntax/scope/value.js +25 -0
  260. package/lib/tokenizer/OffsetToLocation.js +87 -0
  261. package/lib/tokenizer/TokenStream.js +366 -0
  262. package/lib/tokenizer/adopt-buffer.js +9 -0
  263. package/lib/tokenizer/char-code-definitions.js +212 -0
  264. package/lib/tokenizer/index.js +513 -0
  265. package/lib/tokenizer/names.js +28 -0
  266. package/lib/tokenizer/types.js +28 -0
  267. package/lib/tokenizer/utils.js +254 -0
  268. package/lib/utils/List.js +469 -0
  269. package/lib/utils/clone.js +21 -0
  270. package/lib/utils/create-custom-error.js +14 -0
  271. package/lib/utils/ident.js +101 -0
  272. package/lib/utils/index.js +6 -0
  273. package/lib/utils/names.js +106 -0
  274. package/lib/utils/string.js +99 -0
  275. package/lib/utils/url.js +108 -0
  276. package/lib/version.js +5 -0
  277. package/lib/walker/create.js +287 -0
  278. package/lib/walker/index.js +4 -0
  279. package/package.json +133 -0
@@ -0,0 +1,388 @@
1
+ import { List } from '../utils/List.js';
2
+ import { SyntaxError } from './SyntaxError.js';
3
+ import {
4
+ tokenize,
5
+ OffsetToLocation,
6
+ TokenStream,
7
+ tokenNames,
8
+
9
+ consumeNumber,
10
+ findWhiteSpaceStart,
11
+ cmpChar,
12
+ cmpStr,
13
+
14
+ WhiteSpace,
15
+ Comment,
16
+ Ident,
17
+ Function as FunctionToken,
18
+ Url,
19
+ Hash,
20
+ Percentage,
21
+ Number as NumberToken
22
+ } from '../tokenizer/index.js';
23
+ import { readSequence } from './sequence.js';
24
+
25
+ const NOOP = () => {};
26
+ const EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
27
+ const NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
28
+ const SEMICOLON = 0x003B; // U+003B SEMICOLON (;)
29
+ const LEFTCURLYBRACKET = 0x007B; // U+007B LEFT CURLY BRACKET ({)
30
+ const NULL = 0;
31
+
32
+ function createParseContext(name) {
33
+ return function() {
34
+ return this[name]();
35
+ };
36
+ }
37
+
38
+ function fetchParseValues(dict) {
39
+ const result = Object.create(null);
40
+
41
+ for (const name of Object.keys(dict)) {
42
+ const item = dict[name];
43
+ const fn = item.parse || item;
44
+
45
+ if (fn) {
46
+ result[name] = fn;
47
+ }
48
+ }
49
+
50
+ return result;
51
+ }
52
+
53
+ function processConfig(config) {
54
+ const parseConfig = {
55
+ context: Object.create(null),
56
+ features: Object.assign(Object.create(null), config.features),
57
+ scope: Object.assign(Object.create(null), config.scope),
58
+ atrule: fetchParseValues(config.atrule),
59
+ pseudo: fetchParseValues(config.pseudo),
60
+ node: fetchParseValues(config.node)
61
+ };
62
+
63
+ for (const [name, context] of Object.entries(config.parseContext)) {
64
+ switch (typeof context) {
65
+ case 'function':
66
+ parseConfig.context[name] = context;
67
+ break;
68
+
69
+ case 'string':
70
+ parseConfig.context[name] = createParseContext(context);
71
+ break;
72
+ }
73
+ }
74
+
75
+ return {
76
+ config: parseConfig,
77
+ ...parseConfig,
78
+ ...parseConfig.node
79
+ };
80
+ }
81
+
82
+ export function createParser(config) {
83
+ let source = '';
84
+ let filename = '<unknown>';
85
+ let needPositions = false;
86
+ let onParseError = NOOP;
87
+ let onParseErrorThrow = false;
88
+
89
+ const locationMap = new OffsetToLocation();
90
+ const parser = Object.assign(new TokenStream(), processConfig(config || {}), {
91
+ parseAtrulePrelude: true,
92
+ parseRulePrelude: true,
93
+ parseValue: true,
94
+ parseCustomProperty: false,
95
+
96
+ readSequence,
97
+
98
+ consumeUntilBalanceEnd: () => 0,
99
+ consumeUntilLeftCurlyBracket(code) {
100
+ return code === LEFTCURLYBRACKET ? 1 : 0;
101
+ },
102
+ consumeUntilLeftCurlyBracketOrSemicolon(code) {
103
+ return code === LEFTCURLYBRACKET || code === SEMICOLON ? 1 : 0;
104
+ },
105
+ consumeUntilExclamationMarkOrSemicolon(code) {
106
+ return code === EXCLAMATIONMARK || code === SEMICOLON ? 1 : 0;
107
+ },
108
+ consumeUntilSemicolonIncluded(code) {
109
+ return code === SEMICOLON ? 2 : 0;
110
+ },
111
+
112
+ createList() {
113
+ return new List();
114
+ },
115
+ createSingleNodeList(node) {
116
+ return new List().appendData(node);
117
+ },
118
+ getFirstListNode(list) {
119
+ return list && list.first;
120
+ },
121
+ getLastListNode(list) {
122
+ return list && list.last;
123
+ },
124
+
125
+ parseWithFallback(consumer, fallback) {
126
+ const startIndex = this.tokenIndex;
127
+
128
+ try {
129
+ return consumer.call(this);
130
+ } catch (e) {
131
+ if (onParseErrorThrow) {
132
+ throw e;
133
+ }
134
+
135
+ this.skip(startIndex - this.tokenIndex);
136
+ const fallbackNode = fallback.call(this);
137
+
138
+ onParseErrorThrow = true;
139
+ onParseError(e, fallbackNode);
140
+ onParseErrorThrow = false;
141
+
142
+ return fallbackNode;
143
+ }
144
+ },
145
+
146
+ lookupNonWSType(offset) {
147
+ let type;
148
+
149
+ do {
150
+ type = this.lookupType(offset++);
151
+ if (type !== WhiteSpace && type !== Comment) {
152
+ return type;
153
+ }
154
+ } while (type !== NULL);
155
+
156
+ return NULL;
157
+ },
158
+
159
+ charCodeAt(offset) {
160
+ return offset >= 0 && offset < source.length ? source.charCodeAt(offset) : 0;
161
+ },
162
+ substring(offsetStart, offsetEnd) {
163
+ return source.substring(offsetStart, offsetEnd);
164
+ },
165
+ substrToCursor(start) {
166
+ return this.source.substring(start, this.tokenStart);
167
+ },
168
+
169
+ cmpChar(offset, charCode) {
170
+ return cmpChar(source, offset, charCode);
171
+ },
172
+ cmpStr(offsetStart, offsetEnd, str) {
173
+ return cmpStr(source, offsetStart, offsetEnd, str);
174
+ },
175
+
176
+ consume(tokenType) {
177
+ const start = this.tokenStart;
178
+
179
+ this.eat(tokenType);
180
+
181
+ return this.substrToCursor(start);
182
+ },
183
+ consumeFunctionName() {
184
+ const name = source.substring(this.tokenStart, this.tokenEnd - 1);
185
+
186
+ this.eat(FunctionToken);
187
+
188
+ return name;
189
+ },
190
+ consumeNumber(type) {
191
+ const number = source.substring(this.tokenStart, consumeNumber(source, this.tokenStart));
192
+
193
+ this.eat(type);
194
+
195
+ return number;
196
+ },
197
+
198
+ eat(tokenType) {
199
+ if (this.tokenType !== tokenType) {
200
+ const tokenName = tokenNames[tokenType].slice(0, -6).replace(/-/g, ' ').replace(/^./, m => m.toUpperCase());
201
+ let message = `${/[[\](){}]/.test(tokenName) ? `"${tokenName}"` : tokenName} is expected`;
202
+ let offset = this.tokenStart;
203
+
204
+ // tweak message and offset
205
+ switch (tokenType) {
206
+ case Ident:
207
+ // when identifier is expected but there is a function or url
208
+ if (this.tokenType === FunctionToken || this.tokenType === Url) {
209
+ offset = this.tokenEnd - 1;
210
+ message = 'Identifier is expected but function found';
211
+ } else {
212
+ message = 'Identifier is expected';
213
+ }
214
+ break;
215
+
216
+ case Hash:
217
+ if (this.isDelim(NUMBERSIGN)) {
218
+ this.next();
219
+ offset++;
220
+ message = 'Name is expected';
221
+ }
222
+ break;
223
+
224
+ case Percentage:
225
+ if (this.tokenType === NumberToken) {
226
+ offset = this.tokenEnd;
227
+ message = 'Percent sign is expected';
228
+ }
229
+ break;
230
+ }
231
+
232
+ this.error(message, offset);
233
+ }
234
+
235
+ this.next();
236
+ },
237
+ eatIdent(name) {
238
+ if (this.tokenType !== Ident || this.lookupValue(0, name) === false) {
239
+ this.error(`Identifier "${name}" is expected`);
240
+ }
241
+
242
+ this.next();
243
+ },
244
+ eatDelim(code) {
245
+ if (!this.isDelim(code)) {
246
+ this.error(`Delim "${String.fromCharCode(code)}" is expected`);
247
+ }
248
+
249
+ this.next();
250
+ },
251
+
252
+ getLocation(start, end) {
253
+ if (needPositions) {
254
+ return locationMap.getLocationRange(
255
+ start,
256
+ end,
257
+ filename
258
+ );
259
+ }
260
+
261
+ return null;
262
+ },
263
+ getLocationFromList(list) {
264
+ if (needPositions) {
265
+ const head = this.getFirstListNode(list);
266
+ const tail = this.getLastListNode(list);
267
+ return locationMap.getLocationRange(
268
+ head !== null ? head.loc.start.offset - locationMap.startOffset : this.tokenStart,
269
+ tail !== null ? tail.loc.end.offset - locationMap.startOffset : this.tokenStart,
270
+ filename
271
+ );
272
+ }
273
+
274
+ return null;
275
+ },
276
+
277
+ error(message, offset) {
278
+ const location = typeof offset !== 'undefined' && offset < source.length
279
+ ? locationMap.getLocation(offset)
280
+ : this.eof
281
+ ? locationMap.getLocation(findWhiteSpaceStart(source, source.length - 1))
282
+ : locationMap.getLocation(this.tokenStart);
283
+
284
+ throw new SyntaxError(
285
+ message || 'Unexpected input',
286
+ source,
287
+ location.offset,
288
+ location.line,
289
+ location.column,
290
+ locationMap.startLine,
291
+ locationMap.startColumn
292
+ );
293
+ }
294
+ });
295
+ const createTokenIterateAPI = () => ({
296
+ filename,
297
+ source,
298
+ tokenCount: parser.tokenCount,
299
+
300
+ getTokenType: (index) =>
301
+ parser.getTokenType(index),
302
+ getTokenTypeName: (index) =>
303
+ tokenNames[parser.getTokenType(index)],
304
+ getTokenStart: (index) =>
305
+ parser.getTokenStart(index),
306
+ getTokenEnd: (index) =>
307
+ parser.getTokenEnd(index),
308
+ getTokenValue: (index) =>
309
+ parser.source.substring(parser.getTokenStart(index), parser.getTokenEnd(index)),
310
+
311
+ substring: (start, end) =>
312
+ parser.source.substring(start, end),
313
+
314
+ balance: parser.balance.subarray(0, parser.tokenCount + 1),
315
+ isBlockOpenerTokenType: parser.isBlockOpenerTokenType,
316
+ isBlockCloserTokenType: parser.isBlockCloserTokenType,
317
+ getBlockTokenPairIndex: (index) =>
318
+ parser.getBlockTokenPairIndex(index),
319
+
320
+ getLocation: (offset) =>
321
+ locationMap.getLocation(offset, filename),
322
+ getRangeLocation: (start, end) =>
323
+ locationMap.getLocationRange(start, end, filename)
324
+ });
325
+
326
+ const parse = function(source_, options) {
327
+ source = source_;
328
+ options = options || {};
329
+
330
+ parser.setSource(source, tokenize);
331
+ locationMap.setSource(
332
+ source,
333
+ options.offset,
334
+ options.line,
335
+ options.column
336
+ );
337
+
338
+ filename = options.filename || '<unknown>';
339
+ needPositions = Boolean(options.positions);
340
+ onParseError = typeof options.onParseError === 'function' ? options.onParseError : NOOP;
341
+ onParseErrorThrow = false;
342
+
343
+ parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;
344
+ parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;
345
+ parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;
346
+ parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;
347
+
348
+ const { context = 'default', onComment, onToken } = options;
349
+
350
+ if (context in parser.context === false) {
351
+ throw new Error('Unknown context `' + context + '`');
352
+ }
353
+
354
+ if (Array.isArray(onToken)) {
355
+ parser.forEachToken((type, start, end) => {
356
+ onToken.push({ type, start, end });
357
+ });
358
+ } else if (typeof onToken === 'function') {
359
+ parser.forEachToken(onToken.bind(createTokenIterateAPI()));
360
+ }
361
+
362
+ if (typeof onComment === 'function') {
363
+ parser.forEachToken((type, start, end) => {
364
+ if (type === Comment) {
365
+ const loc = parser.getLocation(start, end);
366
+ const value = cmpStr(source, end - 2, end, '*/')
367
+ ? source.slice(start + 2, end - 2)
368
+ : source.slice(start + 2, end);
369
+
370
+ onComment(value, loc);
371
+ }
372
+ });
373
+ }
374
+
375
+ const ast = parser.context[context].call(parser, options);
376
+
377
+ if (!parser.eof) {
378
+ parser.error();
379
+ }
380
+
381
+ return ast;
382
+ };
383
+
384
+ return Object.assign(parse, {
385
+ SyntaxError,
386
+ config: parser.config
387
+ });
388
+ };
@@ -0,0 +1,4 @@
1
+ import { createParser } from './create.js';
2
+ import config from '../syntax/config/parser.js';
3
+
4
+ export default createParser(config);
@@ -0,0 +1,4 @@
1
+ import { createParser } from './create.js';
2
+ import config from '../syntax/config/parser-selector.js';
3
+
4
+ export default createParser(config);
@@ -0,0 +1,43 @@
1
+ import { WhiteSpace, Comment } from '../tokenizer/index.js';
2
+
3
+ export function readSequence(recognizer) {
4
+ const children = this.createList();
5
+ let space = false;
6
+ const context = {
7
+ recognizer
8
+ };
9
+
10
+ while (!this.eof) {
11
+ switch (this.tokenType) {
12
+ case Comment:
13
+ this.next();
14
+ continue;
15
+
16
+ case WhiteSpace:
17
+ space = true;
18
+ this.next();
19
+ continue;
20
+ }
21
+
22
+ let child = recognizer.getNode.call(this, context);
23
+
24
+ if (child === undefined) {
25
+ break;
26
+ }
27
+
28
+ if (space) {
29
+ if (recognizer.onWhiteSpace) {
30
+ recognizer.onWhiteSpace.call(this, child, children, context);
31
+ }
32
+ space = false;
33
+ }
34
+
35
+ children.push(child);
36
+ }
37
+
38
+ if (space && recognizer.onWhiteSpace) {
39
+ recognizer.onWhiteSpace.call(this, null, children, context);
40
+ }
41
+
42
+ return children;
43
+ };
@@ -0,0 +1,28 @@
1
+ import { Ident } from '../../tokenizer/index.js';
2
+
3
+ // https://drafts.csswg.org/css-contain-3/#container-rule
4
+ // The keywords `none`, `and`, `not`, and `or` are excluded from the <custom-ident> above.
5
+ const nonContainerNameKeywords = new Set(['none', 'and', 'not', 'or']);
6
+
7
+ export default {
8
+ parse: {
9
+ prelude() {
10
+ const children = this.createList();
11
+
12
+ if (this.tokenType === Ident) {
13
+ const name = this.substring(this.tokenStart, this.tokenEnd);
14
+
15
+ if (!nonContainerNameKeywords.has(name.toLowerCase())) {
16
+ children.push(this.Identifier());
17
+ }
18
+ }
19
+
20
+ children.push(this.Condition('container'));
21
+
22
+ return children;
23
+ },
24
+ block(nested = false) {
25
+ return this.Block(nested);
26
+ }
27
+ }
28
+ };
@@ -0,0 +1,8 @@
1
+ export default {
2
+ parse: {
3
+ prelude: null,
4
+ block() {
5
+ return this.Block(true);
6
+ }
7
+ }
8
+ };
@@ -0,0 +1,104 @@
1
+ import {
2
+ String as StringToken,
3
+ Ident,
4
+ Url,
5
+ Function as FunctionToken,
6
+ LeftParenthesis,
7
+ RightParenthesis
8
+ } from '../../tokenizer/index.js';
9
+
10
+ function parseWithFallback(parse, fallback) {
11
+ return this.parseWithFallback(
12
+ () => {
13
+ try {
14
+ return parse.call(this);
15
+ } finally {
16
+ this.skipSC();
17
+ if (this.lookupNonWSType(0) !== RightParenthesis) {
18
+ this.error();
19
+ }
20
+ }
21
+ },
22
+ fallback || (() => this.Raw(null, true))
23
+ );
24
+ }
25
+
26
+ const parseFunctions = {
27
+ layer() {
28
+ this.skipSC();
29
+
30
+ const children = this.createList();
31
+ const node = parseWithFallback.call(this, this.Layer);
32
+
33
+ if (node.type !== 'Raw' || node.value !== '') {
34
+ children.push(node);
35
+ }
36
+
37
+ return children;
38
+ },
39
+ supports() {
40
+ this.skipSC();
41
+
42
+ const children = this.createList();
43
+ const node = parseWithFallback.call(
44
+ this,
45
+ this.Declaration,
46
+ () => parseWithFallback.call(this, () => this.Condition('supports'))
47
+ );
48
+
49
+ if (node.type !== 'Raw' || node.value !== '') {
50
+ children.push(node);
51
+ }
52
+
53
+ return children;
54
+ }
55
+ };
56
+
57
+ export default {
58
+ parse: {
59
+ prelude() {
60
+ const children = this.createList();
61
+
62
+ switch (this.tokenType) {
63
+ case StringToken:
64
+ children.push(this.String());
65
+ break;
66
+
67
+ case Url:
68
+ case FunctionToken:
69
+ children.push(this.Url());
70
+ break;
71
+
72
+ default:
73
+ this.error('String or url() is expected');
74
+ }
75
+
76
+ this.skipSC();
77
+
78
+ if (this.tokenType === Ident &&
79
+ this.cmpStr(this.tokenStart, this.tokenEnd, 'layer')) {
80
+ children.push(this.Identifier());
81
+ } else if (
82
+ this.tokenType === FunctionToken &&
83
+ this.cmpStr(this.tokenStart, this.tokenEnd, 'layer(')
84
+ ) {
85
+ children.push(this.Function(null, parseFunctions));
86
+ }
87
+
88
+ this.skipSC();
89
+
90
+ if (this.tokenType === FunctionToken &&
91
+ this.cmpStr(this.tokenStart, this.tokenEnd, 'supports(')) {
92
+ children.push(this.Function(null, parseFunctions));
93
+ }
94
+
95
+ if (this.lookupNonWSType(0) === Ident ||
96
+ this.lookupNonWSType(0) === LeftParenthesis) {
97
+ children.push(this.MediaQueryList());
98
+ }
99
+
100
+ return children;
101
+ },
102
+ block: null
103
+ }
104
+ };
@@ -0,0 +1,23 @@
1
+ import container from './container.js';
2
+ import fontFace from './font-face.js';
3
+ import importAtrule from './import.js';
4
+ import layer from './layer.js';
5
+ import media from './media.js';
6
+ import nest from './nest.js';
7
+ import page from './page.js';
8
+ import scope from './scope.js';
9
+ import startingStyle from './starting-style.js';
10
+ import supports from './supports.js';
11
+
12
+ export default {
13
+ container,
14
+ 'font-face': fontFace,
15
+ import: importAtrule,
16
+ layer,
17
+ media,
18
+ nest,
19
+ page,
20
+ scope,
21
+ 'starting-style': startingStyle,
22
+ supports
23
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.LayerList()
6
+ );
7
+ },
8
+ block() {
9
+ return this.Block(false);
10
+ }
11
+ }
12
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.MediaQueryList()
6
+ );
7
+ },
8
+ block(nested = false) {
9
+ return this.Block(nested);
10
+ }
11
+ }
12
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.SelectorList()
6
+ );
7
+ },
8
+ block() {
9
+ return this.Block(true);
10
+ }
11
+ }
12
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.SelectorList()
6
+ );
7
+ },
8
+ block() {
9
+ return this.Block(true);
10
+ }
11
+ }
12
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.Scope()
6
+ );
7
+ },
8
+ block(nested = false) {
9
+ return this.Block(nested);
10
+ }
11
+ }
12
+ };
@@ -0,0 +1,8 @@
1
+ export default {
2
+ parse: {
3
+ prelude: null,
4
+ block(nested = false) {
5
+ return this.Block(nested);
6
+ }
7
+ }
8
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ parse: {
3
+ prelude() {
4
+ return this.createSingleNodeList(
5
+ this.Condition('supports')
6
+ );
7
+ },
8
+ block(nested = false) {
9
+ return this.Block(nested);
10
+ }
11
+ }
12
+ };