less 3.9.0 → 3.10.1

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