UNPKG

motion

Version:

motion - moving development forward

90 lines (71 loc) 2.91 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 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 _isSvg = require('is-svg'); var _isSvg2 = _interopRequireDefault(_isSvg); var dataURI = /data:image\/svg\+xml(;(charset=)?utf-8)?,/; var encode = function encode(data) { return data.replace(/"/g, '\'').replace(/</g, '%3C').replace(/>/g, '%3E').replace(/&/g, '%26').replace(/#/g, '%23').replace(/\s+/g, ' '); }; var decode = decodeURIComponent; function minifyPromise(svgo, decl, opts) { var promises = []; decl.value = (0, _postcssValueParser2['default'])(decl.value).walk(function (node) { if (node.type !== 'function' || node.value !== 'url' || !node.nodes.length) { return; } var value = node.nodes[0].value; var decodedUri = decode(value); var isUriEncoded = decodedUri !== value; if (isUriEncoded) { value = decodedUri; } if (opts.encode !== undefined) { isUriEncoded = opts.encode; } if (!dataURI.test(value) || !(0, _isSvg2['default'])(value)) { return; } promises.push(new Promise(function (resolve, reject) { svgo.optimize(value.replace(dataURI, ''), function (result) { if (result.error) { return reject('Error parsing SVG: ' + result.error); } node.before = node.after = ''; var data = isUriEncoded ? encode(result.data) : result.data; node.nodes[0].value = 'data:image/svg+xml;charset=utf-8,' + data; node.nodes[0].quote = isUriEncoded ? '"' : '\''; node.nodes[0].type = 'string'; resolve(); }); })); return false; }); return Promise.all(promises).then(function () { decl.value = decl.value.toString(); }); } exports['default'] = _postcss2['default'].plugin('postcss-svgo', function () { var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var svgo = new _svgo2['default'](opts); return function (css) { return new Promise(function (resolve, reject) { var promises = []; css.walkDecls(function (decl) { if (dataURI.test(decl.value)) { promises.push(minifyPromise(svgo, decl, opts)); } }); Promise.all(promises).then(resolve, reject); }); }; }); module.exports = exports['default'];