index.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. 'use strict';
  2. const declarationColonSpaceChecker = require('../declarationColonSpaceChecker');
  3. const declarationValueIndex = require('../../utils/declarationValueIndex');
  4. const ruleMessages = require('../../utils/ruleMessages');
  5. const validateOptions = require('../../utils/validateOptions');
  6. const whitespaceChecker = require('../../utils/whitespaceChecker');
  7. const ruleName = 'declaration-colon-space-after';
  8. const messages = ruleMessages(ruleName, {
  9. expectedAfter: () => 'Expected single space after ":"',
  10. rejectedAfter: () => 'Unexpected whitespace after ":"',
  11. expectedAfterSingleLine: () => 'Expected single space after ":" with a single-line declaration',
  12. });
  13. const meta = {
  14. url: 'https://stylelint.io/user-guide/rules/declaration-colon-space-after',
  15. fixable: true,
  16. deprecated: true,
  17. };
  18. /** @type {import('stylelint').Rule} */
  19. const rule = (primary, _secondaryOptions, context) => {
  20. const checker = whitespaceChecker('space', primary, messages);
  21. return (root, result) => {
  22. const validOptions = validateOptions(result, ruleName, {
  23. actual: primary,
  24. possible: ['always', 'never', 'always-single-line'],
  25. });
  26. if (!validOptions) {
  27. return;
  28. }
  29. declarationColonSpaceChecker({
  30. root,
  31. result,
  32. locationChecker: checker.after,
  33. checkedRuleName: ruleName,
  34. fix: context.fix
  35. ? (decl, index) => {
  36. const colonIndex = index - declarationValueIndex(decl);
  37. const between = decl.raws.between;
  38. if (between == null) throw new Error('`between` must be present');
  39. if (primary.startsWith('always')) {
  40. decl.raws.between =
  41. between.slice(0, colonIndex) + between.slice(colonIndex).replace(/^:\s*/, ': ');
  42. return true;
  43. }
  44. if (primary === 'never') {
  45. decl.raws.between =
  46. between.slice(0, colonIndex) + between.slice(colonIndex).replace(/^:\s*/, ':');
  47. return true;
  48. }
  49. return false;
  50. }
  51. : null,
  52. });
  53. };
  54. };
  55. rule.ruleName = ruleName;
  56. rule.messages = messages;
  57. rule.meta = meta;
  58. module.exports = rule;