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,70 +1,130 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var tslib_1 = require("tslib");
4
- var selector_1 = tslib_1.__importDefault(require("./selector"));
5
- var element_1 = tslib_1.__importDefault(require("./element"));
6
- var ruleset_1 = tslib_1.__importDefault(require("./ruleset"));
7
- var declaration_1 = tslib_1.__importDefault(require("./declaration"));
8
- var detached_ruleset_1 = tslib_1.__importDefault(require("./detached-ruleset"));
9
- var expression_1 = tslib_1.__importDefault(require("./expression"));
10
- var contexts_1 = tslib_1.__importDefault(require("../contexts"));
11
- var utils = tslib_1.__importStar(require("../utils"));
12
- var Definition = function (name, params, rules, condition, variadic, frames, visibilityInfo) {
13
- this.name = name || 'anonymous mixin';
14
- this.selectors = [new selector_1.default([new element_1.default(null, name, false, this._index, this._fileInfo)])];
15
- this.params = params;
16
- this.condition = condition;
17
- this.variadic = variadic;
18
- this.arity = params.length;
19
- this.rules = rules;
20
- this._lookups = {};
21
- var optionalParameters = [];
22
- this.required = params.reduce(function (count, p) {
23
- if (!p.name || (p.name && !p.value)) {
24
- return count + 1;
25
- }
26
- else {
27
- optionalParameters.push(p.name);
28
- return count;
29
- }
30
- }, 0);
31
- this.optionalParameters = optionalParameters;
32
- this.frames = frames;
33
- this.copyVisibilityInfo(visibilityInfo);
34
- this.allowRoot = true;
35
- };
36
- Definition.prototype = Object.assign(new ruleset_1.default(), {
37
- type: 'MixinDefinition',
38
- evalFirst: true,
39
- accept: function (visitor) {
1
+ // @ts-check
2
+ /** @import { EvalContext, TreeVisitor, VisibilityInfo } from './node.js' */
3
+ /** @import { FunctionRegistry } from './nested-at-rule.js' */
4
+ /** @import { MixinArg } from './mixin-call.js' */
5
+ import Node from './node.js';
6
+ import Selector from './selector.js';
7
+ import Element from './element.js';
8
+ import Ruleset from './ruleset.js';
9
+ import Declaration from './declaration.js';
10
+ import DetachedRuleset from './detached-ruleset.js';
11
+ import Expression from './expression.js';
12
+ import contexts from '../contexts.js';
13
+ import * as utils from '../utils.js';
14
+
15
+ /**
16
+ * @typedef {object} MixinParam
17
+ * @property {string} [name]
18
+ * @property {Node} [value]
19
+ * @property {boolean} [variadic]
20
+ */
21
+
22
+ /**
23
+ * @typedef {Ruleset & {
24
+ * functionRegistry?: FunctionRegistry,
25
+ * originalRuleset?: Node
26
+ * }} RulesetWithRegistry
27
+ */
28
+
29
+ class Definition extends Ruleset {
30
+ get type() { return 'MixinDefinition'; }
31
+
32
+ /**
33
+ * @param {string | undefined} name
34
+ * @param {MixinParam[]} params
35
+ * @param {Node[]} rules
36
+ * @param {Node | null} [condition]
37
+ * @param {boolean} [variadic]
38
+ * @param {Node[] | null} [frames]
39
+ * @param {VisibilityInfo} [visibilityInfo]
40
+ */
41
+ constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {
42
+ super(null, null);
43
+ /** @type {string} */
44
+ this.name = name || 'anonymous mixin';
45
+ this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];
46
+ /** @type {MixinParam[]} */
47
+ this.params = params;
48
+ /** @type {Node | null | undefined} */
49
+ this.condition = condition;
50
+ /** @type {boolean | undefined} */
51
+ this.variadic = variadic;
52
+ /** @type {number} */
53
+ this.arity = params.length;
54
+ this.rules = rules;
55
+ this._lookups = {};
56
+ /** @type {string[]} */
57
+ const optionalParameters = [];
58
+ /** @type {number} */
59
+ this.required = params.reduce(function (/** @type {number} */ count, /** @type {MixinParam} */ p) {
60
+ if (!p.name || (p.name && !p.value)) {
61
+ return count + 1;
62
+ }
63
+ else {
64
+ optionalParameters.push(p.name);
65
+ return count;
66
+ }
67
+ }, 0);
68
+ /** @type {string[]} */
69
+ this.optionalParameters = optionalParameters;
70
+ /** @type {Node[] | null | undefined} */
71
+ this.frames = frames;
72
+ this.copyVisibilityInfo(visibilityInfo);
73
+ this.allowRoot = true;
74
+ /** @type {boolean} */
75
+ this.evalFirst = true;
76
+ }
77
+
78
+ /** @param {TreeVisitor} visitor */
79
+ accept(visitor) {
40
80
  if (this.params && this.params.length) {
41
- this.params = visitor.visitArray(this.params);
81
+ this.params = /** @type {MixinParam[]} */ (/** @type {unknown} */ (visitor.visitArray(/** @type {Node[]} */ (/** @type {unknown} */ (this.params)))));
42
82
  }
43
83
  this.rules = visitor.visitArray(this.rules);
44
84
  if (this.condition) {
45
85
  this.condition = visitor.visit(this.condition);
46
86
  }
47
- },
48
- evalParams: function (context, mixinEnv, args, evaldArguments) {
87
+ }
88
+
89
+ /**
90
+ * @param {EvalContext} context
91
+ * @param {EvalContext} mixinEnv
92
+ * @param {MixinArg[] | null} args
93
+ * @param {Node[]} evaldArguments
94
+ * @returns {Ruleset}
95
+ */
96
+ evalParams(context, mixinEnv, args, evaldArguments) {
49
97
  /* jshint boss:true */
50
- var frame = new ruleset_1.default(null, null);
51
- var varargs;
52
- var arg;
53
- var params = utils.copyArray(this.params);
54
- var i;
55
- var j;
56
- var val;
57
- var name;
58
- var isNamedFound;
59
- var argIndex;
60
- var argsLength = 0;
61
- if (mixinEnv.frames && mixinEnv.frames[0] && mixinEnv.frames[0].functionRegistry) {
62
- frame.functionRegistry = mixinEnv.frames[0].functionRegistry.inherit();
98
+ const frame = new Ruleset(null, null);
99
+
100
+ /** @type {Node[] | undefined} */
101
+ let varargs;
102
+ /** @type {MixinArg | undefined} */
103
+ let arg;
104
+ const params = /** @type {MixinParam[]} */ (utils.copyArray(this.params));
105
+ /** @type {number} */
106
+ let i;
107
+ /** @type {number} */
108
+ let j;
109
+ /** @type {Node | undefined} */
110
+ let val;
111
+ /** @type {string | undefined} */
112
+ let name;
113
+ /** @type {boolean} */
114
+ let isNamedFound;
115
+ /** @type {number} */
116
+ let argIndex;
117
+ let argsLength = 0;
118
+
119
+ if (mixinEnv.frames && mixinEnv.frames[0] && /** @type {RulesetWithRegistry} */ (mixinEnv.frames[0]).functionRegistry) {
120
+ /** @type {RulesetWithRegistry} */ (frame).functionRegistry = /** @type {FunctionRegistry} */ (/** @type {RulesetWithRegistry} */ (mixinEnv.frames[0]).functionRegistry).inherit();
63
121
  }
64
- mixinEnv = new contexts_1.default.Eval(mixinEnv, [frame].concat(mixinEnv.frames));
122
+ mixinEnv = new contexts.Eval(mixinEnv, /** @type {Node[]} */ ([frame]).concat(/** @type {Node[]} */ (mixinEnv.frames)));
123
+
65
124
  if (args) {
66
- args = utils.copyArray(args);
125
+ args = /** @type {MixinArg[]} */ (utils.copyArray(args));
67
126
  argsLength = args.length;
127
+
68
128
  for (i = 0; i < argsLength; i++) {
69
129
  arg = args[i];
70
130
  if (name = (arg && arg.name)) {
@@ -72,7 +132,7 @@ Definition.prototype = Object.assign(new ruleset_1.default(), {
72
132
  for (j = 0; j < params.length; j++) {
73
133
  if (!evaldArguments[j] && name === params[j].name) {
74
134
  evaldArguments[j] = arg.value.eval(context);
75
- frame.prependRule(new declaration_1.default(name, arg.value.eval(context)));
135
+ frame.prependRule(new Declaration(name, arg.value.eval(context)));
76
136
  isNamedFound = true;
77
137
  break;
78
138
  }
@@ -81,49 +141,47 @@ Definition.prototype = Object.assign(new ruleset_1.default(), {
81
141
  args.splice(i, 1);
82
142
  i--;
83
143
  continue;
84
- }
85
- else {
86
- throw { type: 'Runtime', message: "Named argument for ".concat(this.name, " ").concat(args[i].name, " not found") };
144
+ } else {
145
+ throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };
87
146
  }
88
147
  }
89
148
  }
90
149
  }
91
150
  argIndex = 0;
92
151
  for (i = 0; i < params.length; i++) {
93
- if (evaldArguments[i]) {
94
- continue;
95
- }
152
+ if (evaldArguments[i]) { continue; }
153
+
96
154
  arg = args && args[argIndex];
155
+
97
156
  if (name = params[i].name) {
98
157
  if (params[i].variadic) {
99
158
  varargs = [];
100
159
  for (j = argIndex; j < argsLength; j++) {
101
- varargs.push(args[j].value.eval(context));
160
+ varargs.push(/** @type {MixinArg[]} */ (args)[j].value.eval(context));
102
161
  }
103
- frame.prependRule(new declaration_1.default(name, new expression_1.default(varargs).eval(context)));
104
- }
105
- else {
162
+ frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));
163
+ } else {
106
164
  val = arg && arg.value;
107
165
  if (val) {
108
166
  // This was a mixin call, pass in a detached ruleset of it's eval'd rules
109
167
  if (Array.isArray(val)) {
110
- val = new detached_ruleset_1.default(new ruleset_1.default('', val));
168
+ val = /** @type {Node} */ (/** @type {unknown} */ (new DetachedRuleset(new Ruleset(null, /** @type {Node[]} */ (val)))));
111
169
  }
112
170
  else {
113
171
  val = val.eval(context);
114
172
  }
115
- }
116
- else if (params[i].value) {
117
- val = params[i].value.eval(mixinEnv);
173
+ } else if (params[i].value) {
174
+ val = /** @type {Node} */ (params[i].value).eval(mixinEnv);
118
175
  frame.resetCache();
176
+ } else {
177
+ throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };
119
178
  }
120
- else {
121
- throw { type: 'Runtime', message: "wrong number of arguments for ".concat(this.name, " (").concat(argsLength, " for ").concat(this.arity, ")") };
122
- }
123
- frame.prependRule(new declaration_1.default(name, val));
179
+
180
+ frame.prependRule(new Declaration(name, val));
124
181
  evaldArguments[i] = val;
125
182
  }
126
183
  }
184
+
127
185
  if (params[i].variadic && args) {
128
186
  for (j = argIndex; j < argsLength; j++) {
129
187
  evaldArguments[j] = args[j].value.eval(context);
@@ -131,59 +189,94 @@ Definition.prototype = Object.assign(new ruleset_1.default(), {
131
189
  }
132
190
  argIndex++;
133
191
  }
192
+
134
193
  return frame;
135
- },
136
- makeImportant: function () {
137
- var rules = !this.rules ? this.rules : this.rules.map(function (r) {
194
+ }
195
+
196
+ /** @returns {Ruleset} */
197
+ makeImportant() {
198
+ const rules = !this.rules ? this.rules : this.rules.map(function (/** @type {Node & { makeImportant?: (important?: boolean) => Node }} */ r) {
138
199
  if (r.makeImportant) {
139
200
  return r.makeImportant(true);
140
- }
141
- else {
201
+ } else {
142
202
  return r;
143
203
  }
144
204
  });
145
- var result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
146
- return result;
147
- },
148
- eval: function (context) {
205
+ const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);
206
+ return /** @type {Ruleset} */ (/** @type {unknown} */ (result));
207
+ }
208
+
209
+ /**
210
+ * @param {EvalContext} context
211
+ * @returns {Definition}
212
+ */
213
+ eval(context) {
149
214
  return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));
150
- },
151
- evalCall: function (context, args, important) {
152
- var _arguments = [];
153
- var mixinFrames = this.frames ? this.frames.concat(context.frames) : context.frames;
154
- var frame = this.evalParams(context, new contexts_1.default.Eval(context, mixinFrames), args, _arguments);
155
- var rules;
156
- var ruleset;
157
- frame.prependRule(new declaration_1.default('@arguments', new expression_1.default(_arguments).eval(context)));
215
+ }
216
+
217
+ /**
218
+ * @param {EvalContext} context
219
+ * @param {MixinArg[]} args
220
+ * @param {string | undefined} important
221
+ * @returns {Ruleset}
222
+ */
223
+ evalCall(context, args, important) {
224
+ /** @type {Node[]} */
225
+ const _arguments = [];
226
+ const mixinFrames = this.frames ? /** @type {Node[]} */ (this.frames).concat(/** @type {Node[]} */ (context.frames)) : /** @type {Node[]} */ (context.frames);
227
+ const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);
228
+ /** @type {Node[]} */
229
+ let rules;
230
+ /** @type {Ruleset} */
231
+ let ruleset;
232
+
233
+ frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));
234
+
158
235
  rules = utils.copyArray(this.rules);
159
- ruleset = new ruleset_1.default(null, rules);
160
- ruleset.originalRuleset = this;
161
- ruleset = ruleset.eval(new contexts_1.default.Eval(context, [this, frame].concat(mixinFrames)));
236
+
237
+ ruleset = new Ruleset(null, rules);
238
+ /** @type {RulesetWithRegistry} */ (ruleset).originalRuleset = this;
239
+ ruleset = /** @type {Ruleset} */ (ruleset.eval(new contexts.Eval(context, /** @type {Node[]} */ ([this, frame]).concat(mixinFrames))));
162
240
  if (important) {
163
- ruleset = ruleset.makeImportant();
241
+ ruleset = /** @type {Ruleset} */ (ruleset.makeImportant());
164
242
  }
165
243
  return ruleset;
166
- },
167
- matchCondition: function (args, context) {
168
- if (this.condition && !this.condition.eval(new contexts_1.default.Eval(context, [this.evalParams(context, /* the parameter variables */ new contexts_1.default.Eval(context, this.frames ? this.frames.concat(context.frames) : context.frames), args, [])]
169
- .concat(this.frames || []) // the parent namespace/mixin frames
170
- .concat(context.frames)))) { // the current environment frames
244
+ }
245
+
246
+ /**
247
+ * @param {MixinArg[] | null} args
248
+ * @param {EvalContext} context
249
+ * @returns {boolean}
250
+ */
251
+ matchCondition(args, context) {
252
+ if (this.condition && !this.condition.eval(
253
+ new contexts.Eval(context,
254
+ /** @type {Node[]} */ ([this.evalParams(context, /* the parameter variables */
255
+ new contexts.Eval(context, this.frames ? /** @type {Node[]} */ (this.frames).concat(/** @type {Node[]} */ (context.frames)) : context.frames), args, [])])
256
+ .concat(/** @type {Node[]} */ (this.frames || [])) // the parent namespace/mixin frames
257
+ .concat(/** @type {Node[]} */ (context.frames))))) { // the current environment frames
171
258
  return false;
172
259
  }
173
260
  return true;
174
- },
175
- matchArgs: function (args, context) {
176
- var allArgsCnt = (args && args.length) || 0;
177
- var len;
178
- var optionalParameters = this.optionalParameters;
179
- var requiredArgsCnt = !args ? 0 : args.reduce(function (count, p) {
261
+ }
262
+
263
+ /**
264
+ * @param {MixinArg[] | null} args
265
+ * @param {EvalContext} [context]
266
+ * @returns {boolean}
267
+ */
268
+ matchArgs(args, context) {
269
+ const allArgsCnt = (args && args.length) || 0;
270
+ let len;
271
+ const optionalParameters = this.optionalParameters;
272
+ const requiredArgsCnt = !args ? 0 : args.reduce(function (/** @type {number} */ count, /** @type {MixinArg} */ p) {
180
273
  if (optionalParameters.indexOf(p.name) < 0) {
181
274
  return count + 1;
182
- }
183
- else {
275
+ } else {
184
276
  return count;
185
277
  }
186
278
  }, 0);
279
+
187
280
  if (!this.variadic) {
188
281
  if (requiredArgsCnt < this.required) {
189
282
  return false;
@@ -191,23 +284,24 @@ Definition.prototype = Object.assign(new ruleset_1.default(), {
191
284
  if (allArgsCnt > this.params.length) {
192
285
  return false;
193
286
  }
194
- }
195
- else {
287
+ } else {
196
288
  if (requiredArgsCnt < (this.required - 1)) {
197
289
  return false;
198
290
  }
199
291
  }
292
+
200
293
  // check patterns
201
294
  len = Math.min(requiredArgsCnt, this.arity);
202
- for (var i = 0; i < len; i++) {
295
+
296
+ for (let i = 0; i < len; i++) {
203
297
  if (!this.params[i].name && !this.params[i].variadic) {
204
- if (args[i].value.eval(context).toCSS() != this.params[i].value.eval(context).toCSS()) {
298
+ if (/** @type {MixinArg[]} */ (args)[i].value.eval(context).toCSS(/** @type {EvalContext} */ ({})) != /** @type {Node} */ (this.params[i].value).eval(context).toCSS(/** @type {EvalContext} */ ({}))) {
205
299
  return false;
206
300
  }
207
301
  }
208
302
  }
209
303
  return true;
210
304
  }
211
- });
212
- exports.default = Definition;
213
- //# sourceMappingURL=mixin-definition.js.map
305
+ }
306
+
307
+ export default Definition;
@@ -1,76 +1,95 @@
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 variable_1 = tslib_1.__importDefault(require("./variable"));
6
- var ruleset_1 = tslib_1.__importDefault(require("./ruleset"));
7
- var selector_1 = tslib_1.__importDefault(require("./selector"));
8
- var NamespaceValue = function (ruleCall, lookups, index, fileInfo) {
9
- this.value = ruleCall;
10
- this.lookups = lookups;
11
- this._index = index;
12
- this._fileInfo = fileInfo;
13
- };
14
- NamespaceValue.prototype = Object.assign(new node_1.default(), {
15
- type: 'NamespaceValue',
16
- eval: function (context) {
17
- var i, name, rules = this.value.eval(context);
1
+ // @ts-check
2
+ /** @import { EvalContext, FileInfo } from './node.js' */
3
+ import Node from './node.js';
4
+ import Variable from './variable.js';
5
+ import Ruleset from './ruleset.js';
6
+ import Selector from './selector.js';
7
+
8
+ class NamespaceValue extends Node {
9
+ get type() { return 'NamespaceValue'; }
10
+
11
+ /**
12
+ * @param {Node} ruleCall
13
+ * @param {string[]} lookups
14
+ * @param {number} index
15
+ * @param {FileInfo} fileInfo
16
+ */
17
+ constructor(ruleCall, lookups, index, fileInfo) {
18
+ super();
19
+ this.value = ruleCall;
20
+ this.lookups = lookups;
21
+ this._index = index;
22
+ this._fileInfo = fileInfo;
23
+ }
24
+
25
+ /**
26
+ * @param {EvalContext} context
27
+ * @returns {Node}
28
+ */
29
+ eval(context) {
30
+ let i, name;
31
+ /** @type {Ruleset | Node | Node[]} */
32
+ let rules = this.value.eval(context);
33
+
18
34
  for (i = 0; i < this.lookups.length; i++) {
19
35
  name = this.lookups[i];
20
- /**
21
- * Eval'd DRs return rulesets.
22
- * Eval'd mixins return rules, so let's make a ruleset if we need it.
23
- * We need to do this because of late parsing of values
24
- */
36
+
25
37
  if (Array.isArray(rules)) {
26
- rules = new ruleset_1.default([new selector_1.default()], rules);
38
+ rules = new Ruleset([new Selector()], rules);
27
39
  }
40
+
41
+ const rs = /** @type {Ruleset} */ (rules);
42
+
28
43
  if (name === '') {
29
- rules = rules.lastDeclaration();
44
+ rules = rs.lastDeclaration();
30
45
  }
31
46
  else if (name.charAt(0) === '@') {
32
47
  if (name.charAt(1) === '@') {
33
- name = "@".concat(new variable_1.default(name.substr(1)).eval(context).value);
48
+ name = `@${new Variable(name.slice(1)).eval(context).value}`;
34
49
  }
35
- if (rules.variables) {
36
- rules = rules.variable(name);
50
+ if (rs.variables) {
51
+ rules = rs.variable(name);
37
52
  }
53
+
38
54
  if (!rules) {
39
55
  throw { type: 'Name',
40
- message: "variable ".concat(name, " not found"),
56
+ message: `variable ${name} not found`,
41
57
  filename: this.fileInfo().filename,
42
58
  index: this.getIndex() };
43
59
  }
44
60
  }
45
61
  else {
46
62
  if (name.substring(0, 2) === '$@') {
47
- name = "$".concat(new variable_1.default(name.substr(1)).eval(context).value);
63
+ name = `$${new Variable(name.slice(1)).eval(context).value}`;
48
64
  }
49
65
  else {
50
- name = name.charAt(0) === '$' ? name : "$".concat(name);
66
+ name = name.charAt(0) === '$' ? name : `$${name}`;
51
67
  }
52
- if (rules.properties) {
53
- rules = rules.property(name);
68
+ if (rs.properties) {
69
+ rules = rs.property(name);
54
70
  }
71
+
55
72
  if (!rules) {
56
73
  throw { type: 'Name',
57
- message: "property \"".concat(name.substr(1), "\" not found"),
74
+ message: `property "${name.slice(1)}" not found`,
58
75
  filename: this.fileInfo().filename,
59
76
  index: this.getIndex() };
60
77
  }
61
- // Properties are an array of values, since a ruleset can have multiple props.
62
- // We pick the last one (the "cascaded" value)
63
- rules = rules[rules.length - 1];
78
+ const rulesArr = /** @type {Node[]} */ (rules);
79
+ rules = rulesArr[rulesArr.length - 1];
64
80
  }
65
- if (rules.value) {
66
- rules = rules.eval(context).value;
81
+
82
+ const current = /** @type {Node} */ (rules);
83
+ if (current.value) {
84
+ rules = /** @type {Node} */ (current.eval(context).value);
67
85
  }
68
- if (rules.ruleset) {
69
- rules = rules.ruleset.eval(context);
86
+ const currentNode = /** @type {Node & { ruleset?: Node }} */ (rules);
87
+ if (currentNode.ruleset) {
88
+ rules = currentNode.ruleset.eval(context);
70
89
  }
71
90
  }
72
- return rules;
91
+ return /** @type {Node} */ (rules);
73
92
  }
74
- });
75
- exports.default = NamespaceValue;
76
- //# sourceMappingURL=namespace-value.js.map
93
+ }
94
+
95
+ export default NamespaceValue;
@@ -1,24 +1,37 @@
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 operation_1 = tslib_1.__importDefault(require("./operation"));
6
- var dimension_1 = tslib_1.__importDefault(require("./dimension"));
7
- var Negative = function (node) {
8
- this.value = node;
9
- };
10
- Negative.prototype = Object.assign(new node_1.default(), {
11
- type: 'Negative',
12
- genCSS: function (context, output) {
1
+ // @ts-check
2
+ /** @import { EvalContext, CSSOutput } from './node.js' */
3
+ import Node from './node.js';
4
+ import Operation from './operation.js';
5
+ import Dimension from './dimension.js';
6
+
7
+ class Negative extends Node {
8
+ get type() { return 'Negative'; }
9
+
10
+ /** @param {Node} node */
11
+ constructor(node) {
12
+ super();
13
+ this.value = node;
14
+ }
15
+
16
+ /**
17
+ * @param {EvalContext} context
18
+ * @param {CSSOutput} output
19
+ */
20
+ genCSS(context, output) {
13
21
  output.add('-');
14
- this.value.genCSS(context, output);
15
- },
16
- eval: function (context) {
17
- if (context.isMathOn()) {
18
- return (new operation_1.default('*', [new dimension_1.default(-1), this.value])).eval(context);
22
+ /** @type {Node} */ (this.value).genCSS(context, output);
23
+ }
24
+
25
+ /**
26
+ * @param {EvalContext} context
27
+ * @returns {Node}
28
+ */
29
+ eval(context) {
30
+ if (context.isMathOn('*')) {
31
+ return (new Operation('*', [new Dimension(-1), /** @type {Node} */ (this.value)], false)).eval(context);
19
32
  }
20
- return new Negative(this.value.eval(context));
33
+ return new Negative(/** @type {Node} */ (this.value).eval(context));
21
34
  }
22
- });
23
- exports.default = Negative;
24
- //# sourceMappingURL=negative.js.map
35
+ }
36
+
37
+ export default Negative;