@tbela99/css-parser 0.0.1 → 0.1.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.
- package/README.md +117 -36
- package/dist/index-umd-web.js +2057 -1235
- package/dist/index.cjs +2051 -1231
- package/dist/index.d.ts +677 -332
- package/dist/lib/ast/expand.js +14 -14
- package/dist/lib/ast/features/calc.js +256 -0
- package/dist/lib/ast/features/index.js +3 -0
- package/dist/lib/ast/features/inlinecssvariables.js +115 -0
- package/dist/lib/ast/features/shorthand.js +45 -0
- package/dist/lib/ast/minify.js +395 -371
- package/dist/lib/ast/types.js +88 -0
- package/dist/lib/ast/utiles/minifyfeature.js +8 -0
- package/dist/lib/ast/walk.js +24 -9
- package/dist/lib/parser/declaration/list.js +18 -4
- package/dist/lib/parser/declaration/map.js +51 -30
- package/dist/lib/parser/declaration/set.js +18 -12
- package/dist/lib/parser/parse.js +176 -136
- package/dist/lib/parser/tokenize.js +42 -35
- package/dist/lib/parser/utils/syntax.js +13 -10
- package/dist/lib/parser/utils/type.js +18 -6
- package/dist/lib/renderer/render.js +201 -79
- package/dist/lib/renderer/sourcemap/lib/encode.js +37 -0
- package/dist/lib/renderer/sourcemap/sourcemap.js +58 -0
- package/dist/lib/renderer/utils/color.js +25 -20
- package/dist/node/index.js +29 -10
- package/dist/web/index.js +33 -12
- package/package.json +5 -4
- package/dist/lib/transform.js +0 -24
package/dist/index-umd-web.js
CHANGED
|
@@ -4,6 +4,93 @@
|
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CSSParser = {}));
|
|
5
5
|
})(this, (function (exports) { 'use strict';
|
|
6
6
|
|
|
7
|
+
exports.NodeType = void 0;
|
|
8
|
+
(function (NodeType) {
|
|
9
|
+
NodeType[NodeType["CommentNodeType"] = 0] = "CommentNodeType";
|
|
10
|
+
NodeType[NodeType["CDOCOMMNodeType"] = 1] = "CDOCOMMNodeType";
|
|
11
|
+
NodeType[NodeType["StyleSheetNodeType"] = 2] = "StyleSheetNodeType";
|
|
12
|
+
NodeType[NodeType["AtRuleNodeType"] = 3] = "AtRuleNodeType";
|
|
13
|
+
NodeType[NodeType["RuleNodeType"] = 4] = "RuleNodeType";
|
|
14
|
+
NodeType[NodeType["DeclarationNodeType"] = 5] = "DeclarationNodeType";
|
|
15
|
+
})(exports.NodeType || (exports.NodeType = {}));
|
|
16
|
+
exports.EnumToken = void 0;
|
|
17
|
+
(function (EnumToken) {
|
|
18
|
+
EnumToken[EnumToken["CommentTokenType"] = 0] = "CommentTokenType";
|
|
19
|
+
EnumToken[EnumToken["CDOCOMMTokenType"] = 1] = "CDOCOMMTokenType";
|
|
20
|
+
EnumToken[EnumToken["LiteralTokenType"] = 2] = "LiteralTokenType";
|
|
21
|
+
EnumToken[EnumToken["IdenTokenType"] = 3] = "IdenTokenType";
|
|
22
|
+
EnumToken[EnumToken["CommaTokenType"] = 4] = "CommaTokenType";
|
|
23
|
+
EnumToken[EnumToken["ColonTokenType"] = 5] = "ColonTokenType";
|
|
24
|
+
EnumToken[EnumToken["SemiColonTokenType"] = 6] = "SemiColonTokenType";
|
|
25
|
+
EnumToken[EnumToken["NumberTokenType"] = 7] = "NumberTokenType";
|
|
26
|
+
EnumToken[EnumToken["AtRuleTokenType"] = 8] = "AtRuleTokenType";
|
|
27
|
+
EnumToken[EnumToken["PercentageTokenType"] = 9] = "PercentageTokenType";
|
|
28
|
+
EnumToken[EnumToken["FunctionTokenType"] = 10] = "FunctionTokenType";
|
|
29
|
+
EnumToken[EnumToken["UrlFunctionTokenType"] = 11] = "UrlFunctionTokenType";
|
|
30
|
+
EnumToken[EnumToken["StringTokenType"] = 12] = "StringTokenType";
|
|
31
|
+
EnumToken[EnumToken["UnclosedStringTokenType"] = 13] = "UnclosedStringTokenType";
|
|
32
|
+
EnumToken[EnumToken["DimensionTokenType"] = 14] = "DimensionTokenType";
|
|
33
|
+
EnumToken[EnumToken["LengthTokenType"] = 15] = "LengthTokenType";
|
|
34
|
+
EnumToken[EnumToken["AngleTokenType"] = 16] = "AngleTokenType";
|
|
35
|
+
EnumToken[EnumToken["TimeTokenType"] = 17] = "TimeTokenType";
|
|
36
|
+
EnumToken[EnumToken["FrequencyTokenType"] = 18] = "FrequencyTokenType";
|
|
37
|
+
EnumToken[EnumToken["ResolutionTokenType"] = 19] = "ResolutionTokenType";
|
|
38
|
+
EnumToken[EnumToken["HashTokenType"] = 20] = "HashTokenType";
|
|
39
|
+
EnumToken[EnumToken["BlockStartTokenType"] = 21] = "BlockStartTokenType";
|
|
40
|
+
EnumToken[EnumToken["BlockEndTokenType"] = 22] = "BlockEndTokenType";
|
|
41
|
+
EnumToken[EnumToken["AttrStartTokenType"] = 23] = "AttrStartTokenType";
|
|
42
|
+
EnumToken[EnumToken["AttrEndTokenType"] = 24] = "AttrEndTokenType";
|
|
43
|
+
EnumToken[EnumToken["StartParensTokenType"] = 25] = "StartParensTokenType";
|
|
44
|
+
EnumToken[EnumToken["EndParensTokenType"] = 26] = "EndParensTokenType";
|
|
45
|
+
EnumToken[EnumToken["ParensTokenType"] = 27] = "ParensTokenType";
|
|
46
|
+
EnumToken[EnumToken["WhitespaceTokenType"] = 28] = "WhitespaceTokenType";
|
|
47
|
+
EnumToken[EnumToken["IncludesTokenType"] = 29] = "IncludesTokenType";
|
|
48
|
+
EnumToken[EnumToken["DashMatchTokenType"] = 30] = "DashMatchTokenType";
|
|
49
|
+
EnumToken[EnumToken["LtTokenType"] = 31] = "LtTokenType";
|
|
50
|
+
EnumToken[EnumToken["LteTokenType"] = 32] = "LteTokenType";
|
|
51
|
+
EnumToken[EnumToken["GtTokenType"] = 33] = "GtTokenType";
|
|
52
|
+
EnumToken[EnumToken["GteTokenType"] = 34] = "GteTokenType";
|
|
53
|
+
EnumToken[EnumToken["PseudoClassTokenType"] = 35] = "PseudoClassTokenType";
|
|
54
|
+
EnumToken[EnumToken["PseudoClassFuncTokenType"] = 36] = "PseudoClassFuncTokenType";
|
|
55
|
+
EnumToken[EnumToken["DelimTokenType"] = 37] = "DelimTokenType";
|
|
56
|
+
EnumToken[EnumToken["UrlTokenTokenType"] = 38] = "UrlTokenTokenType";
|
|
57
|
+
EnumToken[EnumToken["EOFTokenType"] = 39] = "EOFTokenType";
|
|
58
|
+
EnumToken[EnumToken["ImportantTokenType"] = 40] = "ImportantTokenType";
|
|
59
|
+
EnumToken[EnumToken["ColorTokenType"] = 41] = "ColorTokenType";
|
|
60
|
+
EnumToken[EnumToken["AttrTokenType"] = 42] = "AttrTokenType";
|
|
61
|
+
EnumToken[EnumToken["BadCommentTokenType"] = 43] = "BadCommentTokenType";
|
|
62
|
+
EnumToken[EnumToken["BadCdoTokenType"] = 44] = "BadCdoTokenType";
|
|
63
|
+
EnumToken[EnumToken["BadUrlTokenType"] = 45] = "BadUrlTokenType";
|
|
64
|
+
EnumToken[EnumToken["BadStringTokenType"] = 46] = "BadStringTokenType";
|
|
65
|
+
EnumToken[EnumToken["BinaryExpressionTokenType"] = 47] = "BinaryExpressionTokenType";
|
|
66
|
+
EnumToken[EnumToken["UnaryExpressionTokenType"] = 48] = "UnaryExpressionTokenType";
|
|
67
|
+
/* catch all */
|
|
68
|
+
EnumToken[EnumToken["ListToken"] = 49] = "ListToken";
|
|
69
|
+
/* arithmetic tokens */
|
|
70
|
+
EnumToken[EnumToken["Add"] = 50] = "Add";
|
|
71
|
+
EnumToken[EnumToken["Mul"] = 51] = "Mul";
|
|
72
|
+
EnumToken[EnumToken["Div"] = 52] = "Div";
|
|
73
|
+
EnumToken[EnumToken["Sub"] = 53] = "Sub";
|
|
74
|
+
/* aliases */
|
|
75
|
+
EnumToken[EnumToken["Time"] = 17] = "Time";
|
|
76
|
+
EnumToken[EnumToken["Iden"] = 3] = "Iden";
|
|
77
|
+
EnumToken[EnumToken["Hash"] = 20] = "Hash";
|
|
78
|
+
EnumToken[EnumToken["Angle"] = 16] = "Angle";
|
|
79
|
+
EnumToken[EnumToken["Color"] = 41] = "Color";
|
|
80
|
+
EnumToken[EnumToken["Comma"] = 4] = "Comma";
|
|
81
|
+
EnumToken[EnumToken["String"] = 12] = "String";
|
|
82
|
+
EnumToken[EnumToken["Length"] = 15] = "Length";
|
|
83
|
+
EnumToken[EnumToken["Number"] = 7] = "Number";
|
|
84
|
+
EnumToken[EnumToken["Perc"] = 9] = "Perc";
|
|
85
|
+
EnumToken[EnumToken["Literal"] = 2] = "Literal";
|
|
86
|
+
EnumToken[EnumToken["Comment"] = 0] = "Comment";
|
|
87
|
+
EnumToken[EnumToken["UrlFunc"] = 11] = "UrlFunc";
|
|
88
|
+
EnumToken[EnumToken["Dimension"] = 14] = "Dimension";
|
|
89
|
+
EnumToken[EnumToken["Frequency"] = 18] = "Frequency";
|
|
90
|
+
EnumToken[EnumToken["Resolution"] = 19] = "Resolution";
|
|
91
|
+
EnumToken[EnumToken["Whitespace"] = 28] = "Whitespace";
|
|
92
|
+
})(exports.EnumToken || (exports.EnumToken = {}));
|
|
93
|
+
|
|
7
94
|
// name to color
|
|
8
95
|
const COLORS_NAMES = Object.seal({
|
|
9
96
|
'aliceblue': '#f0f8ff',
|
|
@@ -316,18 +403,18 @@
|
|
|
316
403
|
// @ts-ignore
|
|
317
404
|
t = token.chi[i];
|
|
318
405
|
// @ts-ignore
|
|
319
|
-
value += Math.round(t.typ ==
|
|
406
|
+
value += Math.round(t.typ == exports.EnumToken.PercentageTokenType ? 255 * t.val / 100 : t.val).toString(16).padStart(2, '0');
|
|
320
407
|
}
|
|
321
408
|
// @ts-ignore
|
|
322
409
|
if (token.chi.length == 7) {
|
|
323
410
|
// @ts-ignore
|
|
324
411
|
t = token.chi[6];
|
|
325
412
|
// @ts-ignore
|
|
326
|
-
if ((t.typ ==
|
|
413
|
+
if ((t.typ == exports.EnumToken.NumberTokenType && t.val < 1) ||
|
|
327
414
|
// @ts-ignore
|
|
328
|
-
(t.typ ==
|
|
415
|
+
(t.typ == exports.EnumToken.PercentageTokenType && t.val < 100)) {
|
|
329
416
|
// @ts-ignore
|
|
330
|
-
value += Math.round(255 * (t.typ ==
|
|
417
|
+
value += Math.round(255 * (t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val)).toString(16).padStart(2, '0');
|
|
331
418
|
}
|
|
332
419
|
}
|
|
333
420
|
return value;
|
|
@@ -339,21 +426,21 @@
|
|
|
339
426
|
// @ts-ignore
|
|
340
427
|
t = token.chi[2];
|
|
341
428
|
// @ts-ignore
|
|
342
|
-
let s = t.typ ==
|
|
429
|
+
let s = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
343
430
|
// @ts-ignore
|
|
344
431
|
t = token.chi[4];
|
|
345
432
|
// @ts-ignore
|
|
346
|
-
let l = t.typ ==
|
|
433
|
+
let l = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
347
434
|
let a = null;
|
|
348
435
|
if (token.chi?.length == 7) {
|
|
349
436
|
// @ts-ignore
|
|
350
437
|
t = token.chi[6];
|
|
351
438
|
// @ts-ignore
|
|
352
|
-
if ((t.typ ==
|
|
439
|
+
if ((t.typ == exports.EnumToken.PercentageTokenType && t.val < 100) ||
|
|
353
440
|
// @ts-ignore
|
|
354
|
-
(t.typ ==
|
|
441
|
+
(t.typ == exports.EnumToken.NumberTokenType && t.val < 1)) {
|
|
355
442
|
// @ts-ignore
|
|
356
|
-
a = (t.typ ==
|
|
443
|
+
a = (t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val);
|
|
357
444
|
}
|
|
358
445
|
}
|
|
359
446
|
return `#${hsl2rgb(h, s, l, a).reduce((acc, curr) => acc + curr.toString(16).padStart(2, '0'), '')}`;
|
|
@@ -365,21 +452,21 @@
|
|
|
365
452
|
// @ts-ignore
|
|
366
453
|
t = token.chi[2];
|
|
367
454
|
// @ts-ignore
|
|
368
|
-
let white = t.typ ==
|
|
455
|
+
let white = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
369
456
|
// @ts-ignore
|
|
370
457
|
t = token.chi[4];
|
|
371
458
|
// @ts-ignore
|
|
372
|
-
let black = t.typ ==
|
|
459
|
+
let black = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
373
460
|
let a = null;
|
|
374
461
|
if (token.chi?.length == 7) {
|
|
375
462
|
// @ts-ignore
|
|
376
463
|
t = token.chi[6];
|
|
377
464
|
// @ts-ignore
|
|
378
|
-
if ((t.typ ==
|
|
465
|
+
if ((t.typ == exports.EnumToken.PercentageTokenType && t.val < 100) ||
|
|
379
466
|
// @ts-ignore
|
|
380
|
-
(t.typ ==
|
|
467
|
+
(t.typ == exports.EnumToken.NumberTokenType && t.val < 1)) {
|
|
381
468
|
// @ts-ignore
|
|
382
|
-
a = (t.typ ==
|
|
469
|
+
a = (t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val);
|
|
383
470
|
}
|
|
384
471
|
}
|
|
385
472
|
const rgb = hsl2rgb(h, 1, .5, a);
|
|
@@ -396,19 +483,19 @@
|
|
|
396
483
|
// @ts-ignore
|
|
397
484
|
let t = token.chi[0];
|
|
398
485
|
// @ts-ignore
|
|
399
|
-
const c = t.typ ==
|
|
486
|
+
const c = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
400
487
|
// @ts-ignore
|
|
401
488
|
t = token.chi[2];
|
|
402
489
|
// @ts-ignore
|
|
403
|
-
const m = t.typ ==
|
|
490
|
+
const m = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
404
491
|
// @ts-ignore
|
|
405
492
|
t = token.chi[4];
|
|
406
493
|
// @ts-ignore
|
|
407
|
-
const y = t.typ ==
|
|
494
|
+
const y = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
408
495
|
// @ts-ignore
|
|
409
496
|
t = token.chi[6];
|
|
410
497
|
// @ts-ignore
|
|
411
|
-
const k = t.typ ==
|
|
498
|
+
const k = t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val;
|
|
412
499
|
const rgb = [
|
|
413
500
|
Math.round(255 * (1 - Math.min(1, c * (1 - k) + k))),
|
|
414
501
|
Math.round(255 * (1 - Math.min(1, m * (1 - k) + k))),
|
|
@@ -419,12 +506,12 @@
|
|
|
419
506
|
// @ts-ignore
|
|
420
507
|
t = token.chi[8];
|
|
421
508
|
// @ts-ignore
|
|
422
|
-
rgb.push(Math.round(255 * (t.typ ==
|
|
509
|
+
rgb.push(Math.round(255 * (t.typ == exports.EnumToken.PercentageTokenType ? t.val / 100 : t.val)));
|
|
423
510
|
}
|
|
424
511
|
return `#${rgb.reduce((acc, curr) => acc + curr.toString(16).padStart(2, '0'), '')}`;
|
|
425
512
|
}
|
|
426
513
|
function getAngle(token) {
|
|
427
|
-
if (token.typ ==
|
|
514
|
+
if (token.typ == exports.EnumToken.AngleTokenType) {
|
|
428
515
|
switch (token.unit) {
|
|
429
516
|
case 'deg':
|
|
430
517
|
// @ts-ignore
|
|
@@ -497,6 +584,97 @@
|
|
|
497
584
|
return values;
|
|
498
585
|
}
|
|
499
586
|
|
|
587
|
+
// from https://github.com/Rich-Harris/vlq/tree/master
|
|
588
|
+
// credit: Rich Harris
|
|
589
|
+
const integer_to_char = {};
|
|
590
|
+
let i = 0;
|
|
591
|
+
for (const char of 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=') {
|
|
592
|
+
integer_to_char[i++] = char;
|
|
593
|
+
}
|
|
594
|
+
function encode(value) {
|
|
595
|
+
if (typeof value === 'number') {
|
|
596
|
+
return encode_integer(value);
|
|
597
|
+
}
|
|
598
|
+
let result = '';
|
|
599
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
600
|
+
result += encode_integer(value[i]);
|
|
601
|
+
}
|
|
602
|
+
return result;
|
|
603
|
+
}
|
|
604
|
+
function encode_integer(num) {
|
|
605
|
+
let result = '';
|
|
606
|
+
if (num < 0) {
|
|
607
|
+
num = (-num << 1) | 1;
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
num <<= 1;
|
|
611
|
+
}
|
|
612
|
+
do {
|
|
613
|
+
let clamped = num & 31;
|
|
614
|
+
num >>>= 5;
|
|
615
|
+
if (num > 0) {
|
|
616
|
+
clamped |= 32;
|
|
617
|
+
}
|
|
618
|
+
result += integer_to_char[clamped];
|
|
619
|
+
} while (num > 0);
|
|
620
|
+
return result;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
class SourceMap {
|
|
624
|
+
#version = 3;
|
|
625
|
+
#sources = [];
|
|
626
|
+
#map = new Map;
|
|
627
|
+
#line = -1;
|
|
628
|
+
lastLocation = null;
|
|
629
|
+
add(source, original) {
|
|
630
|
+
if (original.src !== '') {
|
|
631
|
+
if (!this.#sources.includes(original.src)) {
|
|
632
|
+
this.#sources.push(original.src);
|
|
633
|
+
}
|
|
634
|
+
const line = source.sta.lin - 1;
|
|
635
|
+
let record;
|
|
636
|
+
if (line > this.#line) {
|
|
637
|
+
this.#line = line;
|
|
638
|
+
}
|
|
639
|
+
if (!this.#map.has(line)) {
|
|
640
|
+
record = [Math.max(0, source.sta.col - 1), this.#sources.indexOf(original.src), original.sta.lin - 1, original.sta.col - 1];
|
|
641
|
+
this.#map.set(line, [record]);
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
const arr = this.#map.get(line);
|
|
645
|
+
record = [Math.max(0, source.sta.col - 1 - arr[0][0]), this.#sources.indexOf(original.src) - arr[0][1], original.sta.lin - 1, original.sta.col - 1];
|
|
646
|
+
arr.push(record);
|
|
647
|
+
}
|
|
648
|
+
if (this.lastLocation != null) {
|
|
649
|
+
record[2] -= this.lastLocation.sta.lin - 1;
|
|
650
|
+
record[3] -= this.lastLocation.sta.col - 1;
|
|
651
|
+
}
|
|
652
|
+
this.lastLocation = original;
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
toUrl() {
|
|
656
|
+
// /*# sourceMappingURL = ${url} */
|
|
657
|
+
return `data:application/json,${encodeURIComponent(JSON.stringify(this.toJSON()))}`;
|
|
658
|
+
}
|
|
659
|
+
toJSON() {
|
|
660
|
+
const mappings = [];
|
|
661
|
+
let i = 0;
|
|
662
|
+
for (; i <= this.#line; i++) {
|
|
663
|
+
if (!this.#map.has(i)) {
|
|
664
|
+
mappings.push('');
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
mappings.push(this.#map.get(i).reduce((acc, curr) => acc + (acc === '' ? '' : ',') + encode(curr), ''));
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return {
|
|
671
|
+
version: this.#version,
|
|
672
|
+
sources: this.#sources.slice(),
|
|
673
|
+
mappings: mappings.join(';')
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
500
678
|
const colorsFunc = ['rgb', 'rgba', 'hsl', 'hsla', 'hwb', 'device-cmyk'];
|
|
501
679
|
function reduceNumber(val) {
|
|
502
680
|
val = (+val).toString();
|
|
@@ -515,35 +693,88 @@
|
|
|
515
693
|
}
|
|
516
694
|
return val;
|
|
517
695
|
}
|
|
518
|
-
function
|
|
696
|
+
function update(position, str) {
|
|
697
|
+
let i = 0;
|
|
698
|
+
for (; i < str.length; i++) {
|
|
699
|
+
if (isNewLine(str[i].charCodeAt(0))) {
|
|
700
|
+
position.lin++;
|
|
701
|
+
position.col = 0;
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
position.col++;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
function doRender(data, options = {}) {
|
|
709
|
+
options = {
|
|
710
|
+
...(options.minify ?? true ? {
|
|
711
|
+
indent: '',
|
|
712
|
+
newLine: '',
|
|
713
|
+
removeComments: true
|
|
714
|
+
} : {
|
|
715
|
+
indent: ' ',
|
|
716
|
+
newLine: '\n',
|
|
717
|
+
compress: false,
|
|
718
|
+
removeComments: false,
|
|
719
|
+
}), sourcemap: false, colorConvert: true, expandNestingRules: false, preserveLicense: false, ...options
|
|
720
|
+
};
|
|
519
721
|
const startTime = performance.now();
|
|
520
722
|
const errors = [];
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
}, { colorConvert: true, expandNestingRules: false, preserveLicense: false }, opt);
|
|
531
|
-
return {
|
|
532
|
-
code: doRender(options.expandNestingRules ? expand(data) : data, options, errors, function reducer(acc, curr) {
|
|
533
|
-
if (curr.typ == 'Comment' && options.removeComments) {
|
|
723
|
+
const sourcemap = options.sourcemap ? new SourceMap : null;
|
|
724
|
+
const cache = Object.create(null);
|
|
725
|
+
const result = {
|
|
726
|
+
code: renderAstNode(options.expandNestingRules ? expand(data) : data, options, sourcemap, {
|
|
727
|
+
ind: 0,
|
|
728
|
+
lin: 1,
|
|
729
|
+
col: 1
|
|
730
|
+
}, errors, function reducer(acc, curr) {
|
|
731
|
+
if (curr.typ == exports.EnumToken.CommentTokenType && options.removeComments) {
|
|
534
732
|
if (!options.preserveLicense || !curr.val.startsWith('/*!')) {
|
|
535
733
|
return acc;
|
|
536
734
|
}
|
|
537
735
|
return acc + curr.val;
|
|
538
736
|
}
|
|
539
|
-
return acc + renderToken(curr, options, reducer, errors);
|
|
540
|
-
},
|
|
737
|
+
return acc + renderToken(curr, options, cache, reducer, errors);
|
|
738
|
+
}, cache), errors, stats: {
|
|
541
739
|
total: `${(performance.now() - startTime).toFixed(2)}ms`
|
|
542
740
|
}
|
|
543
741
|
};
|
|
742
|
+
if (options.output != null) {
|
|
743
|
+
// @ts-ignore
|
|
744
|
+
options.output = options.resolve(options.output, options.cwd).absolute;
|
|
745
|
+
}
|
|
746
|
+
if (sourcemap != null) {
|
|
747
|
+
result.map = sourcemap.toJSON();
|
|
748
|
+
// @ts-ignore
|
|
749
|
+
// result.map.sources = result.map.sources?.map(s => <string>options?.resolve(s, <string>options?.cwd)?.relative)
|
|
750
|
+
}
|
|
751
|
+
return result;
|
|
752
|
+
}
|
|
753
|
+
function updateSourceMap(node, options, cache, sourcemap, position, str) {
|
|
754
|
+
if ([4 /* NodeType.RuleNodeType */, 3 /* NodeType.AtRuleNodeType */].includes(node.typ)) {
|
|
755
|
+
let src = node.loc?.src ?? '';
|
|
756
|
+
let output = options.output ?? '';
|
|
757
|
+
if (src !== '') {
|
|
758
|
+
if (!(src in cache)) {
|
|
759
|
+
// @ts-ignore
|
|
760
|
+
cache[src] = options.resolve(src, options.cwd ?? '').relative;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
if (!(output in cache)) {
|
|
764
|
+
// @ts-ignore
|
|
765
|
+
cache[output] = options.resolve(output, options.cwd).relative;
|
|
766
|
+
}
|
|
767
|
+
// @ts-ignore
|
|
768
|
+
sourcemap.add({ src: cache[output], sta: { ...position } }, {
|
|
769
|
+
...node.loc,
|
|
770
|
+
// @ts-ignore
|
|
771
|
+
src: options.resolve(cache[src], options.cwd).relative
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
update(position, str);
|
|
544
775
|
}
|
|
545
776
|
// @ts-ignore
|
|
546
|
-
function
|
|
777
|
+
function renderAstNode(data, options, sourcemap, position, errors, reducer, cache, level = 0, indents = []) {
|
|
547
778
|
if (indents.length < level + 1) {
|
|
548
779
|
indents.push(options.indent.repeat(level));
|
|
549
780
|
}
|
|
@@ -553,46 +784,61 @@
|
|
|
553
784
|
const indent = indents[level];
|
|
554
785
|
const indentSub = indents[level + 1];
|
|
555
786
|
switch (data.typ) {
|
|
556
|
-
case
|
|
787
|
+
case 5 /* NodeType.DeclarationNodeType */:
|
|
557
788
|
return `${data.nam}:${options.indent}${data.val.reduce(reducer, '')}`;
|
|
558
|
-
case
|
|
559
|
-
case
|
|
789
|
+
case 0 /* NodeType.CommentNodeType */:
|
|
790
|
+
case 1 /* NodeType.CDOCOMMNodeType */:
|
|
791
|
+
if (data.val.startsWith('# sourceMappingURL=')) {
|
|
792
|
+
// ignore sourcemap
|
|
793
|
+
return '';
|
|
794
|
+
}
|
|
560
795
|
return !options.removeComments || (options.preserveLicense && data.val.startsWith('/*!')) ? data.val : '';
|
|
561
|
-
case
|
|
796
|
+
case 2 /* NodeType.StyleSheetNodeType */:
|
|
562
797
|
return data.chi.reduce((css, node) => {
|
|
563
|
-
const str =
|
|
798
|
+
const str = renderAstNode(node, options, sourcemap, { ...position }, errors, reducer, cache, level, indents);
|
|
564
799
|
if (str === '') {
|
|
565
800
|
return css;
|
|
566
801
|
}
|
|
567
802
|
if (css === '') {
|
|
803
|
+
if (sourcemap != null) {
|
|
804
|
+
updateSourceMap(node, options, cache, sourcemap, position, str);
|
|
805
|
+
}
|
|
568
806
|
return str;
|
|
569
807
|
}
|
|
808
|
+
if (sourcemap != null) {
|
|
809
|
+
update(position, options.newLine);
|
|
810
|
+
updateSourceMap(node, options, cache, sourcemap, position, str);
|
|
811
|
+
}
|
|
570
812
|
return `${css}${options.newLine}${str}`;
|
|
571
813
|
}, '');
|
|
572
|
-
case
|
|
573
|
-
case
|
|
574
|
-
if (data.typ ==
|
|
814
|
+
case 3 /* NodeType.AtRuleNodeType */:
|
|
815
|
+
case 4 /* NodeType.RuleNodeType */:
|
|
816
|
+
if (data.typ == 3 /* NodeType.AtRuleNodeType */ && !('chi' in data)) {
|
|
575
817
|
return `${indent}@${data.nam}${data.val === '' ? '' : options.indent || ' '}${data.val};`;
|
|
576
818
|
}
|
|
577
819
|
// @ts-ignore
|
|
578
820
|
let children = data.chi.reduce((css, node) => {
|
|
579
821
|
let str;
|
|
580
|
-
if (node.typ ==
|
|
822
|
+
if (node.typ == 0 /* NodeType.CommentNodeType */) {
|
|
581
823
|
str = options.removeComments && (!options.preserveLicense || !node.val.startsWith('/*!')) ? '' : node.val;
|
|
582
824
|
}
|
|
583
|
-
else if (node.typ ==
|
|
825
|
+
else if (node.typ == 5 /* NodeType.DeclarationNodeType */) {
|
|
584
826
|
if (node.val.length == 0) {
|
|
585
827
|
// @ts-ignore
|
|
586
|
-
errors.push({
|
|
828
|
+
errors.push({
|
|
829
|
+
action: 'ignore',
|
|
830
|
+
message: `render: invalid declaration ${JSON.stringify(node)}`,
|
|
831
|
+
location: node.loc
|
|
832
|
+
});
|
|
587
833
|
return '';
|
|
588
834
|
}
|
|
589
835
|
str = `${node.nam}:${options.indent}${node.val.reduce(reducer, '').trimEnd()};`;
|
|
590
836
|
}
|
|
591
|
-
else if (node.typ ==
|
|
837
|
+
else if (node.typ == 3 /* NodeType.AtRuleNodeType */ && !('chi' in node)) {
|
|
592
838
|
str = `${data.val === '' ? '' : options.indent || ' '}${data.val};`;
|
|
593
839
|
}
|
|
594
840
|
else {
|
|
595
|
-
str =
|
|
841
|
+
str = renderAstNode(node, options, sourcemap, { ...position }, errors, reducer, cache, level + 1, indents);
|
|
596
842
|
}
|
|
597
843
|
if (css === '') {
|
|
598
844
|
return str;
|
|
@@ -605,28 +851,40 @@
|
|
|
605
851
|
if (children.endsWith(';')) {
|
|
606
852
|
children = children.slice(0, -1);
|
|
607
853
|
}
|
|
608
|
-
if (data.typ ==
|
|
854
|
+
if (data.typ == 3 /* NodeType.AtRuleNodeType */) {
|
|
609
855
|
return `@${data.nam}${data.val === '' ? '' : options.indent || ' '}${data.val}${options.indent}{${options.newLine}` + (children === '' ? '' : indentSub + children + options.newLine) + indent + `}`;
|
|
610
856
|
}
|
|
611
857
|
return data.sel + `${options.indent}{${options.newLine}` + (children === '' ? '' : indentSub + children + options.newLine) + indent + `}`;
|
|
612
858
|
}
|
|
613
859
|
return '';
|
|
614
860
|
}
|
|
615
|
-
function renderToken(token, options = {}, reducer, errors) {
|
|
861
|
+
function renderToken(token, options = {}, cache = Object.create(null), reducer, errors) {
|
|
616
862
|
if (reducer == null) {
|
|
617
863
|
reducer = function (acc, curr) {
|
|
618
|
-
if (curr.typ ==
|
|
864
|
+
if (curr.typ == exports.EnumToken.CommentTokenType && options.removeComments) {
|
|
619
865
|
if (!options.preserveLicense || !curr.val.startsWith('/*!')) {
|
|
620
866
|
return acc;
|
|
621
867
|
}
|
|
622
868
|
return acc + curr.val;
|
|
623
869
|
}
|
|
624
|
-
return acc + renderToken(curr, options, reducer, errors);
|
|
870
|
+
return acc + renderToken(curr, options, cache, reducer, errors);
|
|
625
871
|
};
|
|
626
872
|
}
|
|
627
873
|
switch (token.typ) {
|
|
628
|
-
case
|
|
629
|
-
|
|
874
|
+
case exports.EnumToken.ListToken:
|
|
875
|
+
return token.chi.reduce((acc, curr) => acc + renderToken(curr, options, cache), '');
|
|
876
|
+
case exports.EnumToken.BinaryExpressionTokenType:
|
|
877
|
+
return renderToken(token.l, options, cache) + (token.op == exports.EnumToken.Add ? ' + ' : (token.op == exports.EnumToken.Sub ? ' - ' : (token.op == exports.EnumToken.Mul ? '*' : '/'))) + renderToken(token.r, options, cache);
|
|
878
|
+
case exports.EnumToken.Add:
|
|
879
|
+
return ' + ';
|
|
880
|
+
case exports.EnumToken.Sub:
|
|
881
|
+
return ' - ';
|
|
882
|
+
case exports.EnumToken.Mul:
|
|
883
|
+
return '*';
|
|
884
|
+
case exports.EnumToken.Div:
|
|
885
|
+
return '/';
|
|
886
|
+
case exports.EnumToken.ColorTokenType:
|
|
887
|
+
if (options.colorConvert) {
|
|
630
888
|
if (token.kin == 'lit' && token.val.toLowerCase() == 'currentcolor') {
|
|
631
889
|
return 'currentcolor';
|
|
632
890
|
}
|
|
@@ -666,54 +924,69 @@
|
|
|
666
924
|
if (token.kin == 'hex' || token.kin == 'lit') {
|
|
667
925
|
return token.val;
|
|
668
926
|
}
|
|
669
|
-
case
|
|
670
|
-
|
|
671
|
-
|
|
927
|
+
case exports.EnumToken.ParensTokenType:
|
|
928
|
+
case exports.EnumToken.FunctionTokenType:
|
|
929
|
+
case exports.EnumToken.UrlFunctionTokenType:
|
|
930
|
+
case exports.EnumToken.PseudoClassFuncTokenType:
|
|
931
|
+
if (token.typ == exports.EnumToken.FunctionTokenType &&
|
|
932
|
+
token.val == 'calc' &&
|
|
933
|
+
token.chi.length == 1) {
|
|
934
|
+
// calc(200px) => 200px
|
|
935
|
+
return token.chi.reduce((acc, curr) => acc + renderToken(curr, options, cache, reducer), '');
|
|
672
936
|
}
|
|
673
|
-
case 'Func':
|
|
674
|
-
case 'UrlFunc':
|
|
675
|
-
case 'Pseudo-class-func':
|
|
676
937
|
// @ts-ignore
|
|
677
938
|
return ( /* options.minify && 'Pseudo-class-func' == token.typ && token.val.slice(0, 2) == '::' ? token.val.slice(1) :*/token.val ?? '') + '(' + token.chi.reduce(reducer, '') + ')';
|
|
678
|
-
case
|
|
939
|
+
case exports.EnumToken.StartParensTokenType:
|
|
940
|
+
return '(';
|
|
941
|
+
case exports.EnumToken.IncludesTokenType:
|
|
679
942
|
return '~=';
|
|
680
|
-
case
|
|
943
|
+
case exports.EnumToken.DashMatchTokenType:
|
|
681
944
|
return '|=';
|
|
682
|
-
case
|
|
945
|
+
case exports.EnumToken.LtTokenType:
|
|
683
946
|
return '<';
|
|
684
|
-
case
|
|
947
|
+
case exports.EnumToken.LteTokenType:
|
|
685
948
|
return '<=';
|
|
686
|
-
case
|
|
949
|
+
case exports.EnumToken.GtTokenType:
|
|
687
950
|
return '>';
|
|
688
|
-
case
|
|
951
|
+
case exports.EnumToken.GteTokenType:
|
|
689
952
|
return '>=';
|
|
690
|
-
case
|
|
953
|
+
case exports.EnumToken.EndParensTokenType:
|
|
691
954
|
return ')';
|
|
692
|
-
case
|
|
955
|
+
case exports.EnumToken.AttrStartTokenType:
|
|
693
956
|
return '[';
|
|
694
|
-
case
|
|
957
|
+
case exports.EnumToken.AttrEndTokenType:
|
|
695
958
|
return ']';
|
|
696
|
-
case
|
|
959
|
+
case exports.EnumToken.WhitespaceTokenType:
|
|
697
960
|
return ' ';
|
|
698
|
-
case
|
|
961
|
+
case exports.EnumToken.ColonTokenType:
|
|
699
962
|
return ':';
|
|
700
|
-
case
|
|
963
|
+
case exports.EnumToken.SemiColonTokenType:
|
|
701
964
|
return ';';
|
|
702
|
-
case
|
|
965
|
+
case exports.EnumToken.CommaTokenType:
|
|
703
966
|
return ',';
|
|
704
|
-
case
|
|
967
|
+
case exports.EnumToken.ImportantTokenType:
|
|
705
968
|
return '!important';
|
|
706
|
-
case
|
|
969
|
+
case exports.EnumToken.AttrTokenType:
|
|
707
970
|
return '[' + token.chi.reduce(reducer, '') + ']';
|
|
708
|
-
case
|
|
709
|
-
case
|
|
710
|
-
case
|
|
711
|
-
case
|
|
712
|
-
case
|
|
713
|
-
case
|
|
971
|
+
case exports.EnumToken.TimeTokenType:
|
|
972
|
+
case exports.EnumToken.AngleTokenType:
|
|
973
|
+
case exports.EnumToken.LengthTokenType:
|
|
974
|
+
case exports.EnumToken.DimensionTokenType:
|
|
975
|
+
case exports.EnumToken.FrequencyTokenType:
|
|
976
|
+
case exports.EnumToken.ResolutionTokenType:
|
|
977
|
+
if (token.val.typ == exports.EnumToken.BinaryExpressionTokenType) {
|
|
978
|
+
const result = renderToken(token.val, options, cache);
|
|
979
|
+
if (!('unit' in token)) {
|
|
980
|
+
return result;
|
|
981
|
+
}
|
|
982
|
+
if (!result.includes(' ')) {
|
|
983
|
+
return result + token.unit;
|
|
984
|
+
}
|
|
985
|
+
return `(${result})*1${token.unit}`;
|
|
986
|
+
}
|
|
714
987
|
let val = reduceNumber(token.val);
|
|
715
988
|
let unit = token.unit;
|
|
716
|
-
if (token.typ ==
|
|
989
|
+
if (token.typ == exports.EnumToken.AngleTokenType) {
|
|
717
990
|
const angle = getAngle(token);
|
|
718
991
|
let v;
|
|
719
992
|
let value = val + unit;
|
|
@@ -758,36 +1031,58 @@
|
|
|
758
1031
|
}
|
|
759
1032
|
}
|
|
760
1033
|
if (val === '0') {
|
|
761
|
-
if (token.typ ==
|
|
1034
|
+
if (token.typ == exports.EnumToken.TimeTokenType) {
|
|
762
1035
|
return '0s';
|
|
763
1036
|
}
|
|
764
|
-
if (token.typ ==
|
|
1037
|
+
if (token.typ == exports.EnumToken.FrequencyTokenType) {
|
|
765
1038
|
return '0Hz';
|
|
766
1039
|
}
|
|
767
1040
|
// @ts-ignore
|
|
768
|
-
if (token.typ ==
|
|
1041
|
+
if (token.typ == exports.EnumToken.ResolutionTokenType) {
|
|
769
1042
|
return '0x';
|
|
770
1043
|
}
|
|
771
1044
|
return '0';
|
|
772
1045
|
}
|
|
773
1046
|
return val + unit;
|
|
774
|
-
case
|
|
1047
|
+
case exports.EnumToken.PercentageTokenType:
|
|
775
1048
|
const perc = reduceNumber(token.val);
|
|
776
1049
|
return options.minify && perc == '0' ? '0' : perc + '%';
|
|
777
|
-
case
|
|
1050
|
+
case exports.EnumToken.NumberTokenType:
|
|
778
1051
|
return reduceNumber(token.val);
|
|
779
|
-
case
|
|
1052
|
+
case exports.EnumToken.CommentTokenType:
|
|
780
1053
|
if (options.removeComments && (!options.preserveLicense || !token.val.startsWith('/*!'))) {
|
|
781
1054
|
return '';
|
|
782
1055
|
}
|
|
783
|
-
case
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
1056
|
+
case exports.EnumToken.UrlTokenTokenType:
|
|
1057
|
+
if (token.typ == exports.EnumToken.UrlTokenTokenType) {
|
|
1058
|
+
if (options.output != null) {
|
|
1059
|
+
if (!('original' in token)) {
|
|
1060
|
+
// do not modify original token
|
|
1061
|
+
token = { ...token };
|
|
1062
|
+
Object.defineProperty(token, 'original', { enumerable: false, writable: false, value: token.val });
|
|
1063
|
+
}
|
|
1064
|
+
// @ts-ignore
|
|
1065
|
+
if (!(token.original in cache)) {
|
|
1066
|
+
let output = options.output ?? '';
|
|
1067
|
+
const key = output + 'abs';
|
|
1068
|
+
if (!(key in cache)) {
|
|
1069
|
+
// @ts-ignore
|
|
1070
|
+
cache[key] = options.dirname(options.resolve(output, options.cwd).absolute);
|
|
1071
|
+
}
|
|
1072
|
+
// @ts-ignore
|
|
1073
|
+
cache[token.original] = options.resolve(token.original, cache[key]).relative;
|
|
1074
|
+
}
|
|
1075
|
+
// @ts-ignore
|
|
1076
|
+
token.val = cache[token.original];
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
case exports.EnumToken.AtRuleTokenType:
|
|
1080
|
+
case exports.EnumToken.HashTokenType:
|
|
1081
|
+
case exports.EnumToken.PseudoClassTokenType:
|
|
1082
|
+
case exports.EnumToken.LiteralTokenType:
|
|
1083
|
+
case exports.EnumToken.StringTokenType:
|
|
1084
|
+
case exports.EnumToken.IdenTokenType:
|
|
1085
|
+
case exports.EnumToken.DelimTokenType:
|
|
791
1086
|
return /* options.minify && 'Pseudo-class' == token.typ && '::' == token.val.slice(0, 2) ? token.val.slice(1) : */ token.val;
|
|
792
1087
|
}
|
|
793
1088
|
errors?.push({ action: 'ignore', message: `render: unexpected token ${JSON.stringify(token, null, 1)}` });
|
|
@@ -820,17 +1115,17 @@
|
|
|
820
1115
|
return 'unit' in dimension && ['hz', 'khz'].includes(dimension.unit.toLowerCase());
|
|
821
1116
|
}
|
|
822
1117
|
function isColor(token) {
|
|
823
|
-
if (token.typ ==
|
|
1118
|
+
if (token.typ == exports.EnumToken.ColorTokenType) {
|
|
824
1119
|
return true;
|
|
825
1120
|
}
|
|
826
|
-
if (token.typ ==
|
|
1121
|
+
if (token.typ == exports.EnumToken.IdenTokenType) {
|
|
827
1122
|
// named color
|
|
828
1123
|
return token.val.toLowerCase() in COLORS_NAMES;
|
|
829
1124
|
}
|
|
830
|
-
if (token.typ ==
|
|
1125
|
+
if (token.typ == exports.EnumToken.FunctionTokenType && token.chi.length > 0 && colorsFunc.includes(token.val)) {
|
|
831
1126
|
// @ts-ignore
|
|
832
1127
|
for (const v of token.chi) {
|
|
833
|
-
if (![
|
|
1128
|
+
if (![exports.EnumToken.NumberTokenType, exports.EnumToken.AngleTokenType, exports.EnumToken.PercentageTokenType, exports.EnumToken.CommaTokenType, exports.EnumToken.WhitespaceTokenType, exports.EnumToken.LiteralTokenType].includes(v.typ)) {
|
|
834
1129
|
return false;
|
|
835
1130
|
}
|
|
836
1131
|
}
|
|
@@ -999,29 +1294,29 @@
|
|
|
999
1294
|
index++;
|
|
1000
1295
|
break;
|
|
1001
1296
|
}
|
|
1002
|
-
const dimension = { typ:
|
|
1297
|
+
const dimension = { typ: exports.EnumToken.DimensionTokenType, val: name.slice(0, index), unit: name.slice(index) };
|
|
1003
1298
|
if (isAngle(dimension)) {
|
|
1004
1299
|
// @ts-ignore
|
|
1005
|
-
dimension.typ =
|
|
1300
|
+
dimension.typ = exports.EnumToken.AngleTokenType;
|
|
1006
1301
|
}
|
|
1007
1302
|
else if (isLength(dimension)) {
|
|
1008
1303
|
// @ts-ignore
|
|
1009
|
-
dimension.typ =
|
|
1304
|
+
dimension.typ = exports.EnumToken.LengthTokenType;
|
|
1010
1305
|
}
|
|
1011
1306
|
else if (isTime(dimension)) {
|
|
1012
1307
|
// @ts-ignore
|
|
1013
|
-
dimension.typ =
|
|
1308
|
+
dimension.typ = exports.EnumToken.TimeTokenType;
|
|
1014
1309
|
}
|
|
1015
1310
|
else if (isResolution(dimension)) {
|
|
1016
1311
|
// @ts-ignore
|
|
1017
|
-
dimension.typ =
|
|
1312
|
+
dimension.typ = exports.EnumToken.ResolutionTokenType;
|
|
1018
1313
|
if (dimension.unit == 'dppx') {
|
|
1019
1314
|
dimension.unit = 'x';
|
|
1020
1315
|
}
|
|
1021
1316
|
}
|
|
1022
1317
|
else if (isFrequency(dimension)) {
|
|
1023
1318
|
// @ts-ignore
|
|
1024
|
-
dimension.typ =
|
|
1319
|
+
dimension.typ = exports.EnumToken.FrequencyTokenType;
|
|
1025
1320
|
}
|
|
1026
1321
|
return dimension;
|
|
1027
1322
|
}
|
|
@@ -1908,340 +2203,144 @@
|
|
|
1908
2203
|
|
|
1909
2204
|
const funcList = ['clamp', 'calc'];
|
|
1910
2205
|
function matchType(val, properties) {
|
|
1911
|
-
if (val.typ ==
|
|
1912
|
-
|
|
2206
|
+
if (val.typ == exports.EnumToken.IdenTokenType && properties.keywords.includes(val.val) ||
|
|
2207
|
+
// @ts-ignore
|
|
2208
|
+
(properties.types.some((t) => exports.EnumToken[t] == val.typ))) {
|
|
1913
2209
|
return true;
|
|
1914
2210
|
}
|
|
1915
|
-
if (val.typ ==
|
|
1916
|
-
|
|
2211
|
+
if (val.typ == exports.EnumToken.NumberTokenType && val.val == '0') {
|
|
2212
|
+
// @ts-ignore
|
|
2213
|
+
return properties.types.some((type) => {
|
|
2214
|
+
// @ts-ignore
|
|
2215
|
+
const typ = exports.EnumToken[type];
|
|
2216
|
+
return typ == exports.EnumToken.LengthTokenType || typ == exports.EnumToken.AngleTokenType;
|
|
2217
|
+
});
|
|
1917
2218
|
}
|
|
1918
|
-
if (val.typ ==
|
|
1919
|
-
return val.chi.every((t => [
|
|
2219
|
+
if (val.typ == exports.EnumToken.FunctionTokenType && funcList.includes(val.val)) {
|
|
2220
|
+
return val.chi.every((t => [exports.EnumToken.LiteralTokenType, exports.EnumToken.CommaTokenType, exports.EnumToken.WhitespaceTokenType, exports.EnumToken.StartParensTokenType, exports.EnumToken.EndParensTokenType].includes(t.typ) || matchType(t, properties)));
|
|
1920
2221
|
}
|
|
1921
2222
|
return false;
|
|
1922
2223
|
}
|
|
1923
2224
|
|
|
1924
|
-
function
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
if (!eq(a[i], b[i])) {
|
|
1941
|
-
return false;
|
|
1942
|
-
}
|
|
1943
|
-
}
|
|
1944
|
-
return true;
|
|
1945
|
-
}
|
|
1946
|
-
const k1 = Object.keys(a);
|
|
1947
|
-
const k2 = Object.keys(b);
|
|
1948
|
-
if (k1.length != k2.length) {
|
|
1949
|
-
return false;
|
|
1950
|
-
}
|
|
1951
|
-
let key;
|
|
1952
|
-
for (key of k1) {
|
|
1953
|
-
if (!(key in b) || !eq(a[key], b[key])) {
|
|
1954
|
-
return false;
|
|
2225
|
+
function* tokenize(stream) {
|
|
2226
|
+
let ind = -1;
|
|
2227
|
+
let lin = 1;
|
|
2228
|
+
let col = 0;
|
|
2229
|
+
const position = {
|
|
2230
|
+
ind: Math.max(ind, 0),
|
|
2231
|
+
lin: lin,
|
|
2232
|
+
col: Math.max(col, 1)
|
|
2233
|
+
};
|
|
2234
|
+
let value;
|
|
2235
|
+
let buffer = '';
|
|
2236
|
+
// let input: string = '';
|
|
2237
|
+
function consumeWhiteSpace() {
|
|
2238
|
+
let count = 0;
|
|
2239
|
+
while (isWhiteSpace(stream.charAt(count + ind + 1).charCodeAt(0))) {
|
|
2240
|
+
count++;
|
|
1955
2241
|
}
|
|
2242
|
+
next(count);
|
|
2243
|
+
return count;
|
|
1956
2244
|
}
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
constructor(config) {
|
|
1964
|
-
this.config = config;
|
|
1965
|
-
this.declarations = new Map;
|
|
2245
|
+
function pushToken(token, hint) {
|
|
2246
|
+
const result = { token, hint, position: { ...position }, bytesIn: ind };
|
|
2247
|
+
position.ind = ind;
|
|
2248
|
+
position.lin = lin;
|
|
2249
|
+
position.col = col == 0 ? 1 : col;
|
|
2250
|
+
return result;
|
|
1966
2251
|
}
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
2252
|
+
function* consumeString(quoteStr) {
|
|
2253
|
+
const quote = quoteStr;
|
|
2254
|
+
let value;
|
|
2255
|
+
let hasNewLine = false;
|
|
2256
|
+
if (buffer.length > 0) {
|
|
2257
|
+
yield pushToken(buffer);
|
|
2258
|
+
buffer = '';
|
|
1970
2259
|
}
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
if (
|
|
1974
|
-
|
|
1975
|
-
let
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
for (
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
2260
|
+
buffer += quoteStr;
|
|
2261
|
+
while (value = peek()) {
|
|
2262
|
+
if (value == '\\') {
|
|
2263
|
+
const sequence = peek(6);
|
|
2264
|
+
let escapeSequence = '';
|
|
2265
|
+
let codepoint;
|
|
2266
|
+
let i;
|
|
2267
|
+
for (i = 1; i < sequence.length; i++) {
|
|
2268
|
+
codepoint = sequence.charCodeAt(i);
|
|
2269
|
+
if (codepoint == 0x20 ||
|
|
2270
|
+
(codepoint >= 0x61 && codepoint <= 0x66) ||
|
|
2271
|
+
(codepoint >= 0x41 && codepoint <= 0x46) ||
|
|
2272
|
+
(codepoint >= 0x30 && codepoint <= 0x39)) {
|
|
2273
|
+
escapeSequence += sequence[i];
|
|
2274
|
+
if (codepoint == 0x20) {
|
|
2275
|
+
break;
|
|
1986
2276
|
}
|
|
1987
|
-
tokens[current].push(token);
|
|
1988
2277
|
continue;
|
|
1989
2278
|
}
|
|
1990
|
-
|
|
1991
|
-
if (token.typ == 'Iden' && this.config.keywords.includes(token.val)) {
|
|
1992
|
-
if (tokens.length == 0) {
|
|
1993
|
-
tokens.push([]);
|
|
1994
|
-
current++;
|
|
1995
|
-
}
|
|
1996
|
-
tokens[current].push(token);
|
|
1997
|
-
}
|
|
1998
|
-
if (token.typ == 'Literal' && token.val == this.config.separator) {
|
|
1999
|
-
tokens.push([]);
|
|
2000
|
-
current++;
|
|
2001
|
-
continue;
|
|
2002
|
-
}
|
|
2003
|
-
isValid = false;
|
|
2004
|
-
break;
|
|
2005
|
-
}
|
|
2279
|
+
break;
|
|
2006
2280
|
}
|
|
2007
|
-
if (
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
index %= 2;
|
|
2021
|
-
}
|
|
2022
|
-
else {
|
|
2023
|
-
index = 0;
|
|
2024
|
-
break;
|
|
2025
|
-
}
|
|
2026
|
-
}
|
|
2027
|
-
// @ts-ignore
|
|
2028
|
-
const val = this.declarations.get(property).val;
|
|
2029
|
-
if (val.length > 0) {
|
|
2030
|
-
val.push({ typ: 'Whitespace' });
|
|
2031
|
-
}
|
|
2032
|
-
val.push({ ...values[index] });
|
|
2033
|
-
});
|
|
2281
|
+
if (i == 1) {
|
|
2282
|
+
buffer += value + sequence[i];
|
|
2283
|
+
next(2);
|
|
2284
|
+
continue;
|
|
2285
|
+
}
|
|
2286
|
+
if (escapeSequence.trimEnd().length > 0) {
|
|
2287
|
+
const codepoint = Number(`0x${escapeSequence.trimEnd()}`);
|
|
2288
|
+
if (codepoint == 0 ||
|
|
2289
|
+
// leading surrogate
|
|
2290
|
+
(0xD800 <= codepoint && codepoint <= 0xDBFF) ||
|
|
2291
|
+
// trailing surrogate
|
|
2292
|
+
(0xDC00 <= codepoint && codepoint <= 0xDFFF)) {
|
|
2293
|
+
buffer += String.fromCodePoint(0xFFFD);
|
|
2034
2294
|
}
|
|
2295
|
+
else {
|
|
2296
|
+
buffer += String.fromCodePoint(codepoint);
|
|
2297
|
+
}
|
|
2298
|
+
next(escapeSequence.length + 1 + (isWhiteSpace(peek()?.charCodeAt(0)) ? 1 : 0));
|
|
2299
|
+
continue;
|
|
2035
2300
|
}
|
|
2036
|
-
|
|
2037
|
-
|
|
2301
|
+
buffer += next(2);
|
|
2302
|
+
continue;
|
|
2303
|
+
}
|
|
2304
|
+
if (value == quote) {
|
|
2305
|
+
buffer += value;
|
|
2306
|
+
yield pushToken(buffer, hasNewLine ? exports.EnumToken.BadStringTokenType : exports.EnumToken.StringTokenType);
|
|
2307
|
+
next();
|
|
2308
|
+
// i += value.length;
|
|
2309
|
+
buffer = '';
|
|
2310
|
+
return;
|
|
2311
|
+
}
|
|
2312
|
+
if (isNewLine(value.charCodeAt(0))) {
|
|
2313
|
+
hasNewLine = true;
|
|
2314
|
+
}
|
|
2315
|
+
if (hasNewLine && value == ';') {
|
|
2316
|
+
yield pushToken(buffer + value, exports.EnumToken.BadStringTokenType);
|
|
2317
|
+
buffer = '';
|
|
2318
|
+
next();
|
|
2319
|
+
break;
|
|
2038
2320
|
}
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
return this;
|
|
2042
|
-
}
|
|
2043
|
-
isShortHand() {
|
|
2044
|
-
if (this.declarations.has(this.config.shorthand)) {
|
|
2045
|
-
return this.declarations.size == 1;
|
|
2046
|
-
}
|
|
2047
|
-
return this.config.properties.length == this.declarations.size;
|
|
2048
|
-
}
|
|
2049
|
-
[Symbol.iterator]() {
|
|
2050
|
-
let iterator;
|
|
2051
|
-
const declarations = this.declarations;
|
|
2052
|
-
if (declarations.size < this.config.properties.length) {
|
|
2053
|
-
iterator = declarations.values();
|
|
2054
|
-
}
|
|
2055
|
-
else {
|
|
2056
|
-
const values = [];
|
|
2057
|
-
this.config.properties.forEach((property) => {
|
|
2058
|
-
let index = 0;
|
|
2059
|
-
// @ts-ignore
|
|
2060
|
-
for (const token of this.declarations.get(property).val) {
|
|
2061
|
-
if (token.typ == 'Whitespace') {
|
|
2062
|
-
continue;
|
|
2063
|
-
}
|
|
2064
|
-
if (values.length == index) {
|
|
2065
|
-
values.push([]);
|
|
2066
|
-
}
|
|
2067
|
-
values[index].push(token);
|
|
2068
|
-
index++;
|
|
2069
|
-
}
|
|
2070
|
-
});
|
|
2071
|
-
for (const value of values) {
|
|
2072
|
-
let i = value.length;
|
|
2073
|
-
while (i-- > 1) {
|
|
2074
|
-
const t = value[i];
|
|
2075
|
-
const k = value[i == 1 ? 0 : i % 2];
|
|
2076
|
-
if (t.val == k.val && t.val == '0') {
|
|
2077
|
-
if ((t.typ == 'Number' && isLength(k)) ||
|
|
2078
|
-
(k.typ == 'Number' && isLength(t)) ||
|
|
2079
|
-
(isLength(k) || isLength(t))) {
|
|
2080
|
-
value.splice(i, 1);
|
|
2081
|
-
continue;
|
|
2082
|
-
}
|
|
2083
|
-
}
|
|
2084
|
-
if (eq(t, k)) {
|
|
2085
|
-
value.splice(i, 1);
|
|
2086
|
-
continue;
|
|
2087
|
-
}
|
|
2088
|
-
break;
|
|
2089
|
-
}
|
|
2090
|
-
}
|
|
2091
|
-
iterator = [{
|
|
2092
|
-
typ: 'Declaration',
|
|
2093
|
-
nam: this.config.shorthand,
|
|
2094
|
-
val: values.reduce((acc, curr) => {
|
|
2095
|
-
if (curr.length > 1) {
|
|
2096
|
-
const k = curr.length * 2 - 1;
|
|
2097
|
-
let i = 1;
|
|
2098
|
-
while (i < k) {
|
|
2099
|
-
curr.splice(i, 0, { typ: 'Whitespace' });
|
|
2100
|
-
i += 2;
|
|
2101
|
-
}
|
|
2102
|
-
}
|
|
2103
|
-
if (acc.length > 0) {
|
|
2104
|
-
acc.push({ typ: 'Literal', val: this.config.separator });
|
|
2105
|
-
}
|
|
2106
|
-
acc.push(...curr);
|
|
2107
|
-
return acc;
|
|
2108
|
-
}, [])
|
|
2109
|
-
}][Symbol.iterator]();
|
|
2110
|
-
// return {
|
|
2111
|
-
// next() {
|
|
2112
|
-
//
|
|
2113
|
-
// return iterator.next();
|
|
2114
|
-
// }
|
|
2115
|
-
// }
|
|
2116
|
-
}
|
|
2117
|
-
return iterator;
|
|
2118
|
-
// return {
|
|
2119
|
-
// next() {
|
|
2120
|
-
//
|
|
2121
|
-
// return iterator.next();
|
|
2122
|
-
// }
|
|
2123
|
-
// }
|
|
2124
|
-
}
|
|
2125
|
-
}
|
|
2126
|
-
|
|
2127
|
-
function* tokenize(iterator) {
|
|
2128
|
-
let ind = -1;
|
|
2129
|
-
let lin = 1;
|
|
2130
|
-
let col = 0;
|
|
2131
|
-
const position = {
|
|
2132
|
-
ind: Math.max(ind, 0),
|
|
2133
|
-
lin: lin,
|
|
2134
|
-
col: Math.max(col, 1)
|
|
2135
|
-
};
|
|
2136
|
-
let value;
|
|
2137
|
-
let buffer = '';
|
|
2138
|
-
function consumeWhiteSpace() {
|
|
2139
|
-
let count = 0;
|
|
2140
|
-
while (isWhiteSpace(iterator.charAt(count + ind + 1).charCodeAt(0))) {
|
|
2141
|
-
count++;
|
|
2142
|
-
}
|
|
2143
|
-
next(count);
|
|
2144
|
-
return count;
|
|
2145
|
-
}
|
|
2146
|
-
function pushToken(token, hint) {
|
|
2147
|
-
const result = { token, hint, position: { ...position }, bytesIn: ind };
|
|
2148
|
-
position.ind = ind;
|
|
2149
|
-
position.lin = lin;
|
|
2150
|
-
position.col = col == 0 ? 1 : col;
|
|
2151
|
-
return result;
|
|
2152
|
-
}
|
|
2153
|
-
function* consumeString(quoteStr) {
|
|
2154
|
-
const quote = quoteStr;
|
|
2155
|
-
let value;
|
|
2156
|
-
let hasNewLine = false;
|
|
2157
|
-
if (buffer.length > 0) {
|
|
2158
|
-
yield pushToken(buffer);
|
|
2159
|
-
buffer = '';
|
|
2160
|
-
}
|
|
2161
|
-
buffer += quoteStr;
|
|
2162
|
-
while (value = peek()) {
|
|
2163
|
-
if (value == '\\') {
|
|
2164
|
-
const sequence = peek(6);
|
|
2165
|
-
let escapeSequence = '';
|
|
2166
|
-
let codepoint;
|
|
2167
|
-
let i;
|
|
2168
|
-
for (i = 1; i < sequence.length; i++) {
|
|
2169
|
-
codepoint = sequence.charCodeAt(i);
|
|
2170
|
-
if (codepoint == 0x20 ||
|
|
2171
|
-
(codepoint >= 0x61 && codepoint <= 0x66) ||
|
|
2172
|
-
(codepoint >= 0x41 && codepoint <= 0x46) ||
|
|
2173
|
-
(codepoint >= 0x30 && codepoint <= 0x39)) {
|
|
2174
|
-
escapeSequence += sequence[i];
|
|
2175
|
-
if (codepoint == 0x20) {
|
|
2176
|
-
break;
|
|
2177
|
-
}
|
|
2178
|
-
continue;
|
|
2179
|
-
}
|
|
2180
|
-
break;
|
|
2181
|
-
}
|
|
2182
|
-
if (i == 1) {
|
|
2183
|
-
buffer += value + sequence[i];
|
|
2184
|
-
next(2);
|
|
2185
|
-
continue;
|
|
2186
|
-
}
|
|
2187
|
-
if (escapeSequence.trimEnd().length > 0) {
|
|
2188
|
-
const codepoint = Number(`0x${escapeSequence.trimEnd()}`);
|
|
2189
|
-
if (codepoint == 0 ||
|
|
2190
|
-
// leading surrogate
|
|
2191
|
-
(0xD800 <= codepoint && codepoint <= 0xDBFF) ||
|
|
2192
|
-
// trailing surrogate
|
|
2193
|
-
(0xDC00 <= codepoint && codepoint <= 0xDFFF)) {
|
|
2194
|
-
buffer += String.fromCodePoint(0xFFFD);
|
|
2195
|
-
}
|
|
2196
|
-
else {
|
|
2197
|
-
buffer += String.fromCodePoint(codepoint);
|
|
2198
|
-
}
|
|
2199
|
-
next(escapeSequence.length + 1 + (isWhiteSpace(peek()?.charCodeAt(0)) ? 1 : 0));
|
|
2200
|
-
continue;
|
|
2201
|
-
}
|
|
2202
|
-
buffer += next(2);
|
|
2203
|
-
continue;
|
|
2204
|
-
}
|
|
2205
|
-
if (value == quote) {
|
|
2206
|
-
buffer += value;
|
|
2207
|
-
yield pushToken(buffer, hasNewLine ? 'Bad-string' : 'String');
|
|
2208
|
-
next();
|
|
2209
|
-
// i += value.length;
|
|
2210
|
-
buffer = '';
|
|
2211
|
-
return;
|
|
2212
|
-
}
|
|
2213
|
-
if (isNewLine(value.charCodeAt(0))) {
|
|
2214
|
-
hasNewLine = true;
|
|
2215
|
-
}
|
|
2216
|
-
if (hasNewLine && value == ';') {
|
|
2217
|
-
yield pushToken(buffer + value, 'Bad-string');
|
|
2218
|
-
buffer = '';
|
|
2219
|
-
next();
|
|
2220
|
-
break;
|
|
2221
|
-
}
|
|
2222
|
-
buffer += value;
|
|
2223
|
-
next();
|
|
2321
|
+
buffer += value;
|
|
2322
|
+
next();
|
|
2224
2323
|
}
|
|
2225
2324
|
if (hasNewLine) {
|
|
2226
|
-
yield pushToken(buffer,
|
|
2325
|
+
yield pushToken(buffer, exports.EnumToken.BadStringTokenType);
|
|
2227
2326
|
}
|
|
2228
2327
|
else {
|
|
2229
2328
|
// EOF - 'Unclosed-string' fixed
|
|
2230
|
-
yield pushToken(buffer + quote,
|
|
2329
|
+
yield pushToken(buffer + quote, exports.EnumToken.StringTokenType);
|
|
2231
2330
|
}
|
|
2232
2331
|
buffer = '';
|
|
2233
2332
|
}
|
|
2234
2333
|
function peek(count = 1) {
|
|
2235
2334
|
if (count == 1) {
|
|
2236
|
-
return
|
|
2335
|
+
return stream.charAt(ind + 1);
|
|
2237
2336
|
}
|
|
2238
|
-
return
|
|
2337
|
+
return stream.slice(ind + 1, ind + count + 1);
|
|
2239
2338
|
}
|
|
2240
2339
|
function prev(count = 1) {
|
|
2241
2340
|
if (count == 1) {
|
|
2242
|
-
return ind == 0 ? '' :
|
|
2341
|
+
return ind == 0 ? '' : stream.charAt(ind - 1);
|
|
2243
2342
|
}
|
|
2244
|
-
return
|
|
2343
|
+
return stream.slice(ind - 1 - count, ind - 1);
|
|
2245
2344
|
}
|
|
2246
2345
|
function next(count = 1) {
|
|
2247
2346
|
let char = '';
|
|
@@ -2249,9 +2348,9 @@
|
|
|
2249
2348
|
if (count < 0) {
|
|
2250
2349
|
return '';
|
|
2251
2350
|
}
|
|
2252
|
-
while (count-- && (chr =
|
|
2351
|
+
while (count-- && (chr = stream.charAt(ind + 1))) {
|
|
2253
2352
|
char += chr;
|
|
2254
|
-
const codepoint =
|
|
2353
|
+
const codepoint = stream.charCodeAt(++ind);
|
|
2255
2354
|
if (isNaN(codepoint)) {
|
|
2256
2355
|
return char;
|
|
2257
2356
|
}
|
|
@@ -2276,7 +2375,7 @@
|
|
|
2276
2375
|
break;
|
|
2277
2376
|
}
|
|
2278
2377
|
}
|
|
2279
|
-
yield pushToken('',
|
|
2378
|
+
yield pushToken('', exports.EnumToken.WhitespaceTokenType);
|
|
2280
2379
|
buffer = '';
|
|
2281
2380
|
}
|
|
2282
2381
|
switch (value) {
|
|
@@ -2296,7 +2395,7 @@
|
|
|
2296
2395
|
if (value == '*') {
|
|
2297
2396
|
buffer += value;
|
|
2298
2397
|
if (peek() == '/') {
|
|
2299
|
-
yield pushToken(buffer + next(),
|
|
2398
|
+
yield pushToken(buffer + next(), exports.EnumToken.CommentTokenType);
|
|
2300
2399
|
buffer = '';
|
|
2301
2400
|
break;
|
|
2302
2401
|
}
|
|
@@ -2305,7 +2404,7 @@
|
|
|
2305
2404
|
buffer += value;
|
|
2306
2405
|
}
|
|
2307
2406
|
}
|
|
2308
|
-
yield pushToken(buffer,
|
|
2407
|
+
yield pushToken(buffer, exports.EnumToken.BadCommentTokenType);
|
|
2309
2408
|
buffer = '';
|
|
2310
2409
|
}
|
|
2311
2410
|
break;
|
|
@@ -2315,7 +2414,7 @@
|
|
|
2315
2414
|
buffer = '';
|
|
2316
2415
|
}
|
|
2317
2416
|
if (peek() == '=') {
|
|
2318
|
-
yield pushToken('',
|
|
2417
|
+
yield pushToken('', exports.EnumToken.LteTokenType);
|
|
2319
2418
|
next();
|
|
2320
2419
|
break;
|
|
2321
2420
|
}
|
|
@@ -2329,10 +2428,10 @@
|
|
|
2329
2428
|
}
|
|
2330
2429
|
}
|
|
2331
2430
|
if (value === '') {
|
|
2332
|
-
yield pushToken(buffer,
|
|
2431
|
+
yield pushToken(buffer, exports.EnumToken.BadCdoTokenType);
|
|
2333
2432
|
}
|
|
2334
2433
|
else {
|
|
2335
|
-
yield pushToken(buffer + next(2),
|
|
2434
|
+
yield pushToken(buffer + next(2), exports.EnumToken.CDOCOMMTokenType);
|
|
2336
2435
|
}
|
|
2337
2436
|
buffer = '';
|
|
2338
2437
|
}
|
|
@@ -2365,7 +2464,7 @@
|
|
|
2365
2464
|
}
|
|
2366
2465
|
if (value == '=') {
|
|
2367
2466
|
buffer += value;
|
|
2368
|
-
yield pushToken(buffer, buffer[0] == '~' ?
|
|
2467
|
+
yield pushToken(buffer, buffer[0] == '~' ? exports.EnumToken.IncludesTokenType : exports.EnumToken.DashMatchTokenType);
|
|
2369
2468
|
buffer = '';
|
|
2370
2469
|
break;
|
|
2371
2470
|
}
|
|
@@ -2381,11 +2480,11 @@
|
|
|
2381
2480
|
buffer = '';
|
|
2382
2481
|
}
|
|
2383
2482
|
if (peek() == '=') {
|
|
2384
|
-
yield pushToken('',
|
|
2483
|
+
yield pushToken('', exports.EnumToken.GteTokenType);
|
|
2385
2484
|
next();
|
|
2386
2485
|
}
|
|
2387
2486
|
else {
|
|
2388
|
-
yield pushToken('',
|
|
2487
|
+
yield pushToken('', exports.EnumToken.GtTokenType);
|
|
2389
2488
|
}
|
|
2390
2489
|
consumeWhiteSpace();
|
|
2391
2490
|
break;
|
|
@@ -2399,6 +2498,7 @@
|
|
|
2399
2498
|
buffer += value;
|
|
2400
2499
|
break;
|
|
2401
2500
|
case '+':
|
|
2501
|
+
case '*':
|
|
2402
2502
|
case ':':
|
|
2403
2503
|
case ',':
|
|
2404
2504
|
case '=':
|
|
@@ -2412,7 +2512,7 @@
|
|
|
2412
2512
|
}
|
|
2413
2513
|
yield pushToken(value);
|
|
2414
2514
|
buffer = '';
|
|
2415
|
-
if (
|
|
2515
|
+
if (['+', '*', '/'].includes(value) && isWhiteSpace(peek().charCodeAt(0))) {
|
|
2416
2516
|
yield pushToken(next());
|
|
2417
2517
|
}
|
|
2418
2518
|
while (isWhiteSpace(peek().charCodeAt(0))) {
|
|
@@ -2424,7 +2524,7 @@
|
|
|
2424
2524
|
yield pushToken(buffer);
|
|
2425
2525
|
buffer = '';
|
|
2426
2526
|
}
|
|
2427
|
-
yield pushToken('',
|
|
2527
|
+
yield pushToken('', exports.EnumToken.EndParensTokenType);
|
|
2428
2528
|
break;
|
|
2429
2529
|
case '(':
|
|
2430
2530
|
if (buffer.length == 0) {
|
|
@@ -2462,7 +2562,7 @@
|
|
|
2462
2562
|
}
|
|
2463
2563
|
}
|
|
2464
2564
|
if (value === '') {
|
|
2465
|
-
yield pushToken(buffer,
|
|
2565
|
+
yield pushToken(buffer, exports.EnumToken.BadUrlTokenType);
|
|
2466
2566
|
buffer = '';
|
|
2467
2567
|
break;
|
|
2468
2568
|
}
|
|
@@ -2489,7 +2589,7 @@
|
|
|
2489
2589
|
break;
|
|
2490
2590
|
}
|
|
2491
2591
|
if (!(value = next())) {
|
|
2492
|
-
yield pushToken(buffer, hasNewLine ?
|
|
2592
|
+
yield pushToken(buffer, hasNewLine ? exports.EnumToken.BadUrlTokenType : exports.EnumToken.UrlTokenTokenType);
|
|
2493
2593
|
buffer = '';
|
|
2494
2594
|
break;
|
|
2495
2595
|
}
|
|
@@ -2497,8 +2597,8 @@
|
|
|
2497
2597
|
cp = value.charCodeAt(0);
|
|
2498
2598
|
// ')'
|
|
2499
2599
|
if (cp == 0x29) {
|
|
2500
|
-
yield pushToken(buffer, hasNewLine ?
|
|
2501
|
-
yield pushToken('',
|
|
2600
|
+
yield pushToken(buffer, hasNewLine ? exports.EnumToken.BadStringTokenType : exports.EnumToken.StringTokenType);
|
|
2601
|
+
yield pushToken('', exports.EnumToken.EndParensTokenType);
|
|
2502
2602
|
buffer = '';
|
|
2503
2603
|
break;
|
|
2504
2604
|
}
|
|
@@ -2509,15 +2609,15 @@
|
|
|
2509
2609
|
continue;
|
|
2510
2610
|
}
|
|
2511
2611
|
if (cp == 0x29) {
|
|
2512
|
-
yield pushToken(buffer,
|
|
2513
|
-
yield pushToken('',
|
|
2612
|
+
yield pushToken(buffer, exports.EnumToken.BadStringTokenType);
|
|
2613
|
+
yield pushToken('', exports.EnumToken.EndParensTokenType);
|
|
2514
2614
|
buffer = '';
|
|
2515
2615
|
break;
|
|
2516
2616
|
}
|
|
2517
2617
|
buffer += value;
|
|
2518
2618
|
}
|
|
2519
2619
|
if (hasNewLine) {
|
|
2520
|
-
yield pushToken(buffer,
|
|
2620
|
+
yield pushToken(buffer, exports.EnumToken.BadStringTokenType);
|
|
2521
2621
|
buffer = '';
|
|
2522
2622
|
}
|
|
2523
2623
|
break;
|
|
@@ -2532,8 +2632,8 @@
|
|
|
2532
2632
|
cp = value.charCodeAt(0);
|
|
2533
2633
|
// ')'
|
|
2534
2634
|
if (cp == 0x29) {
|
|
2535
|
-
yield pushToken(buffer,
|
|
2536
|
-
yield pushToken('',
|
|
2635
|
+
yield pushToken(buffer, exports.EnumToken.UrlTokenTokenType);
|
|
2636
|
+
yield pushToken('', exports.EnumToken.EndParensTokenType);
|
|
2537
2637
|
buffer = '';
|
|
2538
2638
|
break;
|
|
2539
2639
|
}
|
|
@@ -2569,7 +2669,7 @@
|
|
|
2569
2669
|
}
|
|
2570
2670
|
buffer += next();
|
|
2571
2671
|
}
|
|
2572
|
-
yield pushToken(buffer,
|
|
2672
|
+
yield pushToken(buffer, exports.EnumToken.BadUrlTokenType);
|
|
2573
2673
|
buffer = '';
|
|
2574
2674
|
break;
|
|
2575
2675
|
}
|
|
@@ -2577,7 +2677,7 @@
|
|
|
2577
2677
|
}
|
|
2578
2678
|
}
|
|
2579
2679
|
if (buffer !== '') {
|
|
2580
|
-
yield pushToken(buffer,
|
|
2680
|
+
yield pushToken(buffer, exports.EnumToken.UrlTokenTokenType);
|
|
2581
2681
|
buffer = '';
|
|
2582
2682
|
break;
|
|
2583
2683
|
}
|
|
@@ -2603,7 +2703,7 @@
|
|
|
2603
2703
|
buffer = '';
|
|
2604
2704
|
}
|
|
2605
2705
|
if (peek(9) == 'important') {
|
|
2606
|
-
yield pushToken('',
|
|
2706
|
+
yield pushToken('', exports.EnumToken.ImportantTokenType);
|
|
2607
2707
|
next(9);
|
|
2608
2708
|
buffer = '';
|
|
2609
2709
|
break;
|
|
@@ -2622,33 +2722,40 @@
|
|
|
2622
2722
|
}
|
|
2623
2723
|
|
|
2624
2724
|
const urlTokenMatcher = /^(["']?)[a-zA-Z0-9_/.-][a-zA-Z0-9_/:.#?-]+(\1)$/;
|
|
2625
|
-
const trimWhiteSpace = [
|
|
2626
|
-
const funcLike = [
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
const startTime = performance.now();
|
|
2634
|
-
const errors = [];
|
|
2635
|
-
const options = {
|
|
2725
|
+
const trimWhiteSpace = [exports.EnumToken.GtTokenType, exports.EnumToken.GteTokenType, exports.EnumToken.LtTokenType, exports.EnumToken.LteTokenType];
|
|
2726
|
+
const funcLike = [exports.EnumToken.ParensTokenType, exports.EnumToken.StartParensTokenType, exports.EnumToken.FunctionTokenType, exports.EnumToken.UrlFunctionTokenType, exports.EnumToken.PseudoClassFuncTokenType];
|
|
2727
|
+
const BadTokensTypes = [exports.EnumToken.BadCommentTokenType,
|
|
2728
|
+
exports.EnumToken.BadCdoTokenType,
|
|
2729
|
+
exports.EnumToken.BadUrlTokenType,
|
|
2730
|
+
exports.EnumToken.BadStringTokenType];
|
|
2731
|
+
async function doParse(iterator, options = {}) {
|
|
2732
|
+
options = {
|
|
2636
2733
|
src: '',
|
|
2637
2734
|
sourcemap: false,
|
|
2638
2735
|
minify: true,
|
|
2639
2736
|
nestingRules: false,
|
|
2640
2737
|
resolveImport: false,
|
|
2641
2738
|
resolveUrls: false,
|
|
2739
|
+
removeCharset: false,
|
|
2642
2740
|
removeEmpty: true,
|
|
2643
|
-
|
|
2741
|
+
removeDuplicateDeclarations: true,
|
|
2742
|
+
computeShorthand: true,
|
|
2743
|
+
computeCalcExpression: true,
|
|
2744
|
+
inlineCssVariables: false,
|
|
2745
|
+
...options
|
|
2644
2746
|
};
|
|
2747
|
+
if (options.expandNestingRules) {
|
|
2748
|
+
options.nestingRules = false;
|
|
2749
|
+
}
|
|
2645
2750
|
if (options.resolveImport) {
|
|
2646
2751
|
options.resolveUrls = true;
|
|
2647
2752
|
}
|
|
2753
|
+
const startTime = performance.now();
|
|
2754
|
+
const errors = [];
|
|
2648
2755
|
const src = options.src;
|
|
2649
2756
|
const stack = [];
|
|
2650
|
-
|
|
2651
|
-
typ:
|
|
2757
|
+
let ast = {
|
|
2758
|
+
typ: 2 /* NodeType.StyleSheetNodeType */,
|
|
2652
2759
|
chi: []
|
|
2653
2760
|
};
|
|
2654
2761
|
let tokens = [];
|
|
@@ -2670,10 +2777,14 @@
|
|
|
2670
2777
|
let i;
|
|
2671
2778
|
let loc;
|
|
2672
2779
|
for (i = 0; i < tokens.length; i++) {
|
|
2673
|
-
if (tokens[i].typ ==
|
|
2780
|
+
if (tokens[i].typ == exports.EnumToken.CommentTokenType || tokens[i].typ == exports.EnumToken.CDOCOMMTokenType) {
|
|
2674
2781
|
const position = map.get(tokens[i]);
|
|
2675
|
-
if (tokens[i].typ ==
|
|
2676
|
-
errors.push({
|
|
2782
|
+
if (tokens[i].typ == exports.EnumToken.CDOCOMMTokenType && context.typ != 2 /* NodeType.StyleSheetNodeType */) {
|
|
2783
|
+
errors.push({
|
|
2784
|
+
action: 'drop',
|
|
2785
|
+
message: `CDOCOMM not allowed here ${JSON.stringify(tokens[i], null, 1)}`,
|
|
2786
|
+
location: { src, ...position }
|
|
2787
|
+
});
|
|
2677
2788
|
continue;
|
|
2678
2789
|
}
|
|
2679
2790
|
loc = {
|
|
@@ -2686,7 +2797,7 @@
|
|
|
2686
2797
|
tokens[i].loc = loc;
|
|
2687
2798
|
}
|
|
2688
2799
|
}
|
|
2689
|
-
else if (tokens[i].typ !=
|
|
2800
|
+
else if (tokens[i].typ != exports.EnumToken.WhitespaceTokenType) {
|
|
2690
2801
|
break;
|
|
2691
2802
|
}
|
|
2692
2803
|
}
|
|
@@ -2695,28 +2806,33 @@
|
|
|
2695
2806
|
return null;
|
|
2696
2807
|
}
|
|
2697
2808
|
let delim = tokens.at(-1);
|
|
2698
|
-
if (delim.typ ==
|
|
2809
|
+
if (delim.typ == exports.EnumToken.SemiColonTokenType || delim.typ == exports.EnumToken.BlockStartTokenType || delim.typ == exports.EnumToken.BlockEndTokenType) {
|
|
2699
2810
|
tokens.pop();
|
|
2700
2811
|
}
|
|
2701
2812
|
else {
|
|
2702
|
-
delim = { typ:
|
|
2813
|
+
delim = { typ: exports.EnumToken.SemiColonTokenType };
|
|
2703
2814
|
}
|
|
2704
2815
|
// @ts-ignore
|
|
2705
|
-
while ([
|
|
2816
|
+
while ([exports.EnumToken.WhitespaceTokenType, exports.EnumToken.BadStringTokenType, exports.EnumToken.BadCommentTokenType].includes(tokens.at(-1)?.typ)) {
|
|
2706
2817
|
tokens.pop();
|
|
2707
2818
|
}
|
|
2708
2819
|
if (tokens.length == 0) {
|
|
2709
2820
|
return null;
|
|
2710
2821
|
}
|
|
2711
|
-
if (tokens[0]?.typ ==
|
|
2822
|
+
if (tokens[0]?.typ == exports.EnumToken.AtRuleTokenType) {
|
|
2712
2823
|
const atRule = tokens.shift();
|
|
2713
2824
|
const position = map.get(atRule);
|
|
2714
|
-
if (atRule.val == 'charset'
|
|
2715
|
-
|
|
2716
|
-
|
|
2825
|
+
if (atRule.val == 'charset') {
|
|
2826
|
+
if (position.ind > 0) {
|
|
2827
|
+
errors.push({ action: 'drop', message: 'doParse: invalid @charset', location: { src, ...position } });
|
|
2828
|
+
return null;
|
|
2829
|
+
}
|
|
2830
|
+
if (options.removeCharset) {
|
|
2831
|
+
return null;
|
|
2832
|
+
}
|
|
2717
2833
|
}
|
|
2718
2834
|
// @ts-ignore
|
|
2719
|
-
while ([
|
|
2835
|
+
while ([exports.EnumToken.WhitespaceTokenType].includes(tokens[0]?.typ)) {
|
|
2720
2836
|
tokens.shift();
|
|
2721
2837
|
}
|
|
2722
2838
|
if (atRule.val == 'import') {
|
|
@@ -2725,10 +2841,10 @@
|
|
|
2725
2841
|
let i = context.chi.length;
|
|
2726
2842
|
while (i--) {
|
|
2727
2843
|
const type = context.chi[i].typ;
|
|
2728
|
-
if (type ==
|
|
2844
|
+
if (type == 0 /* NodeType.CommentNodeType */) {
|
|
2729
2845
|
continue;
|
|
2730
2846
|
}
|
|
2731
|
-
if (type !=
|
|
2847
|
+
if (type != 3 /* NodeType.AtRuleNodeType */) {
|
|
2732
2848
|
errors.push({ action: 'drop', message: 'invalid @import', location: { src, ...position } });
|
|
2733
2849
|
return null;
|
|
2734
2850
|
}
|
|
@@ -2741,33 +2857,33 @@
|
|
|
2741
2857
|
}
|
|
2742
2858
|
}
|
|
2743
2859
|
// @ts-ignore
|
|
2744
|
-
if (tokens[0]?.typ !=
|
|
2745
|
-
errors.push({ action: 'drop', message: '
|
|
2860
|
+
if (tokens[0]?.typ != exports.EnumToken.StringTokenType && tokens[0]?.typ != exports.EnumToken.UrlFunctionTokenType) {
|
|
2861
|
+
errors.push({ action: 'drop', message: 'doParse: invalid @import', location: { src, ...position } });
|
|
2746
2862
|
return null;
|
|
2747
2863
|
}
|
|
2748
2864
|
// @ts-ignore
|
|
2749
|
-
if (tokens[0].typ ==
|
|
2750
|
-
errors.push({ action: 'drop', message: '
|
|
2865
|
+
if (tokens[0].typ == exports.EnumToken.UrlFunctionTokenType && tokens[1]?.typ != exports.EnumToken.UrlTokenTokenType && tokens[1]?.typ != exports.EnumToken.StringTokenType) {
|
|
2866
|
+
errors.push({ action: 'drop', message: 'doParse: invalid @import', location: { src, ...position } });
|
|
2751
2867
|
return null;
|
|
2752
2868
|
}
|
|
2753
2869
|
}
|
|
2754
2870
|
if (atRule.val == 'import') {
|
|
2755
2871
|
// @ts-ignore
|
|
2756
|
-
if (tokens[0].typ ==
|
|
2872
|
+
if (tokens[0].typ == exports.EnumToken.UrlFunctionTokenType && tokens[1].typ == exports.EnumToken.UrlTokenTokenType) {
|
|
2757
2873
|
tokens.shift();
|
|
2758
2874
|
// @ts-ignore
|
|
2759
|
-
tokens[0].typ =
|
|
2875
|
+
tokens[0].typ = exports.EnumToken.StringTokenType;
|
|
2760
2876
|
// @ts-ignore
|
|
2761
2877
|
tokens[0].val = `"${tokens[0].val}"`;
|
|
2762
2878
|
}
|
|
2763
2879
|
// @ts-ignore
|
|
2764
|
-
if (tokens[0].typ ==
|
|
2880
|
+
if (tokens[0].typ == exports.EnumToken.StringTokenType) {
|
|
2765
2881
|
if (options.resolveImport) {
|
|
2766
2882
|
const url = tokens[0].val.slice(1, -1);
|
|
2767
2883
|
try {
|
|
2768
2884
|
// @ts-ignore
|
|
2769
2885
|
const root = await options.load(url, options.src).then((src) => {
|
|
2770
|
-
return
|
|
2886
|
+
return doParse(src, Object.assign({}, options, {
|
|
2771
2887
|
minify: false,
|
|
2772
2888
|
// @ts-ignore
|
|
2773
2889
|
src: options.resolve(url, options.src).absolute
|
|
@@ -2775,6 +2891,7 @@
|
|
|
2775
2891
|
});
|
|
2776
2892
|
bytesIn += root.stats.bytesIn;
|
|
2777
2893
|
if (root.ast.chi.length > 0) {
|
|
2894
|
+
// @todo - filter charset, layer and scope
|
|
2778
2895
|
context.chi.push(...root.ast.chi);
|
|
2779
2896
|
}
|
|
2780
2897
|
if (root.errors.length > 0) {
|
|
@@ -2784,7 +2901,7 @@
|
|
|
2784
2901
|
}
|
|
2785
2902
|
catch (error) {
|
|
2786
2903
|
// @ts-ignore
|
|
2787
|
-
errors.push({ action: 'ignore', message: '
|
|
2904
|
+
errors.push({ action: 'ignore', message: 'doParse: ' + error.message, error });
|
|
2788
2905
|
}
|
|
2789
2906
|
}
|
|
2790
2907
|
}
|
|
@@ -2797,12 +2914,12 @@
|
|
|
2797
2914
|
return acc;
|
|
2798
2915
|
}, []);
|
|
2799
2916
|
const node = {
|
|
2800
|
-
typ:
|
|
2917
|
+
typ: 3 /* NodeType.AtRuleNodeType */,
|
|
2801
2918
|
nam: renderToken(atRule, { removeComments: true }),
|
|
2802
2919
|
val: raw.join('')
|
|
2803
2920
|
};
|
|
2804
2921
|
Object.defineProperty(node, 'raw', { enumerable: false, configurable: true, writable: true, value: raw });
|
|
2805
|
-
if (delim.typ ==
|
|
2922
|
+
if (delim.typ == exports.EnumToken.BlockStartTokenType) {
|
|
2806
2923
|
node.chi = [];
|
|
2807
2924
|
}
|
|
2808
2925
|
loc = {
|
|
@@ -2814,15 +2931,15 @@
|
|
|
2814
2931
|
}
|
|
2815
2932
|
// @ts-ignore
|
|
2816
2933
|
context.chi.push(node);
|
|
2817
|
-
return delim.typ ==
|
|
2934
|
+
return delim.typ == exports.EnumToken.BlockStartTokenType ? node : null;
|
|
2818
2935
|
}
|
|
2819
2936
|
else {
|
|
2820
2937
|
// rule
|
|
2821
|
-
if (delim.typ ==
|
|
2938
|
+
if (delim.typ == exports.EnumToken.BlockStartTokenType) {
|
|
2822
2939
|
const position = map.get(tokens[0]);
|
|
2823
2940
|
const uniq = new Map;
|
|
2824
2941
|
parseTokens(tokens, { minify: true }).reduce((acc, curr, index, array) => {
|
|
2825
|
-
if (curr.typ ==
|
|
2942
|
+
if (curr.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
2826
2943
|
if (trimWhiteSpace.includes(array[index - 1]?.typ) ||
|
|
2827
2944
|
trimWhiteSpace.includes(array[index + 1]?.typ) ||
|
|
2828
2945
|
combinators.includes(array[index - 1]?.val) ||
|
|
@@ -2843,7 +2960,7 @@
|
|
|
2843
2960
|
return acc;
|
|
2844
2961
|
}, uniq);
|
|
2845
2962
|
const node = {
|
|
2846
|
-
typ:
|
|
2963
|
+
typ: 4 /* NodeType.RuleNodeType */,
|
|
2847
2964
|
// @ts-ignore
|
|
2848
2965
|
sel: [...uniq.keys()].join(','),
|
|
2849
2966
|
chi: []
|
|
@@ -2868,10 +2985,10 @@
|
|
|
2868
2985
|
// @ts-ignore
|
|
2869
2986
|
let value = null;
|
|
2870
2987
|
for (let i = 0; i < tokens.length; i++) {
|
|
2871
|
-
if (tokens[i].typ ==
|
|
2988
|
+
if (tokens[i].typ == exports.EnumToken.CommentTokenType) {
|
|
2872
2989
|
continue;
|
|
2873
2990
|
}
|
|
2874
|
-
if (tokens[i].typ ==
|
|
2991
|
+
if (tokens[i].typ == exports.EnumToken.ColonTokenType) {
|
|
2875
2992
|
name = tokens.slice(0, i);
|
|
2876
2993
|
value = parseTokens(tokens.slice(i + 1), {
|
|
2877
2994
|
parseColor: true,
|
|
@@ -2888,46 +3005,38 @@
|
|
|
2888
3005
|
const position = map.get(name[0]);
|
|
2889
3006
|
if (name.length > 0) {
|
|
2890
3007
|
for (let i = 1; i < name.length; i++) {
|
|
2891
|
-
if (name[i].typ !=
|
|
3008
|
+
if (name[i].typ != exports.EnumToken.WhitespaceTokenType && name[i].typ != exports.EnumToken.CommentTokenType) {
|
|
2892
3009
|
errors.push({
|
|
2893
3010
|
action: 'drop',
|
|
2894
|
-
message: '
|
|
3011
|
+
message: 'doParse: invalid declaration',
|
|
2895
3012
|
location: { src, ...position }
|
|
2896
3013
|
});
|
|
2897
3014
|
return null;
|
|
2898
3015
|
}
|
|
2899
3016
|
}
|
|
2900
3017
|
}
|
|
2901
|
-
if (value == null) {
|
|
2902
|
-
errors.push({
|
|
2903
|
-
action: 'drop',
|
|
2904
|
-
message: 'parse: invalid declaration',
|
|
2905
|
-
location: { src, ...position }
|
|
2906
|
-
});
|
|
2907
|
-
return null;
|
|
2908
|
-
}
|
|
2909
|
-
if (value.length == 0) {
|
|
3018
|
+
if (value == null || value.length == 0) {
|
|
2910
3019
|
errors.push({
|
|
2911
3020
|
action: 'drop',
|
|
2912
|
-
message: '
|
|
3021
|
+
message: 'doParse: invalid declaration',
|
|
2913
3022
|
location: { src, ...position }
|
|
2914
3023
|
});
|
|
2915
3024
|
return null;
|
|
2916
3025
|
}
|
|
2917
3026
|
const node = {
|
|
2918
|
-
typ:
|
|
3027
|
+
typ: 5 /* NodeType.DeclarationNodeType */,
|
|
2919
3028
|
// @ts-ignore
|
|
2920
3029
|
nam: renderToken(name.shift(), { removeComments: true }),
|
|
2921
3030
|
// @ts-ignore
|
|
2922
3031
|
val: value
|
|
2923
3032
|
};
|
|
2924
|
-
while (node.val[0]?.typ ==
|
|
3033
|
+
while (node.val[0]?.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
2925
3034
|
node.val.shift();
|
|
2926
3035
|
}
|
|
2927
3036
|
if (node.val.length == 0) {
|
|
2928
3037
|
errors.push({
|
|
2929
3038
|
action: 'drop',
|
|
2930
|
-
message: '
|
|
3039
|
+
message: 'doParse: invalid declaration',
|
|
2931
3040
|
location: { src, ...position }
|
|
2932
3041
|
});
|
|
2933
3042
|
return null;
|
|
@@ -2947,8 +3056,8 @@
|
|
|
2947
3056
|
let item;
|
|
2948
3057
|
while (item = iter.next().value) {
|
|
2949
3058
|
bytesIn = item.bytesIn;
|
|
2950
|
-
//
|
|
2951
|
-
if (item.hint != null && item.hint
|
|
3059
|
+
// doParse error
|
|
3060
|
+
if (item.hint != null && BadTokensTypes.includes(item.hint)) {
|
|
2952
3061
|
// bad token
|
|
2953
3062
|
continue;
|
|
2954
3063
|
}
|
|
@@ -3008,9 +3117,12 @@
|
|
|
3008
3117
|
break;
|
|
3009
3118
|
}
|
|
3010
3119
|
const endParseTime = performance.now();
|
|
3120
|
+
if (options.expandNestingRules) {
|
|
3121
|
+
ast = expand(ast);
|
|
3122
|
+
}
|
|
3011
3123
|
if (options.minify) {
|
|
3012
3124
|
if (ast.chi.length > 0) {
|
|
3013
|
-
minify(ast, options, true, errors);
|
|
3125
|
+
minify(ast, options, true, errors, false);
|
|
3014
3126
|
}
|
|
3015
3127
|
}
|
|
3016
3128
|
const endTime = performance.now();
|
|
@@ -3040,81 +3152,81 @@
|
|
|
3040
3152
|
}
|
|
3041
3153
|
if (hint != null) {
|
|
3042
3154
|
return ([
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
|
|
3155
|
+
exports.EnumToken.WhitespaceTokenType, exports.EnumToken.SemiColonTokenType, exports.EnumToken.ColonTokenType, exports.EnumToken.BlockStartTokenType,
|
|
3156
|
+
exports.EnumToken.BlockStartTokenType, exports.EnumToken.AttrStartTokenType, exports.EnumToken.AttrEndTokenType, exports.EnumToken.StartParensTokenType, exports.EnumToken.EndParensTokenType,
|
|
3157
|
+
exports.EnumToken.CommaTokenType, exports.EnumToken.GtTokenType, exports.EnumToken.LtTokenType, exports.EnumToken.GteTokenType, exports.EnumToken.LteTokenType, exports.EnumToken.EOFTokenType
|
|
3046
3158
|
].includes(hint) ? { typ: hint } : { typ: hint, val });
|
|
3047
3159
|
}
|
|
3048
3160
|
if (val == ' ') {
|
|
3049
|
-
return { typ:
|
|
3161
|
+
return { typ: exports.EnumToken.WhitespaceTokenType };
|
|
3050
3162
|
}
|
|
3051
3163
|
if (val == ';') {
|
|
3052
|
-
return { typ:
|
|
3164
|
+
return { typ: exports.EnumToken.SemiColonTokenType };
|
|
3053
3165
|
}
|
|
3054
3166
|
if (val == '{') {
|
|
3055
|
-
return { typ:
|
|
3167
|
+
return { typ: exports.EnumToken.BlockStartTokenType };
|
|
3056
3168
|
}
|
|
3057
3169
|
if (val == '}') {
|
|
3058
|
-
return { typ:
|
|
3170
|
+
return { typ: exports.EnumToken.BlockEndTokenType };
|
|
3059
3171
|
}
|
|
3060
3172
|
if (val == '[') {
|
|
3061
|
-
return { typ:
|
|
3173
|
+
return { typ: exports.EnumToken.AttrStartTokenType };
|
|
3062
3174
|
}
|
|
3063
3175
|
if (val == ']') {
|
|
3064
|
-
return { typ:
|
|
3176
|
+
return { typ: exports.EnumToken.AttrEndTokenType };
|
|
3065
3177
|
}
|
|
3066
3178
|
if (val == ':') {
|
|
3067
|
-
return { typ:
|
|
3179
|
+
return { typ: exports.EnumToken.ColonTokenType };
|
|
3068
3180
|
}
|
|
3069
3181
|
if (val == ')') {
|
|
3070
|
-
return { typ:
|
|
3182
|
+
return { typ: exports.EnumToken.EndParensTokenType };
|
|
3071
3183
|
}
|
|
3072
3184
|
if (val == '(') {
|
|
3073
|
-
return { typ:
|
|
3185
|
+
return { typ: exports.EnumToken.StartParensTokenType };
|
|
3074
3186
|
}
|
|
3075
3187
|
if (val == '=') {
|
|
3076
|
-
return { typ:
|
|
3188
|
+
return { typ: exports.EnumToken.DelimTokenType, val };
|
|
3077
3189
|
}
|
|
3078
3190
|
if (val == ';') {
|
|
3079
|
-
return { typ:
|
|
3191
|
+
return { typ: exports.EnumToken.SemiColonTokenType };
|
|
3080
3192
|
}
|
|
3081
3193
|
if (val == ',') {
|
|
3082
|
-
return { typ:
|
|
3194
|
+
return { typ: exports.EnumToken.CommaTokenType };
|
|
3083
3195
|
}
|
|
3084
3196
|
if (val == '<') {
|
|
3085
|
-
return { typ:
|
|
3197
|
+
return { typ: exports.EnumToken.LtTokenType };
|
|
3086
3198
|
}
|
|
3087
3199
|
if (val == '>') {
|
|
3088
|
-
return { typ:
|
|
3200
|
+
return { typ: exports.EnumToken.GtTokenType };
|
|
3089
3201
|
}
|
|
3090
3202
|
if (isPseudo(val)) {
|
|
3091
3203
|
return val.endsWith('(') ? {
|
|
3092
|
-
typ:
|
|
3204
|
+
typ: exports.EnumToken.PseudoClassFuncTokenType,
|
|
3093
3205
|
val: val.slice(0, -1),
|
|
3094
3206
|
chi: []
|
|
3095
3207
|
}
|
|
3096
3208
|
: {
|
|
3097
|
-
typ:
|
|
3209
|
+
typ: exports.EnumToken.PseudoClassTokenType,
|
|
3098
3210
|
val
|
|
3099
3211
|
};
|
|
3100
3212
|
}
|
|
3101
3213
|
if (isAtKeyword(val)) {
|
|
3102
3214
|
return {
|
|
3103
|
-
typ:
|
|
3215
|
+
typ: exports.EnumToken.AtRuleTokenType,
|
|
3104
3216
|
val: val.slice(1)
|
|
3105
3217
|
};
|
|
3106
3218
|
}
|
|
3107
3219
|
if (isFunction(val)) {
|
|
3108
3220
|
val = val.slice(0, -1);
|
|
3109
3221
|
return {
|
|
3110
|
-
typ: val == 'url' ?
|
|
3222
|
+
typ: val == 'url' ? exports.EnumToken.UrlFunctionTokenType : exports.EnumToken.FunctionTokenType,
|
|
3111
3223
|
val,
|
|
3112
3224
|
chi: []
|
|
3113
3225
|
};
|
|
3114
3226
|
}
|
|
3115
3227
|
if (isNumber(val)) {
|
|
3116
3228
|
return {
|
|
3117
|
-
typ:
|
|
3229
|
+
typ: exports.EnumToken.NumberTokenType,
|
|
3118
3230
|
val
|
|
3119
3231
|
};
|
|
3120
3232
|
}
|
|
@@ -3123,97 +3235,97 @@
|
|
|
3123
3235
|
}
|
|
3124
3236
|
if (isPercentage(val)) {
|
|
3125
3237
|
return {
|
|
3126
|
-
typ:
|
|
3238
|
+
typ: exports.EnumToken.PercentageTokenType,
|
|
3127
3239
|
val: val.slice(0, -1)
|
|
3128
3240
|
};
|
|
3129
3241
|
}
|
|
3130
3242
|
const v = val.toLowerCase();
|
|
3131
3243
|
if (v == 'currentcolor' || val == 'transparent' || v in COLORS_NAMES) {
|
|
3132
3244
|
return {
|
|
3133
|
-
typ:
|
|
3245
|
+
typ: exports.EnumToken.ColorTokenType,
|
|
3134
3246
|
val,
|
|
3135
3247
|
kin: 'lit'
|
|
3136
3248
|
};
|
|
3137
3249
|
}
|
|
3138
3250
|
if (isIdent(val)) {
|
|
3139
3251
|
return {
|
|
3140
|
-
typ:
|
|
3252
|
+
typ: exports.EnumToken.IdenTokenType,
|
|
3141
3253
|
val
|
|
3142
3254
|
};
|
|
3143
3255
|
}
|
|
3144
3256
|
if (val.charAt(0) == '#' && isHexColor(val)) {
|
|
3145
3257
|
return {
|
|
3146
|
-
typ:
|
|
3258
|
+
typ: exports.EnumToken.ColorTokenType,
|
|
3147
3259
|
val,
|
|
3148
3260
|
kin: 'hex'
|
|
3149
3261
|
};
|
|
3150
3262
|
}
|
|
3151
3263
|
if (val.charAt(0) == '#' && isHash(val)) {
|
|
3152
3264
|
return {
|
|
3153
|
-
typ:
|
|
3265
|
+
typ: exports.EnumToken.HashTokenType,
|
|
3154
3266
|
val
|
|
3155
3267
|
};
|
|
3156
3268
|
}
|
|
3157
3269
|
if ('"\''.includes(val.charAt(0))) {
|
|
3158
3270
|
return {
|
|
3159
|
-
typ:
|
|
3271
|
+
typ: exports.EnumToken.UnclosedStringTokenType,
|
|
3160
3272
|
val
|
|
3161
3273
|
};
|
|
3162
3274
|
}
|
|
3163
3275
|
return {
|
|
3164
|
-
typ:
|
|
3276
|
+
typ: exports.EnumToken.LiteralTokenType,
|
|
3165
3277
|
val
|
|
3166
3278
|
};
|
|
3167
3279
|
}
|
|
3168
3280
|
function parseTokens(tokens, options = {}) {
|
|
3169
3281
|
for (let i = 0; i < tokens.length; i++) {
|
|
3170
3282
|
const t = tokens[i];
|
|
3171
|
-
if (t.typ ==
|
|
3283
|
+
if (t.typ == exports.EnumToken.WhitespaceTokenType && ((i == 0 ||
|
|
3172
3284
|
i + 1 == tokens.length ||
|
|
3173
|
-
[
|
|
3285
|
+
[exports.EnumToken.CommaTokenType, exports.EnumToken.GteTokenType, exports.EnumToken.LteTokenType].includes(tokens[i + 1].typ)) ||
|
|
3174
3286
|
(i > 0 &&
|
|
3175
|
-
// tokens[i + 1]?.typ !=
|
|
3287
|
+
// tokens[i + 1]?.typ != Literal ||
|
|
3176
3288
|
// funcLike.includes(tokens[i - 1].typ) &&
|
|
3177
3289
|
// !['var', 'calc'].includes((<FunctionToken>tokens[i - 1]).val)))) &&
|
|
3178
3290
|
trimWhiteSpace.includes(tokens[i - 1].typ)))) {
|
|
3179
3291
|
tokens.splice(i--, 1);
|
|
3180
3292
|
continue;
|
|
3181
3293
|
}
|
|
3182
|
-
if (t.typ ==
|
|
3294
|
+
if (t.typ == exports.EnumToken.ColonTokenType) {
|
|
3183
3295
|
const typ = tokens[i + 1]?.typ;
|
|
3184
3296
|
if (typ != null) {
|
|
3185
|
-
if (typ ==
|
|
3297
|
+
if (typ == exports.EnumToken.FunctionTokenType) {
|
|
3186
3298
|
tokens[i + 1].val = ':' + tokens[i + 1].val;
|
|
3187
|
-
tokens[i + 1].typ =
|
|
3299
|
+
tokens[i + 1].typ = exports.EnumToken.PseudoClassFuncTokenType;
|
|
3188
3300
|
}
|
|
3189
|
-
else if (typ ==
|
|
3301
|
+
else if (typ == exports.EnumToken.IdenTokenType) {
|
|
3190
3302
|
tokens[i + 1].val = ':' + tokens[i + 1].val;
|
|
3191
|
-
tokens[i + 1].typ =
|
|
3303
|
+
tokens[i + 1].typ = exports.EnumToken.PseudoClassTokenType;
|
|
3192
3304
|
}
|
|
3193
|
-
if (typ ==
|
|
3305
|
+
if (typ == exports.EnumToken.FunctionTokenType || typ == exports.EnumToken.IdenTokenType) {
|
|
3194
3306
|
tokens.splice(i, 1);
|
|
3195
3307
|
i--;
|
|
3196
3308
|
continue;
|
|
3197
3309
|
}
|
|
3198
3310
|
}
|
|
3199
3311
|
}
|
|
3200
|
-
if (t.typ ==
|
|
3312
|
+
if (t.typ == exports.EnumToken.AttrStartTokenType) {
|
|
3201
3313
|
let k = i;
|
|
3202
3314
|
let inAttr = 1;
|
|
3203
3315
|
while (++k < tokens.length) {
|
|
3204
|
-
if (tokens[k].typ ==
|
|
3316
|
+
if (tokens[k].typ == exports.EnumToken.AttrEndTokenType) {
|
|
3205
3317
|
inAttr--;
|
|
3206
3318
|
}
|
|
3207
|
-
else if (tokens[k].typ ==
|
|
3319
|
+
else if (tokens[k].typ == exports.EnumToken.AttrStartTokenType) {
|
|
3208
3320
|
inAttr++;
|
|
3209
3321
|
}
|
|
3210
3322
|
if (inAttr == 0) {
|
|
3211
3323
|
break;
|
|
3212
3324
|
}
|
|
3213
3325
|
}
|
|
3214
|
-
Object.assign(t, { typ:
|
|
3326
|
+
Object.assign(t, { typ: exports.EnumToken.AttrTokenType, chi: tokens.splice(i + 1, k - i) });
|
|
3215
3327
|
// @ts-ignore
|
|
3216
|
-
if (t.chi.at(-1).typ ==
|
|
3328
|
+
if (t.chi.at(-1).typ == exports.EnumToken.AttrEndTokenType) {
|
|
3217
3329
|
// @ts-ignore
|
|
3218
3330
|
t.chi.pop();
|
|
3219
3331
|
// @ts-ignore
|
|
@@ -3224,10 +3336,10 @@
|
|
|
3224
3336
|
}
|
|
3225
3337
|
// @ts-ignore
|
|
3226
3338
|
t.chi.forEach(val => {
|
|
3227
|
-
if (val.typ ==
|
|
3339
|
+
if (val.typ == exports.EnumToken.StringTokenType) {
|
|
3228
3340
|
const slice = val.val.slice(1, -1);
|
|
3229
3341
|
if ((slice.charAt(0) != '-' || (slice.charAt(0) == '-' && isIdentStart(slice.charCodeAt(1)))) && isIdent(slice)) {
|
|
3230
|
-
Object.assign(val, { typ:
|
|
3342
|
+
Object.assign(val, { typ: exports.EnumToken.IdenTokenType, val: slice });
|
|
3231
3343
|
}
|
|
3232
3344
|
}
|
|
3233
3345
|
});
|
|
@@ -3238,18 +3350,18 @@
|
|
|
3238
3350
|
let parens = 1;
|
|
3239
3351
|
let k = i;
|
|
3240
3352
|
while (++k < tokens.length) {
|
|
3241
|
-
if (tokens[k].typ ==
|
|
3353
|
+
if (tokens[k].typ == exports.EnumToken.ColonTokenType) {
|
|
3242
3354
|
const typ = tokens[k + 1]?.typ;
|
|
3243
3355
|
if (typ != null) {
|
|
3244
|
-
if (typ ==
|
|
3245
|
-
tokens[k + 1].typ =
|
|
3356
|
+
if (typ == exports.EnumToken.IdenTokenType) {
|
|
3357
|
+
tokens[k + 1].typ = exports.EnumToken.PseudoClassTokenType;
|
|
3246
3358
|
tokens[k + 1].val = ':' + tokens[k + 1].val;
|
|
3247
3359
|
}
|
|
3248
|
-
else if (typ ==
|
|
3249
|
-
tokens[k + 1].typ =
|
|
3360
|
+
else if (typ == exports.EnumToken.FunctionTokenType) {
|
|
3361
|
+
tokens[k + 1].typ = exports.EnumToken.PseudoClassFuncTokenType;
|
|
3250
3362
|
tokens[k + 1].val = ':' + tokens[k + 1].val;
|
|
3251
3363
|
}
|
|
3252
|
-
if (typ ==
|
|
3364
|
+
if (typ == exports.EnumToken.FunctionTokenType || typ == exports.EnumToken.IdenTokenType) {
|
|
3253
3365
|
tokens.splice(k, 1);
|
|
3254
3366
|
k--;
|
|
3255
3367
|
continue;
|
|
@@ -3259,7 +3371,7 @@
|
|
|
3259
3371
|
if (funcLike.includes(tokens[k].typ)) {
|
|
3260
3372
|
parens++;
|
|
3261
3373
|
}
|
|
3262
|
-
else if (tokens[k].typ ==
|
|
3374
|
+
else if (tokens[k].typ == exports.EnumToken.EndParensTokenType) {
|
|
3263
3375
|
parens--;
|
|
3264
3376
|
}
|
|
3265
3377
|
if (parens == 0) {
|
|
@@ -3269,29 +3381,55 @@
|
|
|
3269
3381
|
// @ts-ignore
|
|
3270
3382
|
t.chi = tokens.splice(i + 1, k - i);
|
|
3271
3383
|
// @ts-ignore
|
|
3272
|
-
if (t.chi.at(-1)?.typ ==
|
|
3384
|
+
if (t.chi.at(-1)?.typ == exports.EnumToken.EndParensTokenType) {
|
|
3273
3385
|
// @ts-ignore
|
|
3274
3386
|
t.chi.pop();
|
|
3275
3387
|
}
|
|
3388
|
+
if (t.typ == exports.EnumToken.FunctionTokenType && t.val == 'calc') {
|
|
3389
|
+
for (const { value, parent } of walkValues(t.chi)) {
|
|
3390
|
+
if (value.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
3391
|
+
const p = (parent ?? t);
|
|
3392
|
+
for (let i = 0; i < (p).chi.length; i++) {
|
|
3393
|
+
// @ts-ignore
|
|
3394
|
+
if (p.chi[i] == value) {
|
|
3395
|
+
// @ts-ignore
|
|
3396
|
+
(p).chi.splice(i, 1);
|
|
3397
|
+
i--;
|
|
3398
|
+
break;
|
|
3399
|
+
}
|
|
3400
|
+
}
|
|
3401
|
+
}
|
|
3402
|
+
else if (value.typ == exports.EnumToken.LiteralTokenType && ['+', '-', '/', '*'].includes(value.val)) {
|
|
3403
|
+
// @ts-ignore
|
|
3404
|
+
value.typ = value.val == '+' ? exports.EnumToken.Add : (value.val == '-' ? exports.EnumToken.Sub : (value.val == '*' ? exports.EnumToken.Mul : exports.EnumToken.Div));
|
|
3405
|
+
// @ts-ignore
|
|
3406
|
+
delete value.val;
|
|
3407
|
+
}
|
|
3408
|
+
}
|
|
3409
|
+
}
|
|
3410
|
+
else if (t.typ == exports.EnumToken.StartParensTokenType) {
|
|
3411
|
+
// @ts-ignore
|
|
3412
|
+
t.typ = exports.EnumToken.ParensTokenType;
|
|
3413
|
+
}
|
|
3276
3414
|
// @ts-ignore
|
|
3277
|
-
if (options.parseColor && t.typ ==
|
|
3415
|
+
if (options.parseColor && t.typ == exports.EnumToken.FunctionTokenType && isColor(t)) {
|
|
3278
3416
|
// if (isColor) {
|
|
3279
3417
|
// @ts-ignore
|
|
3280
|
-
t.typ =
|
|
3418
|
+
t.typ = exports.EnumToken.ColorTokenType;
|
|
3281
3419
|
// @ts-ignore
|
|
3282
3420
|
t.kin = t.val;
|
|
3283
3421
|
// @ts-ignore
|
|
3284
3422
|
let m = t.chi.length;
|
|
3285
3423
|
while (m-- > 0) {
|
|
3286
3424
|
// @ts-ignore
|
|
3287
|
-
if ([
|
|
3425
|
+
if ([exports.EnumToken.LiteralTokenType].concat(trimWhiteSpace).includes(t.chi[m].typ)) {
|
|
3288
3426
|
// @ts-ignore
|
|
3289
|
-
if (t.chi[m + 1]?.typ ==
|
|
3427
|
+
if (t.chi[m + 1]?.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
3290
3428
|
// @ts-ignore
|
|
3291
3429
|
t.chi.splice(m + 1, 1);
|
|
3292
3430
|
}
|
|
3293
3431
|
// @ts-ignore
|
|
3294
|
-
if (t.chi[m - 1]?.typ ==
|
|
3432
|
+
if (t.chi[m - 1]?.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
3295
3433
|
// @ts-ignore
|
|
3296
3434
|
t.chi.splice(m - 1, 1);
|
|
3297
3435
|
m--;
|
|
@@ -3299,22 +3437,21 @@
|
|
|
3299
3437
|
}
|
|
3300
3438
|
}
|
|
3301
3439
|
continue;
|
|
3302
|
-
// }
|
|
3303
3440
|
}
|
|
3304
|
-
if (t.typ ==
|
|
3441
|
+
if (t.typ == exports.EnumToken.UrlFunctionTokenType) {
|
|
3305
3442
|
// @ts-ignore
|
|
3306
|
-
if (t.chi[0]?.typ ==
|
|
3443
|
+
if (t.chi[0]?.typ == exports.EnumToken.StringTokenType) {
|
|
3307
3444
|
// @ts-ignore
|
|
3308
3445
|
const value = t.chi[0].val.slice(1, -1);
|
|
3309
3446
|
// @ts-ignore
|
|
3310
3447
|
if (t.chi[0].val.slice(1, 5) != 'data:' && urlTokenMatcher.test(value)) {
|
|
3311
3448
|
// @ts-ignore
|
|
3312
|
-
t.chi[0].typ =
|
|
3449
|
+
t.chi[0].typ = exports.EnumToken.UrlTokenTokenType;
|
|
3313
3450
|
// @ts-ignore
|
|
3314
3451
|
t.chi[0].val = options.src !== '' && options.resolveUrls ? options.resolve(value, options.src).absolute : value;
|
|
3315
3452
|
}
|
|
3316
3453
|
}
|
|
3317
|
-
if (t.chi[0]?.typ ==
|
|
3454
|
+
if (t.chi[0]?.typ == exports.EnumToken.UrlTokenTokenType) {
|
|
3318
3455
|
if (options.src !== '' && options.resolveUrls) {
|
|
3319
3456
|
// @ts-ignore
|
|
3320
3457
|
t.chi[0].val = options.resolve(t.chi[0].val, options.src, options.cwd).relative;
|
|
@@ -3325,13 +3462,13 @@
|
|
|
3325
3462
|
if (t.chi.length > 0) {
|
|
3326
3463
|
// @ts-ignore
|
|
3327
3464
|
parseTokens(t.chi, options);
|
|
3328
|
-
if (t.typ ==
|
|
3465
|
+
if (t.typ == exports.EnumToken.PseudoClassFuncTokenType && t.val == ':is' && options.minify) {
|
|
3329
3466
|
//
|
|
3330
|
-
const count = t.chi.filter(t => t.typ !=
|
|
3467
|
+
const count = t.chi.filter(t => t.typ != exports.EnumToken.CommentTokenType).length;
|
|
3331
3468
|
if (count == 1 ||
|
|
3332
3469
|
(i == 0 &&
|
|
3333
|
-
(tokens[i + 1]?.typ ==
|
|
3334
|
-
(tokens[i - 1]?.typ ==
|
|
3470
|
+
(tokens[i + 1]?.typ == exports.EnumToken.CommaTokenType || tokens.length == i + 1)) ||
|
|
3471
|
+
(tokens[i - 1]?.typ == exports.EnumToken.CommaTokenType && (tokens[i + 1]?.typ == exports.EnumToken.CommaTokenType || tokens.length == i + 1))) {
|
|
3335
3472
|
tokens.splice(i, 1, ...t.chi);
|
|
3336
3473
|
i = Math.max(0, i - t.chi.length);
|
|
3337
3474
|
}
|
|
@@ -3340,22 +3477,22 @@
|
|
|
3340
3477
|
continue;
|
|
3341
3478
|
}
|
|
3342
3479
|
if (options.parseColor) {
|
|
3343
|
-
if (t.typ ==
|
|
3480
|
+
if (t.typ == exports.EnumToken.IdenTokenType) {
|
|
3344
3481
|
// named color
|
|
3345
3482
|
const value = t.val.toLowerCase();
|
|
3346
3483
|
if (value in COLORS_NAMES) {
|
|
3347
3484
|
Object.assign(t, {
|
|
3348
|
-
typ:
|
|
3485
|
+
typ: exports.EnumToken.ColorTokenType,
|
|
3349
3486
|
val: COLORS_NAMES[value].length < value.length ? COLORS_NAMES[value] : value,
|
|
3350
3487
|
kin: 'hex'
|
|
3351
3488
|
});
|
|
3352
3489
|
}
|
|
3353
3490
|
continue;
|
|
3354
3491
|
}
|
|
3355
|
-
if (t.typ ==
|
|
3492
|
+
if (t.typ == exports.EnumToken.HashTokenType && isHexColor(t.val)) {
|
|
3356
3493
|
// hex color
|
|
3357
3494
|
// @ts-ignore
|
|
3358
|
-
t.typ =
|
|
3495
|
+
t.typ = exports.EnumToken.ColorTokenType;
|
|
3359
3496
|
// @ts-ignore
|
|
3360
3497
|
t.kin = 'hex';
|
|
3361
3498
|
}
|
|
@@ -3364,43 +3501,544 @@
|
|
|
3364
3501
|
return tokens;
|
|
3365
3502
|
}
|
|
3366
3503
|
|
|
3367
|
-
|
|
3368
|
-
|
|
3369
|
-
|
|
3370
|
-
declarations;
|
|
3371
|
-
requiredCount;
|
|
3372
|
-
pattern;
|
|
3373
|
-
constructor(config) {
|
|
3374
|
-
const values = Object.values(config.properties);
|
|
3375
|
-
this.requiredCount = values.reduce((acc, curr) => curr.required ? ++acc : acc, 0) || values.length;
|
|
3376
|
-
this.config = config;
|
|
3377
|
-
this.declarations = new Map;
|
|
3378
|
-
this.pattern = config.pattern.split(/\s/);
|
|
3504
|
+
function eq(a, b) {
|
|
3505
|
+
if (a == null || b == null) {
|
|
3506
|
+
return a == b;
|
|
3379
3507
|
}
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3508
|
+
if (typeof a != 'object' || typeof b != 'object') {
|
|
3509
|
+
return a === b;
|
|
3510
|
+
}
|
|
3511
|
+
if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {
|
|
3512
|
+
return false;
|
|
3513
|
+
}
|
|
3514
|
+
if (Array.isArray(a)) {
|
|
3515
|
+
if (a.length != b.length) {
|
|
3516
|
+
return false;
|
|
3383
3517
|
}
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3518
|
+
let i = 0;
|
|
3519
|
+
for (; i < a.length; i++) {
|
|
3520
|
+
if (!eq(a[i], b[i])) {
|
|
3521
|
+
return false;
|
|
3522
|
+
}
|
|
3387
3523
|
}
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
|
|
3391
|
-
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3398
|
-
|
|
3524
|
+
return true;
|
|
3525
|
+
}
|
|
3526
|
+
const k1 = Object.keys(a);
|
|
3527
|
+
const k2 = Object.keys(b);
|
|
3528
|
+
if (k1.length != k2.length) {
|
|
3529
|
+
return false;
|
|
3530
|
+
}
|
|
3531
|
+
let key;
|
|
3532
|
+
for (key of k1) {
|
|
3533
|
+
if (!(key in b) || !eq(a[key], b[key])) {
|
|
3534
|
+
return false;
|
|
3535
|
+
}
|
|
3536
|
+
}
|
|
3537
|
+
return true;
|
|
3538
|
+
}
|
|
3539
|
+
|
|
3540
|
+
function* walk(node) {
|
|
3541
|
+
const parents = [node];
|
|
3542
|
+
const root = node;
|
|
3543
|
+
const weakMap = new WeakMap;
|
|
3544
|
+
while (parents.length > 0) {
|
|
3545
|
+
node = parents.shift();
|
|
3546
|
+
// @ts-ignore
|
|
3547
|
+
yield { node, parent: weakMap.get(node), root };
|
|
3548
|
+
if ('chi' in node) {
|
|
3549
|
+
for (const child of node.chi) {
|
|
3550
|
+
weakMap.set(child, node);
|
|
3551
|
+
}
|
|
3552
|
+
parents.unshift(...node.chi);
|
|
3553
|
+
}
|
|
3554
|
+
}
|
|
3555
|
+
}
|
|
3556
|
+
function* walkValues(values) {
|
|
3557
|
+
const stack = values.slice();
|
|
3558
|
+
const weakMap = new WeakMap;
|
|
3559
|
+
let value;
|
|
3560
|
+
while (stack.length > 0) {
|
|
3561
|
+
value = stack.shift();
|
|
3562
|
+
// @ts-ignore
|
|
3563
|
+
yield { value, parent: weakMap.get(value) };
|
|
3564
|
+
if ('chi' in value) {
|
|
3565
|
+
for (const child of value.chi) {
|
|
3566
|
+
weakMap.set(child, value);
|
|
3567
|
+
}
|
|
3568
|
+
stack.unshift(...value.chi);
|
|
3569
|
+
}
|
|
3570
|
+
}
|
|
3571
|
+
}
|
|
3572
|
+
|
|
3573
|
+
function expand(ast) {
|
|
3574
|
+
//
|
|
3575
|
+
if (![4 /* NodeType.RuleNodeType */, 2 /* NodeType.StyleSheetNodeType */, 3 /* NodeType.AtRuleNodeType */].includes(ast.typ)) {
|
|
3576
|
+
return ast;
|
|
3577
|
+
}
|
|
3578
|
+
if (4 /* NodeType.RuleNodeType */ == ast.typ) {
|
|
3579
|
+
return {
|
|
3580
|
+
typ: 2 /* NodeType.StyleSheetNodeType */,
|
|
3581
|
+
chi: expandRule(ast)
|
|
3582
|
+
};
|
|
3583
|
+
}
|
|
3584
|
+
if (!('chi' in ast)) {
|
|
3585
|
+
return ast;
|
|
3586
|
+
}
|
|
3587
|
+
const result = { ...ast, chi: [] };
|
|
3588
|
+
// @ts-ignore
|
|
3589
|
+
for (let i = 0; i < ast.chi.length; i++) {
|
|
3590
|
+
// @ts-ignore
|
|
3591
|
+
const node = ast.chi[i];
|
|
3592
|
+
if (node.typ == 4 /* NodeType.RuleNodeType */) {
|
|
3593
|
+
// @ts-ignore
|
|
3594
|
+
result.chi.push(...expandRule(node));
|
|
3595
|
+
// i += expanded.length - 1;
|
|
3596
|
+
}
|
|
3597
|
+
else if (node.typ == 3 /* NodeType.AtRuleNodeType */ && 'chi' in node) {
|
|
3598
|
+
let hasRule = false;
|
|
3599
|
+
let j = node.chi.length;
|
|
3600
|
+
while (j--) {
|
|
3601
|
+
if (node.chi[j].typ == 4 /* NodeType.RuleNodeType */ || node.chi[j].typ == 3 /* NodeType.AtRuleNodeType */) {
|
|
3602
|
+
hasRule = true;
|
|
3603
|
+
break;
|
|
3604
|
+
}
|
|
3605
|
+
}
|
|
3606
|
+
// @ts-ignore
|
|
3607
|
+
result.chi.push({ ...(hasRule ? expand(node) : node) });
|
|
3608
|
+
}
|
|
3609
|
+
else {
|
|
3610
|
+
// @ts-ignore
|
|
3611
|
+
result.chi.push(node);
|
|
3612
|
+
}
|
|
3613
|
+
}
|
|
3614
|
+
return result;
|
|
3615
|
+
}
|
|
3616
|
+
function expandRule(node) {
|
|
3617
|
+
const ast = { ...node, chi: node.chi.slice() };
|
|
3618
|
+
const result = [];
|
|
3619
|
+
if (ast.typ == 4 /* NodeType.RuleNodeType */) {
|
|
3620
|
+
let i = 0;
|
|
3621
|
+
for (; i < ast.chi.length; i++) {
|
|
3622
|
+
if (ast.chi[i].typ == 4 /* NodeType.RuleNodeType */) {
|
|
3623
|
+
const rule = ast.chi[i];
|
|
3624
|
+
if (!rule.sel.includes('&')) {
|
|
3625
|
+
const selRule = splitRule(rule.sel);
|
|
3626
|
+
selRule.forEach(arr => combinators.includes(arr[0].charAt(0)) ? arr.unshift(ast.sel) : arr.unshift(ast.sel, ' '));
|
|
3627
|
+
rule.sel = selRule.reduce((acc, curr) => {
|
|
3628
|
+
acc.push(curr.join(''));
|
|
3629
|
+
return acc;
|
|
3630
|
+
}, []).join(',');
|
|
3631
|
+
}
|
|
3632
|
+
else {
|
|
3633
|
+
rule.sel = replaceCompound(rule.sel, ast.sel);
|
|
3634
|
+
}
|
|
3635
|
+
ast.chi.splice(i--, 1);
|
|
3636
|
+
result.push(...expandRule(rule));
|
|
3637
|
+
}
|
|
3638
|
+
else if (ast.chi[i].typ == 3 /* NodeType.AtRuleNodeType */) {
|
|
3639
|
+
let astAtRule = ast.chi[i];
|
|
3640
|
+
const values = [];
|
|
3641
|
+
if (astAtRule.nam == 'scope') {
|
|
3642
|
+
if (astAtRule.val.includes('&')) {
|
|
3643
|
+
astAtRule.val = replaceCompound(astAtRule.val, ast.sel);
|
|
3644
|
+
}
|
|
3645
|
+
astAtRule = expand(astAtRule);
|
|
3646
|
+
}
|
|
3647
|
+
else {
|
|
3648
|
+
// @ts-ignore
|
|
3649
|
+
const clone = { ...ast, chi: astAtRule.chi.slice() };
|
|
3650
|
+
// @ts-ignore
|
|
3651
|
+
astAtRule.chi.length = 0;
|
|
3652
|
+
for (const r of expandRule(clone)) {
|
|
3653
|
+
if (r.typ == 3 /* NodeType.AtRuleNodeType */ && 'chi' in r) {
|
|
3654
|
+
if (astAtRule.val !== '' && r.val !== '') {
|
|
3655
|
+
if (astAtRule.nam == 'media' && r.nam == 'media') {
|
|
3656
|
+
r.val = astAtRule.val + ' and ' + r.val;
|
|
3657
|
+
}
|
|
3658
|
+
else if (astAtRule.nam == 'layer' && r.nam == 'layer') {
|
|
3659
|
+
r.val = astAtRule.val + '.' + r.val;
|
|
3660
|
+
}
|
|
3661
|
+
}
|
|
3662
|
+
// @ts-ignore
|
|
3663
|
+
values.push(r);
|
|
3664
|
+
}
|
|
3665
|
+
else if (r.typ == 4 /* NodeType.RuleNodeType */) {
|
|
3666
|
+
// @ts-ignore
|
|
3667
|
+
astAtRule.chi.push(...expandRule(r));
|
|
3668
|
+
}
|
|
3669
|
+
else {
|
|
3670
|
+
// @ts-ignore
|
|
3671
|
+
astAtRule.chi.push(r);
|
|
3672
|
+
}
|
|
3673
|
+
}
|
|
3674
|
+
}
|
|
3675
|
+
// @ts-ignore
|
|
3676
|
+
result.push(...(astAtRule.chi.length > 0 ? [astAtRule].concat(values) : values));
|
|
3677
|
+
ast.chi.splice(i--, 1);
|
|
3678
|
+
}
|
|
3679
|
+
}
|
|
3680
|
+
}
|
|
3681
|
+
// @ts-ignore
|
|
3682
|
+
return ast.chi.length > 0 ? [ast].concat(result) : result;
|
|
3683
|
+
}
|
|
3684
|
+
function replaceCompound(input, replace) {
|
|
3685
|
+
const tokens = parseString(input);
|
|
3686
|
+
for (const t of walkValues(tokens)) {
|
|
3687
|
+
if (t.value.typ == exports.EnumToken.LiteralTokenType) {
|
|
3688
|
+
if (t.value.val == '&') {
|
|
3689
|
+
t.value.val = replace;
|
|
3690
|
+
}
|
|
3691
|
+
else if (t.value.val.length > 1 && t.value.val.charAt(0) == '&') {
|
|
3692
|
+
t.value.val = replaceCompoundLiteral(t.value.val, replace);
|
|
3693
|
+
}
|
|
3694
|
+
}
|
|
3695
|
+
}
|
|
3696
|
+
return tokens.reduce((acc, curr) => acc + renderToken(curr), '');
|
|
3697
|
+
}
|
|
3698
|
+
function replaceCompoundLiteral(selector, replace) {
|
|
3699
|
+
const tokens = [''];
|
|
3700
|
+
let i = 0;
|
|
3701
|
+
for (; i < selector.length; i++) {
|
|
3702
|
+
if (selector.charAt(i) == '&') {
|
|
3703
|
+
tokens.push('&');
|
|
3704
|
+
tokens.push('');
|
|
3705
|
+
}
|
|
3706
|
+
else {
|
|
3707
|
+
tokens[tokens.length - 1] += selector.charAt(i);
|
|
3708
|
+
}
|
|
3709
|
+
}
|
|
3710
|
+
return tokens.sort((a, b) => {
|
|
3711
|
+
if (a == '&') {
|
|
3712
|
+
return 1;
|
|
3713
|
+
}
|
|
3714
|
+
return b == '&' ? -1 : 0;
|
|
3715
|
+
}).reduce((acc, curr) => acc + (curr == '&' ? replace : curr), '');
|
|
3716
|
+
}
|
|
3717
|
+
|
|
3718
|
+
class MinifyFeature {
|
|
3719
|
+
static get ordering() { return 10000; }
|
|
3720
|
+
register(options) { }
|
|
3721
|
+
run(ast, options = {}, parent, context) {
|
|
3722
|
+
}
|
|
3723
|
+
}
|
|
3724
|
+
|
|
3725
|
+
class InlineCssVariables extends MinifyFeature {
|
|
3726
|
+
static get ordering() {
|
|
3727
|
+
return 0;
|
|
3728
|
+
}
|
|
3729
|
+
static register(options) {
|
|
3730
|
+
if (options.inlineCssVariables) {
|
|
3731
|
+
for (const feature of options.features) {
|
|
3732
|
+
if (feature instanceof InlineCssVariables) {
|
|
3733
|
+
return;
|
|
3734
|
+
}
|
|
3735
|
+
}
|
|
3736
|
+
// @ts-ignore
|
|
3737
|
+
options.features.push(new InlineCssVariables());
|
|
3738
|
+
}
|
|
3739
|
+
}
|
|
3740
|
+
run(ast, options = {}, parent, context) {
|
|
3741
|
+
if (!('variableScope' in context)) {
|
|
3742
|
+
context.variableScope = new Map;
|
|
3743
|
+
}
|
|
3744
|
+
const isRoot = parent.typ == 2 /* NodeType.StyleSheetNodeType */ && ast.typ == 4 /* NodeType.RuleNodeType */ && ast.sel == ':root';
|
|
3745
|
+
const variableScope = context.variableScope;
|
|
3746
|
+
// @ts-ignore
|
|
3747
|
+
for (const node of ast.chi) {
|
|
3748
|
+
if (node.typ == 1 /* NodeType.CDOCOMMNodeType */ || node.typ == 0 /* NodeType.CommentNodeType */) {
|
|
3749
|
+
continue;
|
|
3750
|
+
}
|
|
3751
|
+
if (node.typ != 5 /* NodeType.DeclarationNodeType */) {
|
|
3752
|
+
break;
|
|
3753
|
+
}
|
|
3754
|
+
// css variable
|
|
3755
|
+
if (node.nam.startsWith('--')) {
|
|
3756
|
+
if (!variableScope.has(node.nam)) {
|
|
3757
|
+
const info = {
|
|
3758
|
+
globalScope: isRoot,
|
|
3759
|
+
// @ts-ignore
|
|
3760
|
+
parent: new Set(),
|
|
3761
|
+
declarationCount: 1,
|
|
3762
|
+
replaceable: isRoot,
|
|
3763
|
+
node: node
|
|
3764
|
+
};
|
|
3765
|
+
info.parent.add(ast);
|
|
3766
|
+
variableScope.set(node.nam, info);
|
|
3767
|
+
}
|
|
3768
|
+
else {
|
|
3769
|
+
const info = variableScope.get(node.nam);
|
|
3770
|
+
info.globalScope = isRoot;
|
|
3771
|
+
if (!isRoot) {
|
|
3772
|
+
++info.declarationCount;
|
|
3773
|
+
}
|
|
3774
|
+
if (info.replaceable) {
|
|
3775
|
+
info.replaceable = isRoot && info.declarationCount == 1;
|
|
3776
|
+
}
|
|
3777
|
+
info.parent.add(ast);
|
|
3778
|
+
info.node = node;
|
|
3779
|
+
}
|
|
3780
|
+
}
|
|
3781
|
+
else {
|
|
3782
|
+
for (const { value, parent: parentValue } of walkValues(node.val)) {
|
|
3783
|
+
if (value?.typ == exports.EnumToken.FunctionTokenType && value.val == 'var') {
|
|
3784
|
+
if (value.chi.length == 1 && value.chi[0].typ == exports.EnumToken.IdenTokenType) {
|
|
3785
|
+
const info = variableScope.get(value.chi[0].val);
|
|
3786
|
+
if (info?.replaceable) {
|
|
3787
|
+
if (parentValue != null) {
|
|
3788
|
+
let i = 0;
|
|
3789
|
+
for (; i < parentValue.chi.length; i++) {
|
|
3790
|
+
if (parentValue.chi[i] == value) {
|
|
3791
|
+
parentValue.chi.splice(i, 1, ...info.node.val);
|
|
3792
|
+
break;
|
|
3793
|
+
}
|
|
3794
|
+
}
|
|
3795
|
+
}
|
|
3796
|
+
else {
|
|
3797
|
+
node.val = info.node.val.slice();
|
|
3798
|
+
}
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
}
|
|
3802
|
+
}
|
|
3803
|
+
}
|
|
3804
|
+
}
|
|
3805
|
+
}
|
|
3806
|
+
cleanup(ast, options = {}, context) {
|
|
3807
|
+
const variableScope = context.variableScope;
|
|
3808
|
+
for (const info of variableScope.values()) {
|
|
3809
|
+
if (info.replaceable) {
|
|
3810
|
+
let i;
|
|
3811
|
+
for (const parent of info.parent) {
|
|
3812
|
+
i = parent.chi?.length ?? 0;
|
|
3813
|
+
while (i--) {
|
|
3814
|
+
if (parent.chi[i].typ == 5 /* NodeType.DeclarationNodeType */ && parent.chi[i].nam == info.node.nam) {
|
|
3815
|
+
parent.chi.splice(i, 1);
|
|
3816
|
+
}
|
|
3817
|
+
}
|
|
3818
|
+
if (parent.chi?.length == 0 && 'parent' in parent) {
|
|
3819
|
+
// @ts-ignore
|
|
3820
|
+
for (i = 0; i < parent.parent.chi?.length; i++) {
|
|
3821
|
+
// @ts-ignore
|
|
3822
|
+
if (parent.parent.chi[i] == parent) {
|
|
3823
|
+
// @ts-ignore
|
|
3824
|
+
parent.parent.chi.splice(i, 1);
|
|
3825
|
+
break;
|
|
3826
|
+
}
|
|
3827
|
+
}
|
|
3828
|
+
}
|
|
3829
|
+
}
|
|
3830
|
+
}
|
|
3831
|
+
}
|
|
3832
|
+
}
|
|
3833
|
+
}
|
|
3834
|
+
|
|
3835
|
+
class PropertySet {
|
|
3836
|
+
config;
|
|
3837
|
+
declarations;
|
|
3838
|
+
constructor(config) {
|
|
3839
|
+
this.config = config;
|
|
3840
|
+
this.declarations = new Map;
|
|
3841
|
+
}
|
|
3842
|
+
add(declaration) {
|
|
3843
|
+
if (declaration.nam == this.config.shorthand) {
|
|
3844
|
+
this.declarations = new Map;
|
|
3845
|
+
}
|
|
3846
|
+
else {
|
|
3847
|
+
// expand shorthand
|
|
3848
|
+
if (declaration.nam != this.config.shorthand && this.declarations.has(this.config.shorthand)) {
|
|
3849
|
+
let isValid = true;
|
|
3850
|
+
let current = -1;
|
|
3851
|
+
const tokens = [];
|
|
3852
|
+
// @ts-ignore
|
|
3853
|
+
for (let token of this.declarations.get(this.config.shorthand).val) {
|
|
3854
|
+
// @ts-ignore
|
|
3855
|
+
if (this.config.types.some(t => token.typ == exports.EnumToken[t]) || (token.typ == exports.EnumToken.NumberTokenType && token.val == '0' &&
|
|
3856
|
+
(this.config.types.includes('Length') ||
|
|
3857
|
+
this.config.types.includes('Angle') ||
|
|
3858
|
+
this.config.types.includes('Dimension')))) {
|
|
3859
|
+
if (tokens.length == 0) {
|
|
3860
|
+
tokens.push([]);
|
|
3861
|
+
current++;
|
|
3862
|
+
}
|
|
3863
|
+
tokens[current].push(token);
|
|
3864
|
+
continue;
|
|
3865
|
+
}
|
|
3866
|
+
if (token.typ != exports.EnumToken.WhitespaceTokenType && token.typ != exports.EnumToken.CommentTokenType) {
|
|
3867
|
+
if (token.typ == exports.EnumToken.IdenTokenType && this.config.keywords.includes(token.val)) {
|
|
3868
|
+
if (tokens.length == 0) {
|
|
3869
|
+
tokens.push([]);
|
|
3870
|
+
current++;
|
|
3871
|
+
}
|
|
3872
|
+
tokens[current].push(token);
|
|
3873
|
+
}
|
|
3874
|
+
if (token.typ == exports.EnumToken.LiteralTokenType && token.val == this.config.separator) {
|
|
3875
|
+
tokens.push([]);
|
|
3876
|
+
current++;
|
|
3877
|
+
continue;
|
|
3878
|
+
}
|
|
3879
|
+
isValid = false;
|
|
3880
|
+
break;
|
|
3881
|
+
}
|
|
3882
|
+
}
|
|
3883
|
+
if (isValid && tokens.length > 0) {
|
|
3884
|
+
this.declarations.delete(this.config.shorthand);
|
|
3885
|
+
for (const values of tokens) {
|
|
3886
|
+
this.config.properties.forEach((property, index) => {
|
|
3887
|
+
if (!this.declarations.has(property)) {
|
|
3888
|
+
this.declarations.set(property, {
|
|
3889
|
+
typ: 5 /* NodeType.DeclarationNodeType */,
|
|
3890
|
+
nam: property,
|
|
3891
|
+
val: []
|
|
3892
|
+
});
|
|
3893
|
+
}
|
|
3894
|
+
while (index > 0 && index >= values.length) {
|
|
3895
|
+
if (index > 1) {
|
|
3896
|
+
index %= 2;
|
|
3897
|
+
}
|
|
3898
|
+
else {
|
|
3899
|
+
index = 0;
|
|
3900
|
+
break;
|
|
3901
|
+
}
|
|
3902
|
+
}
|
|
3903
|
+
// @ts-ignore
|
|
3904
|
+
const val = this.declarations.get(property).val;
|
|
3905
|
+
if (val.length > 0) {
|
|
3906
|
+
val.push({ typ: exports.EnumToken.WhitespaceTokenType });
|
|
3907
|
+
}
|
|
3908
|
+
val.push({ ...values[index] });
|
|
3909
|
+
});
|
|
3910
|
+
}
|
|
3911
|
+
}
|
|
3912
|
+
this.declarations.set(declaration.nam, declaration);
|
|
3913
|
+
return this;
|
|
3914
|
+
}
|
|
3915
|
+
}
|
|
3916
|
+
this.declarations.set(declaration.nam, declaration);
|
|
3917
|
+
return this;
|
|
3918
|
+
}
|
|
3919
|
+
isShortHand() {
|
|
3920
|
+
if (this.declarations.has(this.config.shorthand)) {
|
|
3921
|
+
return this.declarations.size == 1;
|
|
3922
|
+
}
|
|
3923
|
+
return this.config.properties.length == this.declarations.size;
|
|
3924
|
+
}
|
|
3925
|
+
[Symbol.iterator]() {
|
|
3926
|
+
let iterator;
|
|
3927
|
+
const declarations = this.declarations;
|
|
3928
|
+
if (declarations.size < this.config.properties.length) {
|
|
3929
|
+
iterator = declarations.values();
|
|
3930
|
+
}
|
|
3931
|
+
else {
|
|
3932
|
+
const values = [];
|
|
3933
|
+
this.config.properties.forEach((property) => {
|
|
3934
|
+
let index = 0;
|
|
3935
|
+
// @ts-ignore
|
|
3936
|
+
for (const token of this.declarations.get(property).val) {
|
|
3937
|
+
if (token.typ == exports.EnumToken.WhitespaceTokenType) {
|
|
3938
|
+
continue;
|
|
3939
|
+
}
|
|
3940
|
+
if (values.length == index) {
|
|
3941
|
+
values.push([]);
|
|
3942
|
+
}
|
|
3943
|
+
values[index].push(token);
|
|
3944
|
+
index++;
|
|
3945
|
+
}
|
|
3946
|
+
});
|
|
3947
|
+
for (const value of values) {
|
|
3948
|
+
let i = value.length;
|
|
3949
|
+
while (i-- > 1) {
|
|
3950
|
+
const t = value[i];
|
|
3951
|
+
const k = value[i == 1 ? 0 : i % 2];
|
|
3952
|
+
if (t.val == k.val && t.val == '0') {
|
|
3953
|
+
if ((t.typ == exports.EnumToken.NumberTokenType && isLength(k)) ||
|
|
3954
|
+
(k.typ == exports.EnumToken.NumberTokenType && isLength(t)) ||
|
|
3955
|
+
(isLength(k) || isLength(t))) {
|
|
3956
|
+
value.splice(i, 1);
|
|
3957
|
+
continue;
|
|
3958
|
+
}
|
|
3959
|
+
}
|
|
3960
|
+
if (eq(t, k)) {
|
|
3961
|
+
value.splice(i, 1);
|
|
3962
|
+
continue;
|
|
3963
|
+
}
|
|
3964
|
+
break;
|
|
3965
|
+
}
|
|
3966
|
+
}
|
|
3967
|
+
iterator = [{
|
|
3968
|
+
typ: 5 /* NodeType.DeclarationNodeType */,
|
|
3969
|
+
nam: this.config.shorthand,
|
|
3970
|
+
val: values.reduce((acc, curr) => {
|
|
3971
|
+
if (curr.length > 1) {
|
|
3972
|
+
const k = curr.length * 2 - 1;
|
|
3973
|
+
let i = 1;
|
|
3974
|
+
while (i < k) {
|
|
3975
|
+
curr.splice(i, 0, { typ: exports.EnumToken.WhitespaceTokenType });
|
|
3976
|
+
i += 2;
|
|
3977
|
+
}
|
|
3978
|
+
}
|
|
3979
|
+
if (acc.length > 0) {
|
|
3980
|
+
acc.push({ typ: exports.EnumToken.LiteralTokenType, val: this.config.separator });
|
|
3981
|
+
}
|
|
3982
|
+
acc.push(...curr);
|
|
3983
|
+
return acc;
|
|
3984
|
+
}, [])
|
|
3985
|
+
}][Symbol.iterator]();
|
|
3986
|
+
// return {
|
|
3987
|
+
// next() {
|
|
3988
|
+
//
|
|
3989
|
+
// return iterator.next();
|
|
3990
|
+
// }
|
|
3991
|
+
// }
|
|
3992
|
+
}
|
|
3993
|
+
return iterator;
|
|
3994
|
+
// return {
|
|
3995
|
+
// next() {
|
|
3996
|
+
//
|
|
3997
|
+
// return iterator.next();
|
|
3998
|
+
// }
|
|
3999
|
+
// }
|
|
4000
|
+
}
|
|
4001
|
+
}
|
|
4002
|
+
|
|
4003
|
+
const propertiesConfig = getConfig();
|
|
4004
|
+
class PropertyMap {
|
|
4005
|
+
config;
|
|
4006
|
+
declarations;
|
|
4007
|
+
requiredCount;
|
|
4008
|
+
pattern;
|
|
4009
|
+
constructor(config) {
|
|
4010
|
+
const values = Object.values(config.properties);
|
|
4011
|
+
this.requiredCount = values.reduce((acc, curr) => curr.required ? ++acc : acc, 0) || values.length;
|
|
4012
|
+
this.config = config;
|
|
4013
|
+
this.declarations = new Map;
|
|
4014
|
+
this.pattern = config.pattern.split(/\s/);
|
|
4015
|
+
}
|
|
4016
|
+
add(declaration) {
|
|
4017
|
+
for (const val of declaration.val) {
|
|
4018
|
+
Object.defineProperty(val, 'propertyName', { enumerable: false, writable: true, value: declaration.nam });
|
|
4019
|
+
}
|
|
4020
|
+
if (declaration.nam == this.config.shorthand) {
|
|
4021
|
+
this.declarations = new Map;
|
|
4022
|
+
this.declarations.set(declaration.nam, declaration);
|
|
4023
|
+
}
|
|
4024
|
+
else {
|
|
4025
|
+
const separator = this.config.separator != null ? {
|
|
4026
|
+
...this.config.separator,
|
|
4027
|
+
typ: exports.EnumToken[this.config.separator.typ]
|
|
4028
|
+
} : null;
|
|
4029
|
+
// expand shorthand
|
|
4030
|
+
if (declaration.nam != this.config.shorthand && this.declarations.has(this.config.shorthand)) {
|
|
4031
|
+
const tokens = {};
|
|
4032
|
+
const values = [];
|
|
4033
|
+
// @ts-ignore
|
|
4034
|
+
this.declarations.get(this.config.shorthand).val.slice().reduce((acc, curr) => {
|
|
4035
|
+
// @ts-ignore
|
|
4036
|
+
if (separator != null && separator.typ == curr.typ && eq(separator, curr)) {
|
|
4037
|
+
acc.push([]);
|
|
4038
|
+
return acc;
|
|
3399
4039
|
}
|
|
3400
|
-
// else {
|
|
3401
4040
|
// @ts-ignore
|
|
3402
4041
|
acc.at(-1).push(curr);
|
|
3403
|
-
// }
|
|
3404
4042
|
return acc;
|
|
3405
4043
|
}, [[]]).
|
|
3406
4044
|
// @ts-ignore
|
|
@@ -3409,7 +4047,7 @@
|
|
|
3409
4047
|
// let current: number = 0;
|
|
3410
4048
|
const props = this.config.properties[property];
|
|
3411
4049
|
for (let i = 0; i < acc.length; i++) {
|
|
3412
|
-
if (acc[i].typ ==
|
|
4050
|
+
if (acc[i].typ == exports.EnumToken.CommentTokenType || acc[i].typ == exports.EnumToken.WhitespaceTokenType) {
|
|
3413
4051
|
acc.splice(i, 1);
|
|
3414
4052
|
i--;
|
|
3415
4053
|
continue;
|
|
@@ -3425,18 +4063,20 @@
|
|
|
3425
4063
|
else {
|
|
3426
4064
|
if (current == tokens[property].length) {
|
|
3427
4065
|
tokens[property].push([acc[i]]);
|
|
3428
|
-
// tokens[property][current].push();
|
|
3429
4066
|
}
|
|
3430
4067
|
else {
|
|
3431
|
-
tokens[property][current].push({ typ:
|
|
4068
|
+
tokens[property][current].push({ typ: exports.EnumToken.WhitespaceTokenType }, acc[i]);
|
|
3432
4069
|
}
|
|
3433
4070
|
}
|
|
3434
4071
|
acc.splice(i, 1);
|
|
3435
4072
|
i--;
|
|
3436
4073
|
// @ts-ignore
|
|
3437
|
-
if ('prefix' in props && acc[i]?.typ == props.prefix.typ) {
|
|
3438
|
-
|
|
3439
|
-
|
|
4074
|
+
if ('prefix' in props && acc[i]?.typ == exports.EnumToken[props.prefix.typ]) {
|
|
4075
|
+
if (eq(acc[i], {
|
|
4076
|
+
...this.config.properties[property].prefix,
|
|
4077
|
+
// @ts-ignore
|
|
4078
|
+
typ: exports.EnumToken[props.prefix.typ]
|
|
4079
|
+
})) {
|
|
3440
4080
|
acc.splice(i, 1);
|
|
3441
4081
|
i--;
|
|
3442
4082
|
}
|
|
@@ -3469,7 +4109,7 @@
|
|
|
3469
4109
|
tokens[property][current].push(...defaults);
|
|
3470
4110
|
}
|
|
3471
4111
|
else {
|
|
3472
|
-
tokens[property][current].push({ typ:
|
|
4112
|
+
tokens[property][current].push({ typ: exports.EnumToken.WhitespaceTokenType }, ...defaults);
|
|
3473
4113
|
}
|
|
3474
4114
|
}
|
|
3475
4115
|
}
|
|
@@ -3480,7 +4120,7 @@
|
|
|
3480
4120
|
if (values.length == 0) {
|
|
3481
4121
|
this.declarations = Object.entries(tokens).reduce((acc, curr) => {
|
|
3482
4122
|
acc.set(curr[0], {
|
|
3483
|
-
typ:
|
|
4123
|
+
typ: 5 /* NodeType.DeclarationNodeType */,
|
|
3484
4124
|
nam: curr[0],
|
|
3485
4125
|
val: curr[1].reduce((acc, curr) => {
|
|
3486
4126
|
if (acc.length > 0) {
|
|
@@ -3550,7 +4190,10 @@
|
|
|
3550
4190
|
else {
|
|
3551
4191
|
let count = 0;
|
|
3552
4192
|
let match;
|
|
3553
|
-
const separator = this.config.separator
|
|
4193
|
+
const separator = this.config.separator != null ? {
|
|
4194
|
+
...this.config.separator,
|
|
4195
|
+
typ: exports.EnumToken[this.config.separator.typ]
|
|
4196
|
+
} : null;
|
|
3554
4197
|
const tokens = {};
|
|
3555
4198
|
// @ts-ignore
|
|
3556
4199
|
/* const valid: string[] =*/
|
|
@@ -3574,14 +4217,18 @@
|
|
|
3574
4217
|
}
|
|
3575
4218
|
continue;
|
|
3576
4219
|
}
|
|
3577
|
-
if (val.typ ==
|
|
4220
|
+
if (val.typ == exports.EnumToken.WhitespaceTokenType || val.typ == exports.EnumToken.CommentTokenType) {
|
|
3578
4221
|
continue;
|
|
3579
4222
|
}
|
|
3580
|
-
|
|
4223
|
+
// @ts-ignore
|
|
4224
|
+
if (props.multiple && props.separator != null && exports.EnumToken[props.separator.typ] == val.typ && eq({
|
|
4225
|
+
...props.separator,
|
|
4226
|
+
typ: exports.EnumToken[props.separator.typ]
|
|
4227
|
+
}, val)) {
|
|
3581
4228
|
continue;
|
|
3582
4229
|
}
|
|
3583
4230
|
// @ts-ignore
|
|
3584
|
-
match = val.typ ==
|
|
4231
|
+
match = val.typ == exports.EnumToken.CommentTokenType || matchType(val, curr[1]);
|
|
3585
4232
|
if (isShorthand) {
|
|
3586
4233
|
isShorthand = match;
|
|
3587
4234
|
}
|
|
@@ -3610,7 +4257,7 @@
|
|
|
3610
4257
|
return entry[1].required && !(entry[0] in tokens);
|
|
3611
4258
|
}) ||
|
|
3612
4259
|
// @ts-ignore
|
|
3613
|
-
!Object.values(tokens).every(v => v.filter(t => t.typ !=
|
|
4260
|
+
!Object.values(tokens).every(v => v.filter(t => t.typ != exports.EnumToken.CommentTokenType).length == count)) {
|
|
3614
4261
|
// @ts-ignore
|
|
3615
4262
|
iterable = this.declarations.values();
|
|
3616
4263
|
}
|
|
@@ -3623,7 +4270,7 @@
|
|
|
3623
4270
|
}
|
|
3624
4271
|
let values = curr[1][i].reduce((acc, curr) => {
|
|
3625
4272
|
if (acc.length > 0) {
|
|
3626
|
-
acc.push({ typ:
|
|
4273
|
+
acc.push({ typ: exports.EnumToken.WhitespaceTokenType });
|
|
3627
4274
|
}
|
|
3628
4275
|
acc.push(curr);
|
|
3629
4276
|
return acc;
|
|
@@ -3635,8 +4282,8 @@
|
|
|
3635
4282
|
let doFilterDefault = true;
|
|
3636
4283
|
if (curr[0] in propertiesConfig.properties) {
|
|
3637
4284
|
for (let v of values) {
|
|
3638
|
-
if (![
|
|
3639
|
-
|| (v.typ ==
|
|
4285
|
+
if (![exports.EnumToken.WhitespaceTokenType, exports.EnumToken.CommentTokenType, exports.EnumToken.IdenTokenType].includes(v.typ)
|
|
4286
|
+
|| (v.typ == exports.EnumToken.IdenTokenType && !this.config.properties[curr[0]].default.includes(v.val))) {
|
|
3640
4287
|
doFilterDefault = false;
|
|
3641
4288
|
break;
|
|
3642
4289
|
}
|
|
@@ -3644,10 +4291,10 @@
|
|
|
3644
4291
|
}
|
|
3645
4292
|
// remove default values
|
|
3646
4293
|
values = values.filter((val) => {
|
|
3647
|
-
if (val.typ ==
|
|
4294
|
+
if (val.typ == exports.EnumToken.WhitespaceTokenType || val.typ == exports.EnumToken.CommentTokenType) {
|
|
3648
4295
|
return false;
|
|
3649
4296
|
}
|
|
3650
|
-
return !doFilterDefault || !(val.typ ==
|
|
4297
|
+
return !doFilterDefault || !(val.typ == exports.EnumToken.IdenTokenType && props.default.includes(val.val));
|
|
3651
4298
|
});
|
|
3652
4299
|
if (values.length > 0) {
|
|
3653
4300
|
if ('mapping' in props) {
|
|
@@ -3656,7 +4303,7 @@
|
|
|
3656
4303
|
let i = values.length;
|
|
3657
4304
|
while (i--) {
|
|
3658
4305
|
// @ts-ignore
|
|
3659
|
-
if (values[i].typ ==
|
|
4306
|
+
if (values[i].typ == exports.EnumToken.IdenTokenType && values[i].val in props.mapping) {
|
|
3660
4307
|
// @ts-ignore
|
|
3661
4308
|
values.splice(i, 1, ...parseString(props.mapping[values[i].val]));
|
|
3662
4309
|
}
|
|
@@ -3665,15 +4312,20 @@
|
|
|
3665
4312
|
}
|
|
3666
4313
|
if ('prefix' in props) {
|
|
3667
4314
|
// @ts-ignore
|
|
3668
|
-
acc[i].push({ ...props.prefix });
|
|
4315
|
+
acc[i].push({ ...props.prefix, typ: exports.EnumToken[props.prefix.typ] });
|
|
3669
4316
|
}
|
|
3670
4317
|
else if (acc[i].length > 0) {
|
|
3671
|
-
acc[i].push({ typ:
|
|
4318
|
+
acc[i].push({ typ: exports.EnumToken.WhitespaceTokenType });
|
|
3672
4319
|
}
|
|
3673
4320
|
acc[i].push(...values.reduce((acc, curr) => {
|
|
3674
4321
|
if (acc.length > 0) {
|
|
3675
4322
|
// @ts-ignore
|
|
3676
|
-
acc.push({
|
|
4323
|
+
acc.push({
|
|
4324
|
+
...((props.separator && {
|
|
4325
|
+
...props.separator,
|
|
4326
|
+
typ: exports.EnumToken[props.separator.typ]
|
|
4327
|
+
}) ?? { typ: exports.EnumToken.WhitespaceTokenType })
|
|
4328
|
+
});
|
|
3677
4329
|
}
|
|
3678
4330
|
// @ts-ignore
|
|
3679
4331
|
acc.push(curr);
|
|
@@ -3689,7 +4341,7 @@
|
|
|
3689
4341
|
if (curr.length == 0 && this.config.default.length > 0) {
|
|
3690
4342
|
curr.push(...parseString(this.config.default[0]).reduce((acc, curr) => {
|
|
3691
4343
|
if (acc.length > 0) {
|
|
3692
|
-
acc.push({ typ:
|
|
4344
|
+
acc.push({ typ: exports.EnumToken.WhitespaceTokenType });
|
|
3693
4345
|
}
|
|
3694
4346
|
acc.push(curr);
|
|
3695
4347
|
return acc;
|
|
@@ -3702,12 +4354,15 @@
|
|
|
3702
4354
|
const val = values.reduce((acc, curr) => acc + renderToken(curr, { removeComments: true }), '');
|
|
3703
4355
|
if (val in this.config.mapping) {
|
|
3704
4356
|
values.length = 0;
|
|
3705
|
-
|
|
3706
|
-
|
|
4357
|
+
values.push({
|
|
4358
|
+
typ: ['"', "'"].includes(val.charAt(0)) ? exports.EnumToken.StringTokenType : exports.EnumToken.IdenTokenType,
|
|
4359
|
+
// @ts-ignore
|
|
4360
|
+
val: this.config.mapping[val]
|
|
4361
|
+
});
|
|
3707
4362
|
}
|
|
3708
4363
|
}
|
|
3709
4364
|
iterable = [{
|
|
3710
|
-
typ:
|
|
4365
|
+
typ: 5 /* NodeType.DeclarationNodeType */,
|
|
3711
4366
|
nam: this.config.shorthand,
|
|
3712
4367
|
val: values
|
|
3713
4368
|
}][Symbol.iterator]();
|
|
@@ -3744,570 +4399,442 @@
|
|
|
3744
4399
|
|
|
3745
4400
|
const config = getConfig();
|
|
3746
4401
|
class PropertyList {
|
|
4402
|
+
options = { removeDuplicateDeclarations: true, computeShorthand: true };
|
|
3747
4403
|
declarations;
|
|
3748
|
-
constructor() {
|
|
3749
|
-
this.
|
|
3750
|
-
|
|
3751
|
-
set(nam, value) {
|
|
3752
|
-
return this.add({ typ: 'Declaration', nam, val: Array.isArray(value) ? value : parseString(String(value)) });
|
|
3753
|
-
}
|
|
3754
|
-
add(declaration) {
|
|
3755
|
-
if (declaration.typ != 'Declaration') {
|
|
3756
|
-
this.declarations.set(Number(Math.random().toString().slice(2)).toString(36), declaration);
|
|
3757
|
-
return this;
|
|
3758
|
-
}
|
|
3759
|
-
let propertyName = declaration.nam;
|
|
3760
|
-
let shortHandType;
|
|
3761
|
-
let shorthand;
|
|
3762
|
-
if (propertyName in config.properties) {
|
|
3763
|
-
// @ts-ignore
|
|
3764
|
-
if ('map' in config.properties[propertyName]) {
|
|
3765
|
-
shortHandType = 'map';
|
|
3766
|
-
// @ts-ignore
|
|
3767
|
-
shorthand = config.properties[propertyName].map;
|
|
3768
|
-
}
|
|
3769
|
-
else {
|
|
3770
|
-
shortHandType = 'set';
|
|
3771
|
-
// @ts-ignore
|
|
3772
|
-
shorthand = config.properties[propertyName].shorthand;
|
|
3773
|
-
}
|
|
3774
|
-
}
|
|
3775
|
-
else if (propertyName in config.map) {
|
|
3776
|
-
shortHandType = 'map';
|
|
3777
|
-
// @ts-ignore
|
|
3778
|
-
shorthand = config.map[propertyName].shorthand;
|
|
3779
|
-
}
|
|
3780
|
-
// @ts-ignore
|
|
3781
|
-
if (shortHandType == 'map') {
|
|
3782
|
-
// @ts-ignore
|
|
3783
|
-
if (!this.declarations.has(shorthand)) {
|
|
3784
|
-
// @ts-ignore
|
|
3785
|
-
this.declarations.set(shorthand, new PropertyMap(config.map[shorthand]));
|
|
3786
|
-
}
|
|
3787
|
-
// @ts-ignore
|
|
3788
|
-
this.declarations.get(shorthand).add(declaration);
|
|
3789
|
-
// return this;
|
|
3790
|
-
}
|
|
3791
|
-
// @ts-ignore
|
|
3792
|
-
else if (shortHandType == 'set') {
|
|
3793
|
-
// @ts-ignore
|
|
3794
|
-
// const shorthand: string = <string>config.properties[propertyName].shorthand;
|
|
3795
|
-
if (!this.declarations.has(shorthand)) {
|
|
3796
|
-
// @ts-ignore
|
|
3797
|
-
this.declarations.set(shorthand, new PropertySet(config.properties[shorthand]));
|
|
3798
|
-
}
|
|
3799
|
-
// @ts-ignore
|
|
3800
|
-
this.declarations.get(shorthand).add(declaration);
|
|
3801
|
-
// return this;
|
|
3802
|
-
}
|
|
3803
|
-
else {
|
|
3804
|
-
this.declarations.set(propertyName, declaration);
|
|
3805
|
-
}
|
|
3806
|
-
return this;
|
|
3807
|
-
}
|
|
3808
|
-
[Symbol.iterator]() {
|
|
3809
|
-
let iterator = this.declarations.values();
|
|
3810
|
-
const iterators = [];
|
|
3811
|
-
return {
|
|
3812
|
-
next() {
|
|
3813
|
-
let value = iterator.next();
|
|
3814
|
-
while ((value.done && iterators.length > 0) ||
|
|
3815
|
-
value.value instanceof PropertySet ||
|
|
3816
|
-
value.value instanceof PropertyMap) {
|
|
3817
|
-
if (value.value instanceof PropertySet || value.value instanceof PropertyMap) {
|
|
3818
|
-
iterators.unshift(iterator);
|
|
3819
|
-
// @ts-ignore
|
|
3820
|
-
iterator = value.value[Symbol.iterator]();
|
|
3821
|
-
value = iterator.next();
|
|
3822
|
-
}
|
|
3823
|
-
if (value.done && iterators.length > 0) {
|
|
3824
|
-
iterator = iterators.shift();
|
|
3825
|
-
value = iterator.next();
|
|
3826
|
-
}
|
|
3827
|
-
}
|
|
3828
|
-
return value;
|
|
3829
|
-
}
|
|
3830
|
-
};
|
|
3831
|
-
}
|
|
3832
|
-
}
|
|
3833
|
-
|
|
3834
|
-
function* walk(node, parent, root) {
|
|
3835
|
-
yield { node, parent, root };
|
|
3836
|
-
if ('chi' in node) {
|
|
3837
|
-
for (const child of node.chi) {
|
|
3838
|
-
yield* walk(child, node, (root ?? node));
|
|
3839
|
-
}
|
|
3840
|
-
}
|
|
3841
|
-
}
|
|
3842
|
-
function* walkValues(values, parent) {
|
|
3843
|
-
for (const value of values) {
|
|
3844
|
-
// @ts-ignore
|
|
3845
|
-
yield { value, parent };
|
|
3846
|
-
if ('chi' in value) {
|
|
3847
|
-
yield* walkValues(value.chi, value);
|
|
3848
|
-
}
|
|
3849
|
-
}
|
|
3850
|
-
}
|
|
3851
|
-
|
|
3852
|
-
function expand(ast) {
|
|
3853
|
-
//
|
|
3854
|
-
if (!['Rule', 'StyleSheet', 'AtRule'].includes(ast.typ)) {
|
|
3855
|
-
return ast;
|
|
3856
|
-
}
|
|
3857
|
-
if ('Rule' == ast.typ) {
|
|
3858
|
-
return {
|
|
3859
|
-
typ: 'StyleSheet',
|
|
3860
|
-
chi: expandRule(ast)
|
|
3861
|
-
};
|
|
3862
|
-
}
|
|
3863
|
-
if (!('chi' in ast)) {
|
|
3864
|
-
return { ...ast };
|
|
3865
|
-
}
|
|
3866
|
-
const result = { ...ast, chi: [] };
|
|
3867
|
-
// @ts-ignore
|
|
3868
|
-
for (let i = 0; i < ast.chi.length; i++) {
|
|
3869
|
-
// @ts-ignore
|
|
3870
|
-
const node = ast.chi[i];
|
|
3871
|
-
if (node.typ == 'Rule') {
|
|
3872
|
-
// @ts-ignore
|
|
3873
|
-
result.chi.push(...expandRule(node));
|
|
3874
|
-
// i += expanded.length - 1;
|
|
3875
|
-
}
|
|
3876
|
-
else if (node.typ == 'AtRule' && 'chi' in node) {
|
|
3877
|
-
let hasRule = false;
|
|
3878
|
-
let j = node.chi.length;
|
|
3879
|
-
while (j--) {
|
|
3880
|
-
if (node.chi[j].typ == 'Rule' || node.chi[j].typ == 'AtRule') {
|
|
3881
|
-
hasRule = true;
|
|
3882
|
-
break;
|
|
3883
|
-
}
|
|
3884
|
-
}
|
|
3885
|
-
// @ts-ignore
|
|
3886
|
-
result.chi.push({ ...(hasRule ? expand(node) : node) });
|
|
3887
|
-
}
|
|
3888
|
-
else {
|
|
3889
|
-
// @ts-ignore
|
|
3890
|
-
result.chi.push(node);
|
|
3891
|
-
}
|
|
3892
|
-
}
|
|
3893
|
-
return result;
|
|
3894
|
-
}
|
|
3895
|
-
function expandRule(node) {
|
|
3896
|
-
const ast = { ...node, chi: node.chi.slice() };
|
|
3897
|
-
const result = [];
|
|
3898
|
-
if (ast.typ == 'Rule') {
|
|
3899
|
-
let i = 0;
|
|
3900
|
-
for (; i < ast.chi.length; i++) {
|
|
3901
|
-
if (ast.chi[i].typ == 'Rule') {
|
|
3902
|
-
const rule = ast.chi[i];
|
|
3903
|
-
if (!rule.sel.includes('&')) {
|
|
3904
|
-
const selRule = splitRule(rule.sel);
|
|
3905
|
-
selRule.forEach(arr => combinators.includes(arr[0].charAt(0)) ? arr.unshift(ast.sel) : arr.unshift(ast.sel, ' '));
|
|
3906
|
-
rule.sel = selRule.reduce((acc, curr) => {
|
|
3907
|
-
acc.push(curr.join(''));
|
|
3908
|
-
return acc;
|
|
3909
|
-
}, []).join(',');
|
|
3910
|
-
}
|
|
3911
|
-
else {
|
|
3912
|
-
rule.sel = replaceCompound(rule.sel, ast.sel);
|
|
3913
|
-
}
|
|
3914
|
-
ast.chi.splice(i--, 1);
|
|
3915
|
-
result.push(...expandRule(rule));
|
|
3916
|
-
}
|
|
3917
|
-
else if (ast.chi[i].typ == 'AtRule') {
|
|
3918
|
-
let astAtRule = ast.chi[i];
|
|
3919
|
-
const values = [];
|
|
3920
|
-
if (astAtRule.nam == 'scope') {
|
|
3921
|
-
if (astAtRule.val.includes('&')) {
|
|
3922
|
-
astAtRule.val = replaceCompound(astAtRule.val, ast.sel);
|
|
3923
|
-
}
|
|
3924
|
-
// @ts-ignore
|
|
3925
|
-
astAtRule = expand(astAtRule);
|
|
3926
|
-
}
|
|
3927
|
-
else {
|
|
3928
|
-
// @ts-ignore
|
|
3929
|
-
const clone = { ...ast, chi: astAtRule.chi.slice() };
|
|
3930
|
-
// @ts-ignore
|
|
3931
|
-
astAtRule.chi.length = 0;
|
|
3932
|
-
for (const r of expandRule(clone)) {
|
|
3933
|
-
if (r.typ == 'AtRule' && 'chi' in r) {
|
|
3934
|
-
if (astAtRule.val !== '' && r.val !== '') {
|
|
3935
|
-
if (astAtRule.nam == 'media' && r.nam == 'media') {
|
|
3936
|
-
r.val = astAtRule.val + ' and ' + r.val;
|
|
3937
|
-
}
|
|
3938
|
-
else if (astAtRule.nam == 'layer' && r.nam == 'layer') {
|
|
3939
|
-
r.val = astAtRule.val + '.' + r.val;
|
|
3940
|
-
}
|
|
3941
|
-
}
|
|
3942
|
-
// @ts-ignore
|
|
3943
|
-
values.push(r);
|
|
3944
|
-
}
|
|
3945
|
-
else if (r.typ == 'Rule') {
|
|
3946
|
-
// @ts-ignore
|
|
3947
|
-
astAtRule.chi.push(...expandRule(r));
|
|
3948
|
-
}
|
|
3949
|
-
else {
|
|
3950
|
-
// @ts-ignore
|
|
3951
|
-
astAtRule.chi.push(r);
|
|
3952
|
-
}
|
|
3953
|
-
}
|
|
3954
|
-
}
|
|
4404
|
+
constructor(options = {}) {
|
|
4405
|
+
for (const key of Object.keys(this.options)) {
|
|
4406
|
+
if (key in options) {
|
|
3955
4407
|
// @ts-ignore
|
|
3956
|
-
|
|
3957
|
-
ast.chi.splice(i--, 1);
|
|
3958
|
-
}
|
|
3959
|
-
}
|
|
3960
|
-
}
|
|
3961
|
-
// @ts-ignore
|
|
3962
|
-
return ast.chi.length > 0 ? [ast].concat(result) : result;
|
|
3963
|
-
}
|
|
3964
|
-
function replaceCompound(input, replace) {
|
|
3965
|
-
const tokens = parseString(input);
|
|
3966
|
-
for (const t of walkValues(tokens)) {
|
|
3967
|
-
if (t.value.typ == 'Literal') {
|
|
3968
|
-
if (t.value.val == '&') {
|
|
3969
|
-
t.value.val = replace;
|
|
3970
|
-
}
|
|
3971
|
-
else if (t.value.val.length > 1 && t.value.val.charAt(0) == '&') {
|
|
3972
|
-
t.value.val = replaceCompoundLiteral(t.value.val, replace);
|
|
4408
|
+
this.options[key] = options[key];
|
|
3973
4409
|
}
|
|
3974
4410
|
}
|
|
4411
|
+
this.declarations = new Map;
|
|
3975
4412
|
}
|
|
3976
|
-
|
|
3977
|
-
|
|
3978
|
-
|
|
3979
|
-
|
|
3980
|
-
|
|
3981
|
-
|
|
3982
|
-
|
|
3983
|
-
tokens.push('&');
|
|
3984
|
-
tokens.push('');
|
|
3985
|
-
}
|
|
3986
|
-
else {
|
|
3987
|
-
tokens[tokens.length - 1] += selector.charAt(i);
|
|
3988
|
-
}
|
|
3989
|
-
}
|
|
3990
|
-
return tokens.sort((a, b) => {
|
|
3991
|
-
if (a == '&') {
|
|
3992
|
-
return 1;
|
|
4413
|
+
set(nam, value) {
|
|
4414
|
+
return this.add({ typ: 5 /* NodeType.DeclarationNodeType */, nam, val: Array.isArray(value) ? value : parseString(String(value)) });
|
|
4415
|
+
}
|
|
4416
|
+
add(declaration) {
|
|
4417
|
+
if (declaration.typ != 5 /* NodeType.DeclarationNodeType */ || !this.options.removeDuplicateDeclarations) {
|
|
4418
|
+
this.declarations.set(Number(Math.random().toString().slice(2)).toString(36), declaration);
|
|
4419
|
+
return this;
|
|
3993
4420
|
}
|
|
3994
|
-
|
|
3995
|
-
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
|
|
3999
|
-
|
|
4000
|
-
|
|
4001
|
-
|
|
4002
|
-
function wrapNodes(previous, node, match, ast, i, nodeIndex) {
|
|
4003
|
-
// @ts-ignore
|
|
4004
|
-
let pSel = match.selector1.reduce(reducer, []).join(',');
|
|
4005
|
-
// @ts-ignore
|
|
4006
|
-
let nSel = match.selector2.reduce(reducer, []).join(',');
|
|
4007
|
-
// @ts-ignore
|
|
4008
|
-
const wrapper = { ...previous, chi: [], sel: match.match.reduce(reducer, []).join(',') };
|
|
4009
|
-
// @ts-ignore
|
|
4010
|
-
Object.defineProperty(wrapper, 'raw', { ...definedPropertySettings,
|
|
4011
|
-
// @ts-ignore
|
|
4012
|
-
value: match.match.map(t => t.slice())
|
|
4013
|
-
});
|
|
4014
|
-
if (pSel == '&' || pSel === '') {
|
|
4015
|
-
// @ts-ignore
|
|
4016
|
-
wrapper.chi.push(...previous.chi);
|
|
4421
|
+
if (!this.options.computeShorthand) {
|
|
4422
|
+
this.declarations.set(declaration.nam, declaration);
|
|
4423
|
+
return this;
|
|
4424
|
+
}
|
|
4425
|
+
let propertyName = declaration.nam;
|
|
4426
|
+
let shortHandType;
|
|
4427
|
+
let shorthand;
|
|
4428
|
+
if (propertyName in config.properties) {
|
|
4017
4429
|
// @ts-ignore
|
|
4018
|
-
if (
|
|
4430
|
+
if ('map' in config.properties[propertyName]) {
|
|
4431
|
+
shortHandType = 'map';
|
|
4019
4432
|
// @ts-ignore
|
|
4020
|
-
|
|
4433
|
+
shorthand = config.properties[propertyName].map;
|
|
4021
4434
|
}
|
|
4022
4435
|
else {
|
|
4436
|
+
shortHandType = 'set';
|
|
4023
4437
|
// @ts-ignore
|
|
4024
|
-
|
|
4438
|
+
shorthand = config.properties[propertyName].shorthand;
|
|
4025
4439
|
}
|
|
4026
4440
|
}
|
|
4027
|
-
else {
|
|
4441
|
+
else if (propertyName in config.map) {
|
|
4442
|
+
shortHandType = 'map';
|
|
4028
4443
|
// @ts-ignore
|
|
4029
|
-
|
|
4444
|
+
shorthand = config.map[propertyName].shorthand;
|
|
4030
4445
|
}
|
|
4031
4446
|
// @ts-ignore
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
|
|
4035
|
-
|
|
4036
|
-
|
|
4037
|
-
// @ts-ignore
|
|
4038
|
-
previous.raw = match.selector1;
|
|
4039
|
-
// @ts-ignore
|
|
4040
|
-
node.sel = nSel;
|
|
4041
|
-
// @ts-ignore
|
|
4042
|
-
node.raw = match.selector2;
|
|
4043
|
-
reduceRuleSelector(wrapper);
|
|
4044
|
-
return wrapper;
|
|
4045
|
-
}
|
|
4046
|
-
function reducer(acc, curr, index, array) {
|
|
4047
|
-
// trim :is()
|
|
4048
|
-
if (array.length == 1 && array[0][0] == ':is(' && array[0].at(-1) == ')') {
|
|
4049
|
-
curr = curr.slice(1, -1);
|
|
4050
|
-
}
|
|
4051
|
-
if (curr[0] == '&') {
|
|
4052
|
-
if (curr[1] == ' ' && !isIdent(curr[2]) && !isFunction(curr[2])) {
|
|
4053
|
-
curr.splice(0, 2);
|
|
4447
|
+
if (shortHandType == 'map') {
|
|
4448
|
+
// @ts-ignore
|
|
4449
|
+
if (!this.declarations.has(shorthand)) {
|
|
4450
|
+
// @ts-ignore
|
|
4451
|
+
this.declarations.set(shorthand, new PropertyMap(config.map[shorthand]));
|
|
4054
4452
|
}
|
|
4055
|
-
|
|
4056
|
-
|
|
4453
|
+
// @ts-ignore
|
|
4454
|
+
this.declarations.get(shorthand).add(declaration);
|
|
4455
|
+
// return this;
|
|
4456
|
+
}
|
|
4457
|
+
// @ts-ignore
|
|
4458
|
+
else if (shortHandType == 'set') {
|
|
4459
|
+
// @ts-ignore
|
|
4460
|
+
// const shorthand: string = <string>config.properties[propertyName].shorthand;
|
|
4461
|
+
if (!this.declarations.has(shorthand)) {
|
|
4462
|
+
// @ts-ignore
|
|
4463
|
+
this.declarations.set(shorthand, new PropertySet(config.properties[shorthand]));
|
|
4057
4464
|
}
|
|
4465
|
+
// @ts-ignore
|
|
4466
|
+
this.declarations.get(shorthand).add(declaration);
|
|
4467
|
+
// return this;
|
|
4058
4468
|
}
|
|
4059
|
-
else
|
|
4060
|
-
|
|
4469
|
+
else {
|
|
4470
|
+
this.declarations.set(propertyName, declaration);
|
|
4061
4471
|
}
|
|
4062
|
-
|
|
4063
|
-
|
|
4472
|
+
return this;
|
|
4473
|
+
}
|
|
4474
|
+
[Symbol.iterator]() {
|
|
4475
|
+
let iterator = this.declarations.values();
|
|
4476
|
+
const iterators = [];
|
|
4477
|
+
return {
|
|
4478
|
+
next() {
|
|
4479
|
+
let value = iterator.next();
|
|
4480
|
+
while ((value.done && iterators.length > 0) ||
|
|
4481
|
+
value.value instanceof PropertySet ||
|
|
4482
|
+
value.value instanceof PropertyMap) {
|
|
4483
|
+
if (value.value instanceof PropertySet || value.value instanceof PropertyMap) {
|
|
4484
|
+
iterators.unshift(iterator);
|
|
4485
|
+
// @ts-ignore
|
|
4486
|
+
iterator = value.value[Symbol.iterator]();
|
|
4487
|
+
value = iterator.next();
|
|
4488
|
+
}
|
|
4489
|
+
if (value.done && iterators.length > 0) {
|
|
4490
|
+
iterator = iterators.shift();
|
|
4491
|
+
value = iterator.next();
|
|
4492
|
+
}
|
|
4493
|
+
}
|
|
4494
|
+
return value;
|
|
4495
|
+
}
|
|
4496
|
+
};
|
|
4497
|
+
}
|
|
4498
|
+
}
|
|
4499
|
+
|
|
4500
|
+
class ComputeShorthand extends MinifyFeature {
|
|
4501
|
+
static get ordering() {
|
|
4502
|
+
return 2;
|
|
4064
4503
|
}
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
node2 = t;
|
|
4073
|
-
exchanged = true;
|
|
4074
|
-
}
|
|
4075
|
-
let i = node1.chi.length;
|
|
4076
|
-
let j = node2.chi.length;
|
|
4077
|
-
if (i == 0 || j == 0) {
|
|
4504
|
+
static register(options) {
|
|
4505
|
+
if (options.computeShorthand) {
|
|
4506
|
+
for (const feature of options.features) {
|
|
4507
|
+
if (feature instanceof ComputeShorthand) {
|
|
4508
|
+
return;
|
|
4509
|
+
}
|
|
4510
|
+
}
|
|
4078
4511
|
// @ts-ignore
|
|
4079
|
-
|
|
4512
|
+
options.features.push(new ComputeShorthand());
|
|
4080
4513
|
}
|
|
4514
|
+
}
|
|
4515
|
+
run(ast, options = {}, parent, context) {
|
|
4081
4516
|
// @ts-ignore
|
|
4082
|
-
const
|
|
4517
|
+
const j = ast.chi.length;
|
|
4518
|
+
let k = 0;
|
|
4519
|
+
let properties = new PropertyList(options);
|
|
4083
4520
|
// @ts-ignore
|
|
4084
|
-
|
|
4521
|
+
for (; k < j; k++) {
|
|
4522
|
+
// @ts-ignore
|
|
4523
|
+
const node = ast.chi[k];
|
|
4524
|
+
if (node.typ == 0 /* NodeType.CommentNodeType */ || node.typ == 5 /* NodeType.DeclarationNodeType */) {
|
|
4525
|
+
properties.add(node);
|
|
4526
|
+
continue;
|
|
4527
|
+
}
|
|
4528
|
+
break;
|
|
4529
|
+
}
|
|
4085
4530
|
// @ts-ignore
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
4531
|
+
ast.chi = [...properties].concat(ast.chi.slice(k));
|
|
4532
|
+
return ast;
|
|
4533
|
+
}
|
|
4534
|
+
}
|
|
4535
|
+
|
|
4536
|
+
class ComputeCalcExpression extends MinifyFeature {
|
|
4537
|
+
static get ordering() {
|
|
4538
|
+
return 1;
|
|
4539
|
+
}
|
|
4540
|
+
static register(options) {
|
|
4541
|
+
if (options.computeCalcExpression) {
|
|
4542
|
+
for (const feature of options.features) {
|
|
4543
|
+
if (feature instanceof ComputeCalcExpression) {
|
|
4544
|
+
return;
|
|
4545
|
+
}
|
|
4546
|
+
}
|
|
4547
|
+
// @ts-ignore
|
|
4548
|
+
options.features.push(new ComputeCalcExpression());
|
|
4090
4549
|
}
|
|
4091
|
-
|
|
4092
|
-
|
|
4550
|
+
}
|
|
4551
|
+
run(ast) {
|
|
4552
|
+
if (!('chi' in ast)) {
|
|
4553
|
+
return ast;
|
|
4093
4554
|
}
|
|
4094
|
-
|
|
4095
|
-
|
|
4096
|
-
if (
|
|
4555
|
+
// @ts-ignore
|
|
4556
|
+
for (const node of ast.chi) {
|
|
4557
|
+
if (node.typ != 5 /* NodeType.DeclarationNodeType */) {
|
|
4097
4558
|
continue;
|
|
4098
4559
|
}
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4104
|
-
|
|
4105
|
-
continue;
|
|
4106
|
-
}
|
|
4107
|
-
if (node1.chi[i].nam == node2.chi[j].nam) {
|
|
4108
|
-
if (eq(node1.chi[i], node2.chi[j])) {
|
|
4109
|
-
intersect.push(node1.chi[i]);
|
|
4110
|
-
node1.chi.splice(i, 1);
|
|
4111
|
-
node2.chi.splice(j, 1);
|
|
4112
|
-
break;
|
|
4560
|
+
const set = new Set;
|
|
4561
|
+
for (const { parent } of walkValues(node.val)) {
|
|
4562
|
+
if (parent != null && parent.typ == exports.EnumToken.FunctionTokenType && parent.val == 'calc') {
|
|
4563
|
+
if (!set.has(parent)) {
|
|
4564
|
+
set.add(parent);
|
|
4565
|
+
parent.chi = evaluate(parent.chi);
|
|
4113
4566
|
}
|
|
4114
4567
|
}
|
|
4115
4568
|
}
|
|
4116
4569
|
}
|
|
4570
|
+
return ast;
|
|
4571
|
+
}
|
|
4572
|
+
}
|
|
4573
|
+
/**
|
|
4574
|
+
* evaluate arithmetic operation
|
|
4575
|
+
* @param l
|
|
4576
|
+
* @param r
|
|
4577
|
+
* @param op
|
|
4578
|
+
*/
|
|
4579
|
+
function doEvaluate(l, r, op) {
|
|
4580
|
+
const defaultReturn = {
|
|
4581
|
+
typ: exports.EnumToken.BinaryExpressionTokenType,
|
|
4582
|
+
op,
|
|
4583
|
+
l,
|
|
4584
|
+
r
|
|
4585
|
+
};
|
|
4586
|
+
if (!isScalarToken(l) || !isScalarToken(r)) {
|
|
4587
|
+
return defaultReturn;
|
|
4588
|
+
}
|
|
4589
|
+
if ((op == exports.EnumToken.Add || op == exports.EnumToken.Sub)) {
|
|
4590
|
+
// @ts-ignore
|
|
4591
|
+
if (l.typ != r.typ || Number.isNaN(+l.val) || Number.isNaN(r.val)) {
|
|
4592
|
+
return defaultReturn;
|
|
4593
|
+
}
|
|
4117
4594
|
// @ts-ignore
|
|
4118
|
-
|
|
4119
|
-
|
|
4595
|
+
return { ...l, val: reduceNumber(+l.val + (op == exports.EnumToken.Add ? +r.val : -1 * r.val)) };
|
|
4596
|
+
}
|
|
4597
|
+
else {
|
|
4598
|
+
// @ts-ignore
|
|
4599
|
+
let val;
|
|
4600
|
+
if (op == exports.EnumToken.Div) {
|
|
4601
|
+
if (r.typ != exports.EnumToken.NumberTokenType || r.val == '0') {
|
|
4602
|
+
return defaultReturn;
|
|
4603
|
+
}
|
|
4120
4604
|
// @ts-ignore
|
|
4121
|
-
|
|
4122
|
-
|
|
4123
|
-
|
|
4124
|
-
if (result == null || [n1, n2].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + render(curr, options).code.length, 0) <= [node1, node2, result].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + render(curr, options).code.length, 0)) {
|
|
4605
|
+
val = reduceNumber(l.val / r.val);
|
|
4606
|
+
}
|
|
4607
|
+
else {
|
|
4125
4608
|
// @ts-ignore
|
|
4126
|
-
|
|
4609
|
+
val = reduceNumber(r.val * l.val);
|
|
4610
|
+
}
|
|
4611
|
+
let result;
|
|
4612
|
+
if (r.typ == exports.EnumToken.NumberTokenType || op == exports.EnumToken.Div) {
|
|
4613
|
+
result = { ...l, val };
|
|
4614
|
+
}
|
|
4615
|
+
else {
|
|
4616
|
+
// @ts-ignore
|
|
4617
|
+
result = { ...r, val };
|
|
4618
|
+
}
|
|
4619
|
+
if (renderToken(result).length <= renderToken(defaultReturn).length) {
|
|
4620
|
+
return result;
|
|
4127
4621
|
}
|
|
4128
|
-
return { result, node1: exchanged ? node2 : node1, node2: exchanged ? node1 : node2 };
|
|
4129
4622
|
}
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
if (selector2[l][i] != token) {
|
|
4153
|
-
matching = false;
|
|
4154
|
-
break;
|
|
4155
|
-
}
|
|
4156
|
-
}
|
|
4157
|
-
}
|
|
4158
|
-
if (!matching) {
|
|
4159
|
-
break;
|
|
4160
|
-
}
|
|
4161
|
-
if (token == ',') {
|
|
4162
|
-
match.push([]);
|
|
4623
|
+
return defaultReturn;
|
|
4624
|
+
}
|
|
4625
|
+
/**
|
|
4626
|
+
* evaluate an array of tokens
|
|
4627
|
+
* @param tokens
|
|
4628
|
+
*/
|
|
4629
|
+
function evaluate(tokens) {
|
|
4630
|
+
const nodes = inlineExpression(evaluateExpression(buildExpression(tokens)));
|
|
4631
|
+
if (nodes.length <= 1) {
|
|
4632
|
+
return nodes;
|
|
4633
|
+
}
|
|
4634
|
+
const map = new Map;
|
|
4635
|
+
let token;
|
|
4636
|
+
let i;
|
|
4637
|
+
for (i = 0; i < nodes.length; i++) {
|
|
4638
|
+
token = nodes[i];
|
|
4639
|
+
if (token.typ == exports.EnumToken.Add) {
|
|
4640
|
+
continue;
|
|
4641
|
+
}
|
|
4642
|
+
if (token.typ == exports.EnumToken.Sub) {
|
|
4643
|
+
if (!isScalarToken(nodes[i + 1])) {
|
|
4644
|
+
token = { typ: exports.EnumToken.ListToken, chi: [nodes[i], nodes[i + 1]] };
|
|
4163
4645
|
}
|
|
4164
4646
|
else {
|
|
4165
|
-
|
|
4166
|
-
matchFunction++;
|
|
4167
|
-
}
|
|
4168
|
-
if (token.endsWith('[')) {
|
|
4169
|
-
inAttr++;
|
|
4170
|
-
}
|
|
4171
|
-
else if (token == ')') {
|
|
4172
|
-
matchFunction--;
|
|
4173
|
-
}
|
|
4174
|
-
else if (token == ']') {
|
|
4175
|
-
inAttr--;
|
|
4176
|
-
}
|
|
4177
|
-
match.at(-1).push(token);
|
|
4647
|
+
token = doEvaluate(nodes[i + 1], { typ: exports.EnumToken.NumberTokenType, val: '-1' }, exports.EnumToken.Mul);
|
|
4178
4648
|
}
|
|
4649
|
+
i++;
|
|
4179
4650
|
}
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
return null;
|
|
4651
|
+
if (!map.has(token.typ)) {
|
|
4652
|
+
map.set(token.typ, [token]);
|
|
4183
4653
|
}
|
|
4184
|
-
|
|
4185
|
-
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
|
|
4654
|
+
else {
|
|
4655
|
+
map.get(token.typ).push(token);
|
|
4656
|
+
}
|
|
4657
|
+
}
|
|
4658
|
+
return [...map].reduce((acc, curr) => {
|
|
4659
|
+
const token = curr[1].reduce((acc, curr) => doEvaluate(acc, curr, exports.EnumToken.Add));
|
|
4660
|
+
if (token.typ != exports.EnumToken.BinaryExpressionTokenType) {
|
|
4661
|
+
if ('val' in token && +token.val < 0) {
|
|
4662
|
+
acc.push({ typ: exports.EnumToken.Sub }, { ...token, val: String(-token.val) });
|
|
4663
|
+
return acc;
|
|
4189
4664
|
}
|
|
4190
4665
|
}
|
|
4191
|
-
if (
|
|
4192
|
-
|
|
4193
|
-
return null;
|
|
4666
|
+
if (acc.length > 0 && curr[0] != exports.EnumToken.ListToken) {
|
|
4667
|
+
acc.push({ typ: exports.EnumToken.Add });
|
|
4194
4668
|
}
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
4669
|
+
acc.push(token);
|
|
4670
|
+
return acc;
|
|
4671
|
+
}, []);
|
|
4672
|
+
}
|
|
4673
|
+
/**
|
|
4674
|
+
* convert BinaryExpression into an array
|
|
4675
|
+
* @param token
|
|
4676
|
+
*/
|
|
4677
|
+
function inlineExpression(token) {
|
|
4678
|
+
const result = [];
|
|
4679
|
+
if (token.typ == exports.EnumToken.BinaryExpressionTokenType) {
|
|
4680
|
+
if ([exports.EnumToken.Mul, exports.EnumToken.Div].includes(token.op)) {
|
|
4681
|
+
result.push(token);
|
|
4204
4682
|
}
|
|
4205
|
-
|
|
4206
|
-
|
|
4683
|
+
else {
|
|
4684
|
+
result.push(...inlineExpression(token.l), { typ: token.op }, ...inlineExpression(token.r));
|
|
4207
4685
|
}
|
|
4208
|
-
|
|
4209
|
-
|
|
4686
|
+
}
|
|
4687
|
+
else {
|
|
4688
|
+
result.push(token);
|
|
4689
|
+
}
|
|
4690
|
+
return result;
|
|
4691
|
+
}
|
|
4692
|
+
/**
|
|
4693
|
+
* evaluate expression
|
|
4694
|
+
* @param token
|
|
4695
|
+
*/
|
|
4696
|
+
function evaluateExpression(token) {
|
|
4697
|
+
if (token.typ != exports.EnumToken.BinaryExpressionTokenType) {
|
|
4698
|
+
return token;
|
|
4699
|
+
}
|
|
4700
|
+
if (token.r.typ == exports.EnumToken.BinaryExpressionTokenType) {
|
|
4701
|
+
token.r = evaluateExpression(token.r);
|
|
4702
|
+
}
|
|
4703
|
+
if (token.l.typ == exports.EnumToken.BinaryExpressionTokenType) {
|
|
4704
|
+
token.l = evaluateExpression(token.l);
|
|
4705
|
+
}
|
|
4706
|
+
const result = doEvaluate(token.l, token.r, token.op);
|
|
4707
|
+
if (result.typ == exports.EnumToken.BinaryExpressionTokenType &&
|
|
4708
|
+
[exports.EnumToken.Mul, exports.EnumToken.Div].includes(result.op)) {
|
|
4709
|
+
// wrap expression
|
|
4710
|
+
if (result.l.typ == exports.EnumToken.BinaryExpressionTokenType && [exports.EnumToken.Sub, exports.EnumToken.Add].includes(result.l.op)) {
|
|
4711
|
+
result.l = { typ: exports.EnumToken.ParensTokenType, chi: [result.l] };
|
|
4210
4712
|
}
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
|
|
4215
|
-
|
|
4216
|
-
|
|
4217
|
-
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4713
|
+
else if (result.r.typ == exports.EnumToken.BinaryExpressionTokenType && [exports.EnumToken.Sub, exports.EnumToken.Add].includes(result.r.op)) {
|
|
4714
|
+
result.r = { typ: exports.EnumToken.ParensTokenType, chi: [result.r] };
|
|
4715
|
+
}
|
|
4716
|
+
}
|
|
4717
|
+
return result;
|
|
4718
|
+
}
|
|
4719
|
+
function isScalarToken(token) {
|
|
4720
|
+
return token.typ != exports.EnumToken.BinaryExpressionTokenType && token.typ != exports.EnumToken.ParensTokenType && token.typ != exports.EnumToken.FunctionTokenType;
|
|
4721
|
+
}
|
|
4722
|
+
/**
|
|
4723
|
+
*
|
|
4724
|
+
* generate binary expression tree
|
|
4725
|
+
* @param tokens
|
|
4726
|
+
*/
|
|
4727
|
+
function buildExpression(tokens) {
|
|
4728
|
+
return factor(factor(tokens.filter(t => t.typ != exports.EnumToken.WhitespaceTokenType), ['/', '*']), ['+', '-'])[0];
|
|
4729
|
+
}
|
|
4730
|
+
function getArithmeticOperation(op) {
|
|
4731
|
+
if (op == '+') {
|
|
4732
|
+
return exports.EnumToken.Add;
|
|
4733
|
+
}
|
|
4734
|
+
if (op == '-') {
|
|
4735
|
+
return exports.EnumToken.Sub;
|
|
4736
|
+
}
|
|
4737
|
+
if (op == '/') {
|
|
4738
|
+
return exports.EnumToken.Div;
|
|
4739
|
+
}
|
|
4740
|
+
return exports.EnumToken.Mul;
|
|
4741
|
+
}
|
|
4742
|
+
/**
|
|
4743
|
+
*
|
|
4744
|
+
* generate binary expression tree
|
|
4745
|
+
* @param token
|
|
4746
|
+
*/
|
|
4747
|
+
function factorToken(token) {
|
|
4748
|
+
if (token.typ == exports.EnumToken.ParensTokenType || (token.typ == exports.EnumToken.FunctionTokenType && token.val == 'calc')) {
|
|
4749
|
+
if (token.typ == exports.EnumToken.FunctionTokenType && token.val == 'calc') {
|
|
4750
|
+
token = { ...token, typ: exports.EnumToken.ParensTokenType };
|
|
4751
|
+
// @ts-ignore
|
|
4752
|
+
delete token.val;
|
|
4753
|
+
}
|
|
4754
|
+
return buildExpression(token.chi);
|
|
4755
|
+
}
|
|
4756
|
+
return token;
|
|
4757
|
+
}
|
|
4758
|
+
/**
|
|
4759
|
+
* generate binary expression tree
|
|
4760
|
+
* @param tokens
|
|
4761
|
+
* @param ops
|
|
4762
|
+
*/
|
|
4763
|
+
function factor(tokens, ops) {
|
|
4764
|
+
let isOp;
|
|
4765
|
+
const opList = [exports.EnumToken.Add, exports.EnumToken.Sub, exports.EnumToken.Div, exports.EnumToken.Mul];
|
|
4766
|
+
if (tokens.length == 1) {
|
|
4767
|
+
return [factorToken(tokens[0])];
|
|
4768
|
+
}
|
|
4769
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
4770
|
+
isOp = opList.includes(tokens[i].typ);
|
|
4771
|
+
if (isOp ||
|
|
4772
|
+
// @ts-ignore
|
|
4773
|
+
(tokens[i].typ == exports.EnumToken.LiteralTokenType && ops.includes(tokens[i].val))) {
|
|
4774
|
+
tokens.splice(i - 1, 3, {
|
|
4775
|
+
typ: exports.EnumToken.BinaryExpressionTokenType,
|
|
4776
|
+
op: isOp ? tokens[i].typ : getArithmeticOperation(tokens[i].val),
|
|
4777
|
+
l: factorToken(tokens[i - 1]),
|
|
4778
|
+
r: factorToken(tokens[i + 1])
|
|
4779
|
+
});
|
|
4780
|
+
i--;
|
|
4278
4781
|
}
|
|
4782
|
+
}
|
|
4783
|
+
return tokens;
|
|
4784
|
+
}
|
|
4785
|
+
|
|
4786
|
+
var allFeatures = /*#__PURE__*/Object.freeze({
|
|
4787
|
+
__proto__: null,
|
|
4788
|
+
ComputeCalcExpression: ComputeCalcExpression,
|
|
4789
|
+
ComputeShorthand: ComputeShorthand,
|
|
4790
|
+
InlineCssVariables: InlineCssVariables
|
|
4791
|
+
});
|
|
4792
|
+
|
|
4793
|
+
const combinators = ['+', '>', '~'];
|
|
4794
|
+
const notEndingWith = ['(', '['].concat(combinators);
|
|
4795
|
+
const definedPropertySettings = { configurable: true, enumerable: false, writable: true };
|
|
4796
|
+
// @ts-ignore
|
|
4797
|
+
const features = Object.values(allFeatures).sort((a, b) => a.ordering - b.ordering);
|
|
4798
|
+
function minify(ast, options = {}, recursive = false, errors, nestingContent, context = {}) {
|
|
4799
|
+
if (!('nodes' in context)) {
|
|
4800
|
+
context.nodes = new WeakSet;
|
|
4801
|
+
}
|
|
4802
|
+
if (context.nodes.has(ast)) {
|
|
4803
|
+
// console.error('skipped', ast.typ);
|
|
4804
|
+
return ast;
|
|
4805
|
+
}
|
|
4806
|
+
context.nodes.add(ast);
|
|
4807
|
+
if (!('features' in options)) {
|
|
4279
4808
|
// @ts-ignore
|
|
4280
|
-
|
|
4809
|
+
options = { removeDuplicateDeclarations: true, computeShorthand: true, computeCalcExpression: true, features: [], ...options };
|
|
4281
4810
|
// @ts-ignore
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
match,
|
|
4286
|
-
selector1,
|
|
4287
|
-
selector2
|
|
4288
|
-
};
|
|
4811
|
+
for (const feature of features) {
|
|
4812
|
+
feature.register(options);
|
|
4813
|
+
}
|
|
4289
4814
|
}
|
|
4290
|
-
function
|
|
4291
|
-
//
|
|
4292
|
-
if (
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
}
|
|
4302
|
-
}
|
|
4815
|
+
function reducer(acc, curr, index, array) {
|
|
4816
|
+
// trim :is()
|
|
4817
|
+
if (array.length == 1 && array[0][0] == ':is(' && array[0].at(-1) == ')') {
|
|
4818
|
+
curr = curr.slice(1, -1);
|
|
4819
|
+
}
|
|
4820
|
+
if (curr[0] == '&') {
|
|
4821
|
+
if (curr[1] == ' ' && !isIdent(curr[2]) && !isFunction(curr[2])) {
|
|
4822
|
+
curr.splice(0, 2);
|
|
4823
|
+
}
|
|
4824
|
+
else if (combinators.includes(curr[1])) {
|
|
4825
|
+
curr.splice(0, 1);
|
|
4303
4826
|
}
|
|
4304
|
-
node.sel = attributes.reduce((acc, curr) => acc + renderToken(curr), '');
|
|
4305
4827
|
}
|
|
4828
|
+
else if (ast.typ == 4 /* NodeType.RuleNodeType */ && (isIdent(curr[0]) || isFunction(curr[0]))) {
|
|
4829
|
+
curr.unshift('&', ' ');
|
|
4830
|
+
}
|
|
4831
|
+
acc.push(curr.join(''));
|
|
4832
|
+
return acc;
|
|
4306
4833
|
}
|
|
4307
4834
|
// @ts-ignore
|
|
4308
|
-
if (
|
|
4835
|
+
if ('chi' in ast && ast.chi.length > 0) {
|
|
4309
4836
|
if (!nestingContent) {
|
|
4310
|
-
nestingContent = options.nestingRules && ast.typ ==
|
|
4837
|
+
nestingContent = options.nestingRules && ast.typ == 4 /* NodeType.RuleNodeType */;
|
|
4311
4838
|
}
|
|
4312
4839
|
let i = 0;
|
|
4313
4840
|
let previous;
|
|
@@ -4316,7 +4843,7 @@
|
|
|
4316
4843
|
// @ts-ignore
|
|
4317
4844
|
for (; i < ast.chi.length; i++) {
|
|
4318
4845
|
// @ts-ignore
|
|
4319
|
-
if (ast.chi[i].typ ==
|
|
4846
|
+
if (ast.chi[i].typ == 0 /* NodeType.CommentNodeType */) {
|
|
4320
4847
|
continue;
|
|
4321
4848
|
}
|
|
4322
4849
|
// @ts-ignore
|
|
@@ -4328,10 +4855,10 @@
|
|
|
4328
4855
|
i--;
|
|
4329
4856
|
continue;
|
|
4330
4857
|
}
|
|
4331
|
-
if (node.typ ==
|
|
4858
|
+
if (node.typ == 3 /* NodeType.AtRuleNodeType */ && node.nam == 'font-face') {
|
|
4332
4859
|
continue;
|
|
4333
4860
|
}
|
|
4334
|
-
if (node.typ ==
|
|
4861
|
+
if (node.typ == 3 /* NodeType.AtRuleNodeType */) {
|
|
4335
4862
|
if (node.nam == 'media' && node.val == 'all') {
|
|
4336
4863
|
// @ts-ignore
|
|
4337
4864
|
ast.chi?.splice(i, 1, ...node.chi);
|
|
@@ -4339,47 +4866,41 @@
|
|
|
4339
4866
|
continue;
|
|
4340
4867
|
}
|
|
4341
4868
|
// @ts-ignore
|
|
4342
|
-
if (previous?.typ ==
|
|
4869
|
+
if (previous?.typ == 3 /* NodeType.AtRuleNodeType */ &&
|
|
4343
4870
|
previous.nam == node.nam &&
|
|
4344
4871
|
previous.val == node.val) {
|
|
4345
4872
|
if ('chi' in node) {
|
|
4346
4873
|
// @ts-ignore
|
|
4347
4874
|
previous.chi.push(...node.chi);
|
|
4348
4875
|
}
|
|
4349
|
-
// else {
|
|
4350
4876
|
ast?.chi?.splice(i--, 1);
|
|
4351
4877
|
continue;
|
|
4352
|
-
// }
|
|
4353
4878
|
}
|
|
4354
4879
|
// @ts-ignore
|
|
4355
|
-
if (hasDeclaration(node)) {
|
|
4356
|
-
|
|
4357
|
-
minifyRule(node);
|
|
4358
|
-
}
|
|
4359
|
-
else {
|
|
4360
|
-
minify(node, options, recursive, errors, nestingContent);
|
|
4880
|
+
if (!hasDeclaration(node)) {
|
|
4881
|
+
minify(node, options, recursive, errors, nestingContent, context);
|
|
4361
4882
|
}
|
|
4362
4883
|
previous = node;
|
|
4363
4884
|
nodeIndex = i;
|
|
4364
4885
|
continue;
|
|
4365
4886
|
}
|
|
4366
4887
|
// @ts-ignore
|
|
4367
|
-
if (node.typ ==
|
|
4888
|
+
if (node.typ == 4 /* NodeType.RuleNodeType */) {
|
|
4368
4889
|
reduceRuleSelector(node);
|
|
4369
4890
|
let wrapper;
|
|
4370
4891
|
let match;
|
|
4371
4892
|
// @ts-ignore
|
|
4372
4893
|
if (options.nestingRules) {
|
|
4373
4894
|
// @ts-ignore
|
|
4374
|
-
if (previous?.typ ==
|
|
4895
|
+
if (previous?.typ == 4 /* NodeType.RuleNodeType */) {
|
|
4375
4896
|
// @ts-ignore
|
|
4376
4897
|
reduceRuleSelector(previous);
|
|
4377
4898
|
// @ts-ignore
|
|
4378
|
-
match = matchSelectors(previous.raw, node.raw, ast.typ);
|
|
4899
|
+
match = matchSelectors(previous.raw, node.raw, ast.typ, errors);
|
|
4379
4900
|
// @ts-ignore
|
|
4380
4901
|
if (match != null) {
|
|
4381
4902
|
// @ts-ignore
|
|
4382
|
-
wrapper = wrapNodes(previous, node, match, ast, i, nodeIndex);
|
|
4903
|
+
wrapper = wrapNodes(previous, node, match, ast, reducer, i, nodeIndex);
|
|
4383
4904
|
nodeIndex = i - 1;
|
|
4384
4905
|
// @ts-ignore
|
|
4385
4906
|
previous = ast.chi[nodeIndex];
|
|
@@ -4392,26 +4913,23 @@
|
|
|
4392
4913
|
// @ts-ignore
|
|
4393
4914
|
const nextNode = ast.chi[i];
|
|
4394
4915
|
// @ts-ignore
|
|
4395
|
-
if (nextNode.typ !=
|
|
4396
|
-
// i--;
|
|
4397
|
-
// previous = wrapper;
|
|
4398
|
-
// nodeIndex = i;
|
|
4916
|
+
if (nextNode.typ != 4 /* NodeType.RuleNodeType */) {
|
|
4399
4917
|
break;
|
|
4400
4918
|
}
|
|
4401
4919
|
reduceRuleSelector(nextNode);
|
|
4402
4920
|
// @ts-ignore
|
|
4403
|
-
match = matchSelectors(wrapper.raw, nextNode.raw, ast.typ);
|
|
4921
|
+
match = matchSelectors(wrapper.raw, nextNode.raw, ast.typ, errors);
|
|
4404
4922
|
// @ts-ignore
|
|
4405
4923
|
if (match == null) {
|
|
4406
4924
|
break;
|
|
4407
4925
|
}
|
|
4408
4926
|
// @ts-ignore
|
|
4409
|
-
wrapper = wrapNodes(wrapper, nextNode, match, ast, i, nodeIndex);
|
|
4927
|
+
wrapper = wrapNodes(wrapper, nextNode, match, ast, reducer, i, nodeIndex);
|
|
4410
4928
|
}
|
|
4411
4929
|
nodeIndex = --i;
|
|
4412
4930
|
// @ts-ignore
|
|
4413
4931
|
previous = ast.chi[nodeIndex];
|
|
4414
|
-
minify(wrapper, options, recursive, errors, nestingContent);
|
|
4932
|
+
minify(wrapper, options, recursive, errors, nestingContent, context);
|
|
4415
4933
|
continue;
|
|
4416
4934
|
}
|
|
4417
4935
|
// @ts-ignore
|
|
@@ -4449,7 +4967,7 @@
|
|
|
4449
4967
|
curr.splice(0, 2);
|
|
4450
4968
|
}
|
|
4451
4969
|
else {
|
|
4452
|
-
if (ast.typ !=
|
|
4970
|
+
if (ast.typ != 4 /* NodeType.RuleNodeType */ && combinators.includes(curr[1])) {
|
|
4453
4971
|
wrap = false;
|
|
4454
4972
|
}
|
|
4455
4973
|
else {
|
|
@@ -4466,7 +4984,7 @@
|
|
|
4466
4984
|
return acc;
|
|
4467
4985
|
}, []);
|
|
4468
4986
|
if (!wrap) {
|
|
4469
|
-
wrap = selector.some(s => s[0] != '&');
|
|
4987
|
+
wrap = selector.some((s) => s[0] != '&');
|
|
4470
4988
|
}
|
|
4471
4989
|
let rule = selector.map(s => {
|
|
4472
4990
|
if (s[0] == '&') {
|
|
@@ -4497,37 +5015,36 @@
|
|
|
4497
5015
|
let k = previous.chi.length;
|
|
4498
5016
|
while (k-- > 0) {
|
|
4499
5017
|
// @ts-ignore
|
|
4500
|
-
if (previous.chi[k].typ ==
|
|
5018
|
+
if (previous.chi[k].typ == 0 /* NodeType.CommentNodeType */) {
|
|
4501
5019
|
continue;
|
|
4502
5020
|
}
|
|
4503
5021
|
// @ts-ignore
|
|
4504
|
-
shouldMerge = previous.chi[k].typ ==
|
|
5022
|
+
shouldMerge = previous.chi[k].typ == 5 /* NodeType.DeclarationNodeType */;
|
|
4505
5023
|
break;
|
|
4506
5024
|
}
|
|
4507
5025
|
if (shouldMerge) {
|
|
4508
5026
|
// @ts-ignore
|
|
4509
|
-
if ((node.typ ==
|
|
5027
|
+
if ((node.typ == 4 /* NodeType.RuleNodeType */ && node.sel == previous.sel) ||
|
|
4510
5028
|
// @ts-ignore
|
|
4511
|
-
(node.typ ==
|
|
5029
|
+
(node.typ == 3 /* NodeType.AtRuleNodeType */) && node.val != 'font-face' && node.val == previous.val) {
|
|
4512
5030
|
// @ts-ignore
|
|
4513
5031
|
node.chi.unshift(...previous.chi);
|
|
4514
5032
|
// @ts-ignore
|
|
4515
5033
|
ast.chi.splice(nodeIndex, 1);
|
|
4516
5034
|
// @ts-ignore
|
|
4517
|
-
if (hasDeclaration(node)) {
|
|
5035
|
+
if (!hasDeclaration(node)) {
|
|
4518
5036
|
// @ts-ignore
|
|
4519
|
-
minifyRule(node);
|
|
4520
|
-
|
|
4521
|
-
|
|
4522
|
-
minify(node, options, recursive, errors, nestingContent);
|
|
5037
|
+
// minifyRule(node, <MinifyOptions>options, ast, context);
|
|
5038
|
+
// } else {
|
|
5039
|
+
minify(node, options, recursive, errors, nestingContent, context);
|
|
4523
5040
|
}
|
|
4524
5041
|
i--;
|
|
4525
5042
|
previous = node;
|
|
4526
5043
|
nodeIndex = i;
|
|
4527
5044
|
continue;
|
|
4528
5045
|
}
|
|
4529
|
-
else if (node.typ ==
|
|
4530
|
-
const intersect = diff(previous, node, options);
|
|
5046
|
+
else if (node.typ == 4 /* NodeType.RuleNodeType */ && previous?.typ == 4 /* NodeType.RuleNodeType */) {
|
|
5047
|
+
const intersect = diff(previous, node, reducer, options);
|
|
4531
5048
|
if (intersect != null) {
|
|
4532
5049
|
if (intersect.node1.chi.length == 0) {
|
|
4533
5050
|
// @ts-ignore
|
|
@@ -4559,24 +5076,22 @@
|
|
|
4559
5076
|
// @ts-ignore
|
|
4560
5077
|
if (recursive && previous != node) {
|
|
4561
5078
|
// @ts-ignore
|
|
4562
|
-
if (hasDeclaration(previous)) {
|
|
5079
|
+
if (!hasDeclaration(previous)) {
|
|
4563
5080
|
// @ts-ignore
|
|
4564
|
-
minifyRule(previous);
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
minify(previous, options, recursive, errors, nestingContent);
|
|
5081
|
+
// minifyRule(previous, <MinifyOptions>options, ast, context);
|
|
5082
|
+
// } else {
|
|
5083
|
+
minify(previous, options, recursive, errors, nestingContent, context);
|
|
4568
5084
|
}
|
|
4569
5085
|
}
|
|
4570
5086
|
}
|
|
4571
5087
|
else {
|
|
4572
5088
|
if ('chi' in previous) {
|
|
4573
5089
|
// @ts-ignore
|
|
4574
|
-
if (hasDeclaration(previous)) {
|
|
5090
|
+
if (!hasDeclaration(previous)) {
|
|
4575
5091
|
// @ts-ignore
|
|
4576
|
-
minifyRule(previous);
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
minify(previous, options, recursive, errors, nestingContent);
|
|
5092
|
+
// minifyRule(previous, <MinifyOptions>options, ast, context);
|
|
5093
|
+
// } else {
|
|
5094
|
+
minify(previous, options, recursive, errors, nestingContent, context);
|
|
4580
5095
|
}
|
|
4581
5096
|
}
|
|
4582
5097
|
}
|
|
@@ -4585,7 +5100,7 @@
|
|
|
4585
5100
|
// @ts-ignore
|
|
4586
5101
|
previous != null &&
|
|
4587
5102
|
// previous.optimized != null &&
|
|
4588
|
-
previous.typ ==
|
|
5103
|
+
previous.typ == 4 /* NodeType.RuleNodeType */ &&
|
|
4589
5104
|
previous.sel.includes('&')) {
|
|
4590
5105
|
fixSelector(previous);
|
|
4591
5106
|
}
|
|
@@ -4595,13 +5110,10 @@
|
|
|
4595
5110
|
// @ts-ignore
|
|
4596
5111
|
if (recursive && node != null && ('chi' in node)) {
|
|
4597
5112
|
// @ts-ignore
|
|
4598
|
-
if (node.chi.some(n => n.typ ==
|
|
4599
|
-
minifyRule(node);
|
|
4600
|
-
}
|
|
4601
|
-
else {
|
|
5113
|
+
if (!node.chi.some(n => n.typ == 5 /* NodeType.DeclarationNodeType */)) {
|
|
4602
5114
|
// @ts-ignore
|
|
4603
|
-
if (!(node.typ ==
|
|
4604
|
-
minify(node, options, recursive, errors, nestingContent);
|
|
5115
|
+
if (!(node.typ == 3 /* NodeType.AtRuleNodeType */ && node.nam != 'font-face')) {
|
|
5116
|
+
minify(node, options, recursive, errors, nestingContent, context);
|
|
4605
5117
|
}
|
|
4606
5118
|
}
|
|
4607
5119
|
}
|
|
@@ -4609,11 +5121,46 @@
|
|
|
4609
5121
|
// @ts-ignore
|
|
4610
5122
|
node != null &&
|
|
4611
5123
|
// previous.optimized != null &&
|
|
4612
|
-
node.typ ==
|
|
5124
|
+
node.typ == 4 /* NodeType.RuleNodeType */ &&
|
|
4613
5125
|
node.sel.includes('&')) {
|
|
4614
5126
|
fixSelector(node);
|
|
4615
5127
|
}
|
|
4616
5128
|
}
|
|
5129
|
+
if (ast.typ == 2 /* NodeType.StyleSheetNodeType */) {
|
|
5130
|
+
let parent;
|
|
5131
|
+
let parents = [ast];
|
|
5132
|
+
while (parents.length > 0) {
|
|
5133
|
+
parent = parents.shift();
|
|
5134
|
+
// @ts-ignore
|
|
5135
|
+
for (let k = 0; k < parent.chi.length; k++) {
|
|
5136
|
+
// @ts-ignore
|
|
5137
|
+
const node = parent.chi[k];
|
|
5138
|
+
if (!('chi' in node) || node.typ == 2 /* NodeType.StyleSheetNodeType */ || (node.typ == 3 /* NodeType.AtRuleNodeType */ && node.nam == 'font-face')) {
|
|
5139
|
+
continue;
|
|
5140
|
+
}
|
|
5141
|
+
// @ts-ignore
|
|
5142
|
+
if (node.chi.length > 0) {
|
|
5143
|
+
parents.push(node);
|
|
5144
|
+
Object.defineProperty(node, 'parent', { ...definedPropertySettings, value: parent });
|
|
5145
|
+
for (const feature of options.features) {
|
|
5146
|
+
feature.run(node, options, parent, context);
|
|
5147
|
+
}
|
|
5148
|
+
}
|
|
5149
|
+
// @ts-ignore
|
|
5150
|
+
if (options.removeEmpty && node.chi.length == 0) {
|
|
5151
|
+
// @ts-ignore
|
|
5152
|
+
parent.chi.splice(k, 1);
|
|
5153
|
+
k--;
|
|
5154
|
+
}
|
|
5155
|
+
}
|
|
5156
|
+
}
|
|
5157
|
+
for (const feature of options.features) {
|
|
5158
|
+
if ('cleanup' in feature) {
|
|
5159
|
+
// @ts-ignore
|
|
5160
|
+
feature.cleanup(ast, options, context);
|
|
5161
|
+
}
|
|
5162
|
+
}
|
|
5163
|
+
}
|
|
4617
5164
|
return ast;
|
|
4618
5165
|
}
|
|
4619
5166
|
function reduceSelector(selector) {
|
|
@@ -4699,37 +5246,14 @@
|
|
|
4699
5246
|
// @ts-ignore
|
|
4700
5247
|
for (let i = 0; i < node.chi?.length; i++) {
|
|
4701
5248
|
// @ts-ignore
|
|
4702
|
-
if (node.chi[i].typ ==
|
|
5249
|
+
if (node.chi[i].typ == 0 /* NodeType.CommentNodeType */) {
|
|
4703
5250
|
continue;
|
|
4704
5251
|
}
|
|
4705
5252
|
// @ts-ignore
|
|
4706
|
-
return node.chi[i].typ ==
|
|
5253
|
+
return node.chi[i].typ == 5 /* NodeType.DeclarationNodeType */;
|
|
4707
5254
|
}
|
|
4708
5255
|
return true;
|
|
4709
5256
|
}
|
|
4710
|
-
function minifyRule(ast) {
|
|
4711
|
-
// @ts-ignore
|
|
4712
|
-
if (!('chi' in ast) || ast.chi?.length <= 1) {
|
|
4713
|
-
return ast;
|
|
4714
|
-
}
|
|
4715
|
-
// @ts-ignore
|
|
4716
|
-
const j = ast.chi.length;
|
|
4717
|
-
let k = 0;
|
|
4718
|
-
let properties = new PropertyList();
|
|
4719
|
-
// @ts-ignore
|
|
4720
|
-
for (; k < j; k++) {
|
|
4721
|
-
// @ts-ignore
|
|
4722
|
-
const node = ast.chi[k];
|
|
4723
|
-
if (node.typ == 'Comment' || node.typ == 'Declaration') {
|
|
4724
|
-
properties.add(node);
|
|
4725
|
-
continue;
|
|
4726
|
-
}
|
|
4727
|
-
break;
|
|
4728
|
-
}
|
|
4729
|
-
// @ts-ignore
|
|
4730
|
-
ast.chi = [...properties].concat(ast.chi.slice(k));
|
|
4731
|
-
return ast;
|
|
4732
|
-
}
|
|
4733
5257
|
function splitRule(buffer) {
|
|
4734
5258
|
const result = [[]];
|
|
4735
5259
|
let str = '';
|
|
@@ -4818,6 +5342,300 @@
|
|
|
4818
5342
|
}
|
|
4819
5343
|
return result;
|
|
4820
5344
|
}
|
|
5345
|
+
function matchSelectors(selector1, selector2, parentType, errors) {
|
|
5346
|
+
let match = [[]];
|
|
5347
|
+
const j = Math.min(selector1.reduce((acc, curr) => Math.min(acc, curr.length), selector1.length > 0 ? selector1[0].length : 0), selector2.reduce((acc, curr) => Math.min(acc, curr.length), selector2.length > 0 ? selector2[0].length : 0));
|
|
5348
|
+
let i = 0;
|
|
5349
|
+
let k;
|
|
5350
|
+
let l;
|
|
5351
|
+
let token;
|
|
5352
|
+
let matching = true;
|
|
5353
|
+
let matchFunction = 0;
|
|
5354
|
+
let inAttr = 0;
|
|
5355
|
+
for (; i < j; i++) {
|
|
5356
|
+
k = 0;
|
|
5357
|
+
token = selector1[0][i];
|
|
5358
|
+
for (; k < selector1.length; k++) {
|
|
5359
|
+
if (selector1[k][i] != token) {
|
|
5360
|
+
matching = false;
|
|
5361
|
+
break;
|
|
5362
|
+
}
|
|
5363
|
+
}
|
|
5364
|
+
if (matching) {
|
|
5365
|
+
l = 0;
|
|
5366
|
+
for (; l < selector2.length; l++) {
|
|
5367
|
+
if (selector2[l][i] != token) {
|
|
5368
|
+
matching = false;
|
|
5369
|
+
break;
|
|
5370
|
+
}
|
|
5371
|
+
}
|
|
5372
|
+
}
|
|
5373
|
+
if (!matching) {
|
|
5374
|
+
break;
|
|
5375
|
+
}
|
|
5376
|
+
if (token == ',') {
|
|
5377
|
+
match.push([]);
|
|
5378
|
+
}
|
|
5379
|
+
else {
|
|
5380
|
+
if (token.endsWith('(')) {
|
|
5381
|
+
matchFunction++;
|
|
5382
|
+
}
|
|
5383
|
+
if (token.endsWith('[')) {
|
|
5384
|
+
inAttr++;
|
|
5385
|
+
}
|
|
5386
|
+
else if (token == ')') {
|
|
5387
|
+
matchFunction--;
|
|
5388
|
+
}
|
|
5389
|
+
else if (token == ']') {
|
|
5390
|
+
inAttr--;
|
|
5391
|
+
}
|
|
5392
|
+
match.at(-1).push(token);
|
|
5393
|
+
}
|
|
5394
|
+
}
|
|
5395
|
+
// invalid function
|
|
5396
|
+
if (matchFunction != 0 || inAttr != 0) {
|
|
5397
|
+
return null;
|
|
5398
|
+
}
|
|
5399
|
+
if (parentType != 4 /* NodeType.RuleNodeType */) {
|
|
5400
|
+
for (const part of match) {
|
|
5401
|
+
if (part.length > 0 && combinators.includes(part[0].charAt(0))) {
|
|
5402
|
+
return null;
|
|
5403
|
+
}
|
|
5404
|
+
}
|
|
5405
|
+
}
|
|
5406
|
+
if (match.length > 1) {
|
|
5407
|
+
errors?.push({
|
|
5408
|
+
action: 'ignore',
|
|
5409
|
+
message: `minify: unsupported multilevel matching\n${JSON.stringify({
|
|
5410
|
+
match,
|
|
5411
|
+
selector1,
|
|
5412
|
+
selector2
|
|
5413
|
+
}, null, 1)}`
|
|
5414
|
+
});
|
|
5415
|
+
return null;
|
|
5416
|
+
}
|
|
5417
|
+
for (const part of match) {
|
|
5418
|
+
while (part.length > 0) {
|
|
5419
|
+
const token = part.at(-1);
|
|
5420
|
+
if (token == ' ' || combinators.includes(token) || notEndingWith.includes(token.at(-1))) {
|
|
5421
|
+
part.pop();
|
|
5422
|
+
continue;
|
|
5423
|
+
}
|
|
5424
|
+
break;
|
|
5425
|
+
}
|
|
5426
|
+
}
|
|
5427
|
+
if (match.every(t => t.length == 0)) {
|
|
5428
|
+
return null;
|
|
5429
|
+
}
|
|
5430
|
+
if (eq([['&']], match)) {
|
|
5431
|
+
return null;
|
|
5432
|
+
}
|
|
5433
|
+
function reduce(acc, curr) {
|
|
5434
|
+
if (acc === null) {
|
|
5435
|
+
return null;
|
|
5436
|
+
}
|
|
5437
|
+
let hasCompoundSelector = true;
|
|
5438
|
+
curr = curr.slice(match[0].length);
|
|
5439
|
+
while (curr.length > 0) {
|
|
5440
|
+
if (curr[0] == ' ') {
|
|
5441
|
+
hasCompoundSelector = false;
|
|
5442
|
+
curr.unshift('&');
|
|
5443
|
+
continue;
|
|
5444
|
+
}
|
|
5445
|
+
break;
|
|
5446
|
+
}
|
|
5447
|
+
// invalid function match
|
|
5448
|
+
if (curr.length > 0 && curr[0].endsWith('(') && curr.at(-1) != ')') {
|
|
5449
|
+
return null;
|
|
5450
|
+
}
|
|
5451
|
+
if (curr.length == 1 && combinators.includes(curr[0].charAt(0))) {
|
|
5452
|
+
return null;
|
|
5453
|
+
}
|
|
5454
|
+
if (hasCompoundSelector && curr.length > 0) {
|
|
5455
|
+
hasCompoundSelector = !['&'].concat(combinators).includes(curr[0].charAt(0));
|
|
5456
|
+
}
|
|
5457
|
+
if (curr[0] == ':is(') {
|
|
5458
|
+
let inFunction = 0;
|
|
5459
|
+
let canReduce = true;
|
|
5460
|
+
const isCompound = curr.reduce((acc, token, index) => {
|
|
5461
|
+
if (index == 0) {
|
|
5462
|
+
inFunction++;
|
|
5463
|
+
canReduce = curr[1] == '&';
|
|
5464
|
+
}
|
|
5465
|
+
else if (token.endsWith('(')) {
|
|
5466
|
+
if (inFunction == 0) {
|
|
5467
|
+
canReduce = false;
|
|
5468
|
+
}
|
|
5469
|
+
inFunction++;
|
|
5470
|
+
}
|
|
5471
|
+
else if (token == ')') {
|
|
5472
|
+
inFunction--;
|
|
5473
|
+
}
|
|
5474
|
+
else if (token == ',') {
|
|
5475
|
+
if (!canReduce) {
|
|
5476
|
+
canReduce = curr[index + 1] == '&';
|
|
5477
|
+
}
|
|
5478
|
+
acc.push([]);
|
|
5479
|
+
}
|
|
5480
|
+
else
|
|
5481
|
+
acc.at(-1)?.push(token);
|
|
5482
|
+
return acc;
|
|
5483
|
+
}, [[]]);
|
|
5484
|
+
if (inFunction > 0) {
|
|
5485
|
+
canReduce = false;
|
|
5486
|
+
}
|
|
5487
|
+
if (canReduce) {
|
|
5488
|
+
curr = isCompound.reduce((acc, curr) => {
|
|
5489
|
+
if (acc.length > 0) {
|
|
5490
|
+
acc.push(',');
|
|
5491
|
+
}
|
|
5492
|
+
acc.push(...curr);
|
|
5493
|
+
return acc;
|
|
5494
|
+
}, []);
|
|
5495
|
+
}
|
|
5496
|
+
}
|
|
5497
|
+
// @todo: check hasCompoundSelector && curr[0] == '&' && curr[1] == ' '
|
|
5498
|
+
acc.push(match.length == 0 ? ['&'] : (hasCompoundSelector && curr[0] != '&' && (curr.length == 0 || !combinators.includes(curr[0].charAt(0))) ? ['&'].concat(curr) : curr));
|
|
5499
|
+
return acc;
|
|
5500
|
+
}
|
|
5501
|
+
// @ts-ignore
|
|
5502
|
+
selector1 = selector1.reduce(reduce, []);
|
|
5503
|
+
// @ts-ignore
|
|
5504
|
+
selector2 = selector2.reduce(reduce, []);
|
|
5505
|
+
return selector1 == null || selector2 == null ? null : {
|
|
5506
|
+
eq: eq(selector1, selector2),
|
|
5507
|
+
match,
|
|
5508
|
+
selector1,
|
|
5509
|
+
selector2
|
|
5510
|
+
};
|
|
5511
|
+
}
|
|
5512
|
+
function fixSelector(node) {
|
|
5513
|
+
// @ts-ignore
|
|
5514
|
+
if (node.sel.includes('&')) {
|
|
5515
|
+
const attributes = parseString(node.sel);
|
|
5516
|
+
for (const attr of walkValues(attributes)) {
|
|
5517
|
+
if (attr.value.typ == exports.EnumToken.PseudoClassFuncTokenType && attr.value.val == ':is') {
|
|
5518
|
+
let i = attr.value.chi.length;
|
|
5519
|
+
while (i--) {
|
|
5520
|
+
if (attr.value.chi[i].typ == exports.EnumToken.LiteralTokenType && attr.value.chi[i].val == '&') {
|
|
5521
|
+
attr.value.chi.splice(i, 1);
|
|
5522
|
+
}
|
|
5523
|
+
}
|
|
5524
|
+
}
|
|
5525
|
+
}
|
|
5526
|
+
node.sel = attributes.reduce((acc, curr) => acc + renderToken(curr), '');
|
|
5527
|
+
}
|
|
5528
|
+
}
|
|
5529
|
+
function wrapNodes(previous, node, match, ast, reducer, i, nodeIndex) {
|
|
5530
|
+
// @ts-ignore
|
|
5531
|
+
let pSel = match.selector1.reduce(reducer, []).join(',');
|
|
5532
|
+
// @ts-ignore
|
|
5533
|
+
let nSel = match.selector2.reduce(reducer, []).join(',');
|
|
5534
|
+
// @ts-ignore
|
|
5535
|
+
const wrapper = { ...previous, chi: [], sel: match.match.reduce(reducer, []).join(',') };
|
|
5536
|
+
// @ts-ignore
|
|
5537
|
+
Object.defineProperty(wrapper, 'raw', {
|
|
5538
|
+
...definedPropertySettings,
|
|
5539
|
+
// @ts-ignore
|
|
5540
|
+
value: match.match.map(t => t.slice())
|
|
5541
|
+
});
|
|
5542
|
+
if (pSel == '&' || pSel === '') {
|
|
5543
|
+
// @ts-ignore
|
|
5544
|
+
wrapper.chi.push(...previous.chi);
|
|
5545
|
+
// @ts-ignore
|
|
5546
|
+
if ((nSel == '&' || nSel === '')) {
|
|
5547
|
+
// @ts-ignore
|
|
5548
|
+
wrapper.chi.push(...node.chi);
|
|
5549
|
+
}
|
|
5550
|
+
else {
|
|
5551
|
+
// @ts-ignore
|
|
5552
|
+
wrapper.chi.push(node);
|
|
5553
|
+
}
|
|
5554
|
+
}
|
|
5555
|
+
else {
|
|
5556
|
+
// @ts-ignore
|
|
5557
|
+
wrapper.chi.push(previous, node);
|
|
5558
|
+
}
|
|
5559
|
+
// @ts-ignore
|
|
5560
|
+
ast.chi.splice(i, 1, wrapper);
|
|
5561
|
+
// @ts-ignore
|
|
5562
|
+
ast.chi.splice(nodeIndex, 1);
|
|
5563
|
+
// @ts-ignore
|
|
5564
|
+
previous.sel = pSel;
|
|
5565
|
+
// @ts-ignore
|
|
5566
|
+
previous.raw = match.selector1;
|
|
5567
|
+
// @ts-ignore
|
|
5568
|
+
node.sel = nSel;
|
|
5569
|
+
// @ts-ignore
|
|
5570
|
+
node.raw = match.selector2;
|
|
5571
|
+
reduceRuleSelector(wrapper);
|
|
5572
|
+
return wrapper;
|
|
5573
|
+
}
|
|
5574
|
+
function diff(n1, n2, reducer, options = {}) {
|
|
5575
|
+
let node1 = n1;
|
|
5576
|
+
let node2 = n2;
|
|
5577
|
+
let exchanged = false;
|
|
5578
|
+
if (node1.chi.length > node2.chi.length) {
|
|
5579
|
+
const t = node1;
|
|
5580
|
+
node1 = node2;
|
|
5581
|
+
node2 = t;
|
|
5582
|
+
exchanged = true;
|
|
5583
|
+
}
|
|
5584
|
+
let i = node1.chi.length;
|
|
5585
|
+
let j = node2.chi.length;
|
|
5586
|
+
if (i == 0 || j == 0) {
|
|
5587
|
+
// @ts-ignore
|
|
5588
|
+
return null;
|
|
5589
|
+
}
|
|
5590
|
+
// @ts-ignore
|
|
5591
|
+
const raw1 = node1.raw;
|
|
5592
|
+
// @ts-ignore
|
|
5593
|
+
const raw2 = node2.raw;
|
|
5594
|
+
// @ts-ignore
|
|
5595
|
+
node1 = { ...node1, chi: node1.chi.slice() };
|
|
5596
|
+
node2 = { ...node2, chi: node2.chi.slice() };
|
|
5597
|
+
if (raw1 != null) {
|
|
5598
|
+
Object.defineProperty(node1, 'raw', { ...definedPropertySettings, value: raw1 });
|
|
5599
|
+
}
|
|
5600
|
+
if (raw2 != null) {
|
|
5601
|
+
Object.defineProperty(node2, 'raw', { ...definedPropertySettings, value: raw2 });
|
|
5602
|
+
}
|
|
5603
|
+
const intersect = [];
|
|
5604
|
+
while (i--) {
|
|
5605
|
+
if (node1.chi[i].typ == 0 /* NodeType.CommentNodeType */) {
|
|
5606
|
+
continue;
|
|
5607
|
+
}
|
|
5608
|
+
j = node2.chi.length;
|
|
5609
|
+
if (j == 0) {
|
|
5610
|
+
break;
|
|
5611
|
+
}
|
|
5612
|
+
while (j--) {
|
|
5613
|
+
if (node2.chi[j].typ == 0 /* NodeType.CommentNodeType */) {
|
|
5614
|
+
continue;
|
|
5615
|
+
}
|
|
5616
|
+
if (node1.chi[i].nam == node2.chi[j].nam) {
|
|
5617
|
+
if (eq(node1.chi[i], node2.chi[j])) {
|
|
5618
|
+
intersect.push(node1.chi[i]);
|
|
5619
|
+
node1.chi.splice(i, 1);
|
|
5620
|
+
node2.chi.splice(j, 1);
|
|
5621
|
+
break;
|
|
5622
|
+
}
|
|
5623
|
+
}
|
|
5624
|
+
}
|
|
5625
|
+
}
|
|
5626
|
+
// @ts-ignore
|
|
5627
|
+
const result = (intersect.length == 0 ? null : {
|
|
5628
|
+
...node1,
|
|
5629
|
+
// @ts-ignore
|
|
5630
|
+
sel: [...new Set([...(n1?.raw?.reduce(reducer, []) || splitRule(n1.sel)).concat(n2?.raw?.reduce(reducer, []) || splitRule(n2.sel))])].join(','),
|
|
5631
|
+
chi: intersect.reverse()
|
|
5632
|
+
});
|
|
5633
|
+
if (result == null || [n1, n2].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + doRender(curr, options).code.length, 0) <= [node1, node2, result].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + doRender(curr, options).code.length, 0)) {
|
|
5634
|
+
// @ts-ignore
|
|
5635
|
+
return null;
|
|
5636
|
+
}
|
|
5637
|
+
return { result, node1: exchanged ? node2 : node1, node2: exchanged ? node1 : node2 };
|
|
5638
|
+
}
|
|
4821
5639
|
function reduceRuleSelector(node) {
|
|
4822
5640
|
if (node.raw == null) {
|
|
4823
5641
|
Object.defineProperty(node, 'raw', { ...definedPropertySettings, value: splitRule(node.sel) });
|
|
@@ -4853,25 +5671,6 @@
|
|
|
4853
5671
|
}
|
|
4854
5672
|
}
|
|
4855
5673
|
|
|
4856
|
-
async function transform$1(css, options = {}) {
|
|
4857
|
-
options = { minify: true, removeEmpty: true, ...options };
|
|
4858
|
-
const startTime = performance.now();
|
|
4859
|
-
return parse$1(css, options).then((parseResult) => {
|
|
4860
|
-
const rendered = render(parseResult.ast, options);
|
|
4861
|
-
return {
|
|
4862
|
-
...parseResult,
|
|
4863
|
-
...rendered,
|
|
4864
|
-
errors: parseResult.errors.concat(rendered.errors),
|
|
4865
|
-
stats: {
|
|
4866
|
-
bytesOut: rendered.code.length,
|
|
4867
|
-
...parseResult.stats,
|
|
4868
|
-
render: rendered.stats.total,
|
|
4869
|
-
total: `${(performance.now() - startTime).toFixed(2)}ms`
|
|
4870
|
-
}
|
|
4871
|
-
};
|
|
4872
|
-
});
|
|
4873
|
-
}
|
|
4874
|
-
|
|
4875
5674
|
const matchUrl = /^(https?:)?\/\//;
|
|
4876
5675
|
function dirname(path) {
|
|
4877
5676
|
if (path == '/' || path === '') {
|
|
@@ -4988,24 +5787,46 @@
|
|
|
4988
5787
|
return fetch(resolve(url, currentFile).absolute).then(parseResponse);
|
|
4989
5788
|
}
|
|
4990
5789
|
|
|
4991
|
-
|
|
4992
|
-
return
|
|
5790
|
+
function render(data, options = {}) {
|
|
5791
|
+
return doRender(data, Object.assign(options, {
|
|
4993
5792
|
load,
|
|
4994
5793
|
resolve,
|
|
4995
|
-
|
|
5794
|
+
dirname,
|
|
5795
|
+
cwd: options.cwd ?? self.location.pathname.endsWith('/') ? self.location.pathname : dirname(self.location.pathname)
|
|
4996
5796
|
}));
|
|
4997
5797
|
}
|
|
4998
|
-
async function
|
|
4999
|
-
return
|
|
5798
|
+
async function parse(iterator, opt = {}) {
|
|
5799
|
+
return doParse(iterator, Object.assign(opt, {
|
|
5000
5800
|
load,
|
|
5001
5801
|
resolve,
|
|
5002
|
-
|
|
5802
|
+
dirname,
|
|
5803
|
+
cwd: opt.cwd ?? self.location.pathname.endsWith('/') ? self.location.pathname : dirname(self.location.pathname)
|
|
5003
5804
|
}));
|
|
5004
5805
|
}
|
|
5806
|
+
async function transform(css, options = {}) {
|
|
5807
|
+
options = { minify: true, removeEmpty: true, removeCharset: true, ...options };
|
|
5808
|
+
const startTime = performance.now();
|
|
5809
|
+
return parse(css, options).then((parseResult) => {
|
|
5810
|
+
const rendered = render(parseResult.ast, options);
|
|
5811
|
+
return {
|
|
5812
|
+
...parseResult,
|
|
5813
|
+
...rendered,
|
|
5814
|
+
errors: parseResult.errors.concat(rendered.errors),
|
|
5815
|
+
stats: {
|
|
5816
|
+
bytesOut: rendered.code.length,
|
|
5817
|
+
...parseResult.stats,
|
|
5818
|
+
render: rendered.stats.total,
|
|
5819
|
+
total: `${(performance.now() - startTime).toFixed(2)}ms`
|
|
5820
|
+
}
|
|
5821
|
+
};
|
|
5822
|
+
});
|
|
5823
|
+
}
|
|
5005
5824
|
|
|
5006
5825
|
exports.colorsFunc = colorsFunc;
|
|
5007
5826
|
exports.combinators = combinators;
|
|
5008
5827
|
exports.dirname = dirname;
|
|
5828
|
+
exports.doParse = doParse;
|
|
5829
|
+
exports.doRender = doRender;
|
|
5009
5830
|
exports.expand = expand;
|
|
5010
5831
|
exports.funcList = funcList;
|
|
5011
5832
|
exports.getConfig = getConfig;
|
|
@@ -5035,10 +5856,11 @@
|
|
|
5035
5856
|
exports.matchType = matchType;
|
|
5036
5857
|
exports.matchUrl = matchUrl;
|
|
5037
5858
|
exports.minify = minify;
|
|
5038
|
-
exports.minifyRule = minifyRule;
|
|
5039
5859
|
exports.parse = parse;
|
|
5040
5860
|
exports.parseDimension = parseDimension;
|
|
5041
5861
|
exports.parseString = parseString;
|
|
5862
|
+
exports.parseTokens = parseTokens;
|
|
5863
|
+
exports.reduceNumber = reduceNumber;
|
|
5042
5864
|
exports.reduceSelector = reduceSelector;
|
|
5043
5865
|
exports.render = render;
|
|
5044
5866
|
exports.renderToken = renderToken;
|