@tbela99/css-parser 1.4.1 → 1.4.3

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 (216) hide show
  1. package/.nyc_output/4874b20e-6f53-4d7a-be5a-cf68316925f2.json +1 -0
  2. package/.nyc_output/6193bc4c-6f5f-4898-8950-c628825e6342.json +1 -0
  3. package/.nyc_output/processinfo/4874b20e-6f53-4d7a-be5a-cf68316925f2.json +1 -0
  4. package/.nyc_output/processinfo/6193bc4c-6f5f-4898-8950-c628825e6342.json +1 -0
  5. package/.repl_history +4 -0
  6. package/CHANGELOG.md +168 -4
  7. package/README.md +82 -0
  8. package/badges/coverage.svg +20 -0
  9. package/deno.lock +2861 -0
  10. package/dist/config.json.js +33 -1
  11. package/dist/index-umd-web.js +24393 -18479
  12. package/dist/index.cjs +27430 -21519
  13. package/dist/index.d.ts +1403 -933
  14. package/dist/lib/ast/clone.d.ts +10 -0
  15. package/dist/lib/ast/clone.js +45 -0
  16. package/dist/lib/ast/expand.d.ts +14 -0
  17. package/dist/lib/ast/expand.js +89 -64
  18. package/dist/lib/ast/features/calc.d.ts +10 -0
  19. package/dist/lib/ast/features/calc.js +62 -24
  20. package/dist/lib/ast/features/if.d.ts +10 -0
  21. package/dist/lib/ast/features/if.js +215 -0
  22. package/dist/lib/ast/features/index.d.ts +6 -0
  23. package/dist/lib/ast/features/index.js +1 -0
  24. package/dist/lib/ast/features/inlinecssvariables.d.ts +15 -0
  25. package/dist/lib/ast/features/inlinecssvariables.js +32 -27
  26. package/dist/lib/ast/features/prefix.d.ts +8 -0
  27. package/dist/lib/ast/features/prefix.js +68 -43
  28. package/dist/lib/ast/features/shorthand.d.ts +12 -0
  29. package/dist/lib/ast/features/shorthand.js +6 -9
  30. package/dist/lib/ast/features/transform.d.ts +10 -0
  31. package/dist/lib/ast/features/transform.js +9 -13
  32. package/dist/lib/ast/features/type.d.ts +15 -0
  33. package/dist/lib/ast/find.d.ts +165 -0
  34. package/dist/lib/ast/find.js +175 -0
  35. package/dist/lib/ast/math/expression.d.ts +18 -0
  36. package/dist/lib/ast/math/expression.js +140 -98
  37. package/dist/lib/ast/math/math.d.ts +6 -0
  38. package/dist/lib/ast/math/math.js +30 -41
  39. package/dist/lib/ast/minify.d.ts +19 -0
  40. package/dist/lib/ast/minify.js +543 -215
  41. package/dist/lib/ast/transform/compute.d.ts +8 -0
  42. package/dist/lib/ast/transform/compute.js +82 -69
  43. package/dist/lib/ast/transform/matrix.d.ts +22 -0
  44. package/dist/lib/ast/transform/matrix.js +12 -26
  45. package/dist/lib/ast/transform/minify.d.ts +5 -0
  46. package/dist/lib/ast/transform/minify.js +20 -20
  47. package/dist/lib/ast/transform/perspective.d.ts +3 -0
  48. package/dist/lib/ast/transform/perspective.js +1 -1
  49. package/dist/lib/ast/transform/rotate.d.ts +12 -0
  50. package/dist/lib/ast/transform/rotate.js +1 -1
  51. package/dist/lib/ast/transform/scale.d.ts +6 -0
  52. package/dist/lib/ast/transform/scale.js +1 -1
  53. package/dist/lib/ast/transform/skew.d.ts +4 -0
  54. package/dist/lib/ast/transform/skew.js +1 -1
  55. package/dist/lib/ast/transform/translate.d.ts +6 -0
  56. package/dist/lib/ast/transform/translate.js +1 -1
  57. package/dist/lib/ast/transform/utils.d.ts +9 -0
  58. package/dist/lib/ast/types.d.ts +903 -0
  59. package/dist/lib/ast/types.js +277 -23
  60. package/dist/lib/ast/walk.d.ts +162 -0
  61. package/dist/lib/ast/walk.js +116 -60
  62. package/dist/lib/fs/resolve.d.ts +20 -0
  63. package/dist/lib/fs/resolve.js +37 -45
  64. package/dist/lib/parser/declaration/list.d.ts +16 -0
  65. package/dist/lib/parser/declaration/list.js +26 -24
  66. package/dist/lib/parser/declaration/map.d.ts +15 -0
  67. package/dist/lib/parser/declaration/map.js +140 -95
  68. package/dist/lib/parser/declaration/set.d.ts +9 -0
  69. package/dist/lib/parser/declaration/set.js +30 -25
  70. package/dist/lib/parser/node.d.ts +7 -0
  71. package/dist/lib/parser/parse.d.ts +107 -0
  72. package/dist/lib/parser/parse.js +1454 -1445
  73. package/dist/lib/parser/tokenize.d.ts +57 -0
  74. package/dist/lib/parser/tokenize.js +557 -404
  75. package/dist/lib/parser/utils/at-rule-container.d.ts +5 -0
  76. package/dist/lib/parser/utils/at-rule-container.js +486 -0
  77. package/dist/lib/parser/utils/at-rule-font-feature-values.d.ts +5 -0
  78. package/dist/lib/parser/utils/at-rule-font-feature-values.js +13 -0
  79. package/dist/lib/parser/utils/at-rule-generic.d.ts +5 -0
  80. package/dist/lib/parser/utils/at-rule-generic.js +118 -0
  81. package/dist/lib/parser/utils/at-rule-import.d.ts +5 -0
  82. package/dist/lib/parser/utils/at-rule-import.js +393 -0
  83. package/dist/lib/parser/utils/at-rule-media.d.ts +5 -0
  84. package/dist/lib/parser/utils/at-rule-media.js +603 -0
  85. package/dist/lib/parser/utils/at-rule-page.d.ts +5 -0
  86. package/dist/lib/parser/utils/at-rule-page.js +28 -0
  87. package/dist/lib/parser/utils/at-rule-support.d.ts +5 -0
  88. package/dist/lib/parser/utils/at-rule-support.js +366 -0
  89. package/dist/lib/parser/utils/at-rule-token.d.ts +1 -0
  90. package/dist/lib/parser/utils/at-rule-when-else.d.ts +5 -0
  91. package/dist/lib/parser/utils/at-rule-when-else.js +363 -0
  92. package/dist/lib/parser/utils/at-rule.d.ts +13 -0
  93. package/dist/lib/parser/utils/at-rule.js +37 -0
  94. package/dist/lib/parser/utils/cache.d.ts +6 -0
  95. package/dist/lib/parser/utils/cache.js +19 -0
  96. package/dist/lib/parser/utils/config.d.ts +2 -0
  97. package/dist/lib/parser/utils/config.js +1 -0
  98. package/dist/lib/parser/utils/declaration-list.d.ts +5 -0
  99. package/dist/lib/parser/utils/declaration.d.ts +18 -0
  100. package/dist/lib/parser/utils/declaration.js +569 -91
  101. package/dist/lib/parser/utils/eq.d.ts +1 -0
  102. package/dist/lib/parser/utils/hash.d.ts +21 -0
  103. package/dist/lib/parser/utils/hash.js +1 -1
  104. package/dist/lib/parser/utils/selector.d.ts +5 -0
  105. package/dist/lib/parser/utils/selector.js +476 -0
  106. package/dist/lib/parser/utils/text.d.ts +3 -0
  107. package/dist/lib/parser/utils/text.js +17 -1
  108. package/dist/lib/parser/utils/token.d.ts +14 -0
  109. package/dist/lib/parser/utils/token.js +102 -0
  110. package/dist/lib/parser/utils/type.d.ts +2 -0
  111. package/dist/lib/parser/utils/type.js +29 -18
  112. package/dist/lib/renderer/render.d.ts +28 -0
  113. package/dist/lib/renderer/render.js +421 -262
  114. package/dist/lib/renderer/sourcemap/lib/encode.d.ts +1 -0
  115. package/dist/lib/renderer/sourcemap/sourcemap.d.ts +26 -0
  116. package/dist/lib/renderer/sourcemap/sourcemap.js +17 -7
  117. package/dist/lib/syntax/color/a98rgb.d.ts +2 -0
  118. package/dist/lib/syntax/color/a98rgb.js +8 -12
  119. package/dist/lib/syntax/color/cmyk.d.ts +10 -0
  120. package/dist/lib/syntax/color/cmyk.js +23 -21
  121. package/dist/lib/syntax/color/color-mix.d.ts +2 -0
  122. package/dist/lib/syntax/color/color-mix.js +88 -77
  123. package/dist/lib/syntax/color/color.d.ts +42 -0
  124. package/dist/lib/syntax/color/color.js +65 -68
  125. package/dist/lib/syntax/color/hex.d.ts +16 -0
  126. package/dist/lib/syntax/color/hex.js +27 -31
  127. package/dist/lib/syntax/color/hsl.d.ts +20 -0
  128. package/dist/lib/syntax/color/hsl.js +5 -12
  129. package/dist/lib/syntax/color/hsv.d.ts +2 -0
  130. package/dist/lib/syntax/color/hwb.d.ts +21 -0
  131. package/dist/lib/syntax/color/hwb.js +8 -21
  132. package/dist/lib/syntax/color/lab.d.ts +25 -0
  133. package/dist/lib/syntax/color/lab.js +20 -21
  134. package/dist/lib/syntax/color/lch.d.ts +23 -0
  135. package/dist/lib/syntax/color/lch.js +13 -15
  136. package/dist/lib/syntax/color/oklab.d.ts +22 -0
  137. package/dist/lib/syntax/color/oklab.js +20 -39
  138. package/dist/lib/syntax/color/oklch.d.ts +20 -0
  139. package/dist/lib/syntax/color/oklch.js +14 -16
  140. package/dist/lib/syntax/color/p3.d.ts +6 -0
  141. package/dist/lib/syntax/color/p3.js +0 -8
  142. package/dist/lib/syntax/color/prophotorgb.d.ts +2 -0
  143. package/dist/lib/syntax/color/rec2020.d.ts +2 -0
  144. package/dist/lib/syntax/color/rec2020.js +9 -13
  145. package/dist/lib/syntax/color/relativecolor.d.ts +13 -0
  146. package/dist/lib/syntax/color/relativecolor.js +68 -41
  147. package/dist/lib/syntax/color/rgb.d.ts +20 -0
  148. package/dist/lib/syntax/color/rgb.js +14 -18
  149. package/dist/lib/syntax/color/srgb.d.ts +23 -0
  150. package/dist/lib/syntax/color/srgb.js +27 -26
  151. package/dist/lib/syntax/color/utils/components.d.ts +2 -0
  152. package/dist/lib/syntax/color/utils/components.js +30 -14
  153. package/dist/lib/syntax/color/utils/distance.d.ts +18 -0
  154. package/dist/lib/syntax/color/utils/distance.js +1 -8
  155. package/dist/lib/syntax/color/utils/matrix.d.ts +6 -0
  156. package/dist/lib/syntax/color/xyz.d.ts +5 -0
  157. package/dist/lib/syntax/color/xyz.js +8 -20
  158. package/dist/lib/syntax/color/xyzd50.d.ts +4 -0
  159. package/dist/lib/syntax/color/xyzd50.js +6 -20
  160. package/dist/lib/syntax/constants.d.ts +67 -0
  161. package/dist/lib/syntax/constants.js +436 -0
  162. package/dist/lib/syntax/syntax.d.ts +38 -0
  163. package/dist/lib/syntax/syntax.js +533 -568
  164. package/dist/lib/validation/config.d.ts +14 -0
  165. package/dist/lib/validation/config.js +72 -33
  166. package/dist/lib/validation/config.json.js +1159 -74
  167. package/dist/lib/validation/json.d.ts +2 -0
  168. package/dist/lib/validation/match.d.ts +38 -0
  169. package/dist/lib/validation/match.js +2985 -0
  170. package/dist/lib/validation/parser/parse.d.ts +8 -0
  171. package/dist/lib/validation/parser/parse.js +684 -935
  172. package/dist/lib/validation/parser/typedef.d.ts +95 -0
  173. package/dist/lib/validation/parser/typedef.js +100 -0
  174. package/dist/lib/validation/utils/list.d.ts +4 -0
  175. package/dist/lib/validation/utils/list.js +4 -11
  176. package/dist/lib/validation/utils/whitespace.d.ts +2 -0
  177. package/dist/lib/validation/utils/whitespace.js +2 -8
  178. package/dist/node.d.ts +207 -0
  179. package/dist/node.js +53 -47
  180. package/dist/web.d.ts +169 -0
  181. package/dist/web.js +50 -41
  182. package/package.json +18 -13
  183. package/playground/index.html +1328 -0
  184. package/playground/sw.js +55 -0
  185. package/playground/tree.js +176 -0
  186. package/dist/lib/syntax/color/utils/constants.js +0 -214
  187. package/dist/lib/syntax/utils.js +0 -70
  188. package/dist/lib/validation/at-rules/container.js +0 -342
  189. package/dist/lib/validation/at-rules/counter-style.js +0 -90
  190. package/dist/lib/validation/at-rules/custom-media.js +0 -50
  191. package/dist/lib/validation/at-rules/document.js +0 -89
  192. package/dist/lib/validation/at-rules/else.js +0 -5
  193. package/dist/lib/validation/at-rules/font-feature-values.js +0 -63
  194. package/dist/lib/validation/at-rules/import.js +0 -150
  195. package/dist/lib/validation/at-rules/keyframes.js +0 -67
  196. package/dist/lib/validation/at-rules/layer.js +0 -41
  197. package/dist/lib/validation/at-rules/media.js +0 -255
  198. package/dist/lib/validation/at-rules/namespace.js +0 -81
  199. package/dist/lib/validation/at-rules/page-margin-box.js +0 -64
  200. package/dist/lib/validation/at-rules/page.js +0 -100
  201. package/dist/lib/validation/at-rules/supports.js +0 -295
  202. package/dist/lib/validation/at-rules/when.js +0 -185
  203. package/dist/lib/validation/atrule.js +0 -184
  204. package/dist/lib/validation/selector.js +0 -36
  205. package/dist/lib/validation/syntax.js +0 -1073
  206. package/dist/lib/validation/syntaxes/complex-selector-list.js +0 -27
  207. package/dist/lib/validation/syntaxes/complex-selector.js +0 -52
  208. package/dist/lib/validation/syntaxes/compound-selector.js +0 -196
  209. package/dist/lib/validation/syntaxes/family-name.js +0 -57
  210. package/dist/lib/validation/syntaxes/keyframe-selector.js +0 -36
  211. package/dist/lib/validation/syntaxes/layer-name.js +0 -57
  212. package/dist/lib/validation/syntaxes/relative-selector-list.js +0 -31
  213. package/dist/lib/validation/syntaxes/relative-selector.js +0 -38
  214. package/dist/lib/validation/syntaxes/selector-list.js +0 -5
  215. package/dist/lib/validation/syntaxes/selector.js +0 -5
  216. package/dist/lib/validation/syntaxes/url.js +0 -40
@@ -0,0 +1,363 @@
1
+ import { EnumToken } from '../../ast/types.js';
2
+ import { renderToken } from '../../renderer/render.js';
3
+ import { trimArray } from '../../validation/match.js';
4
+ import { tokensfuncDefMap, definedPropertySettings, tokensfuncSet } from '../../syntax/constants.js';
5
+ import { parseMediaqueryList } from './at-rule-media.js';
6
+ import { parseAtRuleSupportSyntax } from './at-rule-support.js';
7
+ import { equalsIgnoreCase } from './text.js';
8
+
9
+ const validChildTypes = new Set([
10
+ EnumToken.WhenElseFunctionTokenDefType,
11
+ EnumToken.WhenElseFunctionTokenType,
12
+ EnumToken.WhenElseQueryConditionTokenType,
13
+ EnumToken.WhenElseUnaryConditionTokenType,
14
+ ]);
15
+ function matchAtRuleWhenElseSyntax(stream, context, options = {}) {
16
+ const tokens = [];
17
+ const stack = [];
18
+ let i = 0;
19
+ let success = true;
20
+ let expectAndOr = false;
21
+ let scope = new Set();
22
+ const errors = [];
23
+ const scopes = [scope];
24
+ while (i < stream.length &&
25
+ (stream[i]?.typ === EnumToken.WhitespaceTokenType || stream[i]?.typ === EnumToken.CommentTokenType)) {
26
+ tokens.push(stream[i]);
27
+ i++;
28
+ }
29
+ if (i >= stream.length) {
30
+ success = "else" === context.nam;
31
+ return {
32
+ success,
33
+ errors: success
34
+ ? []
35
+ : [
36
+ {
37
+ action: "drop",
38
+ node: stream[i],
39
+ location: stream[i]?.loc,
40
+ message: `expecting '<boolean-condition>' at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ if (stream[i]?.typ !== EnumToken.WhenElseFunctionTokenDefType &&
46
+ stream[i]?.typ !== EnumToken.SupportsFunctionTokenDefType &&
47
+ stream[i]?.typ !== EnumToken.StartParensTokenType &&
48
+ 'val' in stream[i] &&
49
+ !(stream[i]?.typ === EnumToken.IdenTokenType &&
50
+ (equalsIgnoreCase(stream[i].val, "not") || equalsIgnoreCase(stream[i].val, "only")))) {
51
+ return {
52
+ success: false,
53
+ errors: [
54
+ {
55
+ action: "drop",
56
+ node: stream[i],
57
+ location: stream[i]?.loc,
58
+ message: `expecting '<boolean-condition>' at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ for (; i < stream.length; i++) {
64
+ tokens.push(stream[i]);
65
+ if (stream[i].typ === EnumToken.StartParensTokenType) {
66
+ stack.push(stream[i]);
67
+ scopes.push((scope = new Set()));
68
+ continue;
69
+ }
70
+ if (expectAndOr) {
71
+ let k = i;
72
+ while (k < stream.length &&
73
+ (stream[k]?.typ === EnumToken.WhitespaceTokenType || stream[k]?.typ === EnumToken.CommentTokenType)) {
74
+ tokens.push(stream[k]);
75
+ k++;
76
+ }
77
+ if (k < stream.length) {
78
+ if (stream[k].typ !== EnumToken.EndParensTokenType &&
79
+ !(stream[k].typ === EnumToken.IdenTokenType &&
80
+ (equalsIgnoreCase(stream[k].val, "and") || equalsIgnoreCase(stream[k].val, "or")))) {
81
+ return {
82
+ success: false,
83
+ errors: [
84
+ {
85
+ action: "drop",
86
+ node: stream[k],
87
+ message: `expecting 'and' or 'or' at ${stream[k]?.loc?.src}:${stream[k]?.loc?.sta.lin}:${stream[k]?.loc?.sta.col}`,
88
+ location: stream[k].loc,
89
+ },
90
+ ],
91
+ };
92
+ }
93
+ }
94
+ expectAndOr = false;
95
+ }
96
+ switch (stream[i].typ) {
97
+ case EnumToken.EndParensTokenType:
98
+ {
99
+ if (stack.length === 0) {
100
+ return {
101
+ success: false,
102
+ errors: [
103
+ {
104
+ action: "drop",
105
+ node: stream[i],
106
+ message: `unmatched ')' at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
107
+ },
108
+ ],
109
+ };
110
+ }
111
+ if (stack.at(-1)?.typ === EnumToken.StartParensTokenType) {
112
+ const index = tokens.indexOf(stack.at(-1));
113
+ const slice = trimArray(tokens.splice(index + 1, tokens.length - index - 2));
114
+ const filtered = slice.filter((token) => {
115
+ return (token.typ !== EnumToken.WhitespaceTokenType && token.typ !== EnumToken.CommentTokenType);
116
+ });
117
+ if (filtered.length !== 1 ||
118
+ !(validChildTypes.has(filtered[0].typ) ||
119
+ tokensfuncDefMap.has(filtered[0].typ) ||
120
+ tokensfuncSet.has(filtered[0].typ))) {
121
+ const token = filtered[0] ?? slice[0] ?? stream[i];
122
+ return {
123
+ success: false,
124
+ errors: [
125
+ {
126
+ action: "drop",
127
+ node: token,
128
+ location: token.loc,
129
+ message: `expecting '<boolean-condition"}>' at ${token?.loc?.src}:${token?.loc?.sta.lin}:${token?.loc?.sta.col}`,
130
+ },
131
+ ],
132
+ };
133
+ }
134
+ tokens[index] = Object.defineProperty({
135
+ typ: EnumToken.ParensTokenType,
136
+ chi: slice,
137
+ }, "loc", {
138
+ ...definedPropertySettings,
139
+ value: { ...stack.at(-1).loc, end: { ...stream[i]?.loc?.end } },
140
+ });
141
+ stack.pop();
142
+ tokens.pop();
143
+ scopes.pop();
144
+ scope = scopes[scopes.length - 1];
145
+ expectAndOr = true;
146
+ }
147
+ if (stack.at(-1)?.typ === EnumToken.NotTokenType || stack.at(-1)?.typ === EnumToken.OnlyTokenType) {
148
+ const index = tokens.indexOf(stack.at(-1));
149
+ tokens[index] = Object.defineProperty({
150
+ typ: EnumToken.SupportsQueryUnaryConditionTokenType,
151
+ l: stack.at(-1),
152
+ r: trimArray(tokens.splice(index + 1, i - index - 1)),
153
+ }, "loc", {
154
+ ...definedPropertySettings,
155
+ value: { ...stack.at(-1).loc, end: { ...stream[i]?.loc?.end } },
156
+ });
157
+ stack.pop();
158
+ }
159
+ if (stack.at(-1)?.typ === EnumToken.AndTokenType || stack.at(-1)?.typ === EnumToken.OrTokenType) {
160
+ if (stack.length > 1 && stack.at(-2)?.typ !== EnumToken.StartParensTokenType) {
161
+ return {
162
+ success: false,
163
+ errors: [
164
+ {
165
+ action: "drop",
166
+ node: stack.at(-2),
167
+ message: `expecting '(' at ${stack.at(-2)?.loc?.src}:${stack.at(-2)?.loc?.sta.lin}:${stack.at(-2)?.loc?.sta.col}`,
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ const index = tokens.indexOf(stack.at(-1));
173
+ const index2 = stack.length > 1 ? tokens.indexOf(stack.at(-2)) + 1 : 0;
174
+ const left = trimArray(tokens.slice(index2, index));
175
+ const notToken = left.find((t) => t.typ === EnumToken.SupportsQueryUnaryConditionTokenType &&
176
+ t.l.typ === EnumToken.NotTokenType);
177
+ if (notToken != null) {
178
+ return {
179
+ success: false,
180
+ errors: [
181
+ {
182
+ action: "drop",
183
+ node: stack.at(-1),
184
+ message: `unexpected token after 'not' expression at ${stack.at(-1)?.loc?.src}:${stack.at(-1)?.loc?.sta.lin}:${stack.at(-1)?.loc?.sta.col}`,
185
+ },
186
+ ],
187
+ };
188
+ }
189
+ tokens[index2] = Object.defineProperty({
190
+ typ: EnumToken.SupportsQueryConditionTokenType,
191
+ op: stack.at(-1),
192
+ l: left,
193
+ r: trimArray(tokens.slice(index + 1)),
194
+ }, "loc", {
195
+ ...definedPropertySettings,
196
+ value: { ...stack.at(-1).loc, end: { ...stream[i]?.loc?.end } },
197
+ });
198
+ tokens.length = index2 + 1;
199
+ stack.pop();
200
+ }
201
+ }
202
+ break;
203
+ case EnumToken.IdenTokenType:
204
+ {
205
+ const val = stream[i].val.toLowerCase();
206
+ if ("not" === val || "only" === val) {
207
+ stack.push(stream[i]);
208
+ Object.assign(stream[i], {
209
+ typ: "only" === val ? EnumToken.OnlyTokenType : EnumToken.NotTokenType,
210
+ });
211
+ break;
212
+ }
213
+ if ("and" === val || "or" === val) {
214
+ if (scope.has("or" === val ? EnumToken.AndTokenType : EnumToken.OrTokenType)) {
215
+ return {
216
+ success: false,
217
+ errors: [
218
+ {
219
+ action: "drop",
220
+ message: `mixing <and> and <or> at the same level is not allowed at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
221
+ },
222
+ ],
223
+ };
224
+ }
225
+ if ("or" === val && scopes.length === 1) {
226
+ return {
227
+ success: false,
228
+ errors: [
229
+ {
230
+ action: "drop",
231
+ message: `<or> is not allowed outside of a parenthesis at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
232
+ },
233
+ ],
234
+ };
235
+ }
236
+ Object.assign(stream[i], {
237
+ typ: "or" === val ? EnumToken.OrTokenType : EnumToken.AndTokenType,
238
+ });
239
+ scope.add(stream[i].typ);
240
+ stack.push(stream[i]);
241
+ break;
242
+ }
243
+ }
244
+ break;
245
+ case EnumToken.SupportsFunctionTokenDefType:
246
+ case EnumToken.WhenElseFunctionTokenDefType:
247
+ {
248
+ let matchCount = 1;
249
+ let j = i + 1;
250
+ for (; j < stream.length; j++) {
251
+ if (stream[j].typ === EnumToken.EndParensTokenType) {
252
+ matchCount--;
253
+ if (matchCount === 0) {
254
+ break;
255
+ }
256
+ }
257
+ else if (stream[j].typ === EnumToken.StartParensTokenType ||
258
+ tokensfuncDefMap.has(stream[j].typ)) {
259
+ matchCount++;
260
+ }
261
+ }
262
+ const slice = stream.slice(i, j + 1);
263
+ const funcName = stream[i].val.toLowerCase();
264
+ const tokenList = [
265
+ Object.defineProperty({ typ: EnumToken.StartParensTokenType }, "loc", {
266
+ ...definedPropertySettings,
267
+ value: { ...stream[i].loc, end: { ...stream[j]?.loc?.end } },
268
+ }),
269
+ ].concat(slice.slice(1));
270
+ if ("media" === funcName) {
271
+ const result = parseMediaqueryList(tokenList, options);
272
+ if (!result.success) {
273
+ return result;
274
+ }
275
+ }
276
+ else if ("supports" === funcName) {
277
+ const result = parseAtRuleSupportSyntax(tokenList, context, options);
278
+ if (!result.success) {
279
+ return result;
280
+ }
281
+ }
282
+ else if (stream[i].typ === EnumToken.SupportsFunctionTokenDefType) {
283
+ tokenList.splice(0, tokenList.length, ...slice);
284
+ const result = parseAtRuleSupportSyntax(stream.slice(i, j + 1), context, options);
285
+ if (!result.success) {
286
+ return result;
287
+ }
288
+ }
289
+ else {
290
+ errors.push({
291
+ action: "ignore",
292
+ message: `unknown <boolean-condition> function '${funcName}' at ${stream[i]?.loc?.src}:${stream[i]?.loc?.sta.lin}:${stream[i]?.loc?.sta.col}`,
293
+ node: stream[i],
294
+ location: stream[i].loc,
295
+ });
296
+ }
297
+ Object.defineProperty(Object.assign(stream[i], {
298
+ typ: tokensfuncDefMap.get(stream[i].typ),
299
+ chi: stream[i].typ === EnumToken.SupportsFunctionTokenDefType
300
+ ? trimArray(slice.slice(1, -1))
301
+ : tokenList[0].chi,
302
+ }), "loc", {
303
+ ...definedPropertySettings,
304
+ value: { ...stream[i].loc, end: { ...stream[j]?.loc?.end } },
305
+ });
306
+ if (stack.at(-1)?.typ === EnumToken.NotTokenType || stack.at(-1)?.typ === EnumToken.OnlyTokenType) {
307
+ const index = tokens.indexOf(stack.at(-1));
308
+ tokens[index] = Object.defineProperty({
309
+ typ: EnumToken.WhenElseUnaryConditionTokenType,
310
+ l: stack.at(-1),
311
+ r: trimArray(tokens.slice(index + 1)),
312
+ }, "loc", {
313
+ ...definedPropertySettings,
314
+ value: { ...stack.at(-1).loc, end: { ...stream[i]?.loc?.end } },
315
+ });
316
+ tokens.length = index + 1;
317
+ stack.pop();
318
+ }
319
+ if (stack.at(-1)?.typ === EnumToken.AndTokenType || stack.at(-1)?.typ === EnumToken.OrTokenType) {
320
+ const index = tokens.indexOf(stack.at(-1));
321
+ const index2 = stack.length > 1 ? tokens.indexOf(stack.at(-2)) + 1 : 0;
322
+ tokens[index2] = Object.defineProperty({
323
+ typ: EnumToken.WhenElseQueryConditionTokenType,
324
+ op: stack.at(-1),
325
+ l: trimArray(tokens.slice(index2, index)),
326
+ r: trimArray(tokens.slice(index + 1)),
327
+ }, "loc", {
328
+ ...definedPropertySettings,
329
+ value: { ...stack.at(-1).loc, end: { ...stream[i]?.loc?.end } },
330
+ });
331
+ tokens.length = index2 + 1;
332
+ stack.pop();
333
+ }
334
+ i = j;
335
+ expectAndOr = true;
336
+ }
337
+ break;
338
+ default:
339
+ if (tokensfuncDefMap.has(stream[i].typ)) {
340
+ stack.push(stream[i]);
341
+ expectAndOr = true;
342
+ }
343
+ break;
344
+ }
345
+ }
346
+ if (stack.length > 0) {
347
+ return {
348
+ success: false,
349
+ errors: [
350
+ {
351
+ action: "drop",
352
+ node: stack.at(-1),
353
+ message: `unmatched token '${renderToken(stack.at(-1))}' at ${stack.at(-1).loc.src}:${stack.at(-1).loc.sta.lin}:${stack.at(-1).loc.sta.col}`,
354
+ },
355
+ ],
356
+ };
357
+ }
358
+ stream.length = 0;
359
+ stream.push(...trimArray(tokens));
360
+ return { success, errors };
361
+ }
362
+
363
+ export { matchAtRuleWhenElseSyntax };
@@ -0,0 +1,13 @@
1
+ import type { AtRuleToken, Token, ParserOptions, ValidationOptions } from "../../../@types/index.d.ts";
2
+ export declare function matchAtRuleSyntax(atRule: AtRuleToken, stream: Token[], options: ParserOptions | ValidationOptions): {
3
+ success: boolean;
4
+ errors: {
5
+ action: string;
6
+ message: string;
7
+ node: Token;
8
+ location: import("../../../@types/ast").Location;
9
+ }[];
10
+ } | {
11
+ success: boolean;
12
+ errors: import("../../../@types/index.d.ts").ErrorDescription[];
13
+ };
@@ -0,0 +1,37 @@
1
+ import { EnumToken } from '../../ast/types.js';
2
+ import { ValidationSyntaxGroupEnum } from '../../validation/parser/typedef.js';
3
+ import { getSyntaxRule } from '../../validation/config.js';
4
+ import { trimArray, matchAllSyntax, createValidationContext } from '../../validation/match.js';
5
+
6
+ // export const mediaQueryConditionEnum: Set<EnumToken> = new Set([
7
+ // EnumToken.ParensTokenType,
8
+ // EnumToken.IdenTokenType,
9
+ // EnumToken.MediaQueryConditionTokenType,
10
+ // EnumToken.MediaQueryUnaryFeatureTokenType,
11
+ // ]);
12
+ function matchAtRuleSyntax(atRule, stream, options) {
13
+ const syntaxRules = getSyntaxRule(ValidationSyntaxGroupEnum.AtRules, "@" + atRule.nam);
14
+ const syntax = syntaxRules?.getPreludeRules()?.slice?.(1);
15
+ trimArray(stream);
16
+ if (syntax.length === 0) {
17
+ const filtered = stream.filter((token) => token.typ !== EnumToken.WhitespaceTokenType && token.typ !== EnumToken.CommentTokenType);
18
+ if (filtered.length > 0) {
19
+ return {
20
+ success: false,
21
+ errors: [
22
+ {
23
+ action: "drop",
24
+ message: `unexpected token ${EnumToken[filtered[0].typ]} at ${filtered[0].loc.src}:${filtered[0].loc.sta.lin}:${filtered[0].loc.sta.col}`,
25
+ node: filtered[0],
26
+ location: filtered[0].loc,
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ return { success: true, errors: [] };
32
+ }
33
+ const { success, errors} = matchAllSyntax(syntax, createValidationContext(stream), options);
34
+ return { success, errors };
35
+ }
36
+
37
+ export { matchAtRuleSyntax };
@@ -0,0 +1,6 @@
1
+ /**
2
+ *
3
+ * @param fn
4
+ * @returns
5
+ */
6
+ export declare function memoize(fn: Function): (...args: any[]) => any;
@@ -0,0 +1,19 @@
1
+ /**
2
+ *
3
+ * @param fn
4
+ * @returns
5
+ */
6
+ function memoize(fn) {
7
+ const cache = new Map();
8
+ return function (...args) {
9
+ const key = args.flat().join();
10
+ if (cache.has(key)) {
11
+ return cache.get(key);
12
+ }
13
+ const result = fn(...args);
14
+ cache.set(key, result);
15
+ return result;
16
+ };
17
+ }
18
+
19
+ export { memoize };
@@ -0,0 +1,2 @@
1
+ import type { PropertiesConfig } from "../../../@types/index.d.ts";
2
+ export declare const getConfig: () => PropertiesConfig;
@@ -1,6 +1,7 @@
1
1
  import config from '../../../config.json.js';
2
2
 
3
3
  Object.freeze(config);
4
+ // @ts-expect-error
4
5
  const getConfig = () => config;
5
6
 
6
7
  export { getConfig };
@@ -0,0 +1,5 @@
1
+ import { AstAtRule, AtRuleToken, Token, ParserOptions, ErrorDescription } from "../../../@types";
2
+ export declare function parseDeclarationList(context: AstAtRule | AtRuleToken, stream: Token[], options: ParserOptions, errors: ErrorDescription[]): {
3
+ success: boolean;
4
+ errors: ErrorDescription[];
5
+ };
@@ -0,0 +1,18 @@
1
+ import type { AstAtRule, AstDeclaration, AstInvalidAtRule, AstInvalidDeclaration, AstInvalidRule, AstKeyFrameRule, AstRule, AstStyleSheet, AtRuleToken, ErrorDescription, ParserOptions, RawNodeToken, Token } from "../../../@types/index.d.ts";
2
+ /**
3
+ *
4
+ * @param tokens
5
+ * @returns
6
+ */
7
+ export declare function isDeclarationValue(tokens: Token[]): {
8
+ success: boolean;
9
+ errors: ErrorDescription[];
10
+ };
11
+ /**
12
+ * parse declaration
13
+ * @param tokens
14
+ * @param parent
15
+ * @param options
16
+ * @param errors
17
+ */
18
+ export declare function parseDeclaration(tokens: Token[], parent: AstRule | AstAtRule | AstKeyFrameRule | AstStyleSheet | AtRuleToken | AstInvalidAtRule | AstInvalidRule | null, options: ParserOptions, errors: ErrorDescription[]): AstDeclaration | AstInvalidDeclaration | RawNodeToken;