less 4.4.2 → 4.6.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/bin/lessc +67 -58
- package/dist/less.js +14496 -11811
- package/dist/less.min.js +4 -4
- package/dist/less.min.js.map +1 -1
- package/lib/less/constants.js +5 -7
- package/lib/less/contexts.js +71 -56
- package/lib/less/data/colors.js +150 -153
- package/lib/less/data/index.js +4 -7
- package/lib/less/data/unit-conversions.js +2 -5
- package/lib/less/default-options.js +52 -23
- package/lib/less/deprecation.js +67 -0
- package/lib/less/environment/abstract-file-manager.js +62 -50
- package/lib/less/environment/abstract-plugin-loader.js +69 -46
- package/lib/less/environment/environment-api.ts +21 -0
- package/lib/less/environment/environment.js +34 -30
- package/lib/less/environment/file-manager-api.ts +77 -0
- package/lib/less/functions/boolean.js +13 -13
- package/lib/less/functions/color-blending.js +39 -31
- package/lib/less/functions/color.js +153 -137
- package/lib/less/functions/data-uri.js +73 -64
- package/lib/less/functions/default.js +9 -11
- package/lib/less/functions/function-caller.js +35 -34
- package/lib/less/functions/function-registry.js +16 -17
- package/lib/less/functions/index.js +33 -33
- package/lib/less/functions/list.js +88 -75
- package/lib/less/functions/math-helper.js +8 -11
- package/lib/less/functions/math.js +21 -21
- package/lib/less/functions/number.js +42 -53
- package/lib/less/functions/string.js +18 -22
- package/lib/less/functions/style.js +21 -20
- package/lib/less/functions/svg.js +83 -82
- package/lib/less/functions/types.js +28 -32
- package/lib/less/import-manager.js +73 -64
- package/lib/less/index.js +65 -65
- package/lib/less/less-error.js +65 -46
- package/lib/less/logger.js +11 -14
- package/lib/less/parse-tree.js +94 -38
- package/lib/less/parse.js +44 -44
- package/lib/less/parser/parser-input.js +152 -131
- package/lib/less/parser/parser.js +866 -672
- package/lib/less/plugin-manager.js +57 -46
- package/lib/less/render.js +17 -23
- package/lib/less/source-map-builder.js +52 -43
- package/lib/less/source-map-output.js +57 -44
- package/lib/less/transform-tree.js +40 -30
- package/lib/less/tree/anonymous.js +52 -28
- package/lib/less/tree/assignment.js +44 -27
- package/lib/less/tree/atrule-syntax.js +4 -6
- package/lib/less/tree/atrule.js +247 -140
- package/lib/less/tree/attribute.js +55 -24
- package/lib/less/tree/call.js +70 -42
- package/lib/less/tree/color.js +194 -145
- package/lib/less/tree/combinator.js +31 -21
- package/lib/less/tree/comment.js +44 -23
- package/lib/less/tree/condition.js +61 -36
- package/lib/less/tree/container.js +90 -34
- package/lib/less/tree/debug-info.js +53 -11
- package/lib/less/tree/declaration.js +97 -52
- package/lib/less/tree/detached-ruleset.js +42 -24
- package/lib/less/tree/dimension.js +127 -71
- package/lib/less/tree/element.js +82 -52
- package/lib/less/tree/expression.js +75 -50
- package/lib/less/tree/extend.js +71 -42
- package/lib/less/tree/import.js +184 -110
- package/lib/less/tree/index.js +52 -81
- package/lib/less/tree/javascript.js +43 -32
- package/lib/less/tree/js-eval-node.js +46 -32
- package/lib/less/tree/keyword.js +25 -17
- package/lib/less/tree/media.js +77 -35
- package/lib/less/tree/merge-rules.js +47 -0
- package/lib/less/tree/mixin-call.js +181 -98
- package/lib/less/tree/mixin-definition.js +211 -117
- package/lib/less/tree/namespace-value.js +63 -44
- package/lib/less/tree/negative.js +34 -21
- package/lib/less/tree/nested-at-rule.js +149 -66
- package/lib/less/tree/node.js +225 -90
- package/lib/less/tree/operation.js +59 -34
- package/lib/less/tree/paren.js +34 -17
- package/lib/less/tree/property.js +66 -35
- package/lib/less/tree/query-in-parens.js +52 -60
- package/lib/less/tree/quoted.js +93 -44
- package/lib/less/tree/ruleset.js +632 -318
- package/lib/less/tree/selector.js +151 -77
- package/lib/less/tree/unicode-descriptor.js +14 -12
- package/lib/less/tree/unit.js +111 -63
- package/lib/less/tree/url.js +62 -38
- package/lib/less/tree/value.js +50 -34
- package/lib/less/tree/variable-call.js +47 -30
- package/lib/less/tree/variable.js +53 -31
- package/lib/less/utils.js +44 -47
- package/lib/less/visitors/extend-visitor.js +233 -172
- package/lib/less/visitors/import-sequencer.js +24 -24
- package/lib/less/visitors/import-visitor.js +62 -52
- package/lib/less/visitors/index.js +14 -17
- package/lib/less/visitors/join-selector-visitor.js +40 -37
- package/lib/less/visitors/set-tree-visibility-visitor.js +32 -18
- package/lib/less/visitors/to-css-visitor.js +135 -128
- package/lib/less/visitors/visitor.js +60 -45
- package/lib/less-browser/add-default-options.js +23 -13
- package/lib/less-browser/bootstrap.js +23 -17
- package/lib/less-browser/browser.js +24 -21
- package/lib/less-browser/cache.js +17 -19
- package/lib/less-browser/error-reporting.js +52 -44
- package/lib/less-browser/file-manager.js +52 -42
- package/lib/less-browser/image-size.js +12 -12
- package/lib/less-browser/index.js +131 -105
- package/lib/less-browser/log-listener.js +30 -31
- package/lib/less-browser/plugin-loader.js +10 -10
- package/lib/less-browser/utils.js +19 -21
- package/lib/less-node/environment.js +32 -8
- package/lib/less-node/file-manager.js +62 -45
- package/lib/less-node/fs.js +11 -8
- package/lib/less-node/image-size.js +40 -31
- package/lib/less-node/index.js +28 -19
- package/lib/less-node/lessc-helper.js +28 -28
- package/lib/less-node/plugin-loader.js +35 -27
- package/lib/less-node/url-file-manager.js +33 -31
- package/package.json +31 -19
- package/.eslintignore +0 -6
- package/.eslintrc.js +0 -63
- package/Gruntfile.js +0 -404
- package/bower.json +0 -22
- package/lib/less/constants.js.map +0 -1
- package/lib/less/contexts.js.map +0 -1
- package/lib/less/data/colors.js.map +0 -1
- package/lib/less/data/index.js.map +0 -1
- package/lib/less/data/unit-conversions.js.map +0 -1
- package/lib/less/default-options.js.map +0 -1
- package/lib/less/environment/abstract-file-manager.js.map +0 -1
- package/lib/less/environment/abstract-plugin-loader.js.map +0 -1
- package/lib/less/environment/environment-api.js +0 -3
- package/lib/less/environment/environment-api.js.map +0 -1
- package/lib/less/environment/environment.js.map +0 -1
- package/lib/less/environment/file-manager-api.js +0 -3
- package/lib/less/environment/file-manager-api.js.map +0 -1
- package/lib/less/functions/boolean.js.map +0 -1
- package/lib/less/functions/color-blending.js.map +0 -1
- package/lib/less/functions/color.js.map +0 -1
- package/lib/less/functions/data-uri.js.map +0 -1
- package/lib/less/functions/default.js.map +0 -1
- package/lib/less/functions/function-caller.js.map +0 -1
- package/lib/less/functions/function-registry.js.map +0 -1
- package/lib/less/functions/index.js.map +0 -1
- package/lib/less/functions/list.js.map +0 -1
- package/lib/less/functions/math-helper.js.map +0 -1
- package/lib/less/functions/math.js.map +0 -1
- package/lib/less/functions/number.js.map +0 -1
- package/lib/less/functions/string.js.map +0 -1
- package/lib/less/functions/style.js.map +0 -1
- package/lib/less/functions/svg.js.map +0 -1
- package/lib/less/functions/types.js.map +0 -1
- package/lib/less/import-manager.js.map +0 -1
- package/lib/less/index.js.map +0 -1
- package/lib/less/less-error.js.map +0 -1
- package/lib/less/logger.js.map +0 -1
- package/lib/less/parse-tree.js.map +0 -1
- package/lib/less/parse.js.map +0 -1
- package/lib/less/parser/chunker.js +0 -148
- package/lib/less/parser/chunker.js.map +0 -1
- package/lib/less/parser/parser-input.js.map +0 -1
- package/lib/less/parser/parser.js.map +0 -1
- package/lib/less/plugin-manager.js.map +0 -1
- package/lib/less/render.js.map +0 -1
- package/lib/less/source-map-builder.js.map +0 -1
- package/lib/less/source-map-output.js.map +0 -1
- package/lib/less/transform-tree.js.map +0 -1
- package/lib/less/tree/anonymous.js.map +0 -1
- package/lib/less/tree/assignment.js.map +0 -1
- package/lib/less/tree/atrule-syntax.js.map +0 -1
- package/lib/less/tree/atrule.js.map +0 -1
- package/lib/less/tree/attribute.js.map +0 -1
- package/lib/less/tree/call.js.map +0 -1
- package/lib/less/tree/color.js.map +0 -1
- package/lib/less/tree/combinator.js.map +0 -1
- package/lib/less/tree/comment.js.map +0 -1
- package/lib/less/tree/condition.js.map +0 -1
- package/lib/less/tree/container.js.map +0 -1
- package/lib/less/tree/debug-info.js.map +0 -1
- package/lib/less/tree/declaration.js.map +0 -1
- package/lib/less/tree/detached-ruleset.js.map +0 -1
- package/lib/less/tree/dimension.js.map +0 -1
- package/lib/less/tree/element.js.map +0 -1
- package/lib/less/tree/expression.js.map +0 -1
- package/lib/less/tree/extend.js.map +0 -1
- package/lib/less/tree/import.js.map +0 -1
- package/lib/less/tree/index.js.map +0 -1
- package/lib/less/tree/javascript.js.map +0 -1
- package/lib/less/tree/js-eval-node.js.map +0 -1
- package/lib/less/tree/keyword.js.map +0 -1
- package/lib/less/tree/media.js.map +0 -1
- package/lib/less/tree/mixin-call.js.map +0 -1
- package/lib/less/tree/mixin-definition.js.map +0 -1
- package/lib/less/tree/namespace-value.js.map +0 -1
- package/lib/less/tree/negative.js.map +0 -1
- package/lib/less/tree/nested-at-rule.js.map +0 -1
- package/lib/less/tree/node.js.map +0 -1
- package/lib/less/tree/operation.js.map +0 -1
- package/lib/less/tree/paren.js.map +0 -1
- package/lib/less/tree/property.js.map +0 -1
- package/lib/less/tree/query-in-parens.js.map +0 -1
- package/lib/less/tree/quoted.js.map +0 -1
- package/lib/less/tree/ruleset.js.map +0 -1
- package/lib/less/tree/selector.js.map +0 -1
- package/lib/less/tree/unicode-descriptor.js.map +0 -1
- package/lib/less/tree/unit.js.map +0 -1
- package/lib/less/tree/url.js.map +0 -1
- package/lib/less/tree/value.js.map +0 -1
- package/lib/less/tree/variable-call.js.map +0 -1
- package/lib/less/tree/variable.js.map +0 -1
- package/lib/less/utils.js.map +0 -1
- package/lib/less/visitors/extend-visitor.js.map +0 -1
- package/lib/less/visitors/import-sequencer.js.map +0 -1
- package/lib/less/visitors/import-visitor.js.map +0 -1
- package/lib/less/visitors/index.js.map +0 -1
- package/lib/less/visitors/join-selector-visitor.js.map +0 -1
- package/lib/less/visitors/set-tree-visibility-visitor.js.map +0 -1
- package/lib/less/visitors/to-css-visitor.js.map +0 -1
- package/lib/less/visitors/visitor.js.map +0 -1
- package/lib/less-browser/add-default-options.js.map +0 -1
- package/lib/less-browser/bootstrap.js.map +0 -1
- package/lib/less-browser/browser.js.map +0 -1
- package/lib/less-browser/cache.js.map +0 -1
- package/lib/less-browser/error-reporting.js.map +0 -1
- package/lib/less-browser/file-manager.js.map +0 -1
- package/lib/less-browser/image-size.js.map +0 -1
- package/lib/less-browser/index.js.map +0 -1
- package/lib/less-browser/log-listener.js.map +0 -1
- package/lib/less-browser/plugin-loader.js.map +0 -1
- package/lib/less-browser/utils.js.map +0 -1
- package/lib/less-node/environment.js.map +0 -1
- package/lib/less-node/file-manager.js.map +0 -1
- package/lib/less-node/fs.js.map +0 -1
- package/lib/less-node/image-size.js.map +0 -1
- package/lib/less-node/index.js.map +0 -1
- package/lib/less-node/lessc-helper.js.map +0 -1
- package/lib/less-node/plugin-loader.js.map +0 -1
- package/lib/less-node/url-file-manager.js.map +0 -1
- package/test/.eslintrc.json +0 -9
- package/test/README.md +0 -3
- package/test/browser/common.js +0 -230
- package/test/browser/css/global-vars/simple.css +0 -3
- package/test/browser/css/modify-vars/simple.css +0 -8
- package/test/browser/css/plugin/plugin.css +0 -3
- package/test/browser/css/postProcessor/postProcessor.css +0 -4
- package/test/browser/css/relative-urls/urls.css +0 -36
- package/test/browser/css/rewrite-urls/urls.css +0 -36
- package/test/browser/css/rootpath/urls.css +0 -35
- package/test/browser/css/rootpath-relative/urls.css +0 -35
- package/test/browser/css/rootpath-rewrite-urls/urls.css +0 -35
- package/test/browser/css/urls.css +0 -54
- package/test/browser/generator/benchmark.config.js +0 -50
- package/test/browser/generator/generate.js +0 -78
- package/test/browser/generator/runner.config.js +0 -188
- package/test/browser/generator/runner.js +0 -2
- package/test/browser/generator/template.js +0 -93
- package/test/browser/generator/utils.js +0 -14
- package/test/browser/less/console-errors/test-error.less +0 -3
- package/test/browser/less/console-errors/test-error.txt +0 -2
- package/test/browser/less/errors/image-height-error.less +0 -3
- package/test/browser/less/errors/image-height-error.txt +0 -4
- package/test/browser/less/errors/image-size-error.less +0 -3
- package/test/browser/less/errors/image-size-error.txt +0 -4
- package/test/browser/less/errors/image-width-error.less +0 -3
- package/test/browser/less/errors/image-width-error.txt +0 -4
- package/test/browser/less/global-vars/simple.less +0 -3
- package/test/browser/less/imports/urls.less +0 -4
- package/test/browser/less/imports/urls2.less +0 -4
- package/test/browser/less/modify-vars/imports/simple2.less +0 -4
- package/test/browser/less/modify-vars/simple.less +0 -8
- package/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less +0 -5
- package/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +0 -15
- package/test/browser/less/plugin/plugin.js +0 -4
- package/test/browser/less/plugin/plugin.less +0 -4
- package/test/browser/less/postProcessor/postProcessor.less +0 -4
- package/test/browser/less/relative-urls/urls.less +0 -34
- package/test/browser/less/rewrite-urls/urls.less +0 -34
- package/test/browser/less/rootpath/urls.less +0 -33
- package/test/browser/less/rootpath-relative/urls.less +0 -33
- package/test/browser/less/rootpath-rewrite-urls/urls.less +0 -33
- package/test/browser/less/urls.less +0 -62
- package/test/browser/runner-VisitorPlugin-options.js +0 -3
- package/test/browser/runner-VisitorPlugin.js +0 -3
- package/test/browser/runner-browser-options.js +0 -51
- package/test/browser/runner-browser-spec.js +0 -12
- package/test/browser/runner-console-errors.js +0 -5
- package/test/browser/runner-errors-options.js +0 -6
- package/test/browser/runner-errors-spec.js +0 -3
- package/test/browser/runner-filemanagerPlugin-options.js +0 -5
- package/test/browser/runner-filemanagerPlugin.js +0 -3
- package/test/browser/runner-global-vars-options.js +0 -7
- package/test/browser/runner-global-vars-spec.js +0 -3
- package/test/browser/runner-legacy-options.js +0 -6
- package/test/browser/runner-legacy-spec.js +0 -3
- package/test/browser/runner-main-options.js +0 -17
- package/test/browser/runner-main-spec.js +0 -7
- package/test/browser/runner-modify-vars-options.js +0 -5
- package/test/browser/runner-modify-vars-spec.js +0 -33
- package/test/browser/runner-no-js-errors-options.js +0 -4
- package/test/browser/runner-no-js-errors-spec.js +0 -3
- package/test/browser/runner-postProcessorPlugin-options.js +0 -3
- package/test/browser/runner-postProcessorPlugin.js +0 -3
- package/test/browser/runner-preProcessorPlugin-options.js +0 -3
- package/test/browser/runner-preProcessorPlugin.js +0 -3
- package/test/browser/runner-production-options.js +0 -3
- package/test/browser/runner-production-spec.js +0 -5
- package/test/browser/runner-relative-urls-options.js +0 -3
- package/test/browser/runner-relative-urls-spec.js +0 -3
- package/test/browser/runner-rewrite-urls-options.js +0 -3
- package/test/browser/runner-rewrite-urls-spec.js +0 -3
- package/test/browser/runner-rootpath-options.js +0 -3
- package/test/browser/runner-rootpath-relative-options.js +0 -4
- package/test/browser/runner-rootpath-relative-spec.js +0 -3
- package/test/browser/runner-rootpath-rewrite-urls-options.js +0 -4
- package/test/browser/runner-rootpath-rewrite-urls-spec.js +0 -3
- package/test/browser/runner-rootpath-spec.js +0 -3
- package/test/browser/runner-strict-units-options.js +0 -5
- package/test/browser/runner-strict-units-spec.js +0 -3
- package/test/index.js +0 -112
- package/test/less-test.js +0 -625
- package/test/mocha-playwright/runner.js +0 -210
- package/test/modify-vars.js +0 -28
- package/test/plugins/filemanager/index.js +0 -19
- package/test/plugins/postprocess/index.js +0 -14
- package/test/plugins/preprocess/index.js +0 -19
- package/test/plugins/visitor/index.js +0 -24
- package/test/sourcemaps/basic.json +0 -1
- package/test/sourcemaps/custom-props.json +0 -1
- package/test/sourcemaps/index.html +0 -17
- package/test/sourcemaps-disable-annotation/basic.json +0 -1
- package/test/sourcemaps-variable-selector/basic.json +0 -1
- package/test/test-es6.ts +0 -17
- package/tsconfig.build.json +0 -7
- package/tsconfig.json +0 -21
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var tslib_1 = require("tslib");
|
|
4
1
|
/* eslint-disable no-unused-vars */
|
|
5
2
|
/**
|
|
6
3
|
* @todo - Remove unused when JSDoc types are added for visitor methods
|
|
7
4
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
import tree from '../tree/index.js';
|
|
6
|
+
import Visitor from './visitor.js';
|
|
7
|
+
import mergeRules from '../tree/merge-rules.js';
|
|
8
|
+
|
|
9
|
+
class CSSVisitorUtils {
|
|
10
|
+
constructor(context) {
|
|
11
|
+
this._visitor = new Visitor(this);
|
|
13
12
|
this._context = context;
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
|
|
15
|
+
containsSilentNonBlockedChild(bodyRules) {
|
|
16
|
+
let rule;
|
|
17
17
|
if (!bodyRules) {
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
|
-
for (
|
|
20
|
+
for (let r = 0; r < bodyRules.length; r++) {
|
|
21
21
|
rule = bodyRules[r];
|
|
22
22
|
if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {
|
|
23
23
|
// the atrule contains something that was referenced (likely by extend)
|
|
@@ -26,141 +26,169 @@ var CSSVisitorUtils = /** @class */ (function () {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
return false;
|
|
29
|
-
}
|
|
30
|
-
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
keepOnlyVisibleChilds(owner) {
|
|
31
32
|
if (owner && owner.rules) {
|
|
32
|
-
owner.rules = owner.rules.filter(
|
|
33
|
+
owner.rules = owner.rules.filter(thing => thing.isVisible());
|
|
33
34
|
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
isEmpty(owner) {
|
|
38
|
+
return (owner && owner.rules)
|
|
37
39
|
? (owner.rules.length === 0) : true;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
hasVisibleSelector(rulesetNode) {
|
|
40
43
|
return (rulesetNode && rulesetNode.paths)
|
|
41
44
|
? (rulesetNode.paths.length > 0) : false;
|
|
42
|
-
}
|
|
43
|
-
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
resolveVisibility(node) {
|
|
44
48
|
if (!node.blocksVisibility()) {
|
|
45
49
|
if (this.isEmpty(node)) {
|
|
46
|
-
return;
|
|
50
|
+
return ;
|
|
47
51
|
}
|
|
52
|
+
|
|
48
53
|
return node;
|
|
49
54
|
}
|
|
50
|
-
|
|
55
|
+
|
|
56
|
+
const compiledRulesBody = node.rules[0];
|
|
51
57
|
this.keepOnlyVisibleChilds(compiledRulesBody);
|
|
58
|
+
|
|
52
59
|
if (this.isEmpty(compiledRulesBody)) {
|
|
53
|
-
return;
|
|
60
|
+
return ;
|
|
54
61
|
}
|
|
62
|
+
|
|
55
63
|
node.ensureVisibility();
|
|
56
64
|
node.removeVisibilityBlock();
|
|
65
|
+
|
|
57
66
|
return node;
|
|
58
|
-
}
|
|
59
|
-
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
isVisibleRuleset(rulesetNode) {
|
|
60
70
|
if (rulesetNode.firstRoot) {
|
|
61
71
|
return true;
|
|
62
72
|
}
|
|
73
|
+
|
|
63
74
|
if (this.isEmpty(rulesetNode)) {
|
|
64
75
|
return false;
|
|
65
76
|
}
|
|
77
|
+
|
|
66
78
|
if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {
|
|
67
79
|
return false;
|
|
68
80
|
}
|
|
81
|
+
|
|
69
82
|
return true;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this._visitor = new
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const ToCSSVisitor = function(context) {
|
|
87
|
+
this._visitor = new Visitor(this);
|
|
75
88
|
this._context = context;
|
|
76
89
|
this.utils = new CSSVisitorUtils(context);
|
|
77
90
|
};
|
|
91
|
+
|
|
78
92
|
ToCSSVisitor.prototype = {
|
|
79
93
|
isReplacing: true,
|
|
80
94
|
run: function (root) {
|
|
81
95
|
return this._visitor.visit(root);
|
|
82
96
|
},
|
|
97
|
+
|
|
83
98
|
visitDeclaration: function (declNode, visitArgs) {
|
|
84
99
|
if (declNode.blocksVisibility() || declNode.variable) {
|
|
85
100
|
return;
|
|
86
101
|
}
|
|
87
102
|
return declNode;
|
|
88
103
|
},
|
|
104
|
+
|
|
89
105
|
visitMixinDefinition: function (mixinNode, visitArgs) {
|
|
90
106
|
// mixin definitions do not get eval'd - this means they keep state
|
|
91
107
|
// so we have to clear that state here so it isn't used if toCSS is called twice
|
|
92
108
|
mixinNode.frames = [];
|
|
93
109
|
},
|
|
110
|
+
|
|
94
111
|
visitExtend: function (extendNode, visitArgs) {
|
|
95
112
|
},
|
|
113
|
+
|
|
96
114
|
visitComment: function (commentNode, visitArgs) {
|
|
97
115
|
if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {
|
|
98
116
|
return;
|
|
99
117
|
}
|
|
100
118
|
return commentNode;
|
|
101
119
|
},
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
|
|
121
|
+
visitMedia: function(mediaNode, visitArgs) {
|
|
122
|
+
const originalRules = mediaNode.rules[0].rules;
|
|
104
123
|
mediaNode.accept(this._visitor);
|
|
105
124
|
visitArgs.visitDeeper = false;
|
|
125
|
+
|
|
106
126
|
return this.utils.resolveVisibility(mediaNode, originalRules);
|
|
107
127
|
},
|
|
128
|
+
|
|
108
129
|
visitImport: function (importNode, visitArgs) {
|
|
109
130
|
if (importNode.blocksVisibility()) {
|
|
110
|
-
return;
|
|
131
|
+
return ;
|
|
111
132
|
}
|
|
112
133
|
return importNode;
|
|
113
134
|
},
|
|
114
|
-
|
|
135
|
+
|
|
136
|
+
visitAtRule: function(atRuleNode, visitArgs) {
|
|
115
137
|
if (atRuleNode.rules && atRuleNode.rules.length) {
|
|
116
138
|
return this.visitAtRuleWithBody(atRuleNode, visitArgs);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
139
|
+
} else {
|
|
119
140
|
return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);
|
|
120
141
|
}
|
|
121
142
|
},
|
|
122
|
-
|
|
143
|
+
|
|
144
|
+
visitAnonymous: function(anonymousNode, visitArgs) {
|
|
123
145
|
if (!anonymousNode.blocksVisibility()) {
|
|
124
146
|
anonymousNode.accept(this._visitor);
|
|
125
147
|
return anonymousNode;
|
|
126
148
|
}
|
|
127
149
|
},
|
|
128
|
-
|
|
150
|
+
|
|
151
|
+
visitAtRuleWithBody: function(atRuleNode, visitArgs) {
|
|
129
152
|
// if there is only one nested ruleset and that one has no path, then it is
|
|
130
153
|
// just fake ruleset
|
|
131
154
|
function hasFakeRuleset(atRuleNode) {
|
|
132
|
-
|
|
155
|
+
const bodyRules = atRuleNode.rules;
|
|
133
156
|
return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);
|
|
134
157
|
}
|
|
135
158
|
function getBodyRules(atRuleNode) {
|
|
136
|
-
|
|
159
|
+
const nodeRules = atRuleNode.rules;
|
|
137
160
|
if (hasFakeRuleset(atRuleNode)) {
|
|
138
161
|
return nodeRules[0].rules;
|
|
139
162
|
}
|
|
163
|
+
|
|
140
164
|
return nodeRules;
|
|
141
165
|
}
|
|
142
166
|
// it is still true that it is only one ruleset in array
|
|
143
167
|
// this is last such moment
|
|
144
168
|
// process childs
|
|
145
|
-
|
|
169
|
+
const originalRules = getBodyRules(atRuleNode);
|
|
146
170
|
atRuleNode.accept(this._visitor);
|
|
147
171
|
visitArgs.visitDeeper = false;
|
|
172
|
+
|
|
148
173
|
if (!this.utils.isEmpty(atRuleNode)) {
|
|
149
174
|
this._mergeRules(atRuleNode.rules[0].rules);
|
|
150
175
|
}
|
|
176
|
+
|
|
151
177
|
return this.utils.resolveVisibility(atRuleNode, originalRules);
|
|
152
178
|
},
|
|
153
|
-
|
|
179
|
+
|
|
180
|
+
visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {
|
|
154
181
|
if (atRuleNode.blocksVisibility()) {
|
|
155
182
|
return;
|
|
156
183
|
}
|
|
184
|
+
|
|
157
185
|
if (atRuleNode.name === '@charset') {
|
|
158
186
|
// Only output the debug info together with subsequent @charset definitions
|
|
159
187
|
// a comment (or @media statement) before the actual @charset atrule would
|
|
160
188
|
// be considered illegal css as it has to be on the first line
|
|
161
189
|
if (this.charset) {
|
|
162
190
|
if (atRuleNode.debugInfo) {
|
|
163
|
-
|
|
191
|
+
const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\n/g, '')} */\n`);
|
|
164
192
|
comment.debugInfo = atRuleNode.debugInfo;
|
|
165
193
|
return this._visitor.visit(comment);
|
|
166
194
|
}
|
|
@@ -168,40 +196,49 @@ ToCSSVisitor.prototype = {
|
|
|
168
196
|
}
|
|
169
197
|
this.charset = true;
|
|
170
198
|
}
|
|
199
|
+
|
|
171
200
|
return atRuleNode;
|
|
172
201
|
},
|
|
173
|
-
|
|
202
|
+
|
|
203
|
+
checkValidNodes: function(rules, isRoot) {
|
|
174
204
|
if (!rules) {
|
|
175
205
|
return;
|
|
176
206
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
207
|
+
|
|
208
|
+
for (let i = 0; i < rules.length; i++) {
|
|
209
|
+
const ruleNode = rules[i];
|
|
210
|
+
if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {
|
|
180
211
|
throw { message: 'Properties must be inside selector blocks. They cannot be in the root',
|
|
181
|
-
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename
|
|
212
|
+
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
|
|
182
213
|
}
|
|
183
|
-
if (ruleNode instanceof
|
|
184
|
-
throw { message:
|
|
185
|
-
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename
|
|
214
|
+
if (ruleNode instanceof tree.Call) {
|
|
215
|
+
throw { message: `Function '${ruleNode.name}' did not return a root node`,
|
|
216
|
+
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
|
|
186
217
|
}
|
|
187
218
|
if (ruleNode.type && !ruleNode.allowRoot) {
|
|
188
|
-
throw { message:
|
|
189
|
-
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename
|
|
219
|
+
throw { message: `${ruleNode.type} node returned by a function is not valid here`,
|
|
220
|
+
index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};
|
|
190
221
|
}
|
|
191
222
|
}
|
|
192
223
|
},
|
|
224
|
+
|
|
193
225
|
visitRuleset: function (rulesetNode, visitArgs) {
|
|
194
226
|
// at this point rulesets are nested into each other
|
|
195
|
-
|
|
196
|
-
|
|
227
|
+
let rule;
|
|
228
|
+
|
|
229
|
+
const rulesets = [];
|
|
230
|
+
|
|
197
231
|
this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);
|
|
232
|
+
|
|
198
233
|
if (!rulesetNode.root) {
|
|
199
234
|
// remove invisible paths
|
|
200
235
|
this._compileRulesetPaths(rulesetNode);
|
|
236
|
+
|
|
201
237
|
// remove rulesets from this ruleset body and compile them separately
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
238
|
+
const nodeRules = rulesetNode.rules;
|
|
239
|
+
|
|
240
|
+
let nodeRuleCnt = nodeRules ? nodeRules.length : 0;
|
|
241
|
+
for (let i = 0; i < nodeRuleCnt; ) {
|
|
205
242
|
rule = nodeRules[i];
|
|
206
243
|
if (rule && rule.rules) {
|
|
207
244
|
// visit because we are moving them out from being a child
|
|
@@ -217,109 +254,79 @@ ToCSSVisitor.prototype = {
|
|
|
217
254
|
// compile body
|
|
218
255
|
if (nodeRuleCnt > 0) {
|
|
219
256
|
rulesetNode.accept(this._visitor);
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
257
|
+
} else {
|
|
222
258
|
rulesetNode.rules = null;
|
|
223
259
|
}
|
|
224
260
|
visitArgs.visitDeeper = false;
|
|
225
|
-
}
|
|
226
|
-
else { // if (! rulesetNode.root) {
|
|
261
|
+
} else { // if (! rulesetNode.root) {
|
|
227
262
|
rulesetNode.accept(this._visitor);
|
|
228
263
|
visitArgs.visitDeeper = false;
|
|
229
264
|
}
|
|
265
|
+
|
|
230
266
|
if (rulesetNode.rules) {
|
|
231
267
|
this._mergeRules(rulesetNode.rules);
|
|
232
268
|
this._removeDuplicateRules(rulesetNode.rules);
|
|
233
269
|
}
|
|
270
|
+
|
|
234
271
|
// now decide whether we keep the ruleset
|
|
235
272
|
if (this.utils.isVisibleRuleset(rulesetNode)) {
|
|
236
273
|
rulesetNode.ensureVisibility();
|
|
237
274
|
rulesets.splice(0, 0, rulesetNode);
|
|
238
275
|
}
|
|
276
|
+
|
|
239
277
|
if (rulesets.length === 1) {
|
|
240
278
|
return rulesets[0];
|
|
241
279
|
}
|
|
242
280
|
return rulesets;
|
|
243
281
|
},
|
|
244
|
-
|
|
282
|
+
|
|
283
|
+
_compileRulesetPaths: function(rulesetNode) {
|
|
245
284
|
if (rulesetNode.paths) {
|
|
246
285
|
rulesetNode.paths = rulesetNode.paths
|
|
247
|
-
.filter(
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
for (i = 0; i < p.length; i++) {
|
|
253
|
-
if (p[i].isVisible() && p[i].getIsOutput()) {
|
|
254
|
-
return true;
|
|
286
|
+
.filter(p => {
|
|
287
|
+
let i;
|
|
288
|
+
if (p[0].elements[0].combinator.value === ' ') {
|
|
289
|
+
p[0].elements[0].combinator = new(tree.Combinator)('');
|
|
255
290
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
291
|
+
for (i = 0; i < p.length; i++) {
|
|
292
|
+
if (p[i].isVisible() && p[i].getIsOutput()) {
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return false;
|
|
297
|
+
});
|
|
259
298
|
}
|
|
260
299
|
},
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
300
|
+
|
|
301
|
+
_removeDuplicateRules: function(rules) {
|
|
302
|
+
if (!rules) { return; }
|
|
303
|
+
|
|
265
304
|
// remove duplicates
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (rule instanceof tree_1.default.Declaration) {
|
|
273
|
-
if (!ruleCache[rule.name]) {
|
|
305
|
+
const ruleCache = {};
|
|
306
|
+
|
|
307
|
+
for (let i = rules.length - 1; i >= 0 ; i--) {
|
|
308
|
+
let rule = rules[i];
|
|
309
|
+
if (rule instanceof tree.Declaration) {
|
|
310
|
+
if (!Object.prototype.hasOwnProperty.call(ruleCache, rule.name)) {
|
|
274
311
|
ruleCache[rule.name] = rule;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
ruleList
|
|
278
|
-
|
|
279
|
-
ruleList = ruleCache[rule.name] = [
|
|
312
|
+
} else {
|
|
313
|
+
let ruleList = ruleCache[rule.name];
|
|
314
|
+
if (!Array.isArray(ruleList)) {
|
|
315
|
+
const prevRuleCSS = ruleList.toCSS(this._context);
|
|
316
|
+
ruleList = ruleCache[rule.name] = [prevRuleCSS];
|
|
280
317
|
}
|
|
281
|
-
|
|
318
|
+
const ruleCSS = rule.toCSS(this._context);
|
|
282
319
|
if (ruleList.indexOf(ruleCSS) !== -1) {
|
|
283
320
|
rules.splice(i, 1);
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
321
|
+
} else {
|
|
286
322
|
ruleList.push(ruleCSS);
|
|
287
323
|
}
|
|
288
324
|
}
|
|
289
325
|
}
|
|
290
326
|
}
|
|
291
327
|
},
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
var groups = {};
|
|
297
|
-
var groupsArr = [];
|
|
298
|
-
for (var i = 0; i < rules.length; i++) {
|
|
299
|
-
var rule = rules[i];
|
|
300
|
-
if (rule.merge) {
|
|
301
|
-
var key = rule.name;
|
|
302
|
-
groups[key] ? rules.splice(i--, 1) :
|
|
303
|
-
groupsArr.push(groups[key] = []);
|
|
304
|
-
groups[key].push(rule);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
groupsArr.forEach(function (group) {
|
|
308
|
-
if (group.length > 0) {
|
|
309
|
-
var result_1 = group[0];
|
|
310
|
-
var space_1 = [];
|
|
311
|
-
var comma_1 = [new tree_1.default.Expression(space_1)];
|
|
312
|
-
group.forEach(function (rule) {
|
|
313
|
-
if ((rule.merge === '+') && (space_1.length > 0)) {
|
|
314
|
-
comma_1.push(new tree_1.default.Expression(space_1 = []));
|
|
315
|
-
}
|
|
316
|
-
space_1.push(rule.value);
|
|
317
|
-
result_1.important = result_1.important || rule.important;
|
|
318
|
-
});
|
|
319
|
-
result_1.value = new tree_1.default.Value(comma_1);
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
}
|
|
328
|
+
|
|
329
|
+
_mergeRules: mergeRules
|
|
323
330
|
};
|
|
324
|
-
|
|
325
|
-
|
|
331
|
+
|
|
332
|
+
export default ToCSSVisitor;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var _hasIndexed = false;
|
|
1
|
+
import tree from '../tree/index.js';
|
|
2
|
+
|
|
3
|
+
const _visitArgs = { visitDeeper: true };
|
|
4
|
+
let _hasIndexed = false;
|
|
5
|
+
|
|
7
6
|
function _noop(node) {
|
|
8
7
|
return node;
|
|
9
8
|
}
|
|
9
|
+
|
|
10
10
|
function indexNodeTypes(parent, ticker) {
|
|
11
11
|
// add .typeIndex to tree node types for lookup table
|
|
12
|
-
|
|
13
|
-
for (key in parent) {
|
|
12
|
+
let key, child;
|
|
13
|
+
for (key in parent) {
|
|
14
14
|
/* eslint guard-for-in: 0 */
|
|
15
15
|
child = parent[key];
|
|
16
16
|
switch (typeof child) {
|
|
@@ -24,25 +24,30 @@ function indexNodeTypes(parent, ticker) {
|
|
|
24
24
|
case 'object':
|
|
25
25
|
ticker = indexNodeTypes(child, ticker);
|
|
26
26
|
break;
|
|
27
|
+
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
return ticker;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
class Visitor {
|
|
34
|
+
constructor(implementation) {
|
|
33
35
|
this._implementation = implementation;
|
|
34
36
|
this._visitInCache = {};
|
|
35
37
|
this._visitOutCache = {};
|
|
38
|
+
|
|
36
39
|
if (!_hasIndexed) {
|
|
37
|
-
indexNodeTypes(
|
|
40
|
+
indexNodeTypes(tree, 1);
|
|
38
41
|
_hasIndexed = true;
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
|
-
|
|
44
|
+
|
|
45
|
+
visit(node) {
|
|
42
46
|
if (!node) {
|
|
43
47
|
return node;
|
|
44
48
|
}
|
|
45
|
-
|
|
49
|
+
|
|
50
|
+
const nodeTypeIndex = node.typeIndex;
|
|
46
51
|
if (!nodeTypeIndex) {
|
|
47
52
|
// MixinCall args aren't a node type?
|
|
48
53
|
if (node.value && node.value.typeIndex) {
|
|
@@ -50,48 +55,57 @@ var Visitor = /** @class */ (function () {
|
|
|
50
55
|
}
|
|
51
56
|
return node;
|
|
52
57
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
|
|
59
|
+
const impl = this._implementation;
|
|
60
|
+
let func = this._visitInCache[nodeTypeIndex];
|
|
61
|
+
let funcOut = this._visitOutCache[nodeTypeIndex];
|
|
62
|
+
const visitArgs = _visitArgs;
|
|
63
|
+
let fnName;
|
|
64
|
+
|
|
58
65
|
visitArgs.visitDeeper = true;
|
|
66
|
+
|
|
59
67
|
if (!func) {
|
|
60
|
-
fnName =
|
|
68
|
+
fnName = `visit${node.type}`;
|
|
61
69
|
func = impl[fnName] || _noop;
|
|
62
|
-
funcOut = impl[
|
|
70
|
+
funcOut = impl[`${fnName}Out`] || _noop;
|
|
63
71
|
this._visitInCache[nodeTypeIndex] = func;
|
|
64
72
|
this._visitOutCache[nodeTypeIndex] = funcOut;
|
|
65
73
|
}
|
|
74
|
+
|
|
66
75
|
if (func !== _noop) {
|
|
67
|
-
|
|
76
|
+
const newNode = func.call(impl, node, visitArgs);
|
|
68
77
|
if (node && impl.isReplacing) {
|
|
69
78
|
node = newNode;
|
|
70
79
|
}
|
|
71
80
|
}
|
|
81
|
+
|
|
72
82
|
if (visitArgs.visitDeeper && node) {
|
|
73
83
|
if (node.length) {
|
|
74
|
-
for (
|
|
84
|
+
for (let i = 0, cnt = node.length; i < cnt; i++) {
|
|
75
85
|
if (node[i].accept) {
|
|
76
86
|
node[i].accept(this);
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
|
-
}
|
|
80
|
-
else if (node.accept) {
|
|
89
|
+
} else if (node.accept) {
|
|
81
90
|
node.accept(this);
|
|
82
91
|
}
|
|
83
92
|
}
|
|
93
|
+
|
|
84
94
|
if (funcOut != _noop) {
|
|
85
95
|
funcOut.call(impl, node);
|
|
86
96
|
}
|
|
97
|
+
|
|
87
98
|
return node;
|
|
88
|
-
}
|
|
89
|
-
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
visitArray(nodes, nonReplacing) {
|
|
90
102
|
if (!nodes) {
|
|
91
103
|
return nodes;
|
|
92
104
|
}
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
|
|
106
|
+
const cnt = nodes.length;
|
|
107
|
+
let i;
|
|
108
|
+
|
|
95
109
|
// Non-replacing
|
|
96
110
|
if (nonReplacing || !this._implementation.isReplacing) {
|
|
97
111
|
for (i = 0; i < cnt; i++) {
|
|
@@ -99,27 +113,28 @@ var Visitor = /** @class */ (function () {
|
|
|
99
113
|
}
|
|
100
114
|
return nodes;
|
|
101
115
|
}
|
|
116
|
+
|
|
102
117
|
// Replacing
|
|
103
|
-
|
|
118
|
+
const out = [];
|
|
104
119
|
for (i = 0; i < cnt; i++) {
|
|
105
|
-
|
|
106
|
-
if (evald === undefined) {
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
120
|
+
const evald = this.visit(nodes[i]);
|
|
121
|
+
if (evald === undefined) { continue; }
|
|
109
122
|
if (!evald.splice) {
|
|
110
123
|
out.push(evald);
|
|
111
|
-
}
|
|
112
|
-
else if (evald.length) {
|
|
124
|
+
} else if (evald.length) {
|
|
113
125
|
this.flatten(evald, out);
|
|
114
126
|
}
|
|
115
127
|
}
|
|
116
128
|
return out;
|
|
117
|
-
}
|
|
118
|
-
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
flatten(arr, out) {
|
|
119
132
|
if (!out) {
|
|
120
133
|
out = [];
|
|
121
134
|
}
|
|
122
|
-
|
|
135
|
+
|
|
136
|
+
let cnt, i, item, nestedCnt, j, nestedItem;
|
|
137
|
+
|
|
123
138
|
for (i = 0, cnt = arr.length; i < cnt; i++) {
|
|
124
139
|
item = arr[i];
|
|
125
140
|
if (item === undefined) {
|
|
@@ -129,6 +144,7 @@ var Visitor = /** @class */ (function () {
|
|
|
129
144
|
out.push(item);
|
|
130
145
|
continue;
|
|
131
146
|
}
|
|
147
|
+
|
|
132
148
|
for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {
|
|
133
149
|
nestedItem = item[j];
|
|
134
150
|
if (nestedItem === undefined) {
|
|
@@ -136,15 +152,14 @@ var Visitor = /** @class */ (function () {
|
|
|
136
152
|
}
|
|
137
153
|
if (!nestedItem.splice) {
|
|
138
154
|
out.push(nestedItem);
|
|
139
|
-
}
|
|
140
|
-
else if (nestedItem.length) {
|
|
155
|
+
} else if (nestedItem.length) {
|
|
141
156
|
this.flatten(nestedItem, out);
|
|
142
157
|
}
|
|
143
158
|
}
|
|
144
159
|
}
|
|
160
|
+
|
|
145
161
|
return out;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
//# sourceMappingURL=visitor.js.map
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export default Visitor;
|