-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-stylelint.js
95 lines (71 loc) · 2.4 KB
/
test-stylelint.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* @file Ensures that the Stylelint configuration is valid.
*/
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { runProcess } from './helper/run-process.js';
process.exitCode = (await runTest() ? 0 : 1);
/**
* Run some tests against the Stylelint configuration, to ensure that everything works as expected.
*
* Beside that it ensures that stylelint options are valid by checking the `invalidOptionWarnings` property of the JSON response.
*
* @returns {Promise<boolean>} `true` if everything works as expected, `false` if an error occurred
*/
async function runTest () {
const temporaryPath = path.join(os.tmpdir(), 'linter-bundle-');
const folder = fs.mkdtempSync(temporaryPath);
const tempFilePath = path.join(folder, 'tmp.scss');
fs.writeFileSync(tempFilePath, `// Some test code
$box-shadow-color: #fff; // stylelint-disable-line color-no-hex -- The initial value must be a hex-color
$border-bottom: 10px;
$box-shadow-size: 2px;
@function custom-makelongshadow ($color, $size) {
$val: 5px 0 0 $size $color !default;
@for $i from 6 through 2 {
$val: #{$val}, ($i * 1px) 0 0 $size #{$color};
}
@return $val;
}
@property --color {
syntax: "<color>";
inherits: false;
initial-value: #f00; // stylelint-disable-line color-no-hex -- The initial value must be a hex-color
}
.test, { // stylelint-disable-line plugin/stylelint-selector-no-empty -- Ensure this throws an error which can be suppressed here.
grid-template-areas:
(
"a1"
"a2"
"a3"
);
border: 1px solid var(--color);
border-bottom: 1px dotted $border-bottom;
box-shadow: custom-makelongshadow($box-shadow-color, $box-shadow-size);
color: var(--color);
}
`, 'utf8');
const result = await runProcess(`stylelint -f json "${tempFilePath}"`);
fs.unlinkSync(tempFilePath);
try {
/**
* @type {import('stylelint').LintResult}
*/
const { invalidOptionWarnings, warnings } = JSON.parse(result.stderr)[0];
if (warnings.length > 0) {
process.stderr.write(`Warnings:\n\n- ${warnings.map(({ text, line }) => `[line ${line}] ${text}`).join('\n- ')}\n`);
return false;
}
if (invalidOptionWarnings.length > 0) {
process.stderr.write(`Invalid stylelint configuration:\n\n- ${invalidOptionWarnings.map(({ text }) => text).join('\n- ')}\n`);
return false;
}
}
catch {
process.stdout.write(result.stdout);
process.stderr.write(result.stderr);
return false;
}
return true;
}