UNPKG

2.48 kBJavaScriptView Raw
1'use strict';
2
3const blockString = require('../../utils/blockString');
4const report = require('../../utils/report');
5const ruleMessages = require('../../utils/ruleMessages');
6const validateOptions = require('../../utils/validateOptions');
7const whitespaceChecker = require('../../utils/whitespaceChecker');
8
9const ruleName = 'declaration-block-semicolon-space-before';
10
11const messages = ruleMessages(ruleName, {
12 expectedBefore: () => 'Expected single space before ";"',
13 rejectedBefore: () => 'Unexpected whitespace before ";"',
14 expectedBeforeSingleLine: () =>
15 'Expected single space before ";" in a single-line declaration block',
16 rejectedBeforeSingleLine: () =>
17 'Unexpected whitespace before ";" in a single-line declaration block',
18});
19
20const rule = function(expectation, options, context) {
21 const checker = whitespaceChecker('space', expectation, messages);
22
23 return (root, result) => {
24 const validOptions = validateOptions(result, ruleName, {
25 actual: expectation,
26 possible: ['always', 'never', 'always-single-line', 'never-single-line'],
27 });
28
29 if (!validOptions) {
30 return;
31 }
32
33 root.walkDecls((decl) => {
34 // Ignore last declaration if there's no trailing semicolon
35 const parentRule = decl.parent;
36
37 if (!parentRule.raws.semicolon && parentRule.last === decl) {
38 return;
39 }
40
41 const declString = decl.toString();
42
43 checker.before({
44 source: declString,
45 index: declString.length,
46 lineCheckStr: blockString(parentRule),
47 err: (m) => {
48 if (context.fix) {
49 const value = decl.raws.value ? decl.raws.value.raw : decl.value;
50
51 if (expectation.indexOf('always') === 0) {
52 if (decl.important) {
53 decl.raws.important = ' !important ';
54 } else if (decl.raws.value) {
55 decl.raws.value.raw = value.replace(/\s*$/, ' ');
56 } else {
57 decl.value = value.replace(/\s*$/, ' ');
58 }
59
60 return;
61 } else if (expectation.indexOf('never') === 0) {
62 if (decl.important) {
63 decl.raws.important = decl.raws.important.replace(/\s*$/, '');
64 } else if (decl.raws.value) {
65 decl.raws.value.raw = value.replace(/\s*$/, '');
66 } else {
67 decl.value = value.replace(/\s*$/, '');
68 }
69
70 return;
71 }
72 }
73
74 report({
75 message: m,
76 node: decl,
77 index: decl.toString().length - 1,
78 result,
79 ruleName,
80 });
81 },
82 });
83 });
84 };
85};
86
87rule.ruleName = ruleName;
88rule.messages = messages;
89module.exports = rule;