1 | "use strict";
|
2 |
|
3 | var resolve = require('resolve');
|
4 | var path = require('path');
|
5 |
|
6 | var testFolder = path.relative(process.cwd(), path.dirname(resolve.sync('@less/test-data')));
|
7 | var lessFolder = path.join(testFolder, 'less');
|
8 |
|
9 | module.exports = function(grunt) {
|
10 | grunt.option("stack", true);
|
11 |
|
12 |
|
13 | require("time-grunt")(grunt);
|
14 |
|
15 | var COMPRESS_FOR_TESTS = false;
|
16 | var git = require("git-rev");
|
17 |
|
18 |
|
19 | var browsers = [
|
20 |
|
21 | {
|
22 | browserName: "chrome",
|
23 | version: "latest",
|
24 | platform: "Windows 7"
|
25 | },
|
26 | {
|
27 | browserName: "firefox",
|
28 | version: "latest",
|
29 | platform: "Linux"
|
30 | },
|
31 | {
|
32 | browserName: "safari",
|
33 | version: "9",
|
34 | platform: "OS X 10.11"
|
35 | },
|
36 | {
|
37 | browserName: "internet explorer",
|
38 | version: "8",
|
39 | platform: "Windows XP"
|
40 | },
|
41 | {
|
42 | browserName: "internet explorer",
|
43 | version: "11",
|
44 | platform: "Windows 8.1"
|
45 | },
|
46 | {
|
47 | browserName: "edge",
|
48 | version: "13",
|
49 | platform: "Windows 10"
|
50 | },
|
51 |
|
52 | {
|
53 | browserName: "ipad",
|
54 | deviceName: "iPad Air Simulator",
|
55 | deviceOrientation: "portrait",
|
56 | version: "8.4",
|
57 | platform: "OS X 10.9"
|
58 | },
|
59 | {
|
60 | browserName: "iphone",
|
61 | deviceName: "iPhone 5 Simulator",
|
62 | deviceOrientation: "portrait",
|
63 | version: "9.3",
|
64 | platform: "OS X 10.11"
|
65 | },
|
66 | {
|
67 | browserName: "android",
|
68 | deviceName: "Google Nexus 7 HD Emulator",
|
69 | deviceOrientation: "portrait",
|
70 | version: "4.4",
|
71 | platform: "Linux"
|
72 | }
|
73 | ];
|
74 |
|
75 | var sauceJobs = {};
|
76 |
|
77 | var browserTests = [
|
78 | "filemanager-plugin",
|
79 | "visitor-plugin",
|
80 | "global-vars",
|
81 | "modify-vars",
|
82 | "production",
|
83 | "rootpath-relative",
|
84 | "rootpath-rewrite-urls",
|
85 | "rootpath",
|
86 | "relative-urls",
|
87 | "rewrite-urls",
|
88 | "browser",
|
89 | "no-js-errors",
|
90 | "legacy"
|
91 | ];
|
92 |
|
93 | function makeJob(testName) {
|
94 | sauceJobs[testName] = {
|
95 | options: {
|
96 | urls:
|
97 | testName === "all"
|
98 | ? browserTests.map(function(name) {
|
99 | return (
|
100 | "http://localhost:8081/tmp/browser/test-runner-" +
|
101 | name +
|
102 | ".html"
|
103 | );
|
104 | })
|
105 | : [
|
106 | "http://localhost:8081/tmp/browser/test-runner-" +
|
107 | testName +
|
108 | ".html"
|
109 | ],
|
110 | testname:
|
111 | testName === "all" ? "Unit Tests for Less.js" : testName,
|
112 | browsers: browsers,
|
113 | public: "public",
|
114 | recordVideo: false,
|
115 | videoUploadOnPass: false,
|
116 | recordScreenshots: process.env.TRAVIS_BRANCH !== "master",
|
117 | build:
|
118 | process.env.TRAVIS_BRANCH === "master"
|
119 | ? process.env.TRAVIS_JOB_ID
|
120 | : undefined,
|
121 | tags: [
|
122 | process.env.TRAVIS_BUILD_NUMBER,
|
123 | process.env.TRAVIS_PULL_REQUEST,
|
124 | process.env.TRAVIS_BRANCH
|
125 | ],
|
126 | statusCheckAttempts: -1,
|
127 | sauceConfig: {
|
128 | "idle-timeout": 100
|
129 | },
|
130 | throttled: 5,
|
131 | onTestComplete: function(result, callback) {
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 | var user = process.env.SAUCE_USERNAME;
|
146 | var pass = process.env.SAUCE_ACCESS_KEY;
|
147 |
|
148 | git.short(function(hash) {
|
149 | require("phin")(
|
150 | {
|
151 | method: "PUT",
|
152 | url: [
|
153 | "https://saucelabs.com/rest/v1",
|
154 | user,
|
155 | "jobs",
|
156 | result.job_id
|
157 | ].join("/"),
|
158 | auth: { user: user, pass: pass },
|
159 | data: {
|
160 | passed: result.passed,
|
161 | build: "build-" + hash
|
162 | }
|
163 | },
|
164 | function(error, response) {
|
165 | if (error) {
|
166 | console.log(error);
|
167 | callback(error);
|
168 | } else if (response.statusCode !== 200) {
|
169 | console.log(response);
|
170 | callback(
|
171 | new Error("Unexpected response status")
|
172 | );
|
173 | } else {
|
174 | callback(null, result.passed);
|
175 | }
|
176 | }
|
177 | );
|
178 | });
|
179 | }
|
180 | }
|
181 | };
|
182 | }
|
183 |
|
184 |
|
185 | ["all"].concat(browserTests).map(makeJob);
|
186 |
|
187 | var semver = require('semver');
|
188 | var path = require('path');
|
189 |
|
190 |
|
191 |
|
192 | const nodeVersion = semver.major(process.versions.node);
|
193 | const tsNodeRuntime = path.resolve(path.join('node_modules', '.bin', 'ts-node'));
|
194 | let scriptRuntime = 'node';
|
195 | if (nodeVersion < 8) {
|
196 | scriptRuntime = tsNodeRuntime;
|
197 | }
|
198 |
|
199 |
|
200 | grunt.initConfig({
|
201 | shell: {
|
202 | options: {
|
203 | stdout: true,
|
204 | failOnError: true,
|
205 | execOptions: {
|
206 | maxBuffer: Infinity
|
207 | }
|
208 | },
|
209 | build: {
|
210 | command: [
|
211 |
|
212 | scriptRuntime + " build/rollup.js --dist",
|
213 |
|
214 | "npm run copy:root",
|
215 |
|
216 | "npm run build"
|
217 | ].join(" && ")
|
218 | },
|
219 | testbuild: {
|
220 | command: [
|
221 | "npm run build",
|
222 | scriptRuntime + " build/rollup.js --browser --out=./tmp/browser/less.min.js"
|
223 | ].join(" && ")
|
224 | },
|
225 | testcjs: {
|
226 | command: "npm run build"
|
227 | },
|
228 | testbrowser: {
|
229 | command: scriptRuntime + " build/rollup.js --browser --out=./tmp/browser/less.min.js"
|
230 | },
|
231 | test: {
|
232 | command: [
|
233 | tsNodeRuntime + " test/test-es6.ts",
|
234 | "node test/index.js"
|
235 | ].join(' && ')
|
236 | },
|
237 | generatebrowser: {
|
238 | command: 'node test/browser/generator/generate.js'
|
239 | },
|
240 | runbrowser: {
|
241 | command: 'node test/browser/generator/runner.js'
|
242 | },
|
243 | benchmark: {
|
244 | command: "node benchmark/index.js"
|
245 | },
|
246 | opts: {
|
247 |
|
248 | command: [
|
249 |
|
250 |
|
251 | `node bin/lessc --ie-compat ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
252 |
|
253 | `node bin/lessc --math=always ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
254 | `node bin/lessc --math=parens-division ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
255 | `node bin/lessc --math=parens ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
256 | `node bin/lessc --math=strict ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
257 | `node bin/lessc --math=strict-legacy ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
258 |
|
259 |
|
260 |
|
261 | `node bin/lessc --strict-math=on ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`
|
262 | ].join(" && ")
|
263 | },
|
264 | plugin: {
|
265 | command: [
|
266 | `node bin/lessc --clean-css="--s1 --advanced" ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`,
|
267 | "cd lib",
|
268 | `node ../bin/lessc --clean-css="--s1 --advanced" ../${lessFolder}/_main/lazy-eval.less ../tmp/lazy-eval.css`,
|
269 | "cd ..",
|
270 |
|
271 | `node bin/lessc --plugin=clean-css="--s1 --advanced" --plugin=autoprefix="ie 11,Edge >= 13,Chrome >= 47,Firefox >= 45,iOS >= 9.2,Safari >= 9" ${lessFolder}/_main/lazy-eval.less tmp/lazy-eval.css`
|
272 | ].join(" && ")
|
273 | },
|
274 | "sourcemap-test": {
|
275 |
|
276 | command: [
|
277 | `node bin/lessc --source-map=test/sourcemaps/maps/import-map.map ${lessFolder}/_main/import.less test/sourcemaps/import.css`,
|
278 | `node bin/lessc --source-map ${lessFolder}/sourcemaps/basic.less test/sourcemaps/basic.css`
|
279 | ].join(" && ")
|
280 | }
|
281 | },
|
282 |
|
283 | eslint: {
|
284 | target: [
|
285 | "test/**/*.js",
|
286 | "lib/less*/**/*.js",
|
287 | "!test/less/errors/plugin/plugin-error.js"
|
288 | ],
|
289 | options: {
|
290 | configFile: ".eslintrc.json",
|
291 | fix: true
|
292 | }
|
293 | },
|
294 |
|
295 | connect: {
|
296 | server: {
|
297 | options: {
|
298 | port: 8081
|
299 | }
|
300 | }
|
301 | },
|
302 |
|
303 | "saucelabs-mocha": sauceJobs,
|
304 |
|
305 |
|
306 | clean: {
|
307 | test: ["test/browser/less.js", "tmp", "test/less-bom"],
|
308 | "sourcemap-test": [
|
309 | "test/sourcemaps/*.css",
|
310 | "test/sourcemaps/*.map"
|
311 | ],
|
312 | sauce_log: ["sc_*.log"]
|
313 | }
|
314 | });
|
315 |
|
316 |
|
317 | grunt.loadNpmTasks("grunt-saucelabs");
|
318 |
|
319 | require("jit-grunt")(grunt);
|
320 |
|
321 |
|
322 | grunt.registerTask("default", ["test"]);
|
323 |
|
324 |
|
325 | grunt.registerTask("dist", [
|
326 | "shell:build"
|
327 | ]);
|
328 |
|
329 |
|
330 | grunt.registerTask("browsertest-lessjs", [
|
331 | "shell:testbrowser"
|
332 | ]);
|
333 |
|
334 |
|
335 | grunt.registerTask("browsertest", [
|
336 | "browsertest-lessjs",
|
337 | "connect",
|
338 | "shell:runbrowser"
|
339 | ]);
|
340 |
|
341 |
|
342 | grunt.registerTask("browsertest-server", [
|
343 | "browsertest-lessjs",
|
344 | "shell:generatebrowser",
|
345 | "connect::keepalive"
|
346 | ]);
|
347 |
|
348 | var previous_force_state = grunt.option("force");
|
349 |
|
350 | grunt.registerTask("force", function(set) {
|
351 | if (set === "on") {
|
352 | grunt.option("force", true);
|
353 | } else if (set === "off") {
|
354 | grunt.option("force", false);
|
355 | } else if (set === "restore") {
|
356 | grunt.option("force", previous_force_state);
|
357 | }
|
358 | });
|
359 |
|
360 | grunt.registerTask("sauce", [
|
361 | "browsertest-lessjs",
|
362 | "shell:generatebrowser",
|
363 | "connect",
|
364 | "sauce-after-setup"
|
365 | ]);
|
366 |
|
367 | grunt.registerTask("sauce-after-setup", [
|
368 | "saucelabs-mocha:all",
|
369 | "clean:sauce_log"
|
370 | ]);
|
371 |
|
372 | var testTasks = [
|
373 | "clean",
|
374 | "eslint",
|
375 | "shell:testbuild",
|
376 | "shell:test",
|
377 | "shell:opts",
|
378 | "shell:plugin",
|
379 | "connect",
|
380 | "shell:runbrowser"
|
381 | ];
|
382 |
|
383 | if (
|
384 | isNaN(Number(process.env.TRAVIS_PULL_REQUEST, 10)) &&
|
385 | (process.env.TRAVIS_BRANCH === "master")
|
386 | ) {
|
387 | testTasks.push("force:on");
|
388 | testTasks.push("sauce-after-setup");
|
389 | testTasks.push("force:off");
|
390 | }
|
391 |
|
392 |
|
393 | grunt.registerTask("test", testTasks);
|
394 |
|
395 |
|
396 | grunt.registerTask("shell-options", ["shell:opts"]);
|
397 |
|
398 |
|
399 | grunt.registerTask("shell-plugin", ["shell:plugin"]);
|
400 |
|
401 |
|
402 | grunt.registerTask("quicktest", [
|
403 | "shell:testcjs",
|
404 | "shell:test"
|
405 | ]);
|
406 |
|
407 |
|
408 | grunt.registerTask("sourcemap-test", [
|
409 | "clean:sourcemap-test",
|
410 | "shell:build:lessc",
|
411 | "shell:sourcemap-test",
|
412 | "connect::keepalive"
|
413 | ]);
|
414 |
|
415 |
|
416 | grunt.registerTask("benchmark", [
|
417 | "shell:testcjs",
|
418 | "shell:benchmark"
|
419 | ]);
|
420 | };
|