UNPKG

2.2 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const declarationBangSpaceChecker = require('../declarationBangSpaceChecker');
6const declarationValueIndex = require('../../utils/declarationValueIndex');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9const whitespaceChecker = require('../../utils/whitespaceChecker');
10
11const ruleName = 'declaration-bang-space-after';
12
13const messages = ruleMessages(ruleName, {
14 expectedAfter: () => 'Expected single space after "!"',
15 rejectedAfter: () => 'Unexpected whitespace after "!"',
16});
17
18function rule(expectation, options, context) {
19 const checker = whitespaceChecker('space', expectation, messages);
20
21 return (root, result) => {
22 const validOptions = validateOptions(result, ruleName, {
23 actual: expectation,
24 possible: ['always', 'never'],
25 });
26
27 if (!validOptions) {
28 return;
29 }
30
31 declarationBangSpaceChecker({
32 root,
33 result,
34 locationChecker: checker.after,
35 checkedRuleName: ruleName,
36 fix: context.fix
37 ? (decl, index) => {
38 let bangIndex = index - declarationValueIndex(decl);
39 const value = decl.raws.value ? decl.raws.value.raw : decl.value;
40 let target;
41 let setFixed;
42
43 if (bangIndex < value.length) {
44 target = value;
45 setFixed = (value) => {
46 if (decl.raws.value) {
47 decl.raws.value.raw = value;
48 } else {
49 decl.value = value;
50 }
51 };
52 } else if (decl.important) {
53 target = decl.raws.important || ' !important';
54 bangIndex -= value.length;
55 setFixed = (value) => {
56 decl.raws.important = value;
57 };
58 } else {
59 return false; // not standard
60 }
61
62 const targetBefore = target.slice(0, bangIndex + 1);
63 const targetAfter = target.slice(bangIndex + 1);
64
65 if (expectation === 'always') {
66 setFixed(targetBefore + targetAfter.replace(/^\s*/, ' '));
67
68 return true;
69 }
70
71 if (expectation === 'never') {
72 setFixed(targetBefore + targetAfter.replace(/^\s*/, ''));
73
74 return true;
75 }
76 }
77 : null,
78 });
79 };
80}
81
82rule.ruleName = ruleName;
83rule.messages = messages;
84module.exports = rule;