UNPKG

1.97 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const ruleMessages = require('../../utils/ruleMessages');
7const selectorAttributeOperatorSpaceChecker = require('../selectorAttributeOperatorSpaceChecker');
8const validateOptions = require('../../utils/validateOptions');
9const whitespaceChecker = require('../../utils/whitespaceChecker');
10
11const ruleName = 'selector-attribute-operator-space-before';
12
13const messages = ruleMessages(ruleName, {
14 expectedBefore: (operator) => `Expected single space before "${operator}"`,
15 rejectedBefore: (operator) => `Unexpected whitespace before "${operator}"`,
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 selectorAttributeOperatorSpaceChecker({
32 root,
33 result,
34 locationChecker: checker.before,
35 checkedRuleName: ruleName,
36 checkBeforeOperator: true,
37 fix: context.fix
38 ? (attributeNode) => {
39 const rawAttrAfter = _.get(attributeNode, 'raws.spaces.attribute.after');
40 const { attrAfter, setAttrAfter } = rawAttrAfter
41 ? {
42 attrAfter: rawAttrAfter,
43 setAttrAfter(fixed) {
44 attributeNode.raws.spaces.attribute.after = fixed;
45 },
46 }
47 : {
48 attrAfter: _.get(attributeNode, 'spaces.attribute.after', ''),
49 setAttrAfter(fixed) {
50 _.set(attributeNode, 'spaces.attribute.after', fixed);
51 },
52 };
53
54 if (expectation === 'always') {
55 setAttrAfter(attrAfter.replace(/\s*$/, ' '));
56
57 return true;
58 }
59
60 if (expectation === 'never') {
61 setAttrAfter(attrAfter.replace(/\s*$/, ''));
62
63 return true;
64 }
65 }
66 : null,
67 });
68 };
69}
70
71rule.ruleName = ruleName;
72rule.messages = messages;
73module.exports = rule;