less 4.4.2 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/bin/lessc +67 -58
  2. package/dist/less.js +14496 -11811
  3. package/dist/less.min.js +4 -4
  4. package/dist/less.min.js.map +1 -1
  5. package/lib/less/constants.js +5 -7
  6. package/lib/less/contexts.js +71 -56
  7. package/lib/less/data/colors.js +150 -153
  8. package/lib/less/data/index.js +4 -7
  9. package/lib/less/data/unit-conversions.js +2 -5
  10. package/lib/less/default-options.js +52 -23
  11. package/lib/less/deprecation.js +67 -0
  12. package/lib/less/environment/abstract-file-manager.js +62 -50
  13. package/lib/less/environment/abstract-plugin-loader.js +69 -46
  14. package/lib/less/environment/environment-api.ts +21 -0
  15. package/lib/less/environment/environment.js +34 -30
  16. package/lib/less/environment/file-manager-api.ts +77 -0
  17. package/lib/less/functions/boolean.js +13 -13
  18. package/lib/less/functions/color-blending.js +39 -31
  19. package/lib/less/functions/color.js +153 -137
  20. package/lib/less/functions/data-uri.js +73 -64
  21. package/lib/less/functions/default.js +9 -11
  22. package/lib/less/functions/function-caller.js +35 -34
  23. package/lib/less/functions/function-registry.js +16 -17
  24. package/lib/less/functions/index.js +33 -33
  25. package/lib/less/functions/list.js +88 -75
  26. package/lib/less/functions/math-helper.js +8 -11
  27. package/lib/less/functions/math.js +21 -21
  28. package/lib/less/functions/number.js +42 -53
  29. package/lib/less/functions/string.js +18 -22
  30. package/lib/less/functions/style.js +21 -20
  31. package/lib/less/functions/svg.js +83 -82
  32. package/lib/less/functions/types.js +28 -32
  33. package/lib/less/import-manager.js +73 -64
  34. package/lib/less/index.js +65 -65
  35. package/lib/less/less-error.js +65 -46
  36. package/lib/less/logger.js +11 -14
  37. package/lib/less/parse-tree.js +94 -38
  38. package/lib/less/parse.js +44 -44
  39. package/lib/less/parser/parser-input.js +152 -131
  40. package/lib/less/parser/parser.js +866 -672
  41. package/lib/less/plugin-manager.js +57 -46
  42. package/lib/less/render.js +17 -23
  43. package/lib/less/source-map-builder.js +52 -43
  44. package/lib/less/source-map-output.js +57 -44
  45. package/lib/less/transform-tree.js +40 -30
  46. package/lib/less/tree/anonymous.js +52 -28
  47. package/lib/less/tree/assignment.js +44 -27
  48. package/lib/less/tree/atrule-syntax.js +4 -6
  49. package/lib/less/tree/atrule.js +247 -140
  50. package/lib/less/tree/attribute.js +55 -24
  51. package/lib/less/tree/call.js +70 -42
  52. package/lib/less/tree/color.js +194 -145
  53. package/lib/less/tree/combinator.js +31 -21
  54. package/lib/less/tree/comment.js +44 -23
  55. package/lib/less/tree/condition.js +61 -36
  56. package/lib/less/tree/container.js +90 -34
  57. package/lib/less/tree/debug-info.js +53 -11
  58. package/lib/less/tree/declaration.js +97 -52
  59. package/lib/less/tree/detached-ruleset.js +42 -24
  60. package/lib/less/tree/dimension.js +127 -71
  61. package/lib/less/tree/element.js +82 -52
  62. package/lib/less/tree/expression.js +75 -50
  63. package/lib/less/tree/extend.js +71 -42
  64. package/lib/less/tree/import.js +184 -110
  65. package/lib/less/tree/index.js +52 -81
  66. package/lib/less/tree/javascript.js +43 -32
  67. package/lib/less/tree/js-eval-node.js +46 -32
  68. package/lib/less/tree/keyword.js +25 -17
  69. package/lib/less/tree/media.js +77 -35
  70. package/lib/less/tree/merge-rules.js +47 -0
  71. package/lib/less/tree/mixin-call.js +181 -98
  72. package/lib/less/tree/mixin-definition.js +211 -117
  73. package/lib/less/tree/namespace-value.js +63 -44
  74. package/lib/less/tree/negative.js +34 -21
  75. package/lib/less/tree/nested-at-rule.js +149 -66
  76. package/lib/less/tree/node.js +225 -90
  77. package/lib/less/tree/operation.js +59 -34
  78. package/lib/less/tree/paren.js +34 -17
  79. package/lib/less/tree/property.js +66 -35
  80. package/lib/less/tree/query-in-parens.js +52 -60
  81. package/lib/less/tree/quoted.js +93 -44
  82. package/lib/less/tree/ruleset.js +632 -318
  83. package/lib/less/tree/selector.js +151 -77
  84. package/lib/less/tree/unicode-descriptor.js +14 -12
  85. package/lib/less/tree/unit.js +111 -63
  86. package/lib/less/tree/url.js +62 -38
  87. package/lib/less/tree/value.js +50 -34
  88. package/lib/less/tree/variable-call.js +47 -30
  89. package/lib/less/tree/variable.js +53 -31
  90. package/lib/less/utils.js +44 -47
  91. package/lib/less/visitors/extend-visitor.js +233 -172
  92. package/lib/less/visitors/import-sequencer.js +24 -24
  93. package/lib/less/visitors/import-visitor.js +62 -52
  94. package/lib/less/visitors/index.js +14 -17
  95. package/lib/less/visitors/join-selector-visitor.js +40 -37
  96. package/lib/less/visitors/set-tree-visibility-visitor.js +32 -18
  97. package/lib/less/visitors/to-css-visitor.js +135 -128
  98. package/lib/less/visitors/visitor.js +60 -45
  99. package/lib/less-browser/add-default-options.js +23 -13
  100. package/lib/less-browser/bootstrap.js +23 -17
  101. package/lib/less-browser/browser.js +24 -21
  102. package/lib/less-browser/cache.js +17 -19
  103. package/lib/less-browser/error-reporting.js +52 -44
  104. package/lib/less-browser/file-manager.js +52 -42
  105. package/lib/less-browser/image-size.js +12 -12
  106. package/lib/less-browser/index.js +131 -105
  107. package/lib/less-browser/log-listener.js +30 -31
  108. package/lib/less-browser/plugin-loader.js +10 -10
  109. package/lib/less-browser/utils.js +19 -21
  110. package/lib/less-node/environment.js +32 -8
  111. package/lib/less-node/file-manager.js +62 -45
  112. package/lib/less-node/fs.js +11 -8
  113. package/lib/less-node/image-size.js +40 -31
  114. package/lib/less-node/index.js +28 -19
  115. package/lib/less-node/lessc-helper.js +28 -28
  116. package/lib/less-node/plugin-loader.js +35 -27
  117. package/lib/less-node/url-file-manager.js +33 -31
  118. package/package.json +31 -19
  119. package/.eslintignore +0 -6
  120. package/.eslintrc.js +0 -63
  121. package/Gruntfile.js +0 -404
  122. package/bower.json +0 -22
  123. package/lib/less/constants.js.map +0 -1
  124. package/lib/less/contexts.js.map +0 -1
  125. package/lib/less/data/colors.js.map +0 -1
  126. package/lib/less/data/index.js.map +0 -1
  127. package/lib/less/data/unit-conversions.js.map +0 -1
  128. package/lib/less/default-options.js.map +0 -1
  129. package/lib/less/environment/abstract-file-manager.js.map +0 -1
  130. package/lib/less/environment/abstract-plugin-loader.js.map +0 -1
  131. package/lib/less/environment/environment-api.js +0 -3
  132. package/lib/less/environment/environment-api.js.map +0 -1
  133. package/lib/less/environment/environment.js.map +0 -1
  134. package/lib/less/environment/file-manager-api.js +0 -3
  135. package/lib/less/environment/file-manager-api.js.map +0 -1
  136. package/lib/less/functions/boolean.js.map +0 -1
  137. package/lib/less/functions/color-blending.js.map +0 -1
  138. package/lib/less/functions/color.js.map +0 -1
  139. package/lib/less/functions/data-uri.js.map +0 -1
  140. package/lib/less/functions/default.js.map +0 -1
  141. package/lib/less/functions/function-caller.js.map +0 -1
  142. package/lib/less/functions/function-registry.js.map +0 -1
  143. package/lib/less/functions/index.js.map +0 -1
  144. package/lib/less/functions/list.js.map +0 -1
  145. package/lib/less/functions/math-helper.js.map +0 -1
  146. package/lib/less/functions/math.js.map +0 -1
  147. package/lib/less/functions/number.js.map +0 -1
  148. package/lib/less/functions/string.js.map +0 -1
  149. package/lib/less/functions/style.js.map +0 -1
  150. package/lib/less/functions/svg.js.map +0 -1
  151. package/lib/less/functions/types.js.map +0 -1
  152. package/lib/less/import-manager.js.map +0 -1
  153. package/lib/less/index.js.map +0 -1
  154. package/lib/less/less-error.js.map +0 -1
  155. package/lib/less/logger.js.map +0 -1
  156. package/lib/less/parse-tree.js.map +0 -1
  157. package/lib/less/parse.js.map +0 -1
  158. package/lib/less/parser/chunker.js +0 -148
  159. package/lib/less/parser/chunker.js.map +0 -1
  160. package/lib/less/parser/parser-input.js.map +0 -1
  161. package/lib/less/parser/parser.js.map +0 -1
  162. package/lib/less/plugin-manager.js.map +0 -1
  163. package/lib/less/render.js.map +0 -1
  164. package/lib/less/source-map-builder.js.map +0 -1
  165. package/lib/less/source-map-output.js.map +0 -1
  166. package/lib/less/transform-tree.js.map +0 -1
  167. package/lib/less/tree/anonymous.js.map +0 -1
  168. package/lib/less/tree/assignment.js.map +0 -1
  169. package/lib/less/tree/atrule-syntax.js.map +0 -1
  170. package/lib/less/tree/atrule.js.map +0 -1
  171. package/lib/less/tree/attribute.js.map +0 -1
  172. package/lib/less/tree/call.js.map +0 -1
  173. package/lib/less/tree/color.js.map +0 -1
  174. package/lib/less/tree/combinator.js.map +0 -1
  175. package/lib/less/tree/comment.js.map +0 -1
  176. package/lib/less/tree/condition.js.map +0 -1
  177. package/lib/less/tree/container.js.map +0 -1
  178. package/lib/less/tree/debug-info.js.map +0 -1
  179. package/lib/less/tree/declaration.js.map +0 -1
  180. package/lib/less/tree/detached-ruleset.js.map +0 -1
  181. package/lib/less/tree/dimension.js.map +0 -1
  182. package/lib/less/tree/element.js.map +0 -1
  183. package/lib/less/tree/expression.js.map +0 -1
  184. package/lib/less/tree/extend.js.map +0 -1
  185. package/lib/less/tree/import.js.map +0 -1
  186. package/lib/less/tree/index.js.map +0 -1
  187. package/lib/less/tree/javascript.js.map +0 -1
  188. package/lib/less/tree/js-eval-node.js.map +0 -1
  189. package/lib/less/tree/keyword.js.map +0 -1
  190. package/lib/less/tree/media.js.map +0 -1
  191. package/lib/less/tree/mixin-call.js.map +0 -1
  192. package/lib/less/tree/mixin-definition.js.map +0 -1
  193. package/lib/less/tree/namespace-value.js.map +0 -1
  194. package/lib/less/tree/negative.js.map +0 -1
  195. package/lib/less/tree/nested-at-rule.js.map +0 -1
  196. package/lib/less/tree/node.js.map +0 -1
  197. package/lib/less/tree/operation.js.map +0 -1
  198. package/lib/less/tree/paren.js.map +0 -1
  199. package/lib/less/tree/property.js.map +0 -1
  200. package/lib/less/tree/query-in-parens.js.map +0 -1
  201. package/lib/less/tree/quoted.js.map +0 -1
  202. package/lib/less/tree/ruleset.js.map +0 -1
  203. package/lib/less/tree/selector.js.map +0 -1
  204. package/lib/less/tree/unicode-descriptor.js.map +0 -1
  205. package/lib/less/tree/unit.js.map +0 -1
  206. package/lib/less/tree/url.js.map +0 -1
  207. package/lib/less/tree/value.js.map +0 -1
  208. package/lib/less/tree/variable-call.js.map +0 -1
  209. package/lib/less/tree/variable.js.map +0 -1
  210. package/lib/less/utils.js.map +0 -1
  211. package/lib/less/visitors/extend-visitor.js.map +0 -1
  212. package/lib/less/visitors/import-sequencer.js.map +0 -1
  213. package/lib/less/visitors/import-visitor.js.map +0 -1
  214. package/lib/less/visitors/index.js.map +0 -1
  215. package/lib/less/visitors/join-selector-visitor.js.map +0 -1
  216. package/lib/less/visitors/set-tree-visibility-visitor.js.map +0 -1
  217. package/lib/less/visitors/to-css-visitor.js.map +0 -1
  218. package/lib/less/visitors/visitor.js.map +0 -1
  219. package/lib/less-browser/add-default-options.js.map +0 -1
  220. package/lib/less-browser/bootstrap.js.map +0 -1
  221. package/lib/less-browser/browser.js.map +0 -1
  222. package/lib/less-browser/cache.js.map +0 -1
  223. package/lib/less-browser/error-reporting.js.map +0 -1
  224. package/lib/less-browser/file-manager.js.map +0 -1
  225. package/lib/less-browser/image-size.js.map +0 -1
  226. package/lib/less-browser/index.js.map +0 -1
  227. package/lib/less-browser/log-listener.js.map +0 -1
  228. package/lib/less-browser/plugin-loader.js.map +0 -1
  229. package/lib/less-browser/utils.js.map +0 -1
  230. package/lib/less-node/environment.js.map +0 -1
  231. package/lib/less-node/file-manager.js.map +0 -1
  232. package/lib/less-node/fs.js.map +0 -1
  233. package/lib/less-node/image-size.js.map +0 -1
  234. package/lib/less-node/index.js.map +0 -1
  235. package/lib/less-node/lessc-helper.js.map +0 -1
  236. package/lib/less-node/plugin-loader.js.map +0 -1
  237. package/lib/less-node/url-file-manager.js.map +0 -1
  238. package/test/.eslintrc.json +0 -9
  239. package/test/README.md +0 -3
  240. package/test/browser/common.js +0 -230
  241. package/test/browser/css/global-vars/simple.css +0 -3
  242. package/test/browser/css/modify-vars/simple.css +0 -8
  243. package/test/browser/css/plugin/plugin.css +0 -3
  244. package/test/browser/css/postProcessor/postProcessor.css +0 -4
  245. package/test/browser/css/relative-urls/urls.css +0 -36
  246. package/test/browser/css/rewrite-urls/urls.css +0 -36
  247. package/test/browser/css/rootpath/urls.css +0 -35
  248. package/test/browser/css/rootpath-relative/urls.css +0 -35
  249. package/test/browser/css/rootpath-rewrite-urls/urls.css +0 -35
  250. package/test/browser/css/urls.css +0 -54
  251. package/test/browser/generator/benchmark.config.js +0 -50
  252. package/test/browser/generator/generate.js +0 -78
  253. package/test/browser/generator/runner.config.js +0 -188
  254. package/test/browser/generator/runner.js +0 -2
  255. package/test/browser/generator/template.js +0 -93
  256. package/test/browser/generator/utils.js +0 -14
  257. package/test/browser/less/console-errors/test-error.less +0 -3
  258. package/test/browser/less/console-errors/test-error.txt +0 -2
  259. package/test/browser/less/errors/image-height-error.less +0 -3
  260. package/test/browser/less/errors/image-height-error.txt +0 -4
  261. package/test/browser/less/errors/image-size-error.less +0 -3
  262. package/test/browser/less/errors/image-size-error.txt +0 -4
  263. package/test/browser/less/errors/image-width-error.less +0 -3
  264. package/test/browser/less/errors/image-width-error.txt +0 -4
  265. package/test/browser/less/global-vars/simple.less +0 -3
  266. package/test/browser/less/imports/urls.less +0 -4
  267. package/test/browser/less/imports/urls2.less +0 -4
  268. package/test/browser/less/modify-vars/imports/simple2.less +0 -4
  269. package/test/browser/less/modify-vars/simple.less +0 -8
  270. package/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less +0 -5
  271. package/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +0 -15
  272. package/test/browser/less/plugin/plugin.js +0 -4
  273. package/test/browser/less/plugin/plugin.less +0 -4
  274. package/test/browser/less/postProcessor/postProcessor.less +0 -4
  275. package/test/browser/less/relative-urls/urls.less +0 -34
  276. package/test/browser/less/rewrite-urls/urls.less +0 -34
  277. package/test/browser/less/rootpath/urls.less +0 -33
  278. package/test/browser/less/rootpath-relative/urls.less +0 -33
  279. package/test/browser/less/rootpath-rewrite-urls/urls.less +0 -33
  280. package/test/browser/less/urls.less +0 -62
  281. package/test/browser/runner-VisitorPlugin-options.js +0 -3
  282. package/test/browser/runner-VisitorPlugin.js +0 -3
  283. package/test/browser/runner-browser-options.js +0 -51
  284. package/test/browser/runner-browser-spec.js +0 -12
  285. package/test/browser/runner-console-errors.js +0 -5
  286. package/test/browser/runner-errors-options.js +0 -6
  287. package/test/browser/runner-errors-spec.js +0 -3
  288. package/test/browser/runner-filemanagerPlugin-options.js +0 -5
  289. package/test/browser/runner-filemanagerPlugin.js +0 -3
  290. package/test/browser/runner-global-vars-options.js +0 -7
  291. package/test/browser/runner-global-vars-spec.js +0 -3
  292. package/test/browser/runner-legacy-options.js +0 -6
  293. package/test/browser/runner-legacy-spec.js +0 -3
  294. package/test/browser/runner-main-options.js +0 -17
  295. package/test/browser/runner-main-spec.js +0 -7
  296. package/test/browser/runner-modify-vars-options.js +0 -5
  297. package/test/browser/runner-modify-vars-spec.js +0 -33
  298. package/test/browser/runner-no-js-errors-options.js +0 -4
  299. package/test/browser/runner-no-js-errors-spec.js +0 -3
  300. package/test/browser/runner-postProcessorPlugin-options.js +0 -3
  301. package/test/browser/runner-postProcessorPlugin.js +0 -3
  302. package/test/browser/runner-preProcessorPlugin-options.js +0 -3
  303. package/test/browser/runner-preProcessorPlugin.js +0 -3
  304. package/test/browser/runner-production-options.js +0 -3
  305. package/test/browser/runner-production-spec.js +0 -5
  306. package/test/browser/runner-relative-urls-options.js +0 -3
  307. package/test/browser/runner-relative-urls-spec.js +0 -3
  308. package/test/browser/runner-rewrite-urls-options.js +0 -3
  309. package/test/browser/runner-rewrite-urls-spec.js +0 -3
  310. package/test/browser/runner-rootpath-options.js +0 -3
  311. package/test/browser/runner-rootpath-relative-options.js +0 -4
  312. package/test/browser/runner-rootpath-relative-spec.js +0 -3
  313. package/test/browser/runner-rootpath-rewrite-urls-options.js +0 -4
  314. package/test/browser/runner-rootpath-rewrite-urls-spec.js +0 -3
  315. package/test/browser/runner-rootpath-spec.js +0 -3
  316. package/test/browser/runner-strict-units-options.js +0 -5
  317. package/test/browser/runner-strict-units-spec.js +0 -3
  318. package/test/index.js +0 -112
  319. package/test/less-test.js +0 -625
  320. package/test/mocha-playwright/runner.js +0 -210
  321. package/test/modify-vars.js +0 -28
  322. package/test/plugins/filemanager/index.js +0 -19
  323. package/test/plugins/postprocess/index.js +0 -14
  324. package/test/plugins/preprocess/index.js +0 -19
  325. package/test/plugins/visitor/index.js +0 -24
  326. package/test/sourcemaps/basic.json +0 -1
  327. package/test/sourcemaps/custom-props.json +0 -1
  328. package/test/sourcemaps/index.html +0 -17
  329. package/test/sourcemaps-disable-annotation/basic.json +0 -1
  330. package/test/sourcemaps-variable-selector/basic.json +0 -1
  331. package/test/test-es6.ts +0 -17
  332. package/tsconfig.build.json +0 -7
  333. package/tsconfig.json +0 -21
package/bin/lessc CHANGED
@@ -2,18 +2,17 @@
2
2
 
3
3
  /* eslint indent: [2, 2, {"SwitchCase": 1}] */
4
4
 
5
- 'use strict';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ import { createRequire } from 'module';
8
+ import fs from '../lib/less-node/fs.js';
9
+ import * as utils from '../lib/less/utils.js';
10
+ import * as Constants from '../lib/less/constants.js';
11
+ import less from '../lib/less-node/index.js';
6
12
 
7
- var path = require('path');
8
- var fs = require('../lib/less-node/fs').default;
9
- var os = require('os');
10
- var utils = require('../lib/less/utils');
11
- var Constants = require('../lib/less/constants');
12
-
13
- var less = require('../lib/less-node').default;
13
+ const require = createRequire(import.meta.url);
14
14
 
15
15
  var errno;
16
- var mkdirp;
17
16
 
18
17
  try {
19
18
  errno = require('errno');
@@ -65,6 +64,7 @@ var parseVariableOption = function parseVariableOption(option, variables) {
65
64
  };
66
65
 
67
66
  var sourceMapFileInline = false;
67
+ var pendingDeprecations = [];
68
68
 
69
69
  function printUsage() {
70
70
  less.lesscHelper.printUsage();
@@ -98,53 +98,48 @@ function render() {
98
98
  }
99
99
 
100
100
  if (options.sourceMap) {
101
- sourceMapOptions.sourceMapInputFilename = input;
102
-
103
- if (!sourceMapOptions.sourceMapFullFilename) {
104
- if (!output && !sourceMapFileInline) {
105
- console.error('the sourcemap option only has an optional filename if the css filename is given');
106
- console.error('consider adding --source-map-map-inline which embeds the sourcemap into the css');
107
- process.exitCode = 1;
108
- return;
109
- } // its in the same directory, so always just the basename
110
-
111
-
112
- if (output) {
113
- sourceMapOptions.sourceMapOutputFilename = path.basename(output);
114
- sourceMapOptions.sourceMapFullFilename = ''.concat(output, '.map');
115
- } // its in the same directory, so always just the basename
116
-
117
-
118
- if ('sourceMapFullFilename' in sourceMapOptions) {
119
- sourceMapOptions.sourceMapFilename = path.basename(sourceMapOptions.sourceMapFullFilename);
120
- }
121
- } else if (options.sourceMap && !sourceMapFileInline) {
122
- var mapFilename = path.resolve(process.cwd(), sourceMapOptions.sourceMapFullFilename);
123
- var mapDir = path.dirname(mapFilename);
124
- var outputDir = path.dirname(output); // find the path from the map to the output file
125
-
126
- // eslint-disable-next-line max-len
127
- sourceMapOptions.sourceMapOutputFilename = path.join(path.relative(mapDir, outputDir), path.basename(output)); // make the sourcemap filename point to the sourcemap relative to the css file output directory
128
-
129
- sourceMapOptions.sourceMapFilename = path.join(path.relative(outputDir, mapDir), path.basename(sourceMapOptions.sourceMapFullFilename));
130
- }
131
-
101
+ // Validate conflicting options
132
102
  if (sourceMapOptions.sourceMapURL && sourceMapOptions.disableSourcemapAnnotation) {
133
103
  console.error('You cannot provide flag --source-map-url with --source-map-no-annotation.');
134
104
  console.error('Please remove one of those flags.');
135
105
  process.exitcode = 1;
136
106
  return;
137
107
  }
138
- }
139
108
 
140
- if (sourceMapOptions.sourceMapBasepath === undefined) {
141
- sourceMapOptions.sourceMapBasepath = input ? path.dirname(input) : process.cwd();
142
- }
109
+ // Handle explicit sourceMapFullFilename (from --source-map=filename)
110
+ // Normalization of other options (sourceMapBasepath, sourceMapRootpath, etc.)
111
+ // is handled automatically in parse-tree.js
112
+ if (sourceMapOptions.sourceMapFullFilename && !sourceMapFileInline) {
113
+ var mapFilename = path.resolve(process.cwd(), sourceMapOptions.sourceMapFullFilename);
114
+ var mapDir = path.dirname(mapFilename);
143
115
 
144
- if (sourceMapOptions.sourceMapRootpath === undefined) {
145
- var pathToMap = path.dirname((sourceMapFileInline ? output : sourceMapOptions.sourceMapFullFilename) || '.');
146
- var pathToInput = path.dirname(sourceMapOptions.sourceMapInputFilename || '.');
147
- sourceMapOptions.sourceMapRootpath = path.relative(pathToMap, pathToInput);
116
+ if (output) {
117
+ var outputDir = path.dirname(output);
118
+ // Set sourceMapOutputFilename relative to map directory
119
+ sourceMapOptions.sourceMapOutputFilename = path.join(
120
+ path.relative(mapDir, outputDir),
121
+ path.basename(output)
122
+ );
123
+ // Set sourceMapFilename relative to output directory (for sourceMappingURL comment)
124
+ sourceMapOptions.sourceMapFilename = path.join(
125
+ path.relative(outputDir, mapDir),
126
+ path.basename(sourceMapOptions.sourceMapFullFilename)
127
+ );
128
+ } else {
129
+ // No output filename, just use basename
130
+ sourceMapOptions.sourceMapOutputFilename = path.basename(output || 'output.css');
131
+ sourceMapOptions.sourceMapFilename = path.basename(sourceMapOptions.sourceMapFullFilename);
132
+ }
133
+ } else if (!sourceMapOptions.sourceMapFullFilename && output && !sourceMapFileInline) {
134
+ // No explicit sourcemap filename, derive from output
135
+ sourceMapOptions.sourceMapOutputFilename = path.basename(output);
136
+ sourceMapOptions.sourceMapFullFilename = ''.concat(output, '.map');
137
+ } else if (!output && !sourceMapFileInline) {
138
+ console.error('the sourcemap option only has an optional filename if the css filename is given');
139
+ console.error('consider adding --source-map-map-inline which embeds the sourcemap into the css');
140
+ process.exitCode = 1;
141
+ return;
142
+ }
148
143
  }
149
144
 
150
145
  if (!input) {
@@ -155,6 +150,7 @@ function render() {
155
150
  return;
156
151
  }
157
152
 
153
+ var mkdirp;
158
154
  var ensureDirectory = function ensureDirectory(filepath) {
159
155
  var dir = path.dirname(filepath);
160
156
  var cmd;
@@ -193,7 +189,7 @@ function render() {
193
189
 
194
190
  // To fix https://github.com/less/less.js/issues/3646
195
191
  output = output.toString();
196
-
192
+
197
193
  fs.writeFile(filename, output, 'utf8', function (err) {
198
194
  if (err) {
199
195
  var description = 'Error: ';
@@ -408,11 +404,15 @@ function processPluginQueue() {
408
404
  case 'silent':
409
405
  options.silent = silent = true;
410
406
  break;
411
-
407
+
412
408
  case 'quiet':
413
409
  options.quiet = quiet = true;
414
410
  break;
415
411
 
412
+ case 'quiet-deprecations':
413
+ options.quietDeprecations = true;
414
+ break;
415
+
416
416
  case 'l':
417
417
  case 'lint':
418
418
  options.lint = true;
@@ -458,6 +458,7 @@ function processPluginQueue() {
458
458
 
459
459
  case 'js':
460
460
  options.javascriptEnabled = true;
461
+ pendingDeprecations.push('Warning: Inline JavaScript (--js) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead. (js-eval)');
461
462
  break;
462
463
 
463
464
  case 'no-js':
@@ -481,6 +482,7 @@ function processPluginQueue() {
481
482
  case 'line-numbers':
482
483
  if (checkArgFunc(arg, match[2])) {
483
484
  options.dumpLineNumbers = match[2];
485
+ pendingDeprecations.push('Warning: The --line-numbers option is deprecated and will be removed in Less 5.x. Use source maps instead (--source-map). (dump-line-numbers)');
484
486
  }
485
487
 
486
488
  break;
@@ -537,13 +539,13 @@ function processPluginQueue() {
537
539
  }
538
540
 
539
541
  break;
540
-
542
+
541
543
  case 'ie-compat':
542
- console.warn('The --ie-compat option is deprecated, as it has no effect on compilation.');
544
+ pendingDeprecations.push('Warning: The --ie-compat option is deprecated, as it has no effect on compilation.');
543
545
  break;
544
546
 
545
547
  case 'relative-urls':
546
- console.warn('The --relative-urls option has been deprecated. Use --rewrite-urls=all.');
548
+ pendingDeprecations.push('Warning: The --relative-urls option has been deprecated. Use --rewrite-urls=all.');
547
549
  options.rewriteUrls = Constants.RewriteUrls.ALL;
548
550
  break;
549
551
 
@@ -571,7 +573,7 @@ function processPluginQueue() {
571
573
 
572
574
  case 'sm':
573
575
  case 'strict-math':
574
- console.warn('The --strict-math option has been deprecated. Use --math=strict.');
576
+ pendingDeprecations.push('Warning: The --strict-math option has been deprecated. Use --math=strict.');
575
577
 
576
578
  if (checkArgFunc(arg, match[2])) {
577
579
  if (checkBooleanArg(match[2])) {
@@ -586,14 +588,14 @@ function processPluginQueue() {
586
588
  let m = match[2];
587
589
  if (checkArgFunc(arg, m)) {
588
590
  if (m === 'always') {
589
- console.warn('--math=always is deprecated and will be removed in the future.');
591
+ pendingDeprecations.push('Warning: --math=always is deprecated and will be removed in Less 5.x. Use --math=parens-division (default) or --math=parens. (math-always)');
590
592
  options.math = Constants.Math.ALWAYS;
591
593
  } else if (m === 'parens-division') {
592
594
  options.math = Constants.Math.PARENS_DIVISION;
593
595
  } else if (m === 'parens' || m === 'strict') {
594
596
  options.math = Constants.Math.PARENS;
595
597
  } else if (m === 'strict-legacy') {
596
- console.warn('--math=strict-legacy has been removed. Defaulting to --math=strict');
598
+ pendingDeprecations.push('Warning: --math=strict-legacy has been removed. Defaulting to --math=strict.');
597
599
  options.math = Constants.Math.PARENS;
598
600
  }
599
601
  }
@@ -650,7 +652,7 @@ function processPluginQueue() {
650
652
  case 'disable-plugin-rule':
651
653
  options.disablePluginRule = true;
652
654
  break;
653
-
655
+
654
656
  default:
655
657
  queuePlugins.push({
656
658
  name: arg,
@@ -661,9 +663,16 @@ function processPluginQueue() {
661
663
  }
662
664
  });
663
665
 
666
+ // Flush queued deprecation warnings (respects --silent, --quiet, --quiet-deprecations)
667
+ if (!silent && !quiet && !options.quietDeprecations) {
668
+ pendingDeprecations.forEach(function (msg) {
669
+ console.warn(msg);
670
+ });
671
+ }
672
+
664
673
  if (queuePlugins.length > 0) {
665
674
  processPluginQueue();
666
675
  } else {
667
676
  render();
668
677
  }
669
- })();
678
+ })();