From 3ae8ac42f1c4d6a2da88bc218ca6e6b0a438551b Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 15 Mar 2026 11:08:36 +0000 Subject: [PATCH] Add support for svgo 2.x and 3.x --- lib/image_optim/worker/svgo.rb | 41 +++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/image_optim/worker/svgo.rb b/lib/image_optim/worker/svgo.rb index afd3c4a7..ae8d50f7 100644 --- a/lib/image_optim/worker/svgo.rb +++ b/lib/image_optim/worker/svgo.rb @@ -2,6 +2,7 @@ require 'image_optim/option_helpers' require 'image_optim/worker' +require 'fspath' class ImageOptim class Worker @@ -40,15 +41,45 @@ def optimize(src, dst, options = {}) --input #{src} --output #{dst} ] - disable_plugins.each do |plugin_name| - args.unshift "--disable=#{plugin_name}" - end - enable_plugins.each do |plugin_name| - args.unshift "--enable=#{plugin_name}" + if resolve_bin!(:svgo).version >= '2.0.0' + config_file = plugins_config_file + args.unshift "--config=#{config_file.path}" + else + disable_plugins.each do |plugin_name| + args.unshift "--disable=#{plugin_name}" + end + enable_plugins.each do |plugin_name| + args.unshift "--enable=#{plugin_name}" + end end args.unshift "--precision=#{precision}" if allow_lossy execute(:svgo, args, options) && optimized?(src, dst) end + + private + + def plugins_config_file + FSPath.temp_file %w[image_optim .js] do |config_file| + config_file.puts 'export default {' + config_file.puts ' plugins: [' + config_file.puts ' {' + config_file.puts ' name: \'preset-default\',' + config_file.puts ' params: {' + config_file.puts ' overrides: {' + disable_plugins.each do |plugin_name| + config_file.puts " #{plugin_name}: false," + end + enable_plugins.each do |plugin_name| + config_file.puts " #{plugin_name}: true," + end + config_file.puts ' }' + config_file.puts ' }' + config_file.puts ' }' + config_file.puts ' ]' + config_file.puts '};' + config_file + end + end end end end