diff options
Diffstat (limited to 'node_modules/svgo/lib/svgo.js')
| -rw-r--r-- | node_modules/svgo/lib/svgo.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/node_modules/svgo/lib/svgo.js b/node_modules/svgo/lib/svgo.js new file mode 100644 index 00000000..8c5ca130 --- /dev/null +++ b/node_modules/svgo/lib/svgo.js @@ -0,0 +1,94 @@ +'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) === false) { + throw Error( + "Invalid plugins list. Provided 'plugins' in config should be an array." + ); + } + const resolvedPlugins = plugins.map(resolvePluginConfig); + 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; |
