/* @flow */ "use strict"; const hasLessInterpolation = require("../utils/hasLessInterpolation"); const hasPsvInterpolation = require("../utils/hasPsvInterpolation"); const hasScssInterpolation = require("../utils/hasScssInterpolation"); const hasTplInterpolation = require("../utils/hasTplInterpolation"); /** * Check whether a URL is standard */ module.exports = function(url /*: string*/) /*: boolean*/ { if (url.length === 0) { return true; } // Sass interpolation works anywhere if ( hasScssInterpolation(url) || hasTplInterpolation(url) || hasPsvInterpolation(url) ) { return false; } // Inside `'` and `"` work only LESS interpolation if ( (url[0] === "'" && url[url.length - 1] === "'") || (url[0] === '"' && url[url.length - 1] === '"') ) { if (hasLessInterpolation(url)) { return false; } return true; } // Less variable works only at the beginning // Check is less variable, allow use '@url/some/path' // https://github.com/less/less.js/blob/3.x/lib/less/parser/parser.js#L547 if (url[0] === "@" && /^@@?[\w-]+$/.test(url)) { return false; } // In url without quotes scss variable can be everywhere // But in this case it is allowed to use only specific characters // Also forbidden "/" at the end of url if ( url.indexOf("$") !== -1 && /^[$\sA-Za-z0-9+-/*_'"/]+$/.test(url) && url[url.length - 1] !== "/" ) { return false; } return true; };