UNPKG

sass-lint

Version:

Sass linter. Compatible but different from scss-lint

103 lines (86 loc) 2.26 kB
'use strict'; var helpers = require('../helpers'); var sortProperties = function (obj, order) { var keys = Object.keys(obj), unknown = [], sorted = {}, i; if (typeof order === 'string') { if (order === 'alphabetical') { keys = keys.sort(); } } else { keys = keys.sort(function (a, b) { if (order.indexOf(a) === -1) { if (unknown.indexOf(a) === -1) { unknown.push(a); } } if (order.indexOf(b) === -1) { if (unknown.indexOf(b) === -1) { unknown.push(b); } } if (order.indexOf(a) > order.indexOf(b)) { return 1; } if (order.indexOf(a) < order.indexOf(b)) { return -1; } return 0; }); } for (i = 0; i < unknown.length; i++) { if (keys.indexOf(unknown[i]) !== -1) { keys.splice(keys.indexOf(unknown[i]), 1); } } keys = keys.concat(unknown.sort()); for (i = 0; i < keys.length; i++) { sorted[keys[i]] = obj[keys[i]]; } return sorted; }; module.exports = { 'name': 'property-sort-order', 'defaults': { 'order': 'alphabetical' }, 'detect': function (ast, parser) { var result = []; ast.traverseByType('block', function (block) { var properties = {}, sorted, pKeys, sKeys; if (block) { block.forEach('declaration', function (dec) { var prop = dec.first('property'), name = prop.first('ident'); if (name) { properties[name.content] = prop; } }); sorted = sortProperties(properties, parser.options.order); pKeys = Object.keys(properties); sKeys = Object.keys(sorted); sKeys.every(function (e, i) { var pKey = pKeys[i], prop = properties[pKey]; if (e !== pKey) { result = helpers.addUnique(result, { 'ruleId': parser.rule.name, 'line': prop.start.line, 'column': prop.start.column, 'message': 'Expected `' + e + '`, found `' + pKey + '`', 'severity': parser.severity }); } return true; }); } }); return result; } };