less 4.5.1 → 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 (338) hide show
  1. package/bin/lessc +37 -23
  2. package/dist/less.js +14497 -11745
  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 -55
  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 +36 -26
  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 +63 -45
  36. package/lib/less/logger.js +11 -14
  37. package/lib/less/parse-tree.js +52 -53
  38. package/lib/less/parse.js +44 -44
  39. package/lib/less/parser/parser-input.js +151 -113
  40. package/lib/less/parser/parser.js +864 -658
  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 +56 -43
  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 +28 -15
  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 +20 -21
  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 +25 -18
  119. package/.eslintignore +0 -6
  120. package/.eslintrc.js +0 -63
  121. package/Gruntfile.js +0 -403
  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/parser-input.js.map +0 -1
  159. package/lib/less/parser/parser.js.map +0 -1
  160. package/lib/less/plugin-manager.js.map +0 -1
  161. package/lib/less/render.js.map +0 -1
  162. package/lib/less/source-map-builder.js.map +0 -1
  163. package/lib/less/source-map-output.js.map +0 -1
  164. package/lib/less/transform-tree.js.map +0 -1
  165. package/lib/less/tree/anonymous.js.map +0 -1
  166. package/lib/less/tree/assignment.js.map +0 -1
  167. package/lib/less/tree/atrule-syntax.js.map +0 -1
  168. package/lib/less/tree/atrule.js.map +0 -1
  169. package/lib/less/tree/attribute.js.map +0 -1
  170. package/lib/less/tree/call.js.map +0 -1
  171. package/lib/less/tree/color.js.map +0 -1
  172. package/lib/less/tree/combinator.js.map +0 -1
  173. package/lib/less/tree/comment.js.map +0 -1
  174. package/lib/less/tree/condition.js.map +0 -1
  175. package/lib/less/tree/container.js.map +0 -1
  176. package/lib/less/tree/debug-info.js.map +0 -1
  177. package/lib/less/tree/declaration.js.map +0 -1
  178. package/lib/less/tree/detached-ruleset.js.map +0 -1
  179. package/lib/less/tree/dimension.js.map +0 -1
  180. package/lib/less/tree/element.js.map +0 -1
  181. package/lib/less/tree/expression.js.map +0 -1
  182. package/lib/less/tree/extend.js.map +0 -1
  183. package/lib/less/tree/import.js.map +0 -1
  184. package/lib/less/tree/index.js.map +0 -1
  185. package/lib/less/tree/javascript.js.map +0 -1
  186. package/lib/less/tree/js-eval-node.js.map +0 -1
  187. package/lib/less/tree/keyword.js.map +0 -1
  188. package/lib/less/tree/media.js.map +0 -1
  189. package/lib/less/tree/mixin-call.js.map +0 -1
  190. package/lib/less/tree/mixin-definition.js.map +0 -1
  191. package/lib/less/tree/namespace-value.js.map +0 -1
  192. package/lib/less/tree/negative.js.map +0 -1
  193. package/lib/less/tree/nested-at-rule.js.map +0 -1
  194. package/lib/less/tree/node.js.map +0 -1
  195. package/lib/less/tree/operation.js.map +0 -1
  196. package/lib/less/tree/paren.js.map +0 -1
  197. package/lib/less/tree/property.js.map +0 -1
  198. package/lib/less/tree/query-in-parens.js.map +0 -1
  199. package/lib/less/tree/quoted.js.map +0 -1
  200. package/lib/less/tree/ruleset.js.map +0 -1
  201. package/lib/less/tree/selector.js.map +0 -1
  202. package/lib/less/tree/unicode-descriptor.js.map +0 -1
  203. package/lib/less/tree/unit.js.map +0 -1
  204. package/lib/less/tree/url.js.map +0 -1
  205. package/lib/less/tree/value.js.map +0 -1
  206. package/lib/less/tree/variable-call.js.map +0 -1
  207. package/lib/less/tree/variable.js.map +0 -1
  208. package/lib/less/utils.js.map +0 -1
  209. package/lib/less/visitors/extend-visitor.js.map +0 -1
  210. package/lib/less/visitors/import-sequencer.js.map +0 -1
  211. package/lib/less/visitors/import-visitor.js.map +0 -1
  212. package/lib/less/visitors/index.js.map +0 -1
  213. package/lib/less/visitors/join-selector-visitor.js.map +0 -1
  214. package/lib/less/visitors/set-tree-visibility-visitor.js.map +0 -1
  215. package/lib/less/visitors/to-css-visitor.js.map +0 -1
  216. package/lib/less/visitors/visitor.js.map +0 -1
  217. package/lib/less-browser/add-default-options.js.map +0 -1
  218. package/lib/less-browser/bootstrap.js.map +0 -1
  219. package/lib/less-browser/browser.js.map +0 -1
  220. package/lib/less-browser/cache.js.map +0 -1
  221. package/lib/less-browser/error-reporting.js.map +0 -1
  222. package/lib/less-browser/file-manager.js.map +0 -1
  223. package/lib/less-browser/image-size.js.map +0 -1
  224. package/lib/less-browser/index.js.map +0 -1
  225. package/lib/less-browser/log-listener.js.map +0 -1
  226. package/lib/less-browser/plugin-loader.js.map +0 -1
  227. package/lib/less-browser/utils.js.map +0 -1
  228. package/lib/less-node/environment.js.map +0 -1
  229. package/lib/less-node/file-manager.js.map +0 -1
  230. package/lib/less-node/fs.js.map +0 -1
  231. package/lib/less-node/image-size.js.map +0 -1
  232. package/lib/less-node/index.js.map +0 -1
  233. package/lib/less-node/lessc-helper.js.map +0 -1
  234. package/lib/less-node/plugin-loader.js.map +0 -1
  235. package/lib/less-node/url-file-manager.js.map +0 -1
  236. package/scripts/coverage-lines.js +0 -207
  237. package/scripts/coverage-report.js +0 -158
  238. package/scripts/postinstall.js +0 -61
  239. package/test/.eslintrc.json +0 -9
  240. package/test/README.md +0 -3
  241. package/test/browser/common.js +0 -251
  242. package/test/browser/css/global-vars/simple.css +0 -3
  243. package/test/browser/css/modify-vars/simple.css +0 -8
  244. package/test/browser/css/plugin/plugin.css +0 -3
  245. package/test/browser/css/postProcessor/postProcessor.css +0 -4
  246. package/test/browser/css/relative-urls/urls.css +0 -36
  247. package/test/browser/css/rewrite-urls/urls.css +0 -36
  248. package/test/browser/css/rootpath/urls.css +0 -35
  249. package/test/browser/css/rootpath-relative/urls.css +0 -35
  250. package/test/browser/css/rootpath-rewrite-urls/urls.css +0 -35
  251. package/test/browser/css/urls.css +0 -54
  252. package/test/browser/generator/benchmark.config.js +0 -50
  253. package/test/browser/generator/generate.js +0 -78
  254. package/test/browser/generator/runner.config.js +0 -184
  255. package/test/browser/generator/runner.js +0 -2
  256. package/test/browser/generator/template.js +0 -104
  257. package/test/browser/generator/utils.js +0 -14
  258. package/test/browser/less/console-errors/test-error.less +0 -3
  259. package/test/browser/less/console-errors/test-error.txt +0 -2
  260. package/test/browser/less/errors/image-height-error.less +0 -3
  261. package/test/browser/less/errors/image-height-error.txt +0 -4
  262. package/test/browser/less/errors/image-size-error.less +0 -3
  263. package/test/browser/less/errors/image-size-error.txt +0 -4
  264. package/test/browser/less/errors/image-width-error.less +0 -3
  265. package/test/browser/less/errors/image-width-error.txt +0 -4
  266. package/test/browser/less/global-vars/simple.less +0 -3
  267. package/test/browser/less/imports/urls.less +0 -4
  268. package/test/browser/less/imports/urls2.less +0 -4
  269. package/test/browser/less/modify-vars/imports/simple2.less +0 -4
  270. package/test/browser/less/modify-vars/simple.less +0 -8
  271. package/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less +0 -5
  272. package/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +0 -15
  273. package/test/browser/less/plugin/plugin.js +0 -4
  274. package/test/browser/less/plugin/plugin.less +0 -4
  275. package/test/browser/less/postProcessor/postProcessor.less +0 -4
  276. package/test/browser/less/relative-urls/urls.less +0 -34
  277. package/test/browser/less/rewrite-urls/urls.less +0 -34
  278. package/test/browser/less/rootpath/urls.less +0 -33
  279. package/test/browser/less/rootpath-relative/urls.less +0 -33
  280. package/test/browser/less/rootpath-rewrite-urls/urls.less +0 -33
  281. package/test/browser/less/urls.less +0 -62
  282. package/test/browser/runner-VisitorPlugin-options.js +0 -3
  283. package/test/browser/runner-VisitorPlugin.js +0 -3
  284. package/test/browser/runner-browser-options.js +0 -51
  285. package/test/browser/runner-browser-spec.js +0 -12
  286. package/test/browser/runner-console-errors.js +0 -5
  287. package/test/browser/runner-errors-options.js +0 -6
  288. package/test/browser/runner-errors-spec.js +0 -3
  289. package/test/browser/runner-filemanagerPlugin-options.js +0 -5
  290. package/test/browser/runner-filemanagerPlugin.js +0 -3
  291. package/test/browser/runner-global-vars-options.js +0 -7
  292. package/test/browser/runner-global-vars-spec.js +0 -3
  293. package/test/browser/runner-main-options.js +0 -17
  294. package/test/browser/runner-main-spec.js +0 -7
  295. package/test/browser/runner-modify-vars-options.js +0 -5
  296. package/test/browser/runner-modify-vars-spec.js +0 -33
  297. package/test/browser/runner-no-js-errors-options.js +0 -4
  298. package/test/browser/runner-no-js-errors-spec.js +0 -3
  299. package/test/browser/runner-postProcessorPlugin-options.js +0 -3
  300. package/test/browser/runner-postProcessorPlugin.js +0 -3
  301. package/test/browser/runner-preProcessorPlugin-options.js +0 -3
  302. package/test/browser/runner-preProcessorPlugin.js +0 -3
  303. package/test/browser/runner-production-options.js +0 -3
  304. package/test/browser/runner-production-spec.js +0 -5
  305. package/test/browser/runner-relative-urls-options.js +0 -3
  306. package/test/browser/runner-relative-urls-spec.js +0 -3
  307. package/test/browser/runner-rewrite-urls-options.js +0 -3
  308. package/test/browser/runner-rewrite-urls-spec.js +0 -3
  309. package/test/browser/runner-rootpath-options.js +0 -3
  310. package/test/browser/runner-rootpath-relative-options.js +0 -4
  311. package/test/browser/runner-rootpath-relative-spec.js +0 -3
  312. package/test/browser/runner-rootpath-rewrite-urls-options.js +0 -4
  313. package/test/browser/runner-rootpath-rewrite-urls-spec.js +0 -3
  314. package/test/browser/runner-rootpath-spec.js +0 -3
  315. package/test/browser/runner-strict-units-options.js +0 -5
  316. package/test/browser/runner-strict-units-spec.js +0 -3
  317. package/test/index.js +0 -307
  318. package/test/less-test.js +0 -984
  319. package/test/mocha-playwright/runner.js +0 -210
  320. package/test/modify-vars.js +0 -28
  321. package/test/plugins/filemanager/index.js +0 -19
  322. package/test/plugins/postprocess/index.js +0 -14
  323. package/test/plugins/preprocess/index.js +0 -19
  324. package/test/plugins/visitor/index.js +0 -24
  325. package/test/sourcemaps/basic.json +0 -1
  326. package/test/sourcemaps/comprehensive.json +0 -1
  327. package/test/sourcemaps/custom-props.json +0 -1
  328. package/test/sourcemaps/index.html +0 -17
  329. package/test/sourcemaps/sourcemaps-basepath.json +0 -1
  330. package/test/sourcemaps/sourcemaps-include-source.json +0 -1
  331. package/test/sourcemaps/sourcemaps-rootpath.json +0 -1
  332. package/test/sourcemaps/sourcemaps-url.json +0 -1
  333. package/test/sourcemaps-disable-annotation/basic.json +0 -1
  334. package/test/sourcemaps-variable-selector/basic.json +0 -1
  335. package/test/test-es6.ts +0 -17
  336. package/test.less +0 -1
  337. package/tsconfig.build.json +0 -7
  338. package/tsconfig.json +0 -21
@@ -1,63 +1,129 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var tslib_1 = require("tslib");
4
- var node_1 = tslib_1.__importDefault(require("./node"));
5
- var declaration_1 = tslib_1.__importDefault(require("./declaration"));
6
- var keyword_1 = tslib_1.__importDefault(require("./keyword"));
7
- var comment_1 = tslib_1.__importDefault(require("./comment"));
8
- var paren_1 = tslib_1.__importDefault(require("./paren"));
9
- var selector_1 = tslib_1.__importDefault(require("./selector"));
10
- var element_1 = tslib_1.__importDefault(require("./element"));
11
- var anonymous_1 = tslib_1.__importDefault(require("./anonymous"));
12
- var contexts_1 = tslib_1.__importDefault(require("../contexts"));
13
- var function_registry_1 = tslib_1.__importDefault(require("../functions/function-registry"));
14
- var default_1 = tslib_1.__importDefault(require("../functions/default"));
15
- var debug_info_1 = tslib_1.__importDefault(require("./debug-info"));
16
- var utils = tslib_1.__importStar(require("../utils"));
17
- var parser_1 = tslib_1.__importDefault(require("../parser/parser"));
18
- var Ruleset = function (selectors, rules, strictImports, visibilityInfo) {
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
- this.setParent(this.selectors, this);
28
- this.setParent(this.rules, this);
29
- };
30
- Ruleset.prototype = Object.assign(new node_1.default(), {
31
- type: 'Ruleset',
32
- isRuleset: true,
33
- isRulesetLike: function () { return true; },
34
- accept: function (visitor) {
1
+ // @ts-check
2
+ /** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */
3
+ /** @import { FunctionRegistry } from './nested-at-rule.js' */
4
+ import Node from './node.js';
5
+ import Declaration from './declaration.js';
6
+ import Keyword from './keyword.js';
7
+ import Comment from './comment.js';
8
+ import Paren from './paren.js';
9
+ import Selector from './selector.js';
10
+ import Element from './element.js';
11
+ import Anonymous from './anonymous.js';
12
+ import contexts from '../contexts.js';
13
+ import globalFunctionRegistry from '../functions/function-registry.js';
14
+ import defaultFunc from '../functions/default.js';
15
+ import getDebugInfo from './debug-info.js';
16
+ import * as utils from '../utils.js';
17
+ import Parser from '../parser/parser.js';
18
+
19
+ /**
20
+ * @typedef {Node & {
21
+ * rules?: Node[],
22
+ * selectors?: Selector[],
23
+ * root?: boolean,
24
+ * firstRoot?: boolean,
25
+ * allowImports?: boolean,
26
+ * functionRegistry?: FunctionRegistry,
27
+ * originalRuleset?: Node,
28
+ * debugInfo?: { lineNumber: number, fileName: string },
29
+ * evalFirst?: boolean,
30
+ * isRuleset?: boolean,
31
+ * isCharset?: () => boolean,
32
+ * merge?: boolean | string,
33
+ * multiMedia?: boolean,
34
+ * parse?: { context: EvalContext, importManager: object },
35
+ * bubbleSelectors?: (selectors: Selector[]) => void
36
+ * }} RuleNode
37
+ */
38
+
39
+ class Ruleset extends Node {
40
+ get type() { return 'Ruleset'; }
41
+
42
+ /**
43
+ * @param {Selector[] | null} selectors
44
+ * @param {Node[] | null} rules
45
+ * @param {boolean} [strictImports]
46
+ * @param {VisibilityInfo} [visibilityInfo]
47
+ */
48
+ constructor(selectors, rules, strictImports, visibilityInfo) {
49
+ super();
50
+ /** @type {Selector[] | null} */
51
+ this.selectors = selectors;
52
+ /** @type {Node[] | null} */
53
+ this.rules = rules;
54
+ /** @type {Object<string, { rule: Node, path: Node[] }[]>} */
55
+ this._lookups = {};
56
+ /** @type {Object<string, Declaration> | null} */
57
+ this._variables = null;
58
+ /** @type {Object<string, Declaration[]> | null} */
59
+ this._properties = null;
60
+ /** @type {boolean | undefined} */
61
+ this.strictImports = strictImports;
62
+ this.copyVisibilityInfo(visibilityInfo);
63
+ this.allowRoot = true;
64
+ /** @type {boolean} */
65
+ this.isRuleset = true;
66
+
67
+ /** @type {boolean | undefined} */
68
+ this.root = undefined;
69
+ /** @type {boolean | undefined} */
70
+ this.firstRoot = undefined;
71
+ /** @type {boolean | undefined} */
72
+ this.allowImports = undefined;
73
+ /** @type {FunctionRegistry | undefined} */
74
+ this.functionRegistry = undefined;
75
+ /** @type {Node | undefined} */
76
+ this.originalRuleset = undefined;
77
+ /** @type {{ lineNumber: number, fileName: string } | undefined} */
78
+ this.debugInfo = undefined;
79
+ /** @type {Selector[][] | undefined} */
80
+ this.paths = undefined;
81
+ /** @type {Ruleset[] | null | undefined} */
82
+ this._rulesets = undefined;
83
+ /** @type {boolean | undefined} */
84
+ this.evalFirst = undefined;
85
+ this.setParent(this.selectors, this);
86
+ this.setParent(this.rules, this);
87
+ }
88
+
89
+ isRulesetLike() { return true; }
90
+
91
+ /** @param {TreeVisitor} visitor */
92
+ accept(visitor) {
35
93
  if (this.paths) {
36
- this.paths = visitor.visitArray(this.paths, true);
37
- }
38
- else if (this.selectors) {
39
- this.selectors = visitor.visitArray(this.selectors);
94
+ this.paths = /** @type {Selector[][]} */ (/** @type {unknown} */ (visitor.visitArray(/** @type {Node[]} */ (/** @type {unknown} */ (this.paths)), true)));
95
+ } else if (this.selectors) {
96
+ this.selectors = /** @type {Selector[]} */ (visitor.visitArray(this.selectors));
40
97
  }
41
98
  if (this.rules && this.rules.length) {
42
99
  this.rules = visitor.visitArray(this.rules);
43
100
  }
44
- },
45
- eval: function (context) {
46
- var selectors;
47
- var selCnt;
48
- var selector;
49
- var i;
50
- var hasVariable;
51
- var hasOnePassingSelector = false;
101
+ }
102
+
103
+ /** @param {EvalContext} context */
104
+ eval(context) {
105
+ /** @type {Selector[] | undefined} */
106
+ let selectors;
107
+ /** @type {number} */
108
+ let selCnt;
109
+ /** @type {Selector} */
110
+ let selector;
111
+ /** @type {number} */
112
+ let i;
113
+ /** @type {boolean | undefined} */
114
+ let hasVariable;
115
+ let hasOnePassingSelector = false;
116
+
52
117
  if (this.selectors && (selCnt = this.selectors.length)) {
53
118
  selectors = new Array(selCnt);
54
- default_1.default.error({
119
+ defaultFunc.error({
55
120
  type: 'Syntax',
56
121
  message: 'it is currently only allowed in parametric mixin guards,'
57
122
  });
123
+
58
124
  for (i = 0; i < selCnt; i++) {
59
- selector = this.selectors[i].eval(context);
60
- for (var j = 0; j < selector.elements.length; j++) {
125
+ selector = /** @type {Selector} */ (this.selectors[i].eval(context));
126
+ for (let j = 0; j < selector.elements.length; j++) {
61
127
  if (selector.elements[j].isVariable) {
62
128
  hasVariable = true;
63
129
  break;
@@ -68,112 +134,126 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
68
134
  hasOnePassingSelector = true;
69
135
  }
70
136
  }
137
+
71
138
  if (hasVariable) {
72
- var toParseSelectors = new Array(selCnt);
139
+ const toParseSelectors = new Array(selCnt);
73
140
  for (i = 0; i < selCnt; i++) {
74
141
  selector = selectors[i];
75
142
  toParseSelectors[i] = selector.toCSS(context);
76
143
  }
77
- var startingIndex = selectors[0].getIndex();
78
- var selectorFileInfo = selectors[0].fileInfo();
79
- new parser_1.default(context, this.parse.importManager, selectorFileInfo, startingIndex).parseNode(toParseSelectors.join(','), ['selectors'], function (err, result) {
80
- if (result) {
81
- selectors = utils.flattenArray(result);
82
- }
83
- });
144
+ const startingIndex = selectors[0].getIndex();
145
+ const selectorFileInfo = selectors[0].fileInfo();
146
+ new (/** @type {new (...args: [EvalContext, object, FileInfo, number]) => { parseNode: Function }} */ (/** @type {unknown} */ (Parser)))(context, /** @type {{ context: EvalContext, importManager: object }} */ (this.parse).importManager, selectorFileInfo, startingIndex).parseNode(
147
+ toParseSelectors.join(','),
148
+ ['selectors'],
149
+ function(/** @type {Error | null} */ err, /** @type {Node[]} */ result) {
150
+ if (result) {
151
+ selectors = /** @type {Selector[]} */ (utils.flattenArray(result));
152
+ }
153
+ });
84
154
  }
85
- default_1.default.reset();
86
- }
87
- else {
155
+
156
+ defaultFunc.reset();
157
+ } else {
88
158
  hasOnePassingSelector = true;
89
159
  }
90
- var rules = this.rules ? utils.copyArray(this.rules) : null;
91
- var ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
92
- var rule;
93
- var subRule;
160
+
161
+ let rules = this.rules ? utils.copyArray(this.rules) : null;
162
+ const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());
163
+ /** @type {Node} */
164
+ let rule;
165
+ /** @type {Node} */
166
+ let subRule;
167
+
94
168
  ruleset.originalRuleset = this;
95
169
  ruleset.root = this.root;
96
170
  ruleset.firstRoot = this.firstRoot;
97
171
  ruleset.allowImports = this.allowImports;
172
+
98
173
  if (this.debugInfo) {
99
174
  ruleset.debugInfo = this.debugInfo;
100
175
  }
176
+
101
177
  if (!hasOnePassingSelector) {
102
- rules.length = 0;
178
+ /** @type {Node[]} */ (rules).length = 0;
103
179
  }
180
+
181
+ // push the current ruleset to the frames stack
182
+ const ctxFrames = context.frames;
183
+
104
184
  // inherit a function registry from the frames stack when possible;
105
185
  // otherwise from the global registry
106
- ruleset.functionRegistry = (function (frames) {
107
- var i = 0;
108
- var n = frames.length;
109
- var found;
110
- for (; i !== n; ++i) {
111
- found = frames[i].functionRegistry;
112
- if (found) {
113
- return found;
114
- }
115
- }
116
- return function_registry_1.default;
117
- }(context.frames)).inherit();
118
- // push the current ruleset to the frames stack
119
- var ctxFrames = context.frames;
186
+ /** @type {FunctionRegistry | undefined} */
187
+ let foundRegistry;
188
+ for (let fi = 0, fn = ctxFrames.length; fi !== fn; ++fi) {
189
+ foundRegistry = /** @type {RuleNode} */ (ctxFrames[fi]).functionRegistry;
190
+ if (foundRegistry) { break; }
191
+ }
192
+ ruleset.functionRegistry = (foundRegistry || globalFunctionRegistry).inherit();
120
193
  ctxFrames.unshift(ruleset);
194
+
121
195
  // currrent selectors
122
- var ctxSelectors = context.selectors;
196
+ /** @type {Selector[][] | undefined} */
197
+ let ctxSelectors = /** @type {EvalContext & { selectors?: Selector[][] }} */ (context).selectors;
123
198
  if (!ctxSelectors) {
124
- context.selectors = ctxSelectors = [];
199
+ /** @type {EvalContext & { selectors?: Selector[][] }} */ (context).selectors = ctxSelectors = [];
125
200
  }
126
201
  ctxSelectors.unshift(this.selectors);
202
+
127
203
  // Evaluate imports
128
204
  if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {
129
205
  ruleset.evalImports(context);
130
206
  }
207
+
131
208
  // Store the frames around mixin definitions,
132
209
  // so they can be evaluated like closures when the time comes.
133
- var rsRules = ruleset.rules;
210
+ const rsRules = /** @type {Node[]} */ (ruleset.rules);
134
211
  for (i = 0; (rule = rsRules[i]); i++) {
135
- if (rule.evalFirst) {
212
+ if (/** @type {RuleNode} */ (rule).evalFirst) {
136
213
  rsRules[i] = rule.eval(context);
137
214
  }
138
215
  }
139
- var mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
216
+
217
+ const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;
218
+
140
219
  // Evaluate mixin calls.
141
220
  for (i = 0; (rule = rsRules[i]); i++) {
142
221
  if (rule.type === 'MixinCall') {
143
222
  /* jshint loopfunc:true */
144
- rules = rule.eval(context).filter(function (r) {
145
- if ((r instanceof declaration_1.default) && r.variable) {
223
+ rules = /** @type {Node[]} */ (/** @type {unknown} */ (rule.eval(context))).filter(function(/** @type {Node & { variable?: boolean }} */ r) {
224
+ if ((r instanceof Declaration) && r.variable) {
146
225
  // do not pollute the scope if the variable is
147
226
  // already there. consider returning false here
148
227
  // but we need a way to "return" variable from mixins
149
- return !(ruleset.variable(r.name));
228
+ return !(ruleset.variable(/** @type {string} */ (r.name)));
150
229
  }
151
230
  return true;
152
231
  });
153
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
232
+ rsRules.splice.apply(rsRules, /** @type {[number, number, ...Node[]]} */ ([i, 1].concat(rules)));
154
233
  i += rules.length - 1;
155
234
  ruleset.resetCache();
156
- }
157
- else if (rule.type === 'VariableCall') {
235
+ } else if (rule.type === 'VariableCall') {
158
236
  /* jshint loopfunc:true */
159
- rules = rule.eval(context).rules.filter(function (r) {
160
- if ((r instanceof declaration_1.default) && r.variable) {
237
+ rules = /** @type {Node[]} */ (/** @type {RuleNode} */ (rule.eval(context)).rules).filter(function(/** @type {Node & { variable?: boolean }} */ r) {
238
+ if ((r instanceof Declaration) && r.variable) {
161
239
  // do not pollute the scope at all
162
240
  return false;
163
241
  }
164
242
  return true;
165
243
  });
166
- rsRules.splice.apply(rsRules, [i, 1].concat(rules));
244
+ rsRules.splice.apply(rsRules, /** @type {[number, number, ...Node[]]} */ ([i, 1].concat(rules)));
167
245
  i += rules.length - 1;
168
246
  ruleset.resetCache();
169
247
  }
170
248
  }
249
+
171
250
  // Evaluate everything else
172
251
  for (i = 0; (rule = rsRules[i]); i++) {
173
- if (!rule.evalFirst) {
252
+ if (!/** @type {RuleNode} */ (rule).evalFirst) {
174
253
  rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;
175
254
  }
176
255
  }
256
+
177
257
  // Evaluate everything else
178
258
  for (i = 0; (rule = rsRules[i]); i++) {
179
259
  // for rulesets, check if it is a css guard and can be removed
@@ -181,10 +261,11 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
181
261
  // check if it can be folded in (e.g. & where)
182
262
  if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {
183
263
  rsRules.splice(i--, 1);
184
- for (var j = 0; (subRule = rule.rules[j]); j++) {
185
- if (subRule instanceof node_1.default) {
264
+
265
+ for (let j = 0; (subRule = rule.rules[j]); j++) {
266
+ if (subRule instanceof Node) {
186
267
  subRule.copyVisibilityInfo(rule.visibilityInfo());
187
- if (!(subRule instanceof declaration_1.default) || !subRule.variable) {
268
+ if (!(subRule instanceof Declaration) || !subRule.variable) {
188
269
  rsRules.splice(++i, 0, subRule);
189
270
  }
190
271
  }
@@ -192,84 +273,100 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
192
273
  }
193
274
  }
194
275
  }
276
+
195
277
  // Pop the stack
196
278
  ctxFrames.shift();
197
279
  ctxSelectors.shift();
280
+
198
281
  if (context.mediaBlocks) {
199
282
  for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {
200
- context.mediaBlocks[i].bubbleSelectors(selectors);
283
+ /** @type {RuleNode} */ (context.mediaBlocks[i]).bubbleSelectors(selectors);
201
284
  }
202
285
  }
286
+
203
287
  return ruleset;
204
- },
205
- evalImports: function (context) {
206
- var rules = this.rules;
207
- var i;
208
- var importRules;
209
- if (!rules) {
210
- return;
211
- }
288
+ }
289
+
290
+ /** @param {EvalContext} context */
291
+ evalImports(context) {
292
+ const rules = this.rules;
293
+ /** @type {number} */
294
+ let i;
295
+ /** @type {Node | Node[]} */
296
+ let importRules;
297
+ if (!rules) { return; }
298
+
212
299
  for (i = 0; i < rules.length; i++) {
213
300
  if (rules[i].type === 'Import') {
214
301
  importRules = rules[i].eval(context);
215
- if (importRules && (importRules.length || importRules.length === 0)) {
216
- rules.splice.apply(rules, [i, 1].concat(importRules));
217
- i += importRules.length - 1;
218
- }
219
- else {
302
+ if (importRules && (/** @type {Node[]} */ (/** @type {unknown} */ (importRules)).length || /** @type {Node[]} */ (/** @type {unknown} */ (importRules)).length === 0)) {
303
+ const importArr = /** @type {Node[]} */ (/** @type {unknown} */ (importRules));
304
+ rules.splice(i, 1, ...importArr);
305
+ i += importArr.length - 1;
306
+ } else {
220
307
  rules.splice(i, 1, importRules);
221
308
  }
222
309
  this.resetCache();
223
310
  }
224
311
  }
225
- },
226
- makeImportant: function () {
227
- var result = new Ruleset(this.selectors, this.rules.map(function (r) {
312
+ }
313
+
314
+ makeImportant() {
315
+ const result = new Ruleset(this.selectors, /** @type {Node[]} */ (this.rules).map(function (/** @type {Node & { makeImportant?: () => Node }} */ r) {
228
316
  if (r.makeImportant) {
229
317
  return r.makeImportant();
230
- }
231
- else {
318
+ } else {
232
319
  return r;
233
320
  }
234
321
  }), this.strictImports, this.visibilityInfo());
322
+
235
323
  return result;
236
- },
237
- matchArgs: function (args) {
324
+ }
325
+
326
+ /** @param {Node[] | object[] | null} [args] */
327
+ matchArgs(args) {
238
328
  return !args || args.length === 0;
239
- },
240
- // lets you call a css selector with a guard
241
- matchCondition: function (args, context) {
242
- var lastSelector = this.selectors[this.selectors.length - 1];
329
+ }
330
+
331
+ /**
332
+ * @param {Node[] | object[] | null} args
333
+ * @param {EvalContext} context
334
+ */
335
+ matchCondition(args, context) {
336
+ const lastSelector = /** @type {Selector[]} */ (this.selectors)[/** @type {Selector[]} */ (this.selectors).length - 1];
243
337
  if (!lastSelector.evaldCondition) {
244
338
  return false;
245
339
  }
246
340
  if (lastSelector.condition &&
247
- !lastSelector.condition.eval(new contexts_1.default.Eval(context, context.frames))) {
341
+ !lastSelector.condition.eval(
342
+ new contexts.Eval(context,
343
+ context.frames))) {
248
344
  return false;
249
345
  }
250
346
  return true;
251
- },
252
- resetCache: function () {
347
+ }
348
+
349
+ resetCache() {
253
350
  this._rulesets = null;
254
351
  this._variables = null;
255
352
  this._properties = null;
256
353
  this._lookups = {};
257
- },
258
- variables: function () {
354
+ }
355
+
356
+ variables() {
259
357
  if (!this._variables) {
260
- this._variables = !this.rules ? {} : this.rules.reduce(function (hash, r) {
261
- if (r instanceof declaration_1.default && r.variable === true) {
262
- hash[r.name] = r;
358
+ this._variables = !this.rules ? {} : this.rules.reduce(function (/** @type {Object<string, Declaration>} */ hash, /** @type {Node} */ r) {
359
+ if (r instanceof Declaration && r.variable === true) {
360
+ hash[/** @type {string} */ (r.name)] = r;
263
361
  }
264
362
  // when evaluating variables in an import statement, imports have not been eval'd
265
363
  // so we need to go inside import statements.
266
364
  // guard against root being a string (in the case of inlined less)
267
- if (r.type === 'Import' && r.root && r.root.variables) {
268
- var vars = r.root.variables();
269
- for (var name_1 in vars) {
270
- // eslint-disable-next-line no-prototype-builtins
271
- if (vars.hasOwnProperty(name_1)) {
272
- hash[name_1] = r.root.variable(name_1);
365
+ if (r.type === 'Import' && /** @type {RuleNode} */ (r).root && /** @type {RuleNode & { root: Ruleset }} */ (r).root.variables) {
366
+ const vars = /** @type {RuleNode & { root: Ruleset }} */ (r).root.variables();
367
+ for (const name in vars) {
368
+ if (Object.prototype.hasOwnProperty.call(vars, name)) {
369
+ hash[name] = /** @type {Declaration} */ (/** @type {RuleNode & { root: Ruleset }} */ (r).root.variable(name));
273
370
  }
274
371
  }
275
372
  }
@@ -277,65 +374,77 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
277
374
  }, {});
278
375
  }
279
376
  return this._variables;
280
- },
281
- properties: function () {
377
+ }
378
+
379
+ properties() {
282
380
  if (!this._properties) {
283
- this._properties = !this.rules ? {} : this.rules.reduce(function (hash, r) {
284
- if (r instanceof declaration_1.default && r.variable !== true) {
285
- var name_2 = (r.name.length === 1) && (r.name[0] instanceof keyword_1.default) ?
286
- r.name[0].value : r.name;
381
+ this._properties = !this.rules ? {} : this.rules.reduce(function (/** @type {Object<string, Declaration[]>} */ hash, /** @type {Node} */ r) {
382
+ if (r instanceof Declaration && r.variable !== true) {
383
+ const name = (/** @type {Node[]} */ (r.name).length === 1) && (/** @type {Node[]} */ (r.name)[0] instanceof Keyword) ?
384
+ /** @type {string} */ (/** @type {Node[]} */ (r.name)[0].value) : /** @type {string} */ (r.name);
287
385
  // Properties don't overwrite as they can merge
288
- if (!hash["$".concat(name_2)]) {
289
- hash["$".concat(name_2)] = [r];
386
+ if (!hash[`$${name}`]) {
387
+ hash[`$${name}`] = [ r ];
290
388
  }
291
389
  else {
292
- hash["$".concat(name_2)].push(r);
390
+ hash[`$${name}`].push(r);
293
391
  }
294
392
  }
295
393
  return hash;
296
394
  }, {});
297
395
  }
298
396
  return this._properties;
299
- },
300
- variable: function (name) {
301
- var decl = this.variables()[name];
397
+ }
398
+
399
+ /** @param {string} name */
400
+ variable(name) {
401
+ const decl = this.variables()[name];
302
402
  if (decl) {
303
403
  return this.parseValue(decl);
304
404
  }
305
- },
306
- property: function (name) {
307
- var decl = this.properties()[name];
405
+ }
406
+
407
+ /** @param {string} name */
408
+ property(name) {
409
+ const decl = this.properties()[name];
308
410
  if (decl) {
309
411
  return this.parseValue(decl);
310
412
  }
311
- },
312
- lastDeclaration: function () {
313
- for (var i = this.rules.length; i > 0; i--) {
314
- var decl = this.rules[i - 1];
315
- if (decl instanceof declaration_1.default) {
413
+ }
414
+
415
+ lastDeclaration() {
416
+ for (let i = /** @type {Node[]} */ (this.rules).length; i > 0; i--) {
417
+ const decl = /** @type {Node[]} */ (this.rules)[i - 1];
418
+ if (decl instanceof Declaration) {
316
419
  return this.parseValue(decl);
317
420
  }
318
421
  }
319
- },
320
- parseValue: function (toParse) {
321
- var self = this;
422
+ }
423
+
424
+ /** @param {Declaration | Declaration[]} toParse */
425
+ parseValue(toParse) {
426
+ const self = this;
427
+ /** @param {Declaration} decl */
322
428
  function transformDeclaration(decl) {
323
- if (decl.value instanceof anonymous_1.default && !decl.parsed) {
429
+ if (decl.value instanceof Anonymous && !/** @type {Declaration & { parsed?: boolean }} */ (decl).parsed) {
324
430
  if (typeof decl.value.value === 'string') {
325
- new parser_1.default(this.parse.context, this.parse.importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(decl.value.value, ['value', 'important'], function (err, result) {
326
- if (err) {
327
- decl.parsed = true;
328
- }
329
- if (result) {
330
- decl.value = result[0];
331
- decl.important = result[1] || '';
332
- decl.parsed = true;
333
- }
334
- });
335
- }
336
- else {
337
- decl.parsed = true;
431
+ new (/** @type {new (...args: [EvalContext, object, FileInfo, number]) => { parseNode: Function }} */ (/** @type {unknown} */ (Parser)))(/** @type {{ context: EvalContext, importManager: object }} */ (/** @type {Ruleset} */ (this).parse).context, /** @type {{ context: EvalContext, importManager: object }} */ (/** @type {Ruleset} */ (this).parse).importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(
432
+ decl.value.value,
433
+ ['value', 'important'],
434
+ function(/** @type {Error | null} */ err, /** @type {Node[]} */ result) {
435
+ if (err) {
436
+ decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));
437
+ }
438
+ if (result) {
439
+ decl.value = result[0];
440
+ /** @type {Declaration & { important?: string }} */ (decl).important = /** @type {string} */ (/** @type {unknown} */ (result[1])) || '';
441
+ decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));
442
+ }
443
+ });
444
+ } else {
445
+ decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));
338
446
  }
447
+
339
448
  return decl;
340
449
  }
341
450
  else {
@@ -346,63 +455,79 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
346
455
  return transformDeclaration.call(self, toParse);
347
456
  }
348
457
  else {
349
- var nodes_1 = [];
350
- toParse.forEach(function (n) {
351
- nodes_1.push(transformDeclaration.call(self, n));
352
- });
353
- return nodes_1;
354
- }
355
- },
356
- rulesets: function () {
357
- if (!this.rules) {
358
- return [];
458
+ /** @type {Declaration[]} */
459
+ const nodes = [];
460
+ for (let ti = 0; ti < toParse.length; ti++) {
461
+ nodes.push(transformDeclaration.call(self, toParse[ti]));
462
+ }
463
+ return nodes;
359
464
  }
360
- var filtRules = [];
361
- var rules = this.rules;
362
- var i;
363
- var rule;
465
+ }
466
+
467
+ rulesets() {
468
+ if (!this.rules) { return []; }
469
+
470
+ /** @type {Node[]} */
471
+ const filtRules = [];
472
+ const rules = this.rules;
473
+ /** @type {number} */
474
+ let i;
475
+ /** @type {Node} */
476
+ let rule;
477
+
364
478
  for (i = 0; (rule = rules[i]); i++) {
365
- if (rule.isRuleset) {
479
+ if (/** @type {RuleNode} */ (rule).isRuleset) {
366
480
  filtRules.push(rule);
367
481
  }
368
482
  }
483
+
369
484
  return filtRules;
370
- },
371
- prependRule: function (rule) {
372
- var rules = this.rules;
485
+ }
486
+
487
+ /** @param {Node} rule */
488
+ prependRule(rule) {
489
+ const rules = this.rules;
373
490
  if (rules) {
374
491
  rules.unshift(rule);
375
- }
376
- else {
377
- this.rules = [rule];
492
+ } else {
493
+ this.rules = [ rule ];
378
494
  }
379
495
  this.setParent(rule, this);
380
- },
381
- find: function (selector, self, filter) {
496
+ }
497
+
498
+ /**
499
+ * @param {Selector} selector
500
+ * @param {Ruleset | null} [self]
501
+ * @param {((rule: Node) => boolean)} [filter]
502
+ * @returns {{ rule: Node, path: Node[] }[]}
503
+ */
504
+ find(selector, self, filter) {
382
505
  self = self || this;
383
- var rules = [];
384
- var match;
385
- var foundMixins;
386
- var key = selector.toCSS();
387
- if (key in this._lookups) {
388
- return this._lookups[key];
389
- }
506
+ /** @type {{ rule: Node, path: Node[] }[]} */
507
+ const rules = [];
508
+ /** @type {number | undefined} */
509
+ let match;
510
+ /** @type {{ rule: Node, path: Node[] }[]} */
511
+ let foundMixins;
512
+ const key = selector.toCSS(/** @type {EvalContext} */ ({}));
513
+
514
+ if (key in this._lookups) { return /** @type {{ rule: Node, path: Node[] }[]} */ (this._lookups[key]); }
515
+
390
516
  this.rulesets().forEach(function (rule) {
391
517
  if (rule !== self) {
392
- for (var j = 0; j < rule.selectors.length; j++) {
393
- match = selector.match(rule.selectors[j]);
518
+ for (let j = 0; j < /** @type {RuleNode} */ (rule).selectors.length; j++) {
519
+ match = selector.match(/** @type {RuleNode} */ (rule).selectors[j]);
394
520
  if (match) {
395
521
  if (selector.elements.length > match) {
396
522
  if (!filter || filter(rule)) {
397
- foundMixins = rule.find(new selector_1.default(selector.elements.slice(match)), self, filter);
398
- for (var i = 0; i < foundMixins.length; ++i) {
523
+ foundMixins = /** @type {Ruleset} */ (/** @type {unknown} */ (rule)).find(new Selector(selector.elements.slice(match)), self, filter);
524
+ for (let i = 0; i < foundMixins.length; ++i) {
399
525
  foundMixins[i].path.push(rule);
400
526
  }
401
527
  Array.prototype.push.apply(rules, foundMixins);
402
528
  }
403
- }
404
- else {
405
- rules.push({ rule: rule, path: [] });
529
+ } else {
530
+ rules.push({ rule, path: []});
406
531
  }
407
532
  break;
408
533
  }
@@ -411,139 +536,211 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
411
536
  });
412
537
  this._lookups[key] = rules;
413
538
  return rules;
414
- },
415
- genCSS: function (context, output) {
416
- var i;
417
- var j;
418
- var charsetRuleNodes = [];
419
- var ruleNodes = [];
420
- var // Line number debugging
421
- debugInfo;
422
- var rule;
423
- var path;
539
+ }
540
+
541
+ /**
542
+ * @param {EvalContext} context
543
+ * @param {CSSOutput} output
544
+ */
545
+ genCSS(context, output) {
546
+ /** @type {number} */
547
+ let i;
548
+ /** @type {number} */
549
+ let j;
550
+ /** @type {Node[]} */
551
+ const charsetRuleNodes = [];
552
+ /** @type {Node[]} */
553
+ let ruleNodes = [];
554
+
555
+ let // Line number debugging
556
+ debugInfo;
557
+
558
+ /** @type {Node} */
559
+ let rule;
560
+ /** @type {Selector[]} */
561
+ let path;
562
+
424
563
  context.tabLevel = (context.tabLevel || 0);
564
+
425
565
  if (!this.root) {
426
566
  context.tabLevel++;
427
567
  }
428
- var tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
429
- var tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
430
- var sep;
431
- var charsetNodeIndex = 0;
432
- var importNodeIndex = 0;
433
- for (i = 0; (rule = this.rules[i]); i++) {
434
- if (rule instanceof comment_1.default) {
568
+
569
+ const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join(' ');
570
+ const tabSetStr = context.compress ? '' : Array(context.tabLevel).join(' ');
571
+ /** @type {string} */
572
+ let sep;
573
+
574
+ let charsetNodeIndex = 0;
575
+ let importNodeIndex = 0;
576
+ for (i = 0; (rule = /** @type {Node[]} */ (this.rules)[i]); i++) {
577
+ if (rule instanceof Comment) {
435
578
  if (importNodeIndex === i) {
436
579
  importNodeIndex++;
437
580
  }
438
581
  ruleNodes.push(rule);
439
- }
440
- else if (rule.isCharset && rule.isCharset()) {
582
+ } else if (/** @type {RuleNode} */ (rule).isCharset && /** @type {RuleNode} */ (rule).isCharset()) {
441
583
  ruleNodes.splice(charsetNodeIndex, 0, rule);
442
584
  charsetNodeIndex++;
443
585
  importNodeIndex++;
444
- }
445
- else if (rule.type === 'Import') {
586
+ } else if (rule.type === 'Import') {
446
587
  ruleNodes.splice(importNodeIndex, 0, rule);
447
588
  importNodeIndex++;
448
- }
449
- else {
589
+ } else {
450
590
  ruleNodes.push(rule);
451
591
  }
452
592
  }
453
593
  ruleNodes = charsetRuleNodes.concat(ruleNodes);
594
+
454
595
  // If this is the root node, we don't render
455
596
  // a selector, or {}.
456
597
  if (!this.root) {
457
- debugInfo = (0, debug_info_1.default)(context, this, tabSetStr);
598
+ debugInfo = getDebugInfo(context, /** @type {{ debugInfo: { lineNumber: number, fileName: string } }} */ (/** @type {unknown} */ (this)), tabSetStr);
599
+
458
600
  if (debugInfo) {
459
601
  output.add(debugInfo);
460
602
  output.add(tabSetStr);
461
603
  }
462
- var paths = this.paths;
463
- var pathCnt = paths.length;
464
- var pathSubCnt = void 0;
465
- sep = context.compress ? ',' : (",\n".concat(tabSetStr));
604
+
605
+ const paths = /** @type {Selector[][]} */ (this.paths);
606
+ const pathCnt = paths.length;
607
+ /** @type {number} */
608
+ let pathSubCnt;
609
+
610
+ sep = context.compress ? ',' : (`,\n${tabSetStr}`);
611
+
466
612
  for (i = 0; i < pathCnt; i++) {
467
613
  path = paths[i];
468
- if (!(pathSubCnt = path.length)) {
469
- continue;
470
- }
471
- if (i > 0) {
472
- output.add(sep);
473
- }
474
- context.firstSelector = true;
614
+ if (!(pathSubCnt = path.length)) { continue; }
615
+ if (i > 0) { output.add(sep); }
616
+
617
+ /** @type {EvalContext & { firstSelector?: boolean }} */ (context).firstSelector = true;
475
618
  path[0].genCSS(context, output);
476
- context.firstSelector = false;
619
+
620
+ /** @type {EvalContext & { firstSelector?: boolean }} */ (context).firstSelector = false;
477
621
  for (j = 1; j < pathSubCnt; j++) {
478
622
  path[j].genCSS(context, output);
479
623
  }
480
624
  }
625
+
481
626
  output.add((context.compress ? '{' : ' {\n') + tabRuleStr);
482
627
  }
628
+
483
629
  // Compile rules and rulesets
484
630
  for (i = 0; (rule = ruleNodes[i]); i++) {
631
+
485
632
  if (i + 1 === ruleNodes.length) {
486
633
  context.lastRule = true;
487
634
  }
488
- var currentLastRule = context.lastRule;
489
- if (rule.isRulesetLike(rule)) {
635
+
636
+ const currentLastRule = context.lastRule;
637
+ if (rule.isRulesetLike()) {
490
638
  context.lastRule = false;
491
639
  }
640
+
492
641
  if (rule.genCSS) {
493
642
  rule.genCSS(context, output);
643
+ } else if (rule.value) {
644
+ output.add(/** @type {string} */ (rule.value).toString());
494
645
  }
495
- else if (rule.value) {
496
- output.add(rule.value.toString());
497
- }
646
+
498
647
  context.lastRule = currentLastRule;
648
+
499
649
  if (!context.lastRule && rule.isVisible()) {
500
- output.add(context.compress ? '' : ("\n".concat(tabRuleStr)));
501
- }
502
- else {
650
+ output.add(context.compress ? '' : (`\n${tabRuleStr}`));
651
+ } else {
503
652
  context.lastRule = false;
504
653
  }
505
654
  }
655
+
506
656
  if (!this.root) {
507
- output.add((context.compress ? '}' : "\n".concat(tabSetStr, "}")));
657
+ output.add((context.compress ? '}' : `\n${tabSetStr}}`));
508
658
  context.tabLevel--;
509
659
  }
660
+
510
661
  if (!output.isEmpty() && !context.compress && this.firstRoot) {
511
662
  output.add('\n');
512
663
  }
513
- },
514
- joinSelectors: function (paths, context, selectors) {
515
- for (var s = 0; s < selectors.length; s++) {
664
+ }
665
+
666
+ /**
667
+ * @param {Selector[][]} paths
668
+ * @param {Selector[][]} context
669
+ * @param {Selector[]} selectors
670
+ */
671
+ joinSelectors(paths, context, selectors) {
672
+ for (let s = 0; s < selectors.length; s++) {
516
673
  this.joinSelector(paths, context, selectors[s]);
517
674
  }
518
- },
519
- joinSelector: function (paths, context, selector) {
675
+ }
676
+
677
+ /**
678
+ * @param {Selector[][]} paths
679
+ * @param {Selector[][]} context
680
+ * @param {Selector} selector
681
+ */
682
+ joinSelector(paths, context, selector) {
683
+
684
+ /**
685
+ * @param {Selector[]} elementsToPak
686
+ * @param {Element} originalElement
687
+ * @returns {Paren}
688
+ */
520
689
  function createParenthesis(elementsToPak, originalElement) {
521
- var replacementParen, j;
690
+ /** @type {Paren} */
691
+ let replacementParen;
692
+ /** @type {number} */
693
+ let j;
522
694
  if (elementsToPak.length === 0) {
523
- replacementParen = new paren_1.default(elementsToPak[0]);
524
- }
525
- else {
526
- var insideParent = new Array(elementsToPak.length);
695
+ replacementParen = new Paren(elementsToPak[0]);
696
+ } else {
697
+ const insideParent = new Array(elementsToPak.length);
527
698
  for (j = 0; j < elementsToPak.length; j++) {
528
- insideParent[j] = new element_1.default(null, elementsToPak[j], originalElement.isVariable, originalElement._index, originalElement._fileInfo);
699
+ insideParent[j] = new Element(
700
+ null,
701
+ elementsToPak[j],
702
+ originalElement.isVariable,
703
+ originalElement._index,
704
+ originalElement._fileInfo
705
+ );
529
706
  }
530
- replacementParen = new paren_1.default(new selector_1.default(insideParent));
707
+ replacementParen = new Paren(new Selector(insideParent));
531
708
  }
532
709
  return replacementParen;
533
710
  }
711
+
712
+ /**
713
+ * @param {Paren | Selector} containedElement
714
+ * @param {Element} originalElement
715
+ * @returns {Selector}
716
+ */
534
717
  function createSelector(containedElement, originalElement) {
535
- var element, selector;
536
- element = new element_1.default(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
537
- selector = new selector_1.default([element]);
718
+ /** @type {Element} */
719
+ let element;
720
+ /** @type {Selector} */
721
+ let selector;
722
+ element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);
723
+ selector = new Selector([element]);
538
724
  return selector;
539
725
  }
540
- // joins selector path from `beginningPath` with selector path in `addPath`
541
- // `replacedElement` contains element that is being replaced by `addPath`
542
- // returns concatenated path
726
+
727
+ /**
728
+ * @param {Selector[]} beginningPath
729
+ * @param {Selector[]} addPath
730
+ * @param {Element} replacedElement
731
+ * @param {Selector} originalSelector
732
+ * @returns {Selector[]}
733
+ */
543
734
  function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {
544
- var newSelectorPath, lastSelector, newJoinedSelector;
735
+ /** @type {Selector[]} */
736
+ let newSelectorPath;
737
+ /** @type {Selector} */
738
+ let lastSelector;
739
+ /** @type {Selector} */
740
+ let newJoinedSelector;
545
741
  // our new selector path
546
742
  newSelectorPath = [];
743
+
547
744
  // construct the joined selector - if & is the first thing this will be empty,
548
745
  // if not newJoinedSelector will be the last set of elements in the selector
549
746
  if (beginningPath.length > 0) {
@@ -554,68 +751,99 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
554
751
  else {
555
752
  newJoinedSelector = originalSelector.createDerived([]);
556
753
  }
754
+
557
755
  if (addPath.length > 0) {
558
756
  // /deep/ is a CSS4 selector - (removed, so should deprecate)
559
757
  // that is valid without anything in front of it
560
758
  // so if the & does not have a combinator that is "" or " " then
561
759
  // and there is a combinator on the parent, then grab that.
562
760
  // this also allows + a { & .b { .a & { ... though not sure why you would want to do that
563
- var combinator = replacedElement.combinator;
564
- var parentEl = addPath[0].elements[0];
761
+ let combinator = replacedElement.combinator;
762
+
763
+ const parentEl = addPath[0].elements[0];
565
764
  if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {
566
765
  combinator = parentEl.combinator;
567
766
  }
568
767
  // join the elements so far with the first part of the parent
569
- newJoinedSelector.elements.push(new element_1.default(combinator, parentEl.value, replacedElement.isVariable, replacedElement._index, replacedElement._fileInfo));
768
+ newJoinedSelector.elements.push(new Element(
769
+ combinator,
770
+ parentEl.value,
771
+ replacedElement.isVariable,
772
+ replacedElement._index,
773
+ replacedElement._fileInfo
774
+ ));
570
775
  newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));
571
776
  }
777
+
572
778
  // now add the joined selector - but only if it is not empty
573
779
  if (newJoinedSelector.elements.length !== 0) {
574
780
  newSelectorPath.push(newJoinedSelector);
575
781
  }
782
+
576
783
  // put together the parent selectors after the join (e.g. the rest of the parent)
577
784
  if (addPath.length > 1) {
578
- var restOfPath = addPath.slice(1);
579
- restOfPath = restOfPath.map(function (selector) {
785
+ let restOfPath = addPath.slice(1);
786
+ restOfPath = restOfPath.map(function (/** @type {Selector} */ selector) {
580
787
  return selector.createDerived(selector.elements, []);
581
788
  });
582
789
  newSelectorPath = newSelectorPath.concat(restOfPath);
583
790
  }
584
791
  return newSelectorPath;
585
792
  }
586
- // joins selector path from `beginningPath` with every selector path in `addPaths` array
587
- // `replacedElement` contains element that is being replaced by `addPath`
588
- // returns array with all concatenated paths
589
- function addAllReplacementsIntoPath(beginningPath, addPaths, replacedElement, originalSelector, result) {
590
- var j;
793
+
794
+ /**
795
+ * @param {Selector[][]} beginningPath
796
+ * @param {Selector[]} addPaths
797
+ * @param {Element} replacedElement
798
+ * @param {Selector} originalSelector
799
+ * @param {Selector[][]} result
800
+ * @returns {Selector[][]}
801
+ */
802
+ function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {
803
+ /** @type {number} */
804
+ let j;
591
805
  for (j = 0; j < beginningPath.length; j++) {
592
- var newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
806
+ const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);
593
807
  result.push(newSelectorPath);
594
808
  }
595
809
  return result;
596
810
  }
811
+
812
+ /**
813
+ * @param {Element[]} elements
814
+ * @param {Selector[][]} selectors
815
+ */
597
816
  function mergeElementsOnToSelectors(elements, selectors) {
598
- var i, sel;
817
+ /** @type {number} */
818
+ let i;
819
+ /** @type {Selector[]} */
820
+ let sel;
821
+
599
822
  if (elements.length === 0) {
600
- return;
823
+ return ;
601
824
  }
602
825
  if (selectors.length === 0) {
603
- selectors.push([new selector_1.default(elements)]);
826
+ selectors.push([ new Selector(elements) ]);
604
827
  return;
605
828
  }
829
+
606
830
  for (i = 0; (sel = selectors[i]); i++) {
607
831
  // if the previous thing in sel is a parent this needs to join on to it
608
832
  if (sel.length > 0) {
609
833
  sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));
610
834
  }
611
835
  else {
612
- sel.push(new selector_1.default(elements));
836
+ sel.push(new Selector(elements));
613
837
  }
614
838
  }
615
839
  }
616
- // replace all parent selectors inside `inSelector` by content of `context` array
617
- // resulting selectors are returned inside `paths` array
618
- // returns true if `inSelector` contained at least one parent selector
840
+
841
+ /**
842
+ * @param {Selector[][]} paths
843
+ * @param {Selector[][]} context
844
+ * @param {Selector} inSelector
845
+ * @returns {boolean}
846
+ */
619
847
  function replaceParentSelector(paths, context, inSelector) {
620
848
  // The paths are [[Selector]]
621
849
  // The first list is a list of comma separated selectors
@@ -627,18 +855,47 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
627
855
  // }
628
856
  // == [[.a] [.c]] [[.b] [.c]]
629
857
  //
630
- var i, j, k, currentElements, newSelectors, selectorsMultiplied, sel, el, hadParentSelector = false, length, lastSelector;
858
+ /** @type {number} */
859
+ let i;
860
+ /** @type {number} */
861
+ let j;
862
+ /** @type {number} */
863
+ let k;
864
+ /** @type {Element[]} */
865
+ let currentElements;
866
+ /** @type {Selector[][]} */
867
+ let newSelectors;
868
+ /** @type {Selector[][]} */
869
+ let selectorsMultiplied;
870
+ /** @type {Selector[]} */
871
+ let sel;
872
+ /** @type {Element} */
873
+ let el;
874
+ let hadParentSelector = false;
875
+ /** @type {number} */
876
+ let length;
877
+ /** @type {Selector} */
878
+ let lastSelector;
879
+
880
+ /**
881
+ * @param {Element} element
882
+ * @returns {Selector | null}
883
+ */
631
884
  function findNestedSelector(element) {
632
- var maybeSelector;
633
- if (!(element.value instanceof paren_1.default)) {
885
+ /** @type {Node} */
886
+ let maybeSelector;
887
+ if (!(element.value instanceof Paren)) {
634
888
  return null;
635
889
  }
636
- maybeSelector = element.value.value;
637
- if (!(maybeSelector instanceof selector_1.default)) {
890
+
891
+ maybeSelector = /** @type {Node} */ (element.value.value);
892
+ if (!(maybeSelector instanceof Selector)) {
638
893
  return null;
639
894
  }
895
+
640
896
  return maybeSelector;
641
897
  }
898
+
642
899
  // the elements from the current selector so far
643
900
  currentElements = [];
644
901
  // the current list of new selectors to add to the path.
@@ -647,38 +904,74 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
647
904
  newSelectors = [
648
905
  []
649
906
  ];
907
+
650
908
  for (i = 0; (el = inSelector.elements[i]); i++) {
651
909
  // non parent reference elements just get added
652
910
  if (el.value !== '&') {
653
- var nestedSelector = findNestedSelector(el);
911
+ const nestedSelector = findNestedSelector(el);
654
912
  if (nestedSelector !== null) {
655
913
  // merge the current list of non parent selector elements
656
914
  // on to the current list of selectors to add
657
915
  mergeElementsOnToSelectors(currentElements, newSelectors);
658
- var nestedPaths = [];
659
- var replaced = void 0;
660
- var replacedNewSelectors = [];
661
- replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
662
- hadParentSelector = hadParentSelector || replaced;
663
- // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
664
- for (k = 0; k < nestedPaths.length; k++) {
665
- var replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
916
+
917
+ /** @type {Selector[][]} */
918
+ const nestedPaths = [];
919
+ /** @type {boolean | undefined} */
920
+ let replaced;
921
+ /** @type {Selector[][]} */
922
+ const replacedNewSelectors = [];
923
+
924
+ // Check if this is a comma-separated selector list inside the paren
925
+ // e.g. :not(&.a, &.b) produces Selector([Selector, Anonymous(','), Selector])
926
+ const hasSubSelectors = nestedSelector.elements.some(e => e instanceof Selector);
927
+
928
+ if (hasSubSelectors) {
929
+ // Process each sub-selector individually
930
+ /** @type {(Element | Selector)[]} */
931
+ const resolvedElements = [];
932
+ for (const subEl of nestedSelector.elements) {
933
+ if (subEl instanceof Selector) {
934
+ /** @type {Selector[][]} */
935
+ const subPaths = [];
936
+ const subReplaced = replaceParentSelector(subPaths, context, subEl);
937
+ replaced = replaced || subReplaced;
938
+ if (subPaths.length > 0 && subPaths[0].length > 0) {
939
+ resolvedElements.push(subPaths[0][0]);
940
+ } else {
941
+ resolvedElements.push(subEl);
942
+ }
943
+ } else {
944
+ resolvedElements.push(subEl);
945
+ }
946
+ }
947
+ hadParentSelector = hadParentSelector || /** @type {boolean} */ (replaced);
948
+ const resolvedNestedSelector = new Selector(resolvedElements);
949
+ const replacementSelector = createSelector(createParenthesis([resolvedNestedSelector], el), el);
666
950
  addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
951
+ } else {
952
+ replaced = replaceParentSelector(nestedPaths, context, nestedSelector);
953
+ hadParentSelector = hadParentSelector || replaced;
954
+ // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors
955
+ for (k = 0; k < nestedPaths.length; k++) {
956
+ const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);
957
+ addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);
958
+ }
667
959
  }
668
960
  newSelectors = replacedNewSelectors;
669
961
  currentElements = [];
670
- }
671
- else {
962
+ } else {
672
963
  currentElements.push(el);
673
964
  }
674
- }
675
- else {
965
+
966
+ } else {
676
967
  hadParentSelector = true;
677
968
  // the new list of selectors to add
678
969
  selectorsMultiplied = [];
970
+
679
971
  // merge the current list of non parent selector elements
680
972
  // on to the current list of selectors to add
681
973
  mergeElementsOnToSelectors(currentElements, newSelectors);
974
+
682
975
  // loop through our current selectors
683
976
  for (j = 0; j < newSelectors.length; j++) {
684
977
  sel = newSelectors[j];
@@ -688,7 +981,7 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
688
981
  // the combinator used on el should now be applied to the next element instead so that
689
982
  // it is not lost
690
983
  if (sel.length > 0) {
691
- sel[0].elements.push(new element_1.default(el.combinator, '', el.isVariable, el._index, el._fileInfo));
984
+ sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));
692
985
  }
693
986
  selectorsMultiplied.push(sel);
694
987
  }
@@ -697,20 +990,23 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
697
990
  for (k = 0; k < context.length; k++) {
698
991
  // We need to put the current selectors
699
992
  // then join the last selector's elements on to the parents selectors
700
- var newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
993
+ const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);
701
994
  // add that to our new set of selectors
702
995
  selectorsMultiplied.push(newSelectorPath);
703
996
  }
704
997
  }
705
998
  }
999
+
706
1000
  // our new selectors has been multiplied, so reset the state
707
1001
  newSelectors = selectorsMultiplied;
708
1002
  currentElements = [];
709
1003
  }
710
1004
  }
1005
+
711
1006
  // if we have any elements left over (e.g. .a& .b == .b)
712
1007
  // add them on to all the current selectors
713
1008
  mergeElementsOnToSelectors(currentElements, newSelectors);
1009
+
714
1010
  for (i = 0; i < newSelectors.length; i++) {
715
1011
  length = newSelectors[i].length;
716
1012
  if (length > 0) {
@@ -719,22 +1015,38 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
719
1015
  newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);
720
1016
  }
721
1017
  }
1018
+
722
1019
  return hadParentSelector;
723
1020
  }
1021
+
1022
+ /**
1023
+ * @param {VisibilityInfo} visibilityInfo
1024
+ * @param {Selector} deriveFrom
1025
+ */
724
1026
  function deriveSelector(visibilityInfo, deriveFrom) {
725
- var newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
1027
+ const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);
726
1028
  newSelector.copyVisibilityInfo(visibilityInfo);
727
1029
  return newSelector;
728
1030
  }
1031
+
729
1032
  // joinSelector code follows
730
- var i, newPaths, hadParentSelector;
1033
+ /** @type {number} */
1034
+ let i;
1035
+ /** @type {Selector[][]} */
1036
+ let newPaths;
1037
+ /** @type {boolean} */
1038
+ let hadParentSelector;
1039
+
731
1040
  newPaths = [];
732
1041
  hadParentSelector = replaceParentSelector(newPaths, context, selector);
1042
+
733
1043
  if (!hadParentSelector) {
734
1044
  if (context.length > 0) {
735
1045
  newPaths = [];
736
1046
  for (i = 0; i < context.length; i++) {
737
- var concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
1047
+
1048
+ const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));
1049
+
738
1050
  concatenated.push(selector);
739
1051
  newPaths.push(concatenated);
740
1052
  }
@@ -743,10 +1055,12 @@ Ruleset.prototype = Object.assign(new node_1.default(), {
743
1055
  newPaths = [[selector]];
744
1056
  }
745
1057
  }
1058
+
746
1059
  for (i = 0; i < newPaths.length; i++) {
747
1060
  paths.push(newPaths[i]);
748
1061
  }
1062
+
749
1063
  }
750
- });
751
- exports.default = Ruleset;
752
- //# sourceMappingURL=ruleset.js.map
1064
+ }
1065
+
1066
+ export default Ruleset;