| "use strict"; |
|
|
| exports.__esModule = true; |
| exports.default = svgoPlugin; |
|
|
| var _svgo = _interopRequireDefault(require("svgo")); |
|
|
| var _cosmiconfig = require("cosmiconfig"); |
|
|
| var _config = require("./config"); |
|
|
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
|
|
| |
| const explorer = (0, _cosmiconfig.cosmiconfigSync)('svgo', { |
| searchPlaces: ['package.json', '.svgorc', '.svgorc.js', '.svgorc.json', '.svgorc.yaml', '.svgorc.yml', 'svgo.config.js', '.svgo.yml'], |
| transform: result => result && result.config, |
| cache: true |
| }); |
|
|
| function encodeSVGDatauri(str, type) { |
| let prefix = 'data:image/svg+xml'; |
|
|
| if (!type || type === 'base64') { |
| prefix += ';base64,'; |
|
|
| if (Buffer.from) { |
| str = prefix + Buffer.from(str).toString('base64'); |
| } else { |
| |
| str = prefix + new Buffer(str).toString('base64'); |
| } |
|
|
| } else if (type === 'enc') { |
| str = `${prefix},${encodeURIComponent(str)}`; |
| } else if (type === 'unenc') { |
| str = `${prefix},${str}`; |
| } |
|
|
| return str; |
| } |
| |
|
|
|
|
| function optimizeSync(svgstr, info) { |
| const { |
| config |
| } = this; |
|
|
| if (config.error) { |
| throw config.error; |
| } |
|
|
| const maxPassCount = config.multipass ? 10 : 1; |
| let counter = 0; |
| let prevResultSize = Number.POSITIVE_INFINITY; |
| let result; |
|
|
| const optimizeOnceCallback = svgjs => { |
| if (svgjs.error) { |
| throw svgjs.error; |
| } |
|
|
|
|
| if (++counter < maxPassCount && svgjs.data.length < prevResultSize) { |
| prevResultSize = svgjs.data.length; |
|
|
| this._optimizeOnce(svgjs.data, info, optimizeOnceCallback); |
| } else { |
| if (config.datauri) { |
| svgjs.data = encodeSVGDatauri(svgjs.data, config.datauri); |
| } |
|
|
| if (info.path) { |
| svgjs.path = info.path; |
| } |
|
|
| result = svgjs; |
| } |
| }; |
|
|
| this._optimizeOnce(svgstr, info, optimizeOnceCallback); |
|
|
| return result; |
| } |
|
|
| function createSvgo(config, rcConfig) { |
| const baseSvgoConfig = (0, _config.getBaseSvgoConfig)(config); |
| const mergedConfig = (0, _config.mergeSvgoConfig)(baseSvgoConfig, rcConfig, config.svgoConfig); |
| return new _svgo.default(mergedConfig); |
| } |
|
|
| function getInfo(state) { |
| return state.filePath ? { |
| input: 'file', |
| path: state.filePath |
| } : { |
| input: 'string' |
| }; |
| } |
|
|
| function svgoPlugin(code, config, state) { |
| if (!config.svgo) return code; |
| const filePath = (0, _config.getFilePath)(state); |
| const svgoRcConfig = config.runtimeConfig ? explorer.search(filePath) : {}; |
| const svgo = createSvgo(config, svgoRcConfig); |
| const { |
| data |
| } = optimizeSync.call(svgo, code, getInfo(state)); |
| return data; |
| } |