fix(deps): update dependency svgo to v4#24
Conversation
e941801 to
18482a8
Compare
18482a8 to
cd80b57
Compare
cd80b57 to
8207ed9
Compare
8207ed9 to
b132023
Compare
b132023 to
dae341b
Compare
dae341b to
3f42722
Compare
3f42722 to
75a8c60
Compare
75a8c60 to
86a9cb5
Compare
86a9cb5 to
5be7ed5
Compare
8d65552 to
b5ac09d
Compare
6920c50 to
6820b51
Compare
8a0b4ee to
0c784e3
Compare
bb3df38 to
24819d0
Compare
6de942e to
a245b10
Compare
2bfa7b5 to
6117110
Compare
6117110 to
fc430d9
Compare
📝 WalkthroughWalkthroughThe pull request updates the 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@package.json`:
- Line 32: Change the SVGO v3-style default import and call to the v4 named API
in src/codecs.ts: replace the default import (import svgo from 'svgo') and uses
of svgo.optimize(...) with the named export (e.g., import { optimize } from
'svgo') and call optimize(svgString, options). Before passing merged opts into
optimize inside the svgCodec function, remove any test field from opts (or
explicitly set a plugins array with the desired plugins and options such as
preserving viewBox/title) so SVGO v4’s plugin defaults don’t alter output
unexpectedly. Add "engines": { "node": ">=16" } to package.json to reflect SVGO
v4’s Node requirement. Finally, add a unit/integration test covering the SVG
minimization path to assert key elements (like viewBox/title) are preserved and
prevent regressions.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 623be1a0-6b40-4fad-9d14-23fe13a2c1fd
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (1)
package.json
| "dependencies": { | ||
| "@napi-rs/image": "1.11.2", | ||
| "svgo": "^3.3.3" | ||
| "svgo": "^4.0.1" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Verify Node.js version requirements across the project
echo "=== Checking for Node.js version declarations ==="
# Check for .nvmrc, .node-version, or engines field
fd -H '^\.nvmrc$|^\.node-version$' . --exec cat {}
fd -H '^package\.json$' . --exec jq -r '.engines.node // "No engines.node field"' {}
echo -e "\n=== Checking CI/CD Node.js versions ==="
# Check GitHub Actions workflows
fd -e yml -e yaml . .github/workflows --exec rg -n "node-version" {}
echo -e "\n=== Checking if repository requires Node.js < 16 ==="
# Look for any documentation mentioning Node.js version requirements
rg -i "node\.?js.*\b(14|12|10|8)\b" README.md CONTRIBUTING.md docs/ -n -A2 -B2 || echo "No references to Node.js <16 found"Repository: rstackjs/rsbuild-plugin-image-compress
Length of output: 496
🏁 Script executed:
#!/bin/bash
# Description: Verify svgo API usage and type imports for v4 compatibility
echo "=== Checking svgo imports and usage ==="
# Find all svgo imports
rg -n "from ['\"]svgo['\"]" --type=ts -A2 -B2
echo -e "\n=== Checking svgo.optimize() usage ==="
# Find optimize() calls to verify API compatibility
rg -n "svgo\.optimize" --type=ts -C5
echo -e "\n=== Checking for Config/SvgoConfig type usage ==="
# Find type imports from svgo
rg -n "(SvgoConfig|Config).*from ['\"]svgo['\"]" --type=ts -A2 -B2Repository: rstackjs/rsbuild-plugin-image-compress
Length of output: 1240
🏁 Script executed:
#!/bin/bash
# Description: Verify test coverage for svgo functionality
echo "=== Checking for svgo-related tests ==="
# Find test files that mention svgo or svg codec
rg -l "svgo|svg.*codec|svg.*compress" --glob "*test*" --glob "*spec*" -n
echo -e "\n=== Checking test file content ==="
# Show test implementations
rg -n "svgo|svg.*codec" --glob "*test*" --glob "*spec*" -C5Repository: rstackjs/rsbuild-plugin-image-compress
Length of output: 158
🌐 Web query:
What are the breaking changes in svgo v4.0.0 and v4.0.1 regarding the optimize() method API and Config type exports?
💡 Result:
In SVGO v4.0.0 and v4.0.1, the primary breaking changes regarding the API and configuration structure are as follows: 1. Removal of Default Exports: SVGO now exclusively uses named exports [1][2]. Any code previously using a default export must be updated to use named imports (e.g., import { optimize } from 'svgo';) [1][2]. 2. Enforced Public API Boundaries: SVGO now strictly enforces a boundary between public and internal APIs [1][2]. Users can no longer import internal structures or helpers (such as svgo/lib/builtin) [3]. If you previously imported from specific sub-paths, you must refactor to use the sanctioned public API [1][2]. 3. Browser Bundle Imports: If using the browser bundle, the import path has changed. You must update imports from svgo/dist/svgo.browser.js to svgo/browser [1][2][3]. 4. Configuration and Plugin Changes: - The removeScriptElement plugin was renamed to removeScripts [4][1]. You must update your configuration accordingly [1][3]. - removeViewBox and removeTitle are no longer enabled by default [4][3]. To maintain previous behavior, they must be explicitly added back to the plugins array in your svgo.config.mjs (or equivalent configuration file) [4][1][3]. 5. Type Declarations: Type definitions are now generated automatically from JSDoc comments [4]. This ensures higher accuracy and better synchronization with the implementation compared to manually maintained types [4]. 6. SVGO v4.0.1: This version contains no breaking changes to the optimize() method or Config type [5]. It focuses on dependency updates (minimum sax version to v1.5.0), bug fixes, performance improvements (lazy style computation, path data optimization), and minor type refinements to enforce naming conventions for presets [5]. These changes were introduced to improve API stability, security, and the maintainability of the project's type definitions [4][1][3][5].
Citations:
- 1: https://svgo.dev/docs/migrations/migration-from-v3-to-v4/
- 2: https://github.com/svg/svgo/blob/main/docs/06-migrations/01-migration-from-v3-to-v4.mdx
- 3: https://github.com/svg/svgo/releases/tag/v4.0.0-rc.0
- 4: https://github.com/svg/svgo/releases/tag/v4.0.0
- 5: https://github.com/svg/svgo/releases/tag/v4.0.1
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Inspect root package.json (svgo dependency + type/module info) ==="
ls -la package.json tsconfig*.json 2>/dev/null || true
cat -n package.json | sed -n '1,120p'
echo -e "\n=== Find/inspect tsconfig(s) relevant to module interop ==="
fd -e tsconfig -t f . -d 4 || true
fd -t f 'tsconfig*.json' . -d 4 || true
for f in $(fd -t f 'tsconfig*.json' . -d 6); do
echo -e "\n--- $f (head) ---"
head -n 80 "$f" | cat -n
echo -e "\n--- $f (compilerOptions) ---"
rg -n "compilerOptions" -n "$f" -C2 || true
rg -n "esModuleInterop|allowSyntheticDefaultImports|module|moduleResolution|target|typeRoots|types" "$f" -n || true
done
echo -e "\n=== Inspect SVGO usage/options code ==="
cat -n src/codecs.ts | sed -n '1,140p'
cat -n src/types.ts | sed -n '1,120p'
echo -e "\n=== Check all SVGO imports ==="
rg -n "from ['\"]svgo['\"]" --type=ts -S
rg -n "import svgo from ['\"]svgo['\"]" -S
rg -n "import\\s*\\{[^}]*\\}\\s*from ['\"]svgo['\"]" -S
echo -e "\n=== Check if plugins explicitly enable removeViewBox/removeTitle ==="
rg -n "removeViewBox|removeTitle|plugins" src --type=ts -SRepository: rstackjs/rsbuild-plugin-image-compress
Length of output: 6992
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Search for SVGO config/plugins usage in src ==="
rg -n "removeViewBox|removeTitle|removeScripts|removeScriptElement|plugins\\b|preset\\b|multipass\\b" src --type=ts -S
echo -e "\n=== Search for how svg codec options are provided/typed ==="
rg -n "svg\\s*:" src --type=ts -S
rg -n "codec.*svg|svgCodec|use:\\s*'svg'|use:\\s*\"svg\"" src --type=ts -S
rg -n "SvgoConfig|Config as SvgoConfig" src --type=ts -SRepository: rstackjs/rsbuild-plugin-image-compress
Length of output: 134
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Find where svgo.optimize is used (repo-wide) ==="
rg -n "svgo\\.optimize" -S .
echo -e "\n=== Find where svg codec is referenced/selected ==="
rg -n "svgCodec|use:\\s*['\"]svg['\"]|\\buse:\\s*['\"]svg['\"]" src --type=ts -S
echo -e "\n=== Find where handler gets called for codecs (svg options flow) ==="
rg -n "handler\\(" src --type=ts -S
rg -n "defaultOptions|FinalOptionCollection|CodecBaseOptions|Options\\b" src --type=ts -SRepository: rstackjs/rsbuild-plugin-image-compress
Length of output: 3353
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Read src/utils.ts ==="
cat -n src/utils.ts
echo -e "\n=== Read src/minimizer.ts (focus on handler invocation/options merging) ==="
sed -n '1,220p' src/minimizer.ts | cat -n
echo -e "\n=== Read src/index.ts (options normalization; how svg options are structured) ==="
sed -n '1,120p' src/index.ts | cat -n
echo -e "\n=== Check pnpm-lock.yaml for svgo metadata (engines/module/export hints) ==="
ls -ლა pnpm-lock.yaml 2>/dev/null || true
rg -n "svgo:" pnpm-lock.yaml 2>/dev/null || true
# Print the svgo section if present (keep small)
if [ -f pnpm-lock.yaml ]; then
awk 'BEGIN{f=0} /svgo:/ {f=1} f{print; if(NR>1 && $0 ~ /^[^[:space:]].*:/) {exit}}' pnpm-lock.yaml | head -n 80
fiRepository: rstackjs/rsbuild-plugin-image-compress
Length of output: 8527
Fix SVGO v4 integration (default import + SVG output changes + Node engines)
src/codecs.tsusesimport svgo from 'svgo'andsvgo.optimize(...), but SVGO v4 removes default exports—switch to the v4 named export API and update the call accordingly.svgCodecpasses the mergedoptsdirectly intosvgo.optimize(...); since this repo doesn’t explicitly configureplugins(and default options only addtest: /\.svg$/), SVGO v4’s default plugin behavior change (notablyremoveViewBox/removeTitle) can change optimized SVG output. Filter out thetestfield before callingsvgo.optimizeand/or explicitly set the desiredplugins.package.jsonlacks anengines.nodefield; SVGO v4 requires Node.js >=16, so add:"engines": { "node": ">=16" }
- No SVGO-related tests were found in the repo; add coverage for the SVG minimization path to prevent regressions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@package.json` at line 32, Change the SVGO v3-style default import and call to
the v4 named API in src/codecs.ts: replace the default import (import svgo from
'svgo') and uses of svgo.optimize(...) with the named export (e.g., import {
optimize } from 'svgo') and call optimize(svgString, options). Before passing
merged opts into optimize inside the svgCodec function, remove any test field
from opts (or explicitly set a plugins array with the desired plugins and
options such as preserving viewBox/title) so SVGO v4’s plugin defaults don’t
alter output unexpectedly. Add "engines": { "node": ">=16" } to package.json to
reflect SVGO v4’s Node requirement. Finally, add a unit/integration test
covering the SVG minimization path to assert key elements (like viewBox/title)
are preserved and prevent regressions.
This PR contains the following updates:
^3.3.3→^4.0.1Release Notes
svg/svgo (svgo)
v4.0.1Compare Source
What's Changed
Dependencies
Bug Fixes
<use>elements referencing an empty container that were removed. By @johnkenny54 in #2051Performance
Other Changes
--show-pluginsargument appends the presets a plugin is in to the end of the line. By @viralcodex in #2174preset-if it is a preset (collection of plugins). By @SethFalco in #2178Metrics
Before and after of the browser bundle of each respective version:
v4.0.0Compare Source
Illustration by Vukory
It's been just over a year since our first release candidate, but I believe we can now release SVGO v4.0.0 with confidence! Thank you to all contributors who tested our RC builds and reported issues back up, this really smoothed out the process.
We actually wanted to do the release sooner, but it was a challenge to find the right time to publish a major release, since that means setting time aside to support users through migrations, helping downstream projects migrate, being available to fix or document things that users found to have an unexpected impact by this release, etc. I appreciate everyone's patience, and now that this is done, we can hopefully increase the pace of development again and tackle that backlog of old bugs. ^-^'
Breaking Changes
Please refer to the Migration Guide from v3 to v4 for a more concise version! This section is more verbose as it delves into the motivation of changes too.
Dropped Support for Node.js v14
Node.js v14 is no longer supported by the Node.js team, including security support, since 30 April 2023. Node.js v16 is no longer supported either, but as some are still using it, we'll save dropping support for Node.js v16 for the next major release.
This allows us to update our dependencies to more recent versions and to access more modern Node.js APIs.
Node.js v14 may still work at the time of this release, but we'll no longer be testing against v14 from now on.
Default Plugins
Both removeViewBox and removeTitle have been disabled by default. Both have been major pain points for users and don't make sense to enable in most cases. Other libraries wrapping SVGO have also been disabling these plugins by default, such as Docusaurus and SVGR.
If you would like either of these plugins enabled, you can do so by configuring it in the SVGO config, see the README for more context, however please read the warnings described in the documentation of the plugins first:
export default { plugins: [ 'preset-default', // built-in plugins enabled by default + 'removeViewBox', + 'removeTitle', ], };removeScriptElement → removeScripts
The removeScriptElement plugin has been renamed to removeScripts, to more accurately reflect what the plugin does. It does not only remove the
<script>tag, but also event handlers and script URIs from links.To migrate, amend your SVGO config to refer to
removeScriptsinstead if you use that plugin.export default { plugins: [ 'preset-default', // built-in plugins enabled by default - 'removeScriptElement', + 'removeScripts', ], };Imports/Exports
We now enforce boundaries between the intended public API and any internal structures/helpers. This is the biggest change in SVGO's JavaScript API and will enable maintainers and users to have a mutual understanding of what is public API and what isn't.
There are two ways to import SVGO:
svgo— for normal usage, such as scripts or server-side applications.svgo/browser— for browser usage.If you use the browser bundle, you must amend how you import SVGO:
For ESM/browser, you must use named imports:
We support 3 environments, ESM, Common JS, and browser. The only functional difference is that the
loadConfigfunction is not exported in the browser bundle.If you depended on a helper that we haven't declared as public, then you are encouraged to implement it yourself, or dig into our source and copy it over to your project.
Importing Plugins
If you import/require the array of built-in plugins, or a single plugin during runtime, this is now a top-level export instead:
Selector Helpers
The
XastNode#parentNodeproperty was declared legacy and pending removal for v4, but was still used internally. The remaining instances have now been removed, which required a refactor of the selector helpers.This effects custom plugins that use any of the following functions, where the
selector(2nd) argument could reference parent or sibling nodes (i.e.div > span):querySelectorAllquerySelectormatchesPreviously, these functions had the context of the whole node tree, even if a child node was passed to it. It no longer has that context by default. The new API for these functions is as follows:
A helper has been provided named
#mapNodesToParents, which does this for you. This can be used to easily migrate to the new API. If you're not sure if you need it, then it's safer to take this approach. The third argument won't be necessary ifselectordoes not traverse nodes, for example, querying using one or more attributes of a single node.What Else
ESM
SVGO is now a dual package, serving for both Common JS and ESM usage. To be more explicit, SVGO will continue to work on Common JS projects!
Thanks to @jdufresne for doing the bulk of the work.
Default Behavior
convertCasetofalse.Bug Fixes
filterattribute. By @johnkenny54 in #1933path[opacity=0]as a non-rendering node. By @johnkenny54 in #1948-oargument) ends with a trailing slash to a location that didn't exist. By @SethFalco in #1954Features
VERSIONexport so get the version of SVGO during runtime. By @SethFalco in #2016isPresetandpluginsproperty to plugins, which are only defined for presets. This will indicate if the plugin is a preset, and return the plugins that are in the preset in the order they are invoked.SVG Optimization
Performance
Developer Experience
Metrics
Before and after using vectors from various sources, with the default preset of each respective version:
Note: The increase in size from previous versions is from disabling
removeViewBoxandremoveTitle, with the benefit of preserving scalability and accessibility.Before and after of the browser bundle of each respective version:
Configuration
📅 Schedule: (in timezone Asia/Shanghai)
* 0-3 1,15 * *)🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.