⚙️ Node.js tool for optimizing SVG files
optimize(svg)
usage without config (https://github.com/svg/svgo/pull/1573)Thanks to @XhmikosR, @thewilkybarkid, @renatorib, @matheus1lva, @omgovich and @TrySound
If you enjoy SVGO and would like to support our work, consider sponsoring us directly via our OpenCollective.
We have some good stuff in this release
Before people struggled to figure out what and why happens with such cryptic error
Error: Error in parsing SVG: Unquoted attribute value
Line: 1
Column: 29
Char: 6
File: input.svg
This gives too little information when a lot of svgs are transformed.
New errors look like this, include context and point to exact location with the issue. We hope this will solve many issues when dealing with bundlers and other tools integrations.
Error: SvgoParserError: input.svg:2:29: Unquoted attribute value
1 | <svg viewBox="0 0 120 120">
> 2 | <circle fill="#ff0000" cx=60.444444" cy="60" r="50"/>
| ^
3 | </svg>
4 |
To get better compression results SVGO uses multipass option. This option is used to run prefixIds plugin only once to prefix ids and classes properly.
Though sometimes users run svgo manually a few times which leads to duplicated prefixes and make code much bigger. To solves this prefixIds was redesigned to add prefix only when it does not exit in ids and classes.
Eventually all plugins are planned to be determenistic and idempotent so multipass option would not be necessary and single pass compression could be as effective as possible.
js2svg.eol: 'lf' | 'crlf'
Allows to customize end of line characters which is usually resolved by os.EOL in node.
finalNewline: boolean
Ensures SVG output has a final newline which is required for some tools like git.
Follwing plugins are migrated to the new visitor plugin api and covered with tsdoc
Also fixed a few bugs
Thanks to @XhmikosR, @matheus1lva, @deepsweet, @omgovich, @adalinesimonian and @TrySound
In this release we have a couple of fixes
Visitor api now get parentNode in enter and exit callback
return {
element: {
enter: (node, parentNode) => {
},
exit: (node, parentNode) => {
}
}
}
And a lot of plugins are migrated to visitor api and covered them with tsdoc
Thanks to @XhmikosR, @morganney, @oBusk, @matheus1lva and @TrySound
Hey everybody!
In this release I happy to introduce the new plugin "preset-default" which allows to declaratively setup and customize default set of plugins. Previous solution extendDefaultPlugins
utility prevented parcel users from using cachable json config, svgo-loader and svgo-jsx required svgo to be installed locally. "preset-default" plugin is just another builtin plugi.
module.exports = {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
// customize options
builtinPluginName: {
optionName: 'optionValue',
},
// or disable plugins
anotherBuiltinPlugin: false,
},
},
},
],
};
We also fixed a few bugs
Thanks to @TrySound, @ydaniv, @ludofischer, @XhmikosR and @joseprio
Fixed vulnerability in css-select dependency (https://github.com/svg/svgo/pull/1485)
Thanks to @ericcornelissen
Hey, everybody! We have a big release here.
Before:
<svg>
<style media="print">
.st0{ fill:red; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; }
</style>
<style>
.test { background: red; }
</style>
</svg>
After:
<svg>
<style>
@media print{
.st0{ fill:red; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; }
}
.test { background: red; }
</style>
</svg>
--exclude
flag which uses regexps to exclude some files from --folder
. See #1409svgo --folder=svgs --exclude "invalid-icon" "bad-.+"
Internal AST is migrated to XAST. This spec makes maintaining plugins easier and may be used as interop with other tools like SVGR.
The new visitor plugin type combines features of "full", "perItem" and "perItemReverse" plugins without loosing simplicity. Eventually only visitor api will be supported. See #1454
Also small fixes
Thanks to @chambo-e, @strarsis, @XhmikosR, @omgovich and @TrySound
This is a big patch with new style computing (https://github.com/svg/svgo/pull/1399) and landed to master regression tests
A lot of bugs are fixed
<style>
type attribute in inlineStyles plugin (https://github.com/svg/svgo/pull/1400)<style>
support in removeHiddenElems plugin (https://github.com/svg/svgo/pull/1399)<style>
support when removing useless path commands (https://github.com/svg/svgo/commit/c21fef54e1aede8cf9f4b4b73ab79d91b7907d2b)<style>
support when combining path commands (https://github.com/svg/svgo/commit/ba7e9bdc0d4ee677336f09b6fb24fd6cc866e97d)<pattern>
when at least one argument is present (https://github.com/svg/svgo/commit/0e6b0c4a0182fb79775fb6af2f1df18c12f917d9)<marker>
with display none (https://github.com/svg/svgo/commit/d3e3726ac42bf623572ff06405e12f4ee72873dd)<svg>
(https://github.com/svg/svgo/commit/28c01cfe65cd87796fb061fe3ede7c6f59d0e1f6)435 of 526 regression tests are passing
Thanks to @XhmikosR @sk- and @TrySound
Wow, two minor releases in a row. There is a big reason for that. We got a new logo! See it in readme. Big thanks to @DerianAndre.
There were also implemented brand new path data parser and stringifier (https://github.com/svg/svgo/pull/1378 and https://github.com/svg/svgo/pull/1387) to do more reliable transformations and produce smaller svg.
A cup of small fixes
<tspan>
inside <a>
(https://github.com/svg/svgo/commit/091172a392f6d751855477d51e5c8bd3e44fde97)Thanks to @sk- @XhmikosR @deepsweet and @TrySound
This release introduced two big changes
See fixed bugs
<svg />
with enabled cleanupIDs plugin (https://github.com/svg/svgo/commit/9b97e06ef69b7961f342c9ee8468c552c9b503a3)--config
flag does not exist or json string is specified (https://github.com/svg/svgo/commit/a855b40ec5d53f3ce3b45213fd4c65bc4dc05347)xml:space="preserve"
(https://github.com/svg/svgo/commit/776ec1e71bcd2aa768b2d3ac987177f706834547)<g>
when filter
attribute is specified (https://github.com/svg/svgo/commit/c1d5f0f7a93a6f1c947baa5860ddd40f8d1bb701)Thanks to @XhmikosR @sk- @chromakode @devongovett and @TrySound