less 3.6.0 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/Gruntfile.js +43 -6
  3. package/bin/lessc +32 -3
  4. package/dist/less.js +2810 -326
  5. package/dist/less.min.js +7 -7
  6. package/lib/less/constants.js +13 -0
  7. package/lib/less/contexts.js +45 -10
  8. package/lib/less/default-options.js +12 -4
  9. package/lib/less/functions/color.js +84 -41
  10. package/lib/less/functions/data-uri.js +1 -1
  11. package/lib/less/functions/index.js +1 -0
  12. package/lib/less/functions/list.js +101 -0
  13. package/lib/less/functions/types.js +1 -19
  14. package/lib/less/import-manager.js +3 -3
  15. package/lib/less/index.js +1 -1
  16. package/lib/less/parse.js +3 -3
  17. package/lib/less/parser/parser.js +31 -13
  18. package/lib/less/render.js +2 -2
  19. package/lib/less/source-map-output.js +2 -2
  20. package/lib/less/tree/color.js +58 -18
  21. package/lib/less/tree/declaration.js +11 -7
  22. package/lib/less/tree/expression.js +7 -3
  23. package/lib/less/tree/import.js +9 -8
  24. package/lib/less/tree/mixin-definition.js +1 -1
  25. package/lib/less/tree/operation.js +10 -4
  26. package/lib/less/tree/url.js +12 -8
  27. package/lib/less/utils.js +54 -19
  28. package/lib/less-browser/add-default-options.js +3 -3
  29. package/lib/less-browser/index.js +9 -2
  30. package/lib/less-node/image-size.js +1 -1
  31. package/lib/less-node/lessc-helper.js +12 -4
  32. package/package.json +5 -2
  33. package/test/browser/css/rewrite-urls/urls.css +36 -0
  34. package/test/browser/css/rootpath-rewrite-urls/urls.css +35 -0
  35. package/test/browser/less/rewrite-urls/urls.less +34 -0
  36. package/test/browser/less/rootpath-rewrite-urls/urls.less +33 -0
  37. package/test/browser/less.js +2810 -326
  38. package/test/browser/runner-browser-options.js +1 -1
  39. package/test/browser/runner-errors-options.js +1 -1
  40. package/test/browser/runner-legacy-options.js +1 -1
  41. package/test/browser/runner-rewrite-urls-options.js +3 -0
  42. package/test/browser/runner-rewrite-urls-spec.js +3 -0
  43. package/test/browser/runner-rootpath-relative-spec.js +1 -1
  44. package/test/browser/runner-rootpath-rewrite-urls-options.js +4 -0
  45. package/test/browser/runner-rootpath-rewrite-urls-spec.js +3 -0
  46. package/test/css/calc.css +2 -2
  47. package/test/css/colors.css +20 -3
  48. package/test/css/css-3.css +0 -8
  49. package/test/css/css-escapes.css +3 -0
  50. package/test/css/functions-each.css +48 -0
  51. package/test/css/functions.css +6 -4
  52. package/test/css/math/parens-division/media-math.css +10 -0
  53. package/test/css/math/parens-division/mixins-args.css +169 -0
  54. package/test/css/math/parens-division/new-division.css +16 -0
  55. package/test/css/math/parens-division/parens.css +37 -0
  56. package/test/css/math/strict/css.css +95 -0
  57. package/test/css/math/strict/media-math.css +10 -0
  58. package/test/css/math/strict/mixins-args.css +169 -0
  59. package/test/css/math/strict/parens.css +37 -0
  60. package/test/css/{strict-math → math/strict-legacy}/css.css +0 -0
  61. package/test/css/math/strict-legacy/media-math.css +10 -0
  62. package/test/css/{strict-math → math/strict-legacy}/mixins-args.css +0 -0
  63. package/test/css/{strict-math → math/strict-legacy}/parens.css +5 -1
  64. package/test/css/no-strict-math/no-sm-operations.css +3 -0
  65. package/test/css/rewrite-urls-all/rewrite-urls-all.css +17 -0
  66. package/test/css/rewrite-urls-local/rewrite-urls-local.css +17 -0
  67. package/test/css/rootpath-rewrite-urls-all/rootpath-rewrite-urls-all.css +17 -0
  68. package/test/css/rootpath-rewrite-urls-local/rootpath-rewrite-urls-local.css +17 -0
  69. package/test/css/static-urls/urls.css +2 -2
  70. package/test/css/urls.css +2 -2
  71. package/test/index.js +28 -15
  72. package/test/less/colors.less +18 -0
  73. package/test/less/css-3.less +0 -9
  74. package/test/less/css-escapes.less +4 -0
  75. package/test/less/errors/color-func-invalid-color.txt +1 -1
  76. package/test/less/errors/mixin-not-defined-2.less +7 -0
  77. package/test/less/errors/mixin-not-defined-2.txt +4 -0
  78. package/test/less/functions-each.less +81 -0
  79. package/test/less/functions.less +14 -2
  80. package/test/less/math/parens-division/media-math.less +9 -0
  81. package/test/less/math/parens-division/mixins-args.less +264 -0
  82. package/test/less/math/parens-division/new-division.less +17 -0
  83. package/test/less/{strict-math → math/parens-division}/parens.less +2 -1
  84. package/test/less/math/strict/css.less +108 -0
  85. package/test/less/math/strict/media-math.less +9 -0
  86. package/test/less/math/strict/mixins-args.less +264 -0
  87. package/test/less/math/strict/parens.less +46 -0
  88. package/test/less/{strict-math → math/strict-legacy}/css.less +0 -0
  89. package/test/less/math/strict-legacy/media-math.less +9 -0
  90. package/test/less/{strict-math → math/strict-legacy}/mixins-args.less +0 -0
  91. package/test/less/math/strict-legacy/parens.less +50 -0
  92. package/test/less/no-strict-math/no-sm-operations.less +3 -0
  93. package/test/less/rewrite-urls-all/folder/file.less +8 -0
  94. package/test/less/rewrite-urls-all/rewrite-urls-all.less +11 -0
  95. package/test/less/rewrite-urls-local/folder/file.less +8 -0
  96. package/test/less/rewrite-urls-local/rewrite-urls-local.less +11 -0
  97. package/test/less/rootpath-rewrite-urls-all/folder/file.less +8 -0
  98. package/test/less/rootpath-rewrite-urls-all/rootpath-rewrite-urls-all.less +11 -0
  99. package/test/less/rootpath-rewrite-urls-local/folder/file.less +8 -0
  100. package/test/less/rootpath-rewrite-urls-local/rootpath-rewrite-urls-local.less +11 -0
  101. package/test/less/sourcemaps/custom-props.less +8 -0
  102. package/test/less-bom/colors.less +18 -0
  103. package/test/less-bom/css-3.less +0 -9
  104. package/test/less-bom/css-escapes.less +4 -0
  105. package/test/less-bom/errors/color-func-invalid-color.txt +1 -1
  106. package/test/less-bom/errors/mixin-not-defined-2.less +7 -0
  107. package/test/less-bom/errors/mixin-not-defined-2.txt +4 -0
  108. package/test/less-bom/functions-each.less +81 -0
  109. package/test/less-bom/functions.less +14 -2
  110. package/test/less-bom/math/parens-division/media-math.less +9 -0
  111. package/test/less-bom/math/parens-division/mixins-args.less +264 -0
  112. package/test/less-bom/math/parens-division/new-division.less +17 -0
  113. package/test/less-bom/{strict-math → math/parens-division}/parens.less +2 -1
  114. package/test/less-bom/math/strict/css.less +108 -0
  115. package/test/less-bom/math/strict/media-math.less +9 -0
  116. package/test/less-bom/math/strict/mixins-args.less +264 -0
  117. package/test/less-bom/math/strict/parens.less +46 -0
  118. package/test/less-bom/{strict-math → math/strict-legacy}/css.less +0 -0
  119. package/test/less-bom/math/strict-legacy/media-math.less +9 -0
  120. package/test/less-bom/{strict-math → math/strict-legacy}/mixins-args.less +0 -0
  121. package/test/less-bom/math/strict-legacy/parens.less +50 -0
  122. package/test/less-bom/no-strict-math/no-sm-operations.less +3 -0
  123. package/test/less-bom/rewrite-urls-all/folder/file.less +8 -0
  124. package/test/less-bom/rewrite-urls-all/rewrite-urls-all.less +11 -0
  125. package/test/less-bom/rewrite-urls-local/folder/file.less +8 -0
  126. package/test/less-bom/rewrite-urls-local/rewrite-urls-local.less +11 -0
  127. package/test/less-bom/rootpath-rewrite-urls-all/folder/file.less +8 -0
  128. package/test/less-bom/rootpath-rewrite-urls-all/rootpath-rewrite-urls-all.less +11 -0
  129. package/test/less-bom/rootpath-rewrite-urls-local/folder/file.less +8 -0
  130. package/test/less-bom/rootpath-rewrite-urls-local/rootpath-rewrite-urls-local.less +11 -0
  131. package/test/less-bom/sourcemaps/custom-props.less +8 -0
  132. package/test/less-test.js +26 -12
  133. package/test/sourcemaps/custom-props.json +1 -0
  134. package/.npmignore +0 -8
  135. package/test/less/errors/color-invalid-hex-code.less +0 -4
  136. package/test/less/errors/color-invalid-hex-code.txt +0 -4
  137. package/test/less/errors/color-invalid-hex-code2.less +0 -4
  138. package/test/less/errors/color-invalid-hex-code2.txt +0 -4
  139. package/test/less-bom/errors/color-invalid-hex-code.less +0 -4
  140. package/test/less-bom/errors/color-invalid-hex-code.txt +0 -4
  141. package/test/less-bom/errors/color-invalid-hex-code2.less +0 -4
  142. package/test/less-bom/errors/color-invalid-hex-code2.txt +0 -4
@@ -0,0 +1,108 @@
1
+ @charset "utf-8";
2
+ div { color: black; }
3
+ div { width: 99%; }
4
+
5
+ * {
6
+ min-width: 45em;
7
+ }
8
+
9
+ h1, h2 > a > p, h3 {
10
+ color: none;
11
+ }
12
+
13
+ div.class {
14
+ color: blue;
15
+ }
16
+
17
+ div#id {
18
+ color: green;
19
+ }
20
+
21
+ .class#id {
22
+ color: purple;
23
+ }
24
+
25
+ .one.two.three {
26
+ color: grey;
27
+ }
28
+
29
+ @media print {
30
+ * {
31
+ font-size: 3em;
32
+ }
33
+ }
34
+
35
+ @media screen {
36
+ * {
37
+ font-size: 10px;
38
+ }
39
+ }
40
+
41
+ @font-face {
42
+ font-family: 'Garamond Pro';
43
+ }
44
+
45
+ a:hover, a:link {
46
+ color: #999;
47
+ }
48
+
49
+ p, p:first-child {
50
+ text-transform: none;
51
+ }
52
+
53
+ q:lang(no) {
54
+ quotes: none;
55
+ }
56
+
57
+ p + h1 {
58
+ font-size: +2.2em;
59
+ }
60
+
61
+ #shorthands {
62
+ border: 1px solid #000;
63
+ font: 12px/16px Arial;
64
+ font: 100%/16px Arial;
65
+ margin: 1px 0;
66
+ padding: 0 auto;
67
+ }
68
+
69
+ #more-shorthands {
70
+ margin: 0;
71
+ padding: 1px 0 2px 0;
72
+ font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;
73
+ font: 0/0 a;
74
+ border-radius: 5px / 10px;
75
+ }
76
+
77
+ .misc {
78
+ -moz-border-radius: 2px;
79
+ display: -moz-inline-stack;
80
+ width: .1em;
81
+ background-color: #009998;
82
+ background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));
83
+ margin: ;
84
+ .nested-multiple {
85
+ multiple-semi-colons: yes;;;;;;
86
+ };
87
+ filter: alpha(opacity=100);
88
+ width: auto\9;
89
+ }
90
+
91
+ #important {
92
+ color: red !important;
93
+ width: 100%!important;
94
+ height: 20px ! important;
95
+ }
96
+
97
+ .def-font(@name) {
98
+ @font-face {
99
+ font-family: @name
100
+ }
101
+ }
102
+
103
+ .def-font(font-a);
104
+ .def-font(font-b);
105
+
106
+ .æøå {
107
+ margin: 0;
108
+ }
@@ -0,0 +1,9 @@
1
+ @var: 16;
2
+
3
+ @media (min-width: @var + 1) {
4
+ .foo { bar: 1; }
5
+ }
6
+
7
+ @media (min-width: @var / 9) {
8
+ .foo { bar: 1; }
9
+ }
@@ -0,0 +1,264 @@
1
+ .mixin (@a: 1px, @b: 50%) {
2
+ width: (@a * 5);
3
+ height: (@b - 1%);
4
+ depth: @b - 1%;
5
+ }
6
+
7
+ .mixina (@style, @width, @color: black) {
8
+ border: @width @style @color;
9
+ }
10
+
11
+ .mixiny
12
+ (@a: 0, @b: 0) {
13
+ margin: @a;
14
+ padding: @b;
15
+ }
16
+
17
+ .hidden() {
18
+ color: transparent; // asd
19
+ }
20
+
21
+ #hidden {
22
+ .hidden;
23
+ }
24
+
25
+ #hidden1 {
26
+ .hidden();
27
+ }
28
+
29
+ .two-args {
30
+ color: blue;
31
+ .mixin(2px, 100%);
32
+ .mixina(dotted, 2px);
33
+ }
34
+
35
+ .one-arg {
36
+ .mixin(3px);
37
+ }
38
+
39
+ .no-parens {
40
+ .mixin;
41
+ }
42
+
43
+ .no-args {
44
+ .mixin();
45
+ }
46
+
47
+ .var-args {
48
+ @var: 9;
49
+ .mixin(@var, (@var * 2) / 2);
50
+ }
51
+
52
+ .multi-mix {
53
+ .mixin(2px, 30%);
54
+ .mixiny(4, 5);
55
+ }
56
+
57
+ .maxa(@arg1: 10, @arg2: #f00) {
58
+ padding: (@arg1 * 2px);
59
+ color: @arg2;
60
+ }
61
+
62
+ body {
63
+ .maxa(15);
64
+ }
65
+
66
+ @glob: 5;
67
+ .global-mixin(@a:2) {
68
+ width: (@glob + @a);
69
+ }
70
+
71
+ .scope-mix {
72
+ .global-mixin(3);
73
+ }
74
+
75
+ .nested-ruleset (@width: 200px) {
76
+ width: @width;
77
+ .column { margin: @width; }
78
+ }
79
+ .content {
80
+ .nested-ruleset(600px);
81
+ }
82
+
83
+ //
84
+
85
+ .same-var-name2(@radius) {
86
+ radius: @radius;
87
+ }
88
+ .same-var-name(@radius) {
89
+ .same-var-name2(@radius);
90
+ }
91
+ #same-var-name {
92
+ .same-var-name(5px);
93
+ }
94
+
95
+ //
96
+
97
+ .var-inside () {
98
+ @var: 10px;
99
+ width: @var;
100
+ }
101
+ #var-inside { .var-inside; }
102
+
103
+ .mixin-arguments (@width: 0px, ...) {
104
+ border: @arguments;
105
+ width: @width;
106
+ }
107
+
108
+ .arguments {
109
+ .mixin-arguments(1px, solid, black);
110
+ }
111
+ .arguments2 {
112
+ .mixin-arguments();
113
+ }
114
+ .arguments3 {
115
+ .mixin-arguments;
116
+ }
117
+
118
+ .mixin-arguments2 (@width, @rest...) {
119
+ border: @arguments;
120
+ rest: @rest;
121
+ width: @width;
122
+ }
123
+ .arguments4 {
124
+ .mixin-arguments2(0, 1, 2, 3, 4);
125
+ }
126
+
127
+ // Edge cases
128
+
129
+ .edge-case {
130
+ .mixin-arguments("{");
131
+ }
132
+
133
+ // Division vs. Literal Slash
134
+ .border-radius(@r: 2px/5px) {
135
+ border-radius: @r;
136
+ }
137
+ .slash-vs-math {
138
+ .border-radius();
139
+ .border-radius(5px/10px);
140
+ .border-radius((3px * 2));
141
+ }
142
+ // semi-colon vs comma for delimiting
143
+
144
+ .mixin-takes-one(@a) {
145
+ one: @a;
146
+ }
147
+
148
+ .mixin-takes-two(@a; @b) {
149
+ one: @a;
150
+ two: @b;
151
+ }
152
+
153
+ .comma-vs-semi-colon {
154
+ .mixin-takes-two(@a : a; @b : b, c);
155
+ .mixin-takes-two(@a : d, e; @b : f);
156
+ .mixin-takes-one(@a: g);
157
+ .mixin-takes-one(@a : h;);
158
+ .mixin-takes-one(i);
159
+ .mixin-takes-one(j;);
160
+ .mixin-takes-two(k, l);
161
+ .mixin-takes-one(m, n;);
162
+ .mixin-takes-two(o, p; q);
163
+ .mixin-takes-two(r, s; t;);
164
+ }
165
+
166
+ .mixin-conflict(@a:defA, @b:defB, @c:defC) {
167
+ three: @a, @b, @c;
168
+ }
169
+
170
+ .mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) {
171
+ four: @a, @b, @c, @d;
172
+ }
173
+
174
+ #named-conflict {
175
+ .mixin-conflict(11, 12, 13, @a:a);
176
+ .mixin-conflict(@a:a, 21, 22, 23);
177
+ }
178
+ @a: 3px;
179
+ .mixin-default-arg(@a: 1px, @b: @a, @c: @b) {
180
+ defaults: 1px 1px 1px;
181
+ defaults: 2px 2px 2px;
182
+ }
183
+
184
+ .test-mixin-default-arg {
185
+ .mixin-default-arg();
186
+ .mixin-default-arg(2px);
187
+ }
188
+
189
+ .mixin-comma-default1(@color; @padding; @margin: 2, 2, 2, 2) {
190
+ margin: @margin;
191
+ }
192
+ .selector {
193
+ .mixin-comma-default1(#33acfe; 4);
194
+ }
195
+ .mixin-comma-default2(@margin: 2, 2, 2, 2;) {
196
+ margin: @margin;
197
+ }
198
+ .selector2 {
199
+ .mixin-comma-default2();
200
+ }
201
+ .mixin-comma-default3(@margin: 2, 2, 2, 2) {
202
+ margin: @margin;
203
+ }
204
+ .selector3 {
205
+ .mixin-comma-default3(4,2,2,2);
206
+ }
207
+
208
+ .test-calling-one-arg-mixin(@a) {
209
+ }
210
+
211
+ .test-calling-one-arg-mixin(@a, @b, @rest...) {
212
+ }
213
+
214
+ div {
215
+ .test-calling-one-arg-mixin(1);
216
+ }
217
+
218
+ mixins-args-expand-op- {
219
+ @x: 1, 2, 3;
220
+ @y: 4 5 6;
221
+
222
+ &1 {.m3(@x...)}
223
+ &2 {.m3(@y...)}
224
+ &3 {.wr(a, b, c)}
225
+ &4 {.wr(a; b; c, d)}
226
+ &5 {.wr(@x...)}
227
+ &6 {.m4(0; @x...)}
228
+ &7 {.m4(@x..., @a: 0)}
229
+ &8 {.m4(@b: 1.5; @x...)}
230
+ &9 {.aa(@y, @x..., and again, @y...)}
231
+
232
+ .m3(@a, @b, @c) {
233
+ m3: @a, @b, @c;
234
+ }
235
+
236
+ .m4(@a, @b, @c, @d) {
237
+ m4: @a, @b, @c, @d;
238
+ }
239
+
240
+ .wr(@a...) {
241
+ &a {.m3(@a...)}
242
+ &b {.m4(0, @a...)}
243
+ &c {.m4(@a..., 4)}
244
+ }
245
+
246
+ .aa(@a...) {
247
+ aa: @a;
248
+ a4: extract(@a, 5);
249
+ a8: extract(@a, 8);
250
+ }
251
+ }
252
+ #test-mixin-matching-when-default-2645 {
253
+ .mixin(@height) {
254
+ height: @height;
255
+ }
256
+
257
+ .mixin(@width, @height: 10px) {
258
+ width: @width;
259
+
260
+ .mixin(@height: @height);
261
+ }
262
+
263
+ .mixin(@height: 20px);
264
+ }
@@ -0,0 +1,46 @@
1
+ .parens {
2
+ @var: 1px;
3
+ border: (@var * 2) solid black;
4
+ margin: (@var * 1) (@var + 2) (4 * 4) 3;
5
+ width: (6 * 6);
6
+ padding: 2px (6 * 6px);
7
+ }
8
+
9
+ .more-parens {
10
+ @var: (2 * 2);
11
+ padding: (2 * @var) 4 4 (@var * 1px);
12
+ width-all: ((@var * @var) * 6);
13
+ width-first: ((@var * @var)) * 6;
14
+ width-keep: (@var * @var) * 6;
15
+ height: calc(100% + (25vh - 20px));
16
+ height-keep: (7 * 7) + (8 * 8);
17
+ height-all: ((7 * 7) + (8 * 8));
18
+ height-parts: ((7 * 7)) + ((8 * 8));
19
+ margin-keep: (4 * (5 + 5) / 2) - (@var * 2);
20
+ margin-parts: ((4 * (5 + 5) / 2)) - ((@var * 2));
21
+ margin-all: ((4 * (5 + 5) / 2) + (-(@var * 2)));
22
+ border-radius-keep: 4px * (1 + 1) / @var + 3px;
23
+ border-radius-parts: ((4px * (1 + 1))) / ((@var + 3px));
24
+ border-radius-all: (4px * (1 + 1) / @var + 3px);
25
+ // margin: (6 * 6)px;
26
+ }
27
+
28
+ .negative {
29
+ @var: 1;
30
+ neg-var: -@var; // -1 ?
31
+ neg-var-paren: -(@var); // -(1) ?
32
+ }
33
+
34
+ .nested-parens {
35
+ width: 2 * (4 * (2 + (1 + 6))) - 1;
36
+ height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1;
37
+ }
38
+
39
+ .mixed-units {
40
+ margin: 2px 4em 1 5pc;
41
+ padding: (2px + 4px) 1em 2px 2;
42
+ }
43
+
44
+ .test-false-negatives {
45
+ a: ~"(";
46
+ }
@@ -0,0 +1,9 @@
1
+ @var: 16;
2
+
3
+ @media (min-width: @var + 1) {
4
+ .foo { bar: 1; }
5
+ }
6
+
7
+ @media (min-width: @var / 9) {
8
+ .foo { bar: 1; }
9
+ }
@@ -0,0 +1,50 @@
1
+ .parens {
2
+ @var: 1px;
3
+ border: (@var * 2) solid black;
4
+ margin: (@var * 1) (@var + 2) (4 * 4) 3;
5
+ width: (6 * 6);
6
+ padding: 2px (6 * 6px);
7
+ }
8
+
9
+ .in-function {
10
+ value: min((1 + 1)) + 1;
11
+ }
12
+
13
+ .more-parens {
14
+ @var: (2 * 2);
15
+ padding: (2 * @var) 4 4 (@var * 1px);
16
+ width-all: ((@var * @var) * 6);
17
+ width-first: ((@var * @var)) * 6;
18
+ width-keep: (@var * @var) * 6;
19
+ height: calc(100% + (25vh - 20px));
20
+ height-keep: (7 * 7) + (8 * 8);
21
+ height-all: ((7 * 7) + (8 * 8));
22
+ height-parts: ((7 * 7)) + ((8 * 8));
23
+ margin-keep: (4 * (5 + 5) / 2) - (@var * 2);
24
+ margin-parts: ((4 * (5 + 5) / 2)) - ((@var * 2));
25
+ margin-all: ((4 * (5 + 5) / 2) + (-(@var * 2)));
26
+ border-radius-keep: 4px * (1 + 1) / @var + 3px;
27
+ border-radius-parts: ((4px * (1 + 1))) / ((@var + 3px));
28
+ border-radius-all: (4px * (1 + 1) / @var + 3px);
29
+ // margin: (6 * 6)px;
30
+ }
31
+
32
+ .negative {
33
+ @var: 1;
34
+ neg-var: -@var; // -1 ?
35
+ neg-var-paren: -(@var); // -(1) ?
36
+ }
37
+
38
+ .nested-parens {
39
+ width: 2 * (4 * (2 + (1 + 6))) - 1;
40
+ height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1;
41
+ }
42
+
43
+ .mixed-units {
44
+ margin: 2px 4em 1 5pc;
45
+ padding: (2px + 4px) 1em 2px 2;
46
+ }
47
+
48
+ .test-false-negatives {
49
+ a: ~"(";
50
+ }
@@ -11,3 +11,6 @@
11
11
  color: green-black;
12
12
  animation: blue-change 5s infinite;
13
13
  }
14
+ .division {
15
+ value: ((16px ./ 2) / 2) / 2;
16
+ }
@@ -0,0 +1,8 @@
1
+ #imported-file {
2
+ background-image: url("./relative/path");
3
+ background-image: url("../relative/path");
4
+ background-image: url("../../relative/path");
5
+ background-image: url("module");
6
+ background-image: url("module/path");
7
+ background-image: url("module/path/../relative/path");
8
+ }
@@ -0,0 +1,11 @@
1
+ @import "./folder/file.less";
2
+
3
+ #rewrite-urls-all {
4
+ background-image: url("./relative/path");
5
+ background-image: url("../relative/path");
6
+ background-image: url("./relative/../path");
7
+ background-image: url("./relative/../path/..");
8
+ background-image: url("module");
9
+ background-image: url("module/path");
10
+ background-image: url("module/path/../relative/path");
11
+ }
@@ -0,0 +1,8 @@
1
+ #imported-file {
2
+ background-image: url("./relative/path");
3
+ background-image: url("../relative/path");
4
+ background-image: url("../../relative/path");
5
+ background-image: url("module");
6
+ background-image: url("module/path");
7
+ background-image: url("module/path/../relative/path");
8
+ }
@@ -0,0 +1,11 @@
1
+ @import "./folder/file.less";
2
+
3
+ #rewrite-urls-local {
4
+ background-image: url("./relative/path");
5
+ background-image: url("../relative/path");
6
+ background-image: url("./relative/../path");
7
+ background-image: url("./relative/../path/..");
8
+ background-image: url("module");
9
+ background-image: url("module/path");
10
+ background-image: url("module/path/../relative/path");
11
+ }
@@ -0,0 +1,8 @@
1
+ #imported-file {
2
+ background-image: url("./relative/path");
3
+ background-image: url("../relative/path");
4
+ background-image: url("../../relative/path");
5
+ background-image: url("module");
6
+ background-image: url("module/path");
7
+ background-image: url("module/path/../relative/path");
8
+ }
@@ -0,0 +1,11 @@
1
+ @import "./folder/file.less";
2
+
3
+ #rootpath-rewrite-urls-all {
4
+ background-image: url("./relative/path");
5
+ background-image: url("../relative/path");
6
+ background-image: url("./relative/../path");
7
+ background-image: url("./relative/../path/..");
8
+ background-image: url("module");
9
+ background-image: url("module/path");
10
+ background-image: url("module/path/../relative/path");
11
+ }
@@ -0,0 +1,8 @@
1
+ #imported-file {
2
+ background-image: url("./relative/path");
3
+ background-image: url("../relative/path");
4
+ background-image: url("../../relative/path");
5
+ background-image: url("module");
6
+ background-image: url("module/path");
7
+ background-image: url("module/path/../relative/path");
8
+ }
@@ -0,0 +1,11 @@
1
+ @import "./folder/file.less";
2
+
3
+ #rootpath-rewrite-urls-local {
4
+ background-image: url("./relative/path");
5
+ background-image: url("../relative/path");
6
+ background-image: url("./relative/../path");
7
+ background-image: url("./relative/../path/..");
8
+ background-image: url("module");
9
+ background-image: url("module/path");
10
+ background-image: url("module/path/../relative/path");
11
+ }
@@ -0,0 +1,8 @@
1
+ @color: var(--foo);
2
+
3
+ body {
4
+ border-left: 1px solid @color;
5
+ width: calc(50% - 5px);
6
+ border-top: 1px solid @color;
7
+ }
8
+
package/test/less-test.js CHANGED
@@ -4,7 +4,8 @@ module.exports = function() {
4
4
  var path = require('path'),
5
5
  fs = require('fs'),
6
6
  copyBom = require('./copy-bom')(),
7
- doBomTest = false;
7
+ doBomTest = false,
8
+ clone = require('clone');
8
9
 
9
10
  var less = require('../lib/less-node');
10
11
  var stylize = require('../lib/less-node/lessc-helper').stylize;
@@ -82,6 +83,10 @@ module.exports = function() {
82
83
  });
83
84
 
84
85
  function testSourcemap(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {
86
+ if (err) {
87
+ fail('ERROR: ' + (err && err.message));
88
+ return;
89
+ }
85
90
  // Check the sourceMappingURL at the bottom of the file
86
91
  var expectedSourceMapURL = name + '.css.map',
87
92
  sourceMappingPrefix = '/*# sourceMappingURL=',
@@ -226,10 +231,10 @@ module.exports = function() {
226
231
  }
227
232
 
228
233
  function runTestSet(options, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {
229
- var options2 = options ? JSON.parse(JSON.stringify(options)) : {};
234
+ options = options ? clone(options) : {};
230
235
  runTestSetInternal(normalFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename);
231
236
  if (doBomTest) {
232
- runTestSetInternal(bomFolder, options2, foldername, verifyFunction, nameModifier, doReplacements, getFilename);
237
+ runTestSetInternal(bomFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename);
233
238
  }
234
239
  }
235
240
 
@@ -237,8 +242,10 @@ module.exports = function() {
237
242
  runTestSetInternal(normalFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename);
238
243
  }
239
244
 
240
- function runTestSetInternal(baseFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {
245
+ function runTestSetInternal(baseFolder, opts, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {
241
246
  foldername = foldername || '';
247
+
248
+ var originalOptions = opts || {};
242
249
 
243
250
  if (!doReplacements) {
244
251
  doReplacements = globalReplacements;
@@ -251,6 +258,8 @@ module.exports = function() {
251
258
  fs.readdirSync(path.join(baseFolder, foldername)).forEach(function (file) {
252
259
  if (!/\.less$/.test(file)) { return; }
253
260
 
261
+ var options = clone(originalOptions);
262
+
254
263
  var name = getBasename(file);
255
264
 
256
265
  if (oneTestOnly && name !== oneTestOnly) {
@@ -260,20 +269,24 @@ module.exports = function() {
260
269
  totalTests++;
261
270
 
262
271
  if (options.sourceMap && !options.sourceMap.sourceMapFileInline) {
263
- options.sourceMapOutputFilename = name + '.css';
264
- options.sourceMapBasepath = path.join(process.cwd(), baseFolder);
265
- options.sourceMapRootpath = 'testweb/';
266
- // TODO separate options?
267
- options.sourceMap = options;
268
-
272
+ options.sourceMap = {
273
+ sourceMapOutputFilename: name + '.css',
274
+ sourceMapBasepath: path.join(process.cwd(), baseFolder),
275
+ sourceMapRootpath: 'testweb/'
276
+ };
269
277
  // This options is normally set by the bin/lessc script. Setting it causes the sourceMappingURL comment to be appended to the CSS
270
278
  // output. The value is designed to allow the sourceMapBasepath option to be tested, as it should be removed by less before
271
279
  // setting the sourceMappingURL value, leaving just the sourceMapOutputFilename and .map extension.
272
- options.sourceMapFilename = options.sourceMapBasepath + '/' + options.sourceMapOutputFilename + '.map';
280
+ options.sourceMap.sourceMapFilename = options.sourceMap.sourceMapBasepath + '/' + options.sourceMap.sourceMapOutputFilename + '.map';
273
281
  }
274
282
 
275
283
  options.getVars = function(file) {
276
- return JSON.parse(fs.readFileSync(getFilename(getBasename(file), 'vars', baseFolder), 'utf8'));
284
+ try {
285
+ return JSON.parse(fs.readFileSync(getFilename(getBasename(file), 'vars', baseFolder), 'utf8'));
286
+ }
287
+ catch (e) {
288
+ return {};
289
+ }
277
290
  };
278
291
 
279
292
  var doubleCallCheck = false;
@@ -294,6 +307,7 @@ module.exports = function() {
294
307
  release();
295
308
  return verificationResult;
296
309
  }
310
+
297
311
  if (err) {
298
312
  fail('ERROR: ' + (err && err.message));
299
313
  if (isVerbose) {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["testweb/sourcemaps/custom-props.less"],"names":[],"mappings":"AAEA;EACC,uBAHO,UAGP;EACA,OAAO,eAAP;EACA,gCAAA","file":"sourcemaps/custom-props.css"}