less 3.13.1 → 4.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.
Files changed (200) hide show
  1. package/Gruntfile.js +1 -1
  2. package/bin/lessc +14 -3
  3. package/dist/less.js +11156 -11157
  4. package/dist/less.min.js +3 -3
  5. package/dist/less.min.js.map +1 -1
  6. package/lib/less/constants.js +2 -2
  7. package/lib/less/constants.js.map +1 -1
  8. package/lib/less/contexts.js +88 -110
  9. package/lib/less/contexts.js.map +1 -1
  10. package/lib/less/data/index.js +3 -5
  11. package/lib/less/data/index.js.map +1 -1
  12. package/lib/less/default-options.js +57 -53
  13. package/lib/less/default-options.js.map +1 -1
  14. package/lib/less/environment/abstract-file-manager.js +6 -6
  15. package/lib/less/environment/abstract-file-manager.js.map +1 -1
  16. package/lib/less/environment/abstract-plugin-loader.js +7 -13
  17. package/lib/less/environment/abstract-plugin-loader.js.map +1 -1
  18. package/lib/less/environment/environment.js +9 -11
  19. package/lib/less/environment/environment.js.map +1 -1
  20. package/lib/less/functions/boolean.js +14 -6
  21. package/lib/less/functions/boolean.js.map +1 -1
  22. package/lib/less/functions/color-blending.js +2 -4
  23. package/lib/less/functions/color-blending.js.map +1 -1
  24. package/lib/less/functions/color.js +41 -9
  25. package/lib/less/functions/color.js.map +1 -1
  26. package/lib/less/functions/data-uri.js +5 -26
  27. package/lib/less/functions/data-uri.js.map +1 -1
  28. package/lib/less/functions/default.js +2 -4
  29. package/lib/less/functions/default.js.map +1 -1
  30. package/lib/less/functions/function-caller.js +19 -35
  31. package/lib/less/functions/function-caller.js.map +1 -1
  32. package/lib/less/functions/index.js +14 -16
  33. package/lib/less/functions/index.js.map +1 -1
  34. package/lib/less/functions/list.js +21 -12
  35. package/lib/less/functions/list.js.map +1 -1
  36. package/lib/less/functions/math-helper.js +2 -4
  37. package/lib/less/functions/math-helper.js.map +1 -1
  38. package/lib/less/functions/math.js +2 -4
  39. package/lib/less/functions/math.js.map +1 -1
  40. package/lib/less/functions/number.js +12 -8
  41. package/lib/less/functions/number.js.map +1 -1
  42. package/lib/less/functions/string.js +4 -6
  43. package/lib/less/functions/string.js.map +1 -1
  44. package/lib/less/functions/svg.js +6 -8
  45. package/lib/less/functions/svg.js.map +1 -1
  46. package/lib/less/functions/types.js +9 -11
  47. package/lib/less/functions/types.js.map +1 -1
  48. package/lib/less/import-manager.js +6 -27
  49. package/lib/less/import-manager.js.map +1 -1
  50. package/lib/less/index.js +48 -82
  51. package/lib/less/index.js.map +1 -1
  52. package/lib/less/less-error.js +6 -24
  53. package/lib/less/less-error.js.map +1 -1
  54. package/lib/less/parse-tree.js +8 -8
  55. package/lib/less/parse-tree.js.map +1 -1
  56. package/lib/less/parse.js +11 -31
  57. package/lib/less/parse.js.map +1 -1
  58. package/lib/less/parser/chunker.js +4 -2
  59. package/lib/less/parser/chunker.js.map +1 -1
  60. package/lib/less/parser/parser-input.js +2 -4
  61. package/lib/less/parser/parser-input.js.map +1 -1
  62. package/lib/less/parser/parser.js +8 -29
  63. package/lib/less/parser/parser.js.map +1 -1
  64. package/lib/less/plugin-manager.js +2 -3
  65. package/lib/less/plugin-manager.js.map +1 -1
  66. package/lib/less/render.js +6 -22
  67. package/lib/less/render.js.map +1 -1
  68. package/lib/less/source-map-builder.js +4 -2
  69. package/lib/less/source-map-builder.js.map +1 -1
  70. package/lib/less/source-map-output.js +5 -7
  71. package/lib/less/source-map-output.js.map +1 -1
  72. package/lib/less/transform-tree.js +9 -9
  73. package/lib/less/transform-tree.js.map +1 -1
  74. package/lib/less/tree/anonymous.js +19 -20
  75. package/lib/less/tree/anonymous.js.map +1 -1
  76. package/lib/less/tree/assignment.js +22 -23
  77. package/lib/less/tree/assignment.js.map +1 -1
  78. package/lib/less/tree/atrule.js +105 -116
  79. package/lib/less/tree/atrule.js.map +1 -1
  80. package/lib/less/tree/attribute.js +18 -19
  81. package/lib/less/tree/attribute.js.map +1 -1
  82. package/lib/less/tree/call.js +68 -69
  83. package/lib/less/tree/call.js.map +1 -1
  84. package/lib/less/tree/color.js +163 -172
  85. package/lib/less/tree/color.js.map +1 -1
  86. package/lib/less/tree/combinator.js +9 -10
  87. package/lib/less/tree/combinator.js.map +1 -1
  88. package/lib/less/tree/comment.js +15 -16
  89. package/lib/less/tree/comment.js.map +1 -1
  90. package/lib/less/tree/condition.js +29 -30
  91. package/lib/less/tree/condition.js.map +1 -1
  92. package/lib/less/tree/debug-info.js +32 -30
  93. package/lib/less/tree/debug-info.js.map +1 -1
  94. package/lib/less/tree/declaration.js +71 -95
  95. package/lib/less/tree/declaration.js.map +1 -1
  96. package/lib/less/tree/detached-ruleset.js +18 -38
  97. package/lib/less/tree/detached-ruleset.js.map +1 -1
  98. package/lib/less/tree/dimension.js +126 -129
  99. package/lib/less/tree/dimension.js.map +1 -1
  100. package/lib/less/tree/element.js +40 -41
  101. package/lib/less/tree/element.js.map +1 -1
  102. package/lib/less/tree/expression.js +55 -74
  103. package/lib/less/tree/expression.js.map +1 -1
  104. package/lib/less/tree/extend.js +28 -34
  105. package/lib/less/tree/extend.js.map +1 -1
  106. package/lib/less/tree/import.js +120 -140
  107. package/lib/less/tree/import.js.map +1 -1
  108. package/lib/less/tree/index.js +37 -39
  109. package/lib/less/tree/index.js.map +1 -1
  110. package/lib/less/tree/javascript.js +23 -24
  111. package/lib/less/tree/javascript.js.map +1 -1
  112. package/lib/less/tree/js-eval-node.js +51 -50
  113. package/lib/less/tree/js-eval-node.js.map +1 -1
  114. package/lib/less/tree/keyword.js +10 -11
  115. package/lib/less/tree/keyword.js.map +1 -1
  116. package/lib/less/tree/media.js +111 -131
  117. package/lib/less/tree/media.js.map +1 -1
  118. package/lib/less/tree/mixin-call.js +156 -160
  119. package/lib/less/tree/mixin-call.js.map +1 -1
  120. package/lib/less/tree/mixin-definition.js +164 -184
  121. package/lib/less/tree/mixin-definition.js.map +1 -1
  122. package/lib/less/tree/namespace-value.js +53 -57
  123. package/lib/less/tree/namespace-value.js.map +1 -1
  124. package/lib/less/tree/negative.js +16 -17
  125. package/lib/less/tree/negative.js.map +1 -1
  126. package/lib/less/tree/node.js +39 -39
  127. package/lib/less/tree/node.js.map +1 -1
  128. package/lib/less/tree/operation.js +41 -63
  129. package/lib/less/tree/operation.js.map +1 -1
  130. package/lib/less/tree/paren.js +13 -14
  131. package/lib/less/tree/paren.js.map +1 -1
  132. package/lib/less/tree/property.js +48 -49
  133. package/lib/less/tree/property.js.map +1 -1
  134. package/lib/less/tree/quoted.js +50 -51
  135. package/lib/less/tree/quoted.js.map +1 -1
  136. package/lib/less/tree/ruleset.js +665 -702
  137. package/lib/less/tree/ruleset.js.map +1 -1
  138. package/lib/less/tree/selector.js +105 -106
  139. package/lib/less/tree/selector.js.map +1 -1
  140. package/lib/less/tree/unicode-descriptor.js +5 -6
  141. package/lib/less/tree/unicode-descriptor.js.map +1 -1
  142. package/lib/less/tree/unit.js +99 -120
  143. package/lib/less/tree/unit.js.map +1 -1
  144. package/lib/less/tree/url.js +44 -45
  145. package/lib/less/tree/url.js.map +1 -1
  146. package/lib/less/tree/value.js +27 -26
  147. package/lib/less/tree/value.js.map +1 -1
  148. package/lib/less/tree/variable-call.js +30 -31
  149. package/lib/less/tree/variable-call.js.map +1 -1
  150. package/lib/less/tree/variable.js +46 -48
  151. package/lib/less/tree/variable.js.map +1 -1
  152. package/lib/less/utils.js +5 -23
  153. package/lib/less/utils.js.map +1 -1
  154. package/lib/less/visitors/extend-visitor.js +14 -41
  155. package/lib/less/visitors/extend-visitor.js.map +1 -1
  156. package/lib/less/visitors/import-sequencer.js +2 -7
  157. package/lib/less/visitors/import-sequencer.js.map +1 -1
  158. package/lib/less/visitors/import-visitor.js +7 -33
  159. package/lib/less/visitors/import-visitor.js.map +1 -1
  160. package/lib/less/visitors/index.js +7 -9
  161. package/lib/less/visitors/index.js.map +1 -1
  162. package/lib/less/visitors/join-selector-visitor.js +2 -4
  163. package/lib/less/visitors/join-selector-visitor.js.map +1 -1
  164. package/lib/less/visitors/to-css-visitor.js +4 -6
  165. package/lib/less/visitors/to-css-visitor.js.map +1 -1
  166. package/lib/less/visitors/visitor.js +4 -12
  167. package/lib/less/visitors/visitor.js.map +1 -1
  168. package/lib/less-browser/add-default-options.js +2 -4
  169. package/lib/less-browser/add-default-options.js.map +1 -1
  170. package/lib/less-browser/bootstrap.js +4 -6
  171. package/lib/less-browser/bootstrap.js.map +1 -1
  172. package/lib/less-browser/browser.js +2 -20
  173. package/lib/less-browser/browser.js.map +1 -1
  174. package/lib/less-browser/error-reporting.js +3 -24
  175. package/lib/less-browser/error-reporting.js.map +1 -1
  176. package/lib/less-browser/file-manager.js +17 -36
  177. package/lib/less-browser/file-manager.js.map +1 -1
  178. package/lib/less-browser/image-size.js +2 -4
  179. package/lib/less-browser/image-size.js.map +1 -1
  180. package/lib/less-browser/index.js +9 -11
  181. package/lib/less-browser/index.js.map +1 -1
  182. package/lib/less-browser/plugin-loader.js +10 -29
  183. package/lib/less-browser/plugin-loader.js.map +1 -1
  184. package/lib/less-node/file-manager.js +15 -34
  185. package/lib/less-node/file-manager.js.map +1 -1
  186. package/lib/less-node/image-size.js +4 -6
  187. package/lib/less-node/image-size.js.map +1 -1
  188. package/lib/less-node/index.js +10 -16
  189. package/lib/less-node/index.js.map +1 -1
  190. package/lib/less-node/plugin-loader.js +23 -42
  191. package/lib/less-node/plugin-loader.js.map +1 -1
  192. package/lib/less-node/url-file-manager.js +23 -38
  193. package/lib/less-node/url-file-manager.js.map +1 -1
  194. package/package.json +12 -9
  195. package/test/browser/less/errors/image-height-error.txt +1 -1
  196. package/test/browser/less/errors/image-size-error.txt +1 -1
  197. package/test/browser/less/errors/image-width-error.txt +1 -1
  198. package/test/index.js +28 -9
  199. package/test/less-test.js +36 -16
  200. package/tsconfig.json +1 -0
@@ -1,40 +1,19 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
24
2
  Object.defineProperty(exports, "__esModule", { value: true });
25
- var node_1 = __importDefault(require("./node"));
26
- var declaration_1 = __importDefault(require("./declaration"));
27
- var keyword_1 = __importDefault(require("./keyword"));
28
- var comment_1 = __importDefault(require("./comment"));
29
- var paren_1 = __importDefault(require("./paren"));
30
- var selector_1 = __importDefault(require("./selector"));
31
- var element_1 = __importDefault(require("./element"));
32
- var anonymous_1 = __importDefault(require("./anonymous"));
33
- var contexts_1 = __importDefault(require("../contexts"));
34
- var function_registry_1 = __importDefault(require("../functions/function-registry"));
35
- var default_1 = __importDefault(require("../functions/default"));
36
- var debug_info_1 = __importDefault(require("./debug-info"));
37
- var utils = __importStar(require("../utils"));
3
+ var tslib_1 = require("tslib");
4
+ var node_1 = tslib_1.__importDefault(require("./node"));
5
+ var declaration_1 = tslib_1.__importDefault(require("./declaration"));
6
+ var keyword_1 = tslib_1.__importDefault(require("./keyword"));
7
+ var comment_1 = tslib_1.__importDefault(require("./comment"));
8
+ var paren_1 = tslib_1.__importDefault(require("./paren"));
9
+ var selector_1 = tslib_1.__importDefault(require("./selector"));
10
+ var element_1 = tslib_1.__importDefault(require("./element"));
11
+ var anonymous_1 = tslib_1.__importDefault(require("./anonymous"));
12
+ var contexts_1 = tslib_1.__importDefault(require("../contexts"));
13
+ var function_registry_1 = tslib_1.__importDefault(require("../functions/function-registry"));
14
+ var default_1 = tslib_1.__importDefault(require("../functions/default"));
15
+ var debug_info_1 = tslib_1.__importDefault(require("./debug-info"));
16
+ var utils = tslib_1.__importStar(require("../utils"));
38
17
  var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
39
18
  this.selectors = selectors;
40
19
  this.rules = rules;
@@ -47,740 +26,724 @@ var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
47
26
  this.setParent(this.selectors, this);
48
27
  this.setParent(this.rules, this);
49
28
  };
50
- Ruleset.prototype = new node_1.default();
51
- Ruleset.prototype.isRulesetLike = function () {
52
- return true;
53
- };
54
- Ruleset.prototype.accept = function (visitor) {
55
- if (this.paths) {
56
- this.paths = visitor.visitArray(this.paths, true);
57
- }
58
- else if (this.selectors) {
59
- this.selectors = visitor.visitArray(this.selectors);
60
- }
61
- if (this.rules && this.rules.length) {
62
- this.rules = visitor.visitArray(this.rules);
63
- }
64
- };
65
- Ruleset.prototype.eval = function (context) {
66
- var that = this;
67
- var selectors;
68
- var selCnt;
69
- var selector;
70
- var i;
71
- var hasVariable;
72
- var hasOnePassingSelector = false;
73
- if (this.selectors && (selCnt = this.selectors.length)) {
74
- selectors = new Array(selCnt);
75
- default_1.default.error({
76
- type: 'Syntax',
77
- message: 'it is currently only allowed in parametric mixin guards,'
78
- });
79
- for (i = 0; i < selCnt; i++) {
80
- selector = this.selectors[i].eval(context);
81
- for (var j = 0; j < selector.elements.length; j++) {
82
- if (selector.elements[j].isVariable) {
83
- hasVariable = true;
84
- break;
29
+ Ruleset.prototype = Object.assign(new node_1.default(), {
30
+ type: 'Ruleset',
31
+ isRuleset: true,
32
+ isRulesetLike: function () { return true; },
33
+ accept: function (visitor) {
34
+ if (this.paths) {
35
+ this.paths = visitor.visitArray(this.paths, true);
36
+ }
37
+ else if (this.selectors) {
38
+ this.selectors = visitor.visitArray(this.selectors);
39
+ }
40
+ if (this.rules && this.rules.length) {
41
+ this.rules = visitor.visitArray(this.rules);
42
+ }
43
+ },
44
+ eval: function (context) {
45
+ var that = this;
46
+ var selectors;
47
+ var selCnt;
48
+ var selector;
49
+ var i;
50
+ var hasVariable;
51
+ var hasOnePassingSelector = false;
52
+ if (this.selectors && (selCnt = this.selectors.length)) {
53
+ selectors = new Array(selCnt);
54
+ default_1.default.error({
55
+ type: 'Syntax',
56
+ message: 'it is currently only allowed in parametric mixin guards,'
57
+ });
58
+ for (i = 0; i < selCnt; i++) {
59
+ selector = this.selectors[i].eval(context);
60
+ for (var j = 0; j < selector.elements.length; j++) {
61
+ if (selector.elements[j].isVariable) {
62
+ hasVariable = true;
63
+ break;
64
+ }
65
+ }
66
+ selectors[i] = selector;
67
+ if (selector.evaldCondition) {
68
+ hasOnePassingSelector = true;
85
69
  }
86
70
  }
87
- selectors[i] = selector;
88
- if (selector.evaldCondition) {
89
- hasOnePassingSelector = true;
71
+ if (hasVariable) {
72
+ var toParseSelectors = new Array(selCnt);
73
+ for (i = 0; i < selCnt; i++) {
74
+ selector = selectors[i];
75
+ toParseSelectors[i] = selector.toCSS(context);
76
+ }
77
+ this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) {
78
+ if (result) {
79
+ selectors = utils.flattenArray(result);
80
+ }
81
+ });
90
82
  }
83
+ default_1.default.reset();
91
84
  }
92
- if (hasVariable) {
93
- var toParseSelectors = new Array(selCnt);
94
- for (i = 0; i < selCnt; i++) {
95
- selector = selectors[i];
96
- toParseSelectors[i] = selector.toCSS(context);
97
- }
98
- this.parse.parseNode(toParseSelectors.join(','), ["selectors"], selectors[0].getIndex(), selectors[0].fileInfo(), function (err, result) {
99
- if (result) {
100
- selectors = utils.flattenArray(result);
85
+ else {
86
+ hasOnePassingSelector = true;
87
+ }
88
+ var rules = this.rules ? utils.copyArray(this.rules) : null;
89
+ var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
90
+ var rule;
91
+ var subRule;
92
+ ruleset.originalRuleset = this;
93
+ ruleset.root = this.root;
94
+ ruleset.firstRoot = this.firstRoot;
95
+ ruleset.allowImports = this.allowImports;
96
+ if (this.debugInfo) {
97
+ ruleset.debugInfo = this.debugInfo;
98
+ }
99
+ if (!hasOnePassingSelector) {
100
+ rules.length = 0;
101
+ }
102
+ // inherit a function registry from the frames stack when possible;
103
+ // otherwise from the global registry
104
+ ruleset.functionRegistry = (function (frames) {
105
+ var i = 0;
106
+ var n = frames.length;
107
+ var found;
108
+ for (; i !== n; ++i) {
109
+ found = frames[i].functionRegistry;
110
+ if (found) {
111
+ return found;
101
112
  }
102
- });
103
- }
104
- default_1.default.reset();
105
- }
106
- else {
107
- hasOnePassingSelector = true;
108
- }
109
- var rules = this.rules ? utils.copyArray(this.rules) : null;
110
- var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
111
- var rule;
112
- var subRule;
113
- ruleset.originalRuleset = this;
114
- ruleset.root = this.root;
115
- ruleset.firstRoot = this.firstRoot;
116
- ruleset.allowImports = this.allowImports;
117
- if (this.debugInfo) {
118
- ruleset.debugInfo = this.debugInfo;
119
- }
120
- if (!hasOnePassingSelector) {
121
- rules.length = 0;
122
- }
123
- // inherit a function registry from the frames stack when possible;
124
- // otherwise from the global registry
125
- ruleset.functionRegistry = (function (frames) {
126
- var i = 0;
127
- var n = frames.length;
128
- var found;
129
- for (; i !== n; ++i) {
130
- found = frames[i].functionRegistry;
131
- if (found) {
132
- return found;
133
- }
134
- }
135
- return function_registry_1.default;
136
- })(context.frames).inherit();
137
- // push the current ruleset to the frames stack
138
- var ctxFrames = context.frames;
139
- ctxFrames.unshift(ruleset);
140
- // currrent selectors
141
- var ctxSelectors = context.selectors;
142
- if (!ctxSelectors) {
143
- context.selectors = ctxSelectors = [];
144
- }
145
- ctxSelectors.unshift(this.selectors);
146
- // Evaluate imports
147
- if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
148
- ruleset.evalImports(context);
149
- }
150
- // Store the frames around mixin definitions,
151
- // so they can be evaluated like closures when the time comes.
152
- var rsRules = ruleset.rules;
153
- for (i = 0; (rule = rsRules[i]); i++) {
154
- if (rule.evalFirst) {
155
- rsRules[i] = rule.eval(context);
113
+ }
114
+ return function_registry_1.default;
115
+ }(context.frames)).inherit();
116
+ // push the current ruleset to the frames stack
117
+ var ctxFrames = context.frames;
118
+ ctxFrames.unshift(ruleset);
119
+ // currrent selectors
120
+ var ctxSelectors = context.selectors;
121
+ if (!ctxSelectors) {
122
+ context.selectors = ctxSelectors = [];
123
+ }
124
+ ctxSelectors.unshift(this.selectors);
125
+ // Evaluate imports
126
+ if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
127
+ ruleset.evalImports(context);
128
+ }
129
+ // Store the frames around mixin definitions,
130
+ // so they can be evaluated like closures when the time comes.
131
+ var rsRules = ruleset.rules;
132
+ for (i = 0; (rule = rsRules[i]); i++) {
133
+ if (rule.evalFirst) {
134
+ rsRules[i] = rule.eval(context);
135
+ }
156
136
  }
157
- }
158
- var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
159
- // Evaluate mixin calls.
160
- for (i = 0; (rule = rsRules[i]); i++) {
161
- if (rule.type === 'MixinCall') {
162
- /* jshint loopfunc:true */
163
- rules = rule.eval(context).filter(function (r) {
164
- if ((r instanceof declaration_1.default) && r.variable) {
165
- // do not pollute the scope if the variable is
166
- // already there. consider returning false here
167
- // but we need a way to "return" variable from mixins
168
- return !(ruleset.variable(r.name));
169
- }
170
- return true;
171
- });
172
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
173
- i += rules.length - 1;
174
- ruleset.resetCache();
175
- }
176
- else if (rule.type === 'VariableCall') {
177
- /* jshint loopfunc:true */
178
- rules = rule.eval(context).rules.filter(function (r) {
179
- if ((r instanceof declaration_1.default) && r.variable) {
180
- // do not pollute the scope at all
181
- return false;
182
- }
183
- return true;
184
- });
185
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
186
- i += rules.length - 1;
187
- ruleset.resetCache();
137
+ var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
138
+ // Evaluate mixin calls.
139
+ for (i = 0; (rule = rsRules[i]); i++) {
140
+ if (rule.type === 'MixinCall') {
141
+ /* jshint loopfunc:true */
142
+ rules = rule.eval(context).filter(function (r) {
143
+ if ((r instanceof declaration_1.default) && r.variable) {
144
+ // do not pollute the scope if the variable is
145
+ // already there. consider returning false here
146
+ // but we need a way to "return" variable from mixins
147
+ return !(ruleset.variable(r.name));
148
+ }
149
+ return true;
150
+ });
151
+ rsRules.splice.apply(rsRules, [i, 1].concat(rules));
152
+ i += rules.length - 1;
153
+ ruleset.resetCache();
154
+ }
155
+ else if (rule.type === 'VariableCall') {
156
+ /* jshint loopfunc:true */
157
+ rules = rule.eval(context).rules.filter(function (r) {
158
+ if ((r instanceof declaration_1.default) && r.variable) {
159
+ // do not pollute the scope at all
160
+ return false;
161
+ }
162
+ return true;
163
+ });
164
+ rsRules.splice.apply(rsRules, [i, 1].concat(rules));
165
+ i += rules.length - 1;
166
+ ruleset.resetCache();
167
+ }
188
168
  }
189
- }
190
- // Evaluate everything else
191
- for (i = 0; (rule = rsRules[i]); i++) {
192
- if (!rule.evalFirst) {
193
- rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
169
+ // Evaluate everything else
170
+ for (i = 0; (rule = rsRules[i]); i++) {
171
+ if (!rule.evalFirst) {
172
+ rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
173
+ }
194
174
  }
195
- }
196
- // Evaluate everything else
197
- for (i = 0; (rule = rsRules[i]); i++) {
198
- // for rulesets, check if it is a css guard and can be removed
199
- if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
200
- // check if it can be folded in (e.g. & where)
201
- if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
202
- rsRules.splice(i--, 1);
203
- for (var j = 0; (subRule = rule.rules[j]); j++) {
204
- if (subRule instanceof node_1.default) {
205
- subRule.copyVisibilityInfo(rule.visibilityInfo());
206
- if (!(subRule instanceof declaration_1.default) || !subRule.variable) {
207
- rsRules.splice(++i, 0, subRule);
175
+ // Evaluate everything else
176
+ for (i = 0; (rule = rsRules[i]); i++) {
177
+ // for rulesets, check if it is a css guard and can be removed
178
+ if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {
179
+ // check if it can be folded in (e.g. & where)
180
+ if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
181
+ rsRules.splice(i--, 1);
182
+ for (var j = 0; (subRule = rule.rules[j]); j++) {
183
+ if (subRule instanceof node_1.default) {
184
+ subRule.copyVisibilityInfo(rule.visibilityInfo());
185
+ if (!(subRule instanceof declaration_1.default) || !subRule.variable) {
186
+ rsRules.splice(++i, 0, subRule);
187
+ }
208
188
  }
209
189
  }
210
190
  }
211
191
  }
212
192
  }
213
- }
214
- // Pop the stack
215
- ctxFrames.shift();
216
- ctxSelectors.shift();
217
- if (context.mediaBlocks) {
218
- for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
219
- context.mediaBlocks[i].bubbleSelectors(selectors);
220
- }
221
- }
222
- return ruleset;
223
- };
224
- Ruleset.prototype.evalImports = function (context) {
225
- var rules = this.rules;
226
- var i;
227
- var importRules;
228
- if (!rules) {
229
- return;
230
- }
231
- for (i = 0; i < rules.length; i++) {
232
- if (rules[i].type === 'Import') {
233
- importRules = rules[i].eval(context);
234
- if (importRules && (importRules.length || importRules.length === 0)) {
235
- rules.splice.apply(rules, [i, 1].concat(importRules));
236
- i += importRules.length - 1;
193
+ // Pop the stack
194
+ ctxFrames.shift();
195
+ ctxSelectors.shift();
196
+ if (context.mediaBlocks) {
197
+ for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
198
+ context.mediaBlocks[i].bubbleSelectors(selectors);
237
199
  }
238
- else {
239
- rules.splice(i, 1, importRules);
240
- }
241
- this.resetCache();
242
- }
243
- }
244
- };
245
- Ruleset.prototype.makeImportant = function () {
246
- var result = new Ruleset(this.selectors, this.rules.map(function (r) {
247
- if (r.makeImportant) {
248
- return r.makeImportant();
249
200
  }
250
- else {
251
- return r;
201
+ return ruleset;
202
+ },
203
+ evalImports: function (context) {
204
+ var rules = this.rules;
205
+ var i;
206
+ var importRules;
207
+ if (!rules) {
208
+ return;
252
209
  }
253
- }), this.strictImports, this.visibilityInfo());
254
- return result;
255
- };
256
- Ruleset.prototype.matchArgs = function (args) {
257
- return !args || args.length === 0;
258
- };
259
- // lets you call a css selector with a guard
260
- Ruleset.prototype.matchCondition = function (args, context) {
261
- var lastSelector = this.selectors[this.selectors.length - 1];
262
- if (!lastSelector.evaldCondition) {
263
- return false;
264
- }
265
- if (lastSelector.condition &&
266
- !lastSelector.condition.eval(new contexts_1.default.Eval(context, context.frames))) {
267
- return false;
268
- }
269
- return true;
270
- };
271
- Ruleset.prototype.resetCache = function () {
272
- this._rulesets = null;
273
- this._variables = null;
274
- this._properties = null;
275
- this._lookups = {};
276
- };
277
- Ruleset.prototype.variables = function () {
278
- if (!this._variables) {
279
- this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
280
- if (r instanceof declaration_1.default && r.variable === true) {
281
- hash[r.name] = r;
282
- }
283
- // when evaluating variables in an import statement, imports have not been eval'd
284
- // so we need to go inside import statements.
285
- // guard against root being a string (in the case of inlined less)
286
- if (r.type === 'Import' && r.root && r.root.variables) {
287
- var vars = r.root.variables();
288
- for (var name_1 in vars) {
289
- if (vars.hasOwnProperty(name_1)) {
290
- hash[name_1] = r.root.variable(name_1);
291
- }
292
- }
293
- }
294
- return hash;
295
- }, {});
296
- }
297
- return this._variables;
298
- };
299
- Ruleset.prototype.properties = function () {
300
- if (!this._properties) {
301
- this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
302
- if (r instanceof declaration_1.default && r.variable !== true) {
303
- var name_2 = (r.name.length === 1) && (r.name[0] instanceof keyword_1.default) ?
304
- r.name[0].value : r.name;
305
- // Properties don't overwrite as they can merge
306
- if (!hash["$" + name_2]) {
307
- hash["$" + name_2] = [r];
210
+ for (i = 0; i < rules.length; i++) {
211
+ if (rules[i].type === 'Import') {
212
+ importRules = rules[i].eval(context);
213
+ if (importRules && (importRules.length || importRules.length === 0)) {
214
+ rules.splice.apply(rules, [i, 1].concat(importRules));
215
+ i += importRules.length - 1;
308
216
  }
309
217
  else {
310
- hash["$" + name_2].push(r);
218
+ rules.splice(i, 1, importRules);
311
219
  }
220
+ this.resetCache();
312
221
  }
313
- return hash;
314
- }, {});
315
- }
316
- return this._properties;
317
- };
318
- Ruleset.prototype.variable = function (name) {
319
- var decl = this.variables()[name];
320
- if (decl) {
321
- return this.parseValue(decl);
322
- }
323
- };
324
- Ruleset.prototype.property = function (name) {
325
- var decl = this.properties()[name];
326
- if (decl) {
327
- return this.parseValue(decl);
328
- }
329
- };
330
- Ruleset.prototype.lastDeclaration = function () {
331
- for (var i = this.rules.length; i > 0; i--) {
332
- var decl = this.rules[i - 1];
333
- if (decl instanceof declaration_1.default) {
334
- return this.parseValue(decl);
335
222
  }
336
- }
337
- };
338
- Ruleset.prototype.parseValue = function (toParse) {
339
- var self = this;
340
- function transformDeclaration(decl) {
341
- if (decl.value instanceof anonymous_1.default && !decl.parsed) {
342
- if (typeof decl.value.value === 'string') {
343
- this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) {
344
- if (err) {
345
- decl.parsed = true;
346
- }
347
- if (result) {
348
- decl.value = result[0];
349
- decl.important = result[1] || '';
350
- decl.parsed = true;
351
- }
352
- });
223
+ },
224
+ makeImportant: function () {
225
+ var result = new Ruleset(this.selectors, this.rules.map(function (r) {
226
+ if (r.makeImportant) {
227
+ return r.makeImportant();
353
228
  }
354
229
  else {
355
- decl.parsed = true;
230
+ return r;
356
231
  }
357
- return decl;
358
- }
359
- else {
360
- return decl;
361
- }
362
- }
363
- if (!Array.isArray(toParse)) {
364
- return transformDeclaration.call(self, toParse);
365
- }
366
- else {
367
- var nodes_1 = [];
368
- toParse.forEach(function (n) {
369
- nodes_1.push(transformDeclaration.call(self, n));
370
- });
371
- return nodes_1;
372
- }
373
- };
374
- Ruleset.prototype.rulesets = function () {
375
- if (!this.rules) {
376
- return [];
377
- }
378
- var filtRules = [];
379
- var rules = this.rules;
380
- var i;
381
- var rule;
382
- for (i = 0; (rule = rules[i]); i++) {
383
- if (rule.isRuleset) {
384
- filtRules.push(rule);
385
- }
386
- }
387
- return filtRules;
388
- };
389
- Ruleset.prototype.prependRule = function (rule) {
390
- var rules = this.rules;
391
- if (rules) {
392
- rules.unshift(rule);
393
- }
394
- else {
395
- this.rules = [rule];
396
- }
397
- this.setParent(rule, this);
398
- };
399
- Ruleset.prototype.find = function (selector, self, filter) {
400
- if (self === void 0) { self = this; }
401
- var rules = [];
402
- var match;
403
- var foundMixins;
404
- var key = selector.toCSS();
405
- if (key in this._lookups) {
406
- return this._lookups[key];
407
- }
408
- this.rulesets().forEach(function (rule) {
409
- if (rule !== self) {
410
- for (var j = 0; j < rule.selectors.length; j++) {
411
- match = selector.match(rule.selectors[j]);
412
- if (match) {
413
- if (selector.elements.length > match) {
414
- if (!filter || filter(rule)) {
415
- foundMixins = rule.find(new selector_1.default(selector.elements.slice(match)), self, filter);
416
- for (var i = 0; i < foundMixins.length; ++i) {
417
- foundMixins[i].path.push(rule);
418
- }
419
- Array.prototype.push.apply(rules, foundMixins);
232
+ }), this.strictImports, this.visibilityInfo());
233
+ return result;
234
+ },
235
+ matchArgs: function (args) {
236
+ return !args || args.length === 0;
237
+ },
238
+ // lets you call a css selector with a guard
239
+ matchCondition: function (args, context) {
240
+ var lastSelector = this.selectors[this.selectors.length - 1];
241
+ if (!lastSelector.evaldCondition) {
242
+ return false;
243
+ }
244
+ if (lastSelector.condition &&
245
+ !lastSelector.condition.eval(new contexts_1.default.Eval(context, context.frames))) {
246
+ return false;
247
+ }
248
+ return true;
249
+ },
250
+ resetCache: function () {
251
+ this._rulesets = null;
252
+ this._variables = null;
253
+ this._properties = null;
254
+ this._lookups = {};
255
+ },
256
+ variables: function () {
257
+ if (!this._variables) {
258
+ this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
259
+ if (r instanceof declaration_1.default && r.variable === true) {
260
+ hash[r.name] = r;
261
+ }
262
+ // when evaluating variables in an import statement, imports have not been eval'd
263
+ // so we need to go inside import statements.
264
+ // guard against root being a string (in the case of inlined less)
265
+ if (r.type === 'Import' && r.root && r.root.variables) {
266
+ var vars = r.root.variables();
267
+ for (var name_1 in vars) {
268
+ if (vars.hasOwnProperty(name_1)) {
269
+ hash[name_1] = r.root.variable(name_1);
420
270
  }
421
271
  }
272
+ }
273
+ return hash;
274
+ }, {});
275
+ }
276
+ return this._variables;
277
+ },
278
+ properties: function () {
279
+ if (!this._properties) {
280
+ this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
281
+ if (r instanceof declaration_1.default && r.variable !== true) {
282
+ var name_2 = (r.name.length === 1) && (r.name[0] instanceof keyword_1.default) ?
283
+ r.name[0].value : r.name;
284
+ // Properties don't overwrite as they can merge
285
+ if (!hash["$" + name_2]) {
286
+ hash["$" + name_2] = [r];
287
+ }
422
288
  else {
423
- rules.push({ rule: rule, path: [] });
289
+ hash["$" + name_2].push(r);
424
290
  }
425
- break;
426
291
  }
427
- }
292
+ return hash;
293
+ }, {});
294
+ }
295
+ return this._properties;
296
+ },
297
+ variable: function (name) {
298
+ var decl = this.variables()[name];
299
+ if (decl) {
300
+ return this.parseValue(decl);
428
301
  }
429
- });
430
- this._lookups[key] = rules;
431
- return rules;
432
- };
433
- Ruleset.prototype.genCSS = function (context, output) {
434
- var i;
435
- var j;
436
- var charsetRuleNodes = [];
437
- var ruleNodes = [];
438
- var // Line number debugging
439
- debugInfo;
440
- var rule;
441
- var path;
442
- context.tabLevel = (context.tabLevel || 0);
443
- if (!this.root) {
444
- context.tabLevel++;
445
- }
446
- var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
447
- var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
448
- var sep;
449
- var charsetNodeIndex = 0;
450
- var importNodeIndex = 0;
451
- for (i = 0; (rule = this.rules[i]); i++) {
452
- if (rule instanceof comment_1.default) {
453
- if (importNodeIndex === i) {
454
- importNodeIndex++;
302
+ },
303
+ property: function (name) {
304
+ var decl = this.properties()[name];
305
+ if (decl) {
306
+ return this.parseValue(decl);
307
+ }
308
+ },
309
+ lastDeclaration: function () {
310
+ for (var i = this.rules.length; i > 0; i--) {
311
+ var decl = this.rules[i - 1];
312
+ if (decl instanceof declaration_1.default) {
313
+ return this.parseValue(decl);
455
314
  }
456
- ruleNodes.push(rule);
457
315
  }
458
- else if (rule.isCharset && rule.isCharset()) {
459
- ruleNodes.splice(charsetNodeIndex, 0, rule);
460
- charsetNodeIndex++;
461
- importNodeIndex++;
316
+ },
317
+ parseValue: function (toParse) {
318
+ var self = this;
319
+ function transformDeclaration(decl) {
320
+ if (decl.value instanceof anonymous_1.default && !decl.parsed) {
321
+ if (typeof decl.value.value === 'string') {
322
+ this.parse.parseNode(decl.value.value, ['value', 'important'], decl.value.getIndex(), decl.fileInfo(), function (err, result) {
323
+ if (err) {
324
+ decl.parsed = true;
325
+ }
326
+ if (result) {
327
+ decl.value = result[0];
328
+ decl.important = result[1] || '';
329
+ decl.parsed = true;
330
+ }
331
+ });
332
+ }
333
+ else {
334
+ decl.parsed = true;
335
+ }
336
+ return decl;
337
+ }
338
+ else {
339
+ return decl;
340
+ }
462
341
  }
463
- else if (rule.type === 'Import') {
464
- ruleNodes.splice(importNodeIndex, 0, rule);
465
- importNodeIndex++;
342
+ if (!Array.isArray(toParse)) {
343
+ return transformDeclaration.call(self, toParse);
466
344
  }
467
345
  else {
468
- ruleNodes.push(rule);
469
- }
470
- }
471
- ruleNodes = charsetRuleNodes.concat(ruleNodes);
472
- // If this is the root node, we don't render
473
- // a selector, or {}.
474
- if (!this.root) {
475
- debugInfo = debug_info_1.default(context, this, tabSetStr);
476
- if (debugInfo) {
477
- output.add(debugInfo);
478
- output.add(tabSetStr);
479
- }
480
- var paths = this.paths;
481
- var pathCnt = paths.length;
482
- var pathSubCnt = void 0;
483
- sep = context.compress ? ',' : (",\n" + tabSetStr);
484
- for (i = 0; i < pathCnt; i++) {
485
- path = paths[i];
486
- if (!(pathSubCnt = path.length)) {
487
- continue;
488
- }
489
- if (i > 0) {
490
- output.add(sep);
491
- }
492
- context.firstSelector = true;
493
- path[0].genCSS(context, output);
494
- context.firstSelector = false;
495
- for (j = 1; j < pathSubCnt; j++) {
496
- path[j].genCSS(context, output);
497
- }
498
- }
499
- output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
500
- }
501
- // Compile rules and rulesets
502
- for (i = 0; (rule = ruleNodes[i]); i++) {
503
- if (i + 1 === ruleNodes.length) {
504
- context.lastRule = true;
505
- }
506
- var currentLastRule = context.lastRule;
507
- if (rule.isRulesetLike(rule)) {
508
- context.lastRule = false;
346
+ var nodes_1 = [];
347
+ toParse.forEach(function (n) {
348
+ nodes_1.push(transformDeclaration.call(self, n));
349
+ });
350
+ return nodes_1;
509
351
  }
510
- if (rule.genCSS) {
511
- rule.genCSS(context, output);
352
+ },
353
+ rulesets: function () {
354
+ if (!this.rules) {
355
+ return [];
512
356
  }
513
- else if (rule.value) {
514
- output.add(rule.value.toString());
357
+ var filtRules = [];
358
+ var rules = this.rules;
359
+ var i;
360
+ var rule;
361
+ for (i = 0; (rule = rules[i]); i++) {
362
+ if (rule.isRuleset) {
363
+ filtRules.push(rule);
364
+ }
515
365
  }
516
- context.lastRule = currentLastRule;
517
- if (!context.lastRule && rule.isVisible()) {
518
- output.add(context.compress ? '' : ("\n" + tabRuleStr));
366
+ return filtRules;
367
+ },
368
+ prependRule: function (rule) {
369
+ var rules = this.rules;
370
+ if (rules) {
371
+ rules.unshift(rule);
519
372
  }
520
373
  else {
521
- context.lastRule = false;
522
- }
523
- }
524
- if (!this.root) {
525
- output.add((context.compress ? '}' : "\n" + tabSetStr + "}"));
526
- context.tabLevel--;
527
- }
528
- if (!output.isEmpty() && !context.compress && this.firstRoot) {
529
- output.add('\n');
530
- }
531
- };
532
- Ruleset.prototype.joinSelectors = function (paths, context, selectors) {
533
- for (var s = 0; s < selectors.length; s++) {
534
- this.joinSelector(paths, context, selectors[s]);
535
- }
536
- };
537
- Ruleset.prototype.joinSelector = function (paths, context, selector) {
538
- function createParenthesis(elementsToPak, originalElement) {
539
- var replacementParen;
374
+ this.rules = [rule];
375
+ }
376
+ this.setParent(rule, this);
377
+ },
378
+ find: function (selector, self, filter) {
379
+ self = self || this;
380
+ var rules = [];
381
+ var match;
382
+ var foundMixins;
383
+ var key = selector.toCSS();
384
+ if (key in this._lookups) {
385
+ return this._lookups[key];
386
+ }
387
+ this.rulesets().forEach(function (rule) {
388
+ if (rule !== self) {
389
+ for (var j = 0; j < rule.selectors.length; j++) {
390
+ match = selector.match(rule.selectors[j]);
391
+ if (match) {
392
+ if (selector.elements.length > match) {
393
+ if (!filter || filter(rule)) {
394
+ foundMixins = rule.find(new selector_1.default(selector.elements.slice(match)), self, filter);
395
+ for (var i = 0; i < foundMixins.length; ++i) {
396
+ foundMixins[i].path.push(rule);
397
+ }
398
+ Array.prototype.push.apply(rules, foundMixins);
399
+ }
400
+ }
401
+ else {
402
+ rules.push({ rule: rule, path: [] });
403
+ }
404
+ break;
405
+ }
406
+ }
407
+ }
408
+ });
409
+ this._lookups[key] = rules;
410
+ return rules;
411
+ },
412
+ genCSS: function (context, output) {
413
+ var i;
540
414
  var j;
541
- if (elementsToPak.length === 0) {
542
- replacementParen = new paren_1.default(elementsToPak[0]);
415
+ var charsetRuleNodes = [];
416
+ var ruleNodes = [];
417
+ var // Line number debugging
418
+ debugInfo;
419
+ var rule;
420
+ var path;
421
+ context.tabLevel = (context.tabLevel || 0);
422
+ if (!this.root) {
423
+ context.tabLevel++;
424
+ }
425
+ var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
426
+ var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
427
+ var sep;
428
+ var charsetNodeIndex = 0;
429
+ var importNodeIndex = 0;
430
+ for (i = 0; (rule = this.rules[i]); i++) {
431
+ if (rule instanceof comment_1.default) {
432
+ if (importNodeIndex === i) {
433
+ importNodeIndex++;
434
+ }
435
+ ruleNodes.push(rule);
436
+ }
437
+ else if (rule.isCharset && rule.isCharset()) {
438
+ ruleNodes.splice(charsetNodeIndex, 0, rule);
439
+ charsetNodeIndex++;
440
+ importNodeIndex++;
441
+ }
442
+ else if (rule.type === 'Import') {
443
+ ruleNodes.splice(importNodeIndex, 0, rule);
444
+ importNodeIndex++;
445
+ }
446
+ else {
447
+ ruleNodes.push(rule);
448
+ }
543
449
  }
544
- else {
545
- var insideParent = new Array(elementsToPak.length);
546
- for (j = 0; j < elementsToPak.length; j++) {
547
- insideParent[j] = new element_1.default(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
450
+ ruleNodes = charsetRuleNodes.concat(ruleNodes);
451
+ // If this is the root node, we don't render
452
+ // a selector, or {}.
453
+ if (!this.root) {
454
+ debugInfo = debug_info_1.default(context, this, tabSetStr);
455
+ if (debugInfo) {
456
+ output.add(debugInfo);
457
+ output.add(tabSetStr);
548
458
  }
549
- replacementParen = new paren_1.default(new selector_1.default(insideParent));
459
+ var paths = this.paths;
460
+ var pathCnt = paths.length;
461
+ var pathSubCnt = void 0;
462
+ sep = context.compress ? ',' : (",\n" + tabSetStr);
463
+ for (i = 0; i < pathCnt; i++) {
464
+ path = paths[i];
465
+ if (!(pathSubCnt = path.length)) {
466
+ continue;
467
+ }
468
+ if (i > 0) {
469
+ output.add(sep);
470
+ }
471
+ context.firstSelector = true;
472
+ path[0].genCSS(context, output);
473
+ context.firstSelector = false;
474
+ for (j = 1; j < pathSubCnt; j++) {
475
+ path[j].genCSS(context, output);
476
+ }
477
+ }
478
+ output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
550
479
  }
551
- return replacementParen;
552
- }
553
- function createSelector(containedElement, originalElement) {
554
- var element;
555
- var selector;
556
- element = new element_1.default(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
557
- selector = new selector_1.default([element]);
558
- return selector;
559
- }
560
- // joins selector path from `beginningPath` with selector path in `addPath`
561
- // `replacedElement` contains element that is being replaced by `addPath`
562
- // returns concatenated path
563
- function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
564
- var newSelectorPath;
565
- var lastSelector;
566
- var newJoinedSelector;
567
- // our new selector path
568
- newSelectorPath = [];
569
- // construct the joined selector - if & is the first thing this will be empty,
570
- // if not newJoinedSelector will be the last set of elements in the selector
571
- if (beginningPath.length > 0) {
572
- newSelectorPath = utils.copyArray(beginningPath);
573
- lastSelector = newSelectorPath.pop();
574
- newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));
480
+ // Compile rules and rulesets
481
+ for (i = 0; (rule = ruleNodes[i]); i++) {
482
+ if (i + 1 === ruleNodes.length) {
483
+ context.lastRule = true;
484
+ }
485
+ var currentLastRule = context.lastRule;
486
+ if (rule.isRulesetLike(rule)) {
487
+ context.lastRule = false;
488
+ }
489
+ if (rule.genCSS) {
490
+ rule.genCSS(context, output);
491
+ }
492
+ else if (rule.value) {
493
+ output.add(rule.value.toString());
494
+ }
495
+ context.lastRule = currentLastRule;
496
+ if (!context.lastRule && rule.isVisible()) {
497
+ output.add(context.compress ? '' : ("\n" + tabRuleStr));
498
+ }
499
+ else {
500
+ context.lastRule = false;
501
+ }
575
502
  }
576
- else {
577
- newJoinedSelector = originalSelector.createDerived([]);
578
- }
579
- if (addPath.length > 0) {
580
- // /deep/ is a CSS4 selector - (removed, so should deprecate)
581
- // that is valid without anything in front of it
582
- // so if the & does not have a combinator that is "" or " " then
583
- // and there is a combinator on the parent, then grab that.
584
- // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
585
- var combinator = replacedElement.combinator;
586
- var parentEl = addPath[0].elements[0];
587
- if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
588
- combinator = parentEl.combinator;
589
- }
590
- // join the elements so far with the first part of the parent
591
- newJoinedSelector.elements.push(new element_1.default(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
592
- newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
593
- }
594
- // now add the joined selector - but only if it is not empty
595
- if (newJoinedSelector.elements.length !== 0) {
596
- newSelectorPath.push(newJoinedSelector);
597
- }
598
- // put together the parent selectors after the join (e.g. the rest of the parent)
599
- if (addPath.length > 1) {
600
- var restOfPath = addPath.slice(1);
601
- restOfPath = restOfPath.map(function (selector) { return selector.createDerived(selector.elements, []); });
602
- newSelectorPath = newSelectorPath.concat(restOfPath);
603
- }
604
- return newSelectorPath;
605
- }
606
- // joins selector path from `beginningPath` with every selector path in `addPaths` array
607
- // `replacedElement` contains element that is being replaced by `addPath`
608
- // returns array with all concatenated paths
609
- function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
610
- var j;
611
- for (j = 0; j < beginningPath.length; j++) {
612
- var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
613
- result.push(newSelectorPath);
503
+ if (!this.root) {
504
+ output.add((context.compress ? '}' : "\n" + tabSetStr + "}"));
505
+ context.tabLevel--;
614
506
  }
615
- return result;
616
- }
617
- function mergeElementsOnToSelectors(elements, selectors) {
618
- var i;
619
- var sel;
620
- if (elements.length === 0) {
621
- return;
507
+ if (!output.isEmpty() && !context.compress && this.firstRoot) {
508
+ output.add('\n');
622
509
  }
623
- if (selectors.length === 0) {
624
- selectors.push([new selector_1.default(elements)]);
625
- return;
510
+ },
511
+ joinSelectors: function (paths, context, selectors) {
512
+ for (var s = 0; s < selectors.length; s++) {
513
+ this.joinSelector(paths, context, selectors[s]);
626
514
  }
627
- for (i = 0; (sel = selectors[i]); i++) {
628
- // if the previous thing in sel is a parent this needs to join on to it
629
- if (sel.length > 0) {
630
- sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
515
+ },
516
+ joinSelector: function (paths, context, selector) {
517
+ function createParenthesis(elementsToPak, originalElement) {
518
+ var replacementParen, j;
519
+ if (elementsToPak.length === 0) {
520
+ replacementParen = new paren_1.default(elementsToPak[0]);
631
521
  }
632
522
  else {
633
- sel.push(new selector_1.default(elements));
523
+ var insideParent = new Array(elementsToPak.length);
524
+ for (j = 0; j < elementsToPak.length; j++) {
525
+ insideParent[j] = new element_1.default(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
526
+ }
527
+ replacementParen = new paren_1.default(new selector_1.default(insideParent));
528
+ }
529
+ return replacementParen;
530
+ }
531
+ function createSelector(containedElement, originalElement) {
532
+ var element, selector;
533
+ element = new element_1.default(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
534
+ selector = new selector_1.default([element]);
535
+ return selector;
536
+ }
537
+ // joins selector path from `beginningPath` with selector path in `addPath`
538
+ // `replacedElement` contains element that is being replaced by `addPath`
539
+ // returns concatenated path
540
+ function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
541
+ var newSelectorPath, lastSelector, newJoinedSelector;
542
+ // our new selector path
543
+ newSelectorPath = [];
544
+ // construct the joined selector - if & is the first thing this will be empty,
545
+ // if not newJoinedSelector will be the last set of elements in the selector
546
+ if (beginningPath.length > 0) {
547
+ newSelectorPath = utils.copyArray(beginningPath);
548
+ lastSelector = newSelectorPath.pop();
549
+ newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));
550
+ }
551
+ else {
552
+ newJoinedSelector = originalSelector.createDerived([]);
553
+ }
554
+ if (addPath.length > 0) {
555
+ // /deep/ is a CSS4 selector - (removed, so should deprecate)
556
+ // that is valid without anything in front of it
557
+ // so if the & does not have a combinator that is "" or " " then
558
+ // and there is a combinator on the parent, then grab that.
559
+ // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
560
+ var combinator = replacedElement.combinator;
561
+ var parentEl = addPath[0].elements[0];
562
+ if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
563
+ combinator = parentEl.combinator;
564
+ }
565
+ // join the elements so far with the first part of the parent
566
+ newJoinedSelector.elements.push(new element_1.default(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
567
+ newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
634
568
  }
569
+ // now add the joined selector - but only if it is not empty
570
+ if (newJoinedSelector.elements.length !== 0) {
571
+ newSelectorPath.push(newJoinedSelector);
572
+ }
573
+ // put together the parent selectors after the join (e.g. the rest of the parent)
574
+ if (addPath.length > 1) {
575
+ var restOfPath = addPath.slice(1);
576
+ restOfPath = restOfPath.map(function (selector) {
577
+ return selector.createDerived(selector.elements, []);
578
+ });
579
+ newSelectorPath = newSelectorPath.concat(restOfPath);
580
+ }
581
+ return newSelectorPath;
582
+ }
583
+ // joins selector path from `beginningPath` with every selector path in `addPaths` array
584
+ // `replacedElement` contains element that is being replaced by `addPath`
585
+ // returns array with all concatenated paths
586
+ function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
587
+ var j;
588
+ for (j = 0; j < beginningPath.length; j++) {
589
+ var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
590
+ result.push(newSelectorPath);
591
+ }
592
+ return result;
635
593
  }
636
- }
637
- // replace all parent selectors inside `inSelector` by content of `context` array
638
- // resulting selectors are returned inside `paths` array
639
- // returns true if `inSelector` contained at least one parent selector
640
- function replaceParentSelector(paths, context, inSelector) {
641
- // The paths are [[Selector]]
642
- // The first list is a list of comma separated selectors
643
- // The inner list is a list of inheritance separated selectors
644
- // e.g.
645
- // .a, .b {
646
- // .c {
647
- // }
648
- // }
649
- // == [[.a] [.c]] [[.b] [.c]]
650
- //
651
- var i;
652
- var j;
653
- var k;
654
- var currentElements;
655
- var newSelectors;
656
- var selectorsMultiplied;
657
- var sel;
658
- var el;
659
- var hadParentSelector = false;
660
- var length;
661
- var lastSelector;
662
- function findNestedSelector(element) {
663
- var maybeSelector;
664
- if (!(element.value instanceof paren_1.default)) {
665
- return null;
666
- }
667
- maybeSelector = element.value.value;
668
- if (!(maybeSelector instanceof selector_1.default)) {
669
- return null;
670
- }
671
- return maybeSelector;
672
- }
673
- // the elements from the current selector so far
674
- currentElements = [];
675
- // the current list of new selectors to add to the path.
676
- // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
677
- // by the parents
678
- newSelectors = [
679
- []
680
- ];
681
- for (i = 0; (el = inSelector.elements[i]); i++) {
682
- // non parent reference elements just get added
683
- if (el.value !== '&') {
684
- var nestedSelector = findNestedSelector(el);
685
- if (nestedSelector != null) {
686
- // merge the current list of non parent selector elements
687
- // on to the current list of selectors to add
688
- mergeElementsOnToSelectors(currentElements, newSelectors);
689
- var nestedPaths = [];
690
- var replaced = void 0;
691
- var replacedNewSelectors = [];
692
- replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
693
- hadParentSelector = hadParentSelector || replaced;
694
- // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
695
- for (k = 0; k < nestedPaths.length; k++) {
696
- var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
697
- addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
698
- }
699
- newSelectors = replacedNewSelectors;
700
- currentElements = [];
594
+ function mergeElementsOnToSelectors(elements, selectors) {
595
+ var i, sel;
596
+ if (elements.length === 0) {
597
+ return;
598
+ }
599
+ if (selectors.length === 0) {
600
+ selectors.push([new selector_1.default(elements)]);
601
+ return;
602
+ }
603
+ for (i = 0; (sel = selectors[i]); i++) {
604
+ // if the previous thing in sel is a parent this needs to join on to it
605
+ if (sel.length > 0) {
606
+ sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
701
607
  }
702
608
  else {
703
- currentElements.push(el);
609
+ sel.push(new selector_1.default(elements));
704
610
  }
705
611
  }
706
- else {
707
- hadParentSelector = true;
708
- // the new list of selectors to add
709
- selectorsMultiplied = [];
710
- // merge the current list of non parent selector elements
711
- // on to the current list of selectors to add
712
- mergeElementsOnToSelectors(currentElements, newSelectors);
713
- // loop through our current selectors
714
- for (j = 0; j < newSelectors.length; j++) {
715
- sel = newSelectors[j];
716
- // if we don't have any parent paths, the & might be in a mixin so that it can be used
717
- // whether there are parents or not
718
- if (context.length === 0) {
719
- // the combinator used on el should now be applied to the next element instead so that
720
- // it is not lost
721
- if (sel.length > 0) {
722
- sel[0].elements.push(new element_1.default(el.combinator, '', el.isVariable, el._index, el._fileInfo));
612
+ }
613
+ // replace all parent selectors inside `inSelector` by content of `context` array
614
+ // resulting selectors are returned inside `paths` array
615
+ // returns true if `inSelector` contained at least one parent selector
616
+ function replaceParentSelector(paths, context, inSelector) {
617
+ // The paths are [[Selector]]
618
+ // The first list is a list of comma separated selectors
619
+ // The inner list is a list of inheritance separated selectors
620
+ // e.g.
621
+ // .a, .b {
622
+ // .c {
623
+ // }
624
+ // }
625
+ // == [[.a] [.c]] [[.b] [.c]]
626
+ //
627
+ var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
628
+ function findNestedSelector(element) {
629
+ var maybeSelector;
630
+ if (!(element.value instanceof paren_1.default)) {
631
+ return null;
632
+ }
633
+ maybeSelector = element.value.value;
634
+ if (!(maybeSelector instanceof selector_1.default)) {
635
+ return null;
636
+ }
637
+ return maybeSelector;
638
+ }
639
+ // the elements from the current selector so far
640
+ currentElements = [];
641
+ // the current list of new selectors to add to the path.
642
+ // We will build it up. We initiate it with one empty selector as we "multiply" the new selectors
643
+ // by the parents
644
+ newSelectors = [
645
+ []
646
+ ];
647
+ for (i = 0; (el = inSelector.elements[i]); i++) {
648
+ // non parent reference elements just get added
649
+ if (el.value !== '&') {
650
+ var nestedSelector = findNestedSelector(el);
651
+ if (nestedSelector != null) {
652
+ // merge the current list of non parent selector elements
653
+ // on to the current list of selectors to add
654
+ mergeElementsOnToSelectors(currentElements, newSelectors);
655
+ var nestedPaths = [];
656
+ var replaced = void 0;
657
+ var replacedNewSelectors = [];
658
+ replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
659
+ hadParentSelector = hadParentSelector || replaced;
660
+ // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
661
+ for (k = 0; k < nestedPaths.length; k++) {
662
+ var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
663
+ addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
723
664
  }
724
- selectorsMultiplied.push(sel);
665
+ newSelectors = replacedNewSelectors;
666
+ currentElements = [];
725
667
  }
726
668
  else {
727
- // and the parent selectors
728
- for (k = 0; k < context.length; k++) {
729
- // We need to put the current selectors
730
- // then join the last selector's elements on to the parents selectors
731
- var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
732
- // add that to our new set of selectors
733
- selectorsMultiplied.push(newSelectorPath);
669
+ currentElements.push(el);
670
+ }
671
+ }
672
+ else {
673
+ hadParentSelector = true;
674
+ // the new list of selectors to add
675
+ selectorsMultiplied = [];
676
+ // merge the current list of non parent selector elements
677
+ // on to the current list of selectors to add
678
+ mergeElementsOnToSelectors(currentElements, newSelectors);
679
+ // loop through our current selectors
680
+ for (j = 0; j < newSelectors.length; j++) {
681
+ sel = newSelectors[j];
682
+ // if we don't have any parent paths, the & might be in a mixin so that it can be used
683
+ // whether there are parents or not
684
+ if (context.length === 0) {
685
+ // the combinator used on el should now be applied to the next element instead so that
686
+ // it is not lost
687
+ if (sel.length > 0) {
688
+ sel[0].elements.push(new element_1.default(el.combinator, '', el.isVariable, el._index, el._fileInfo));
689
+ }
690
+ selectorsMultiplied.push(sel);
691
+ }
692
+ else {
693
+ // and the parent selectors
694
+ for (k = 0; k < context.length; k++) {
695
+ // We need to put the current selectors
696
+ // then join the last selector's elements on to the parents selectors
697
+ var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
698
+ // add that to our new set of selectors
699
+ selectorsMultiplied.push(newSelectorPath);
700
+ }
734
701
  }
735
702
  }
703
+ // our new selectors has been multiplied, so reset the state
704
+ newSelectors = selectorsMultiplied;
705
+ currentElements = [];
736
706
  }
737
- // our new selectors has been multiplied, so reset the state
738
- newSelectors = selectorsMultiplied;
739
- currentElements = [];
740
707
  }
741
- }
742
- // if we have any elements left over (e.g. .a& .b == .b)
743
- // add them on to all the current selectors
744
- mergeElementsOnToSelectors(currentElements, newSelectors);
745
- for (i = 0; i < newSelectors.length; i++) {
746
- length = newSelectors[i].length;
747
- if (length > 0) {
748
- paths.push(newSelectors[i]);
749
- lastSelector = newSelectors[i][length - 1];
750
- newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
708
+ // if we have any elements left over (e.g. .a& .b == .b)
709
+ // add them on to all the current selectors
710
+ mergeElementsOnToSelectors(currentElements, newSelectors);
711
+ for (i = 0; i < newSelectors.length; i++) {
712
+ length = newSelectors[i].length;
713
+ if (length > 0) {
714
+ paths.push(newSelectors[i]);
715
+ lastSelector = newSelectors[i][length - 1];
716
+ newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
717
+ }
751
718
  }
752
- }
753
- return hadParentSelector;
754
- }
755
- function deriveSelector(visibilityInfo, deriveFrom) {
756
- var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
757
- newSelector.copyVisibilityInfo(visibilityInfo);
758
- return newSelector;
759
- }
760
- // joinSelector code follows
761
- var i;
762
- var newPaths;
763
- var hadParentSelector;
764
- newPaths = [];
765
- hadParentSelector = replaceParentSelector(newPaths, context, selector);
766
- if (!hadParentSelector) {
767
- if (context.length > 0) {
768
- newPaths = [];
769
- for (i = 0; i < context.length; i++) {
770
- var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
771
- concatenated.push(selector);
772
- newPaths.push(concatenated);
719
+ return hadParentSelector;
720
+ }
721
+ function deriveSelector(visibilityInfo, deriveFrom) {
722
+ var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
723
+ newSelector.copyVisibilityInfo(visibilityInfo);
724
+ return newSelector;
725
+ }
726
+ // joinSelector code follows
727
+ var i, newPaths, hadParentSelector;
728
+ newPaths = [];
729
+ hadParentSelector = replaceParentSelector(newPaths, context, selector);
730
+ if (!hadParentSelector) {
731
+ if (context.length > 0) {
732
+ newPaths = [];
733
+ for (i = 0; i < context.length; i++) {
734
+ var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
735
+ concatenated.push(selector);
736
+ newPaths.push(concatenated);
737
+ }
738
+ }
739
+ else {
740
+ newPaths = [[selector]];
773
741
  }
774
742
  }
775
- else {
776
- newPaths = [[selector]];
743
+ for (i = 0; i < newPaths.length; i++) {
744
+ paths.push(newPaths[i]);
777
745
  }
778
746
  }
779
- for (i = 0; i < newPaths.length; i++) {
780
- paths.push(newPaths[i]);
781
- }
782
- };
783
- Ruleset.prototype.type = 'Ruleset';
784
- Ruleset.prototype.isRuleset = true;
747
+ });
785
748
  exports.default = Ruleset;
786
749
  //# sourceMappingURL=ruleset.js.map