"use strict"; const _ = require("lodash"); const declarationValueIndex = require("../../utils/declarationValueIndex"); const keywordSets = require("../../reference/keywordSets"); const postcss = require("postcss"); const report = require("../../utils/report"); const ruleMessages = require("../../utils/ruleMessages"); const validateOptions = require("../../utils/validateOptions"); const valueParser = require("postcss-value-parser"); const ruleName = "time-min-milliseconds"; const messages = ruleMessages(ruleName, { expected: time => `Expected a minimum of ${time} milliseconds` }); const rule = function(minimum) { return (root, result) => { const validOptions = validateOptions(result, ruleName, { actual: minimum, possible: _.isNumber }); if (!validOptions) { return; } root.walkDecls(decl => { const propertyName = postcss.vendor.unprefixed(decl.prop.toLowerCase()); if ( keywordSets.longhandTimeProperties.has(propertyName) && !isAcceptableTime(decl.value) ) { complain(decl); } if (keywordSets.shorthandTimeProperties.has(propertyName)) { const valueList = postcss.list.space(decl.value); for (const value of valueList) { if (!isAcceptableTime(value)) { complain(decl, decl.value.indexOf(value)); } } } }); function isAcceptableTime(time) { const parsedTime = valueParser.unit(time); if (!parsedTime) return true; if (parsedTime.number <= 0) { return true; } if ( parsedTime.unit.toLowerCase() === "ms" && parsedTime.number < minimum ) { return false; } if ( parsedTime.unit.toLowerCase() === "s" && parsedTime.number * 1000 < minimum ) { return false; } return true; } function complain(decl, offset) { offset = offset || 0; report({ result, ruleName, message: messages.expected(minimum), index: declarationValueIndex(decl) + offset, node: decl }); } }; }; rule.ruleName = ruleName; rule.messages = messages; module.exports = rule;