| 'use strict'; |
| |
| const { parseSvg } = require('./parser.js'); |
| const { stringifySvg } = require('./stringifier.js'); |
| const { builtin } = require('./builtin.js'); |
| const { invokePlugins } = require('./svgo/plugins.js'); |
| const { encodeSVGDatauri } = require('./svgo/tools.js'); |
| |
| const pluginsMap = {}; |
| for (const plugin of builtin) { |
| pluginsMap[plugin.name] = plugin; |
| } |
| |
| const resolvePluginConfig = (plugin) => { |
| if (typeof plugin === 'string') { |
| // resolve builtin plugin specified as string |
| const builtinPlugin = pluginsMap[plugin]; |
| if (builtinPlugin == null) { |
| throw Error(`Unknown builtin plugin "${plugin}" specified.`); |
| } |
| return { |
| name: plugin, |
| params: {}, |
| fn: builtinPlugin.fn, |
| }; |
| } |
| if (typeof plugin === 'object' && plugin != null) { |
| if (plugin.name == null) { |
| throw Error(`Plugin name should be specified`); |
| } |
| // use custom plugin implementation |
| let fn = plugin.fn; |
| if (fn == null) { |
| // resolve builtin plugin implementation |
| const builtinPlugin = pluginsMap[plugin.name]; |
| if (builtinPlugin == null) { |
| throw Error(`Unknown builtin plugin "${plugin.name}" specified.`); |
| } |
| fn = builtinPlugin.fn; |
| } |
| return { |
| name: plugin.name, |
| params: plugin.params, |
| fn, |
| }; |
| } |
| return null; |
| }; |
| |
| const optimize = (input, config) => { |
| if (config == null) { |
| config = {}; |
| } |
| if (typeof config !== 'object') { |
| throw Error('Config should be an object'); |
| } |
| const maxPassCount = config.multipass ? 10 : 1; |
| let prevResultSize = Number.POSITIVE_INFINITY; |
| let output = ''; |
| const info = {}; |
| if (config.path != null) { |
| info.path = config.path; |
| } |
| for (let i = 0; i < maxPassCount; i += 1) { |
| info.multipassCount = i; |
| const ast = parseSvg(input, config.path); |
| const plugins = config.plugins || ['preset-default']; |
| if (!Array.isArray(plugins)) { |
| throw Error( |
| 'malformed config, `plugins` property must be an array.\nSee more info here: https://github.com/svg/svgo#configuration', |
| ); |
| } |
| const resolvedPlugins = plugins |
| .filter((plugin) => plugin != null) |
| .map(resolvePluginConfig); |
| |
| if (resolvedPlugins.length < plugins.length) { |
| console.warn( |
| 'Warning: plugins list includes null or undefined elements, these will be ignored.', |
| ); |
| } |
| const globalOverrides = {}; |
| if (config.floatPrecision != null) { |
| globalOverrides.floatPrecision = config.floatPrecision; |
| } |
| invokePlugins(ast, info, resolvedPlugins, null, globalOverrides); |
| output = stringifySvg(ast, config.js2svg); |
| if (output.length < prevResultSize) { |
| input = output; |
| prevResultSize = output.length; |
| } else { |
| break; |
| } |
| } |
| if (config.datauri) { |
| output = encodeSVGDatauri(output, config.datauri); |
| } |
| return { |
| data: output, |
| }; |
| }; |
| exports.optimize = optimize; |