| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | 'use strict';Object.defineProperty(exports, "__esModule", {    value: true});var _postcss = require('postcss');var _postcss2 = _interopRequireDefault(_postcss);var _postcssValueParser = require('postcss-value-parser');var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);var _svgo = require('svgo');var _svgo2 = _interopRequireDefault(_svgo);var _url = require('./lib/url');function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }const PLUGIN = 'postcss-svgo';const dataURI = /data:image\/svg\+xml(;((charset=)?utf-8|base64))?,/i;const dataURIBase64 = /data:image\/svg\+xml;base64,/i;function minifyPromise(decl, getSvgo, opts, postcssResult) {    const promises = [];    const parsed = (0, _postcssValueParser2.default)(decl.value);    decl.value = parsed.walk(node => {        if (node.type !== 'function' || node.value.toLowerCase() !== 'url' || !node.nodes.length) {            return;        }        let { value, quote } = node.nodes[0];        let isBase64, isUriEncoded;        let svg = value.replace(dataURI, '');        if (dataURIBase64.test(value)) {            svg = Buffer.from(svg, 'base64').toString('utf8');            isBase64 = true;        } else {            let decodedUri;            try {                decodedUri = (0, _url.decode)(svg);                isUriEncoded = decodedUri !== svg;            } catch (e) {                // Swallow exception if we cannot decode the value                isUriEncoded = false;            }            if (isUriEncoded) {                svg = decodedUri;            }            if (opts.encode !== undefined) {                isUriEncoded = opts.encode;            }        }        promises.push(getSvgo().optimize(svg).then(result => {            if (result.error) {                decl.warn(postcssResult, `${result.error}`);                return;            }            let data, optimizedValue;            if (isBase64) {                data = Buffer.from(result.data).toString('base64');                optimizedValue = 'data:image/svg+xml;base64,' + data;            } else {                data = isUriEncoded ? (0, _url.encode)(result.data) : result.data;                // Should always encode # otherwise we yield a broken SVG                // in Firefox (works in Chrome however). See this issue:                // https://github.com/cssnano/cssnano/issues/245                data = data.replace(/#/g, '%23');                optimizedValue = 'data:image/svg+xml;charset=utf-8,' + data;                quote = isUriEncoded ? '"' : '\'';            }            node.nodes[0] = Object.assign({}, node.nodes[0], {                value: optimizedValue,                quote: quote,                type: 'string',                before: '',                after: ''            });        }).catch(error => {            decl.warn(postcssResult, `${error}`);        }));        return false;    });    return Promise.all(promises).then(() => decl.value = decl.value.toString());}exports.default = _postcss2.default.plugin(PLUGIN, (opts = {}) => {    let svgo = null;    const getSvgo = () => {        if (!svgo) {            svgo = new _svgo2.default(opts);        }        return svgo;    };    return (css, result) => {        return new Promise((resolve, reject) => {            const svgoQueue = [];            css.walkDecls(decl => {                if (!dataURI.test(decl.value)) {                    return;                }                svgoQueue.push(minifyPromise(decl, getSvgo, opts, result));            });            return Promise.all(svgoQueue).then(resolve, reject);        });    };});module.exports = exports['default'];
 |