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