'use strict'; const fs = require('fs'); const processCopy = require('./copy'); const processRebase = require('./rebase'); const encodeFile = require('../lib/encode'); const getFile = require('../lib/get-file'); /** * @param {String} originUrl * @param {PostcssUrl~Dir} dir * @param {PostcssUrl~Option} options * * @returns {String|Undefined} */ function processFallback(originUrl, dir, options) { if (typeof options.fallback === 'function') { return options.fallback.apply(null, arguments); } switch (options.fallback) { case 'copy': return processCopy.apply(null, arguments); case 'rebase': return processRebase.apply(null, arguments); default: return; } } /** * Inline image in url() * * @type {PostcssUrl~UrlProcessor} * @param {PostcssUrl~Asset} asset * @param {PostcssUrl~Dir} dir * @param {PostcssUrl~Options} options * @param {PostcssUrl~Decl} decl * @param {Function} warn * @param {Result} result * @param {Function} addDependency * * @returns {String|Undefined} */ // eslint-disable-next-line complexity module.exports = function(asset, dir, options, decl, warn, result, addDependency) { const file = getFile(asset, options, dir, warn); if (!file) return; if (!file.mimeType) { warn(`Unable to find asset mime-type for ${file.path}`); return; } const maxSize = (options.maxSize || 0) * 1024; if (maxSize) { const stats = fs.statSync(file.path); if (stats.size >= maxSize) { return processFallback.apply(this, arguments); } } const isSvg = file.mimeType === 'image/svg+xml'; const defaultEncodeType = isSvg ? 'encodeURIComponent' : 'base64'; const encodeType = options.encodeType || defaultEncodeType; // Warn for svg with hashes/fragments if (isSvg && asset.hash && !options.ignoreFragmentWarning) { // eslint-disable-next-line max-len warn(`Image type is svg and link contains #. Postcss-url cant handle svg fragments. SVG file fully inlined. ${file.path}`); } addDependency(file.path); const optimizeSvgEncode = isSvg && options.optimizeSvgEncode; const encodedStr = encodeFile(file, encodeType, optimizeSvgEncode); const resultValue = options.includeUriFragment && asset.hash ? encodedStr + asset.hash : encodedStr; // wrap url by quotes if percent-encoded svg return isSvg && encodeType !== 'base64' ? `"${resultValue}"` : resultValue; };