rspack-plugin-svg-sprite 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026
3
+ Copyright (c) 2026 Yichen Zhu
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -7,16 +7,25 @@
7
7
  [![npm version](https://img.shields.io/npm/v/rspack-plugin-svg-sprite)](https://www.npmjs.com/package/rspack-plugin-svg-sprite)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/rspack-plugin-svg-sprite)](https://www.npmjs.com/package/rspack-plugin-svg-sprite)
9
9
  [![license](https://img.shields.io/github/license/yichenzhu1337/rspack-plugin-svg-sprite)](https://github.com/yichenzhu1337/rspack-plugin-svg-sprite/blob/main/LICENSE)
10
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/rspack-plugin-svg-sprite)](https://bundlephobia.com/package/rspack-plugin-svg-sprite)
10
11
 
11
- **[Live Demo](https://yichenzhu1337.github.io/rspack-plugin-svg-sprite/)**
12
+ **[Live Demo](https://yichenzhu1337.github.io/rspack-plugin-svg-sprite/)** | **[npm](https://www.npmjs.com/package/rspack-plugin-svg-sprite)** | **[npm trends](https://npmtrends.com/rspack-plugin-svg-sprite-vs-svg-sprite-loader)**
13
+
14
+ ```bash
15
+ npm install rspack-plugin-svg-sprite -D
16
+ ```
12
17
 
13
18
  ---
14
19
 
20
+ ## Why SVG sprites?
21
+
22
+ Individual SVG files mean one HTTP request per icon — 50 icons = 50 requests. Inlining SVGs directly into JSX bloats your bundle with duplicated markup. SVG sprites solve both problems: all icons are combined into a single file (or a single hidden DOM element), and each icon is referenced by `<use href="#id" />` — one request, zero duplication, full CSS styling support, and resolution-independent rendering at any size.
23
+
15
24
  ## What is this?
16
25
 
17
26
  `rspack-plugin-svg-sprite` lets you import `.svg` files in your Rspack (or Webpack 5) project and automatically combine them into an SVG sprite sheet — either inlined in the DOM or extracted as an external `.svg` file.
18
27
 
19
- It was created because the popular [`svg-sprite-loader`](https://github.com/JetBrains/svg-sprite-loader) depends on internal Webpack APIs (`NormalModule.getCompilationHooks`, `compilation.hooks.additionalAssets`, etc.) that do not exist in Rspack. This package reimplements the same functionality using Rspack-compatible APIs while keeping the exact same exported symbol shape (`id`, `viewBox`, `url`, `content`), so your existing component code works without changes.
28
+ It was created because the popular [`svg-sprite-loader`](https://github.com/JetBrains/svg-sprite-loader) depends on internal Webpack APIs (`NormalModule.getCompilationHooks`, `compilation.hooks.additionalAssets`, etc.) that do not exist in Rspack ([rspack#11609](https://github.com/web-infra-dev/rspack/issues/11609)). This package reimplements the same functionality using Rspack-compatible APIs while keeping the exact same exported symbol shape (`id`, `viewBox`, `url`, `content`), so your existing component code works without changes.
20
29
 
21
30
  ## Features
22
31
 
@@ -34,6 +43,10 @@ It was created because the popular [`svg-sprite-loader`](https://github.com/JetB
34
43
 
35
44
  ```bash
36
45
  npm install rspack-plugin-svg-sprite -D
46
+ # or
47
+ pnpm add rspack-plugin-svg-sprite -D
48
+ # or
49
+ yarn add rspack-plugin-svg-sprite -D
37
50
  ```
38
51
 
39
52
  ### Configure (inline mode)
@@ -74,6 +87,42 @@ import logo from './logo.svg';
74
87
 
75
88
  That's it. Every imported SVG is automatically registered as a `<symbol>` in a hidden sprite and referenced by `#id`.
76
89
 
90
+ ### TypeScript
91
+
92
+ This package ships with a client type declaration. Add it to your `tsconfig.json` so `import icon from './icon.svg'` is fully typed:
93
+
94
+ ```jsonc
95
+ // tsconfig.json
96
+ {
97
+ "compilerOptions": {
98
+ "types": ["rspack-plugin-svg-sprite/client"],
99
+ },
100
+ }
101
+ ```
102
+
103
+ This gives you autocompletion for `id`, `viewBox`, `url`, and `content` on every SVG import.
104
+
105
+ <details>
106
+ <summary>Alternative: manual declaration file</summary>
107
+
108
+ If you prefer, create a `svg.d.ts` file instead:
109
+
110
+ ```ts
111
+ declare module '*.svg' {
112
+ const symbol: {
113
+ id: string;
114
+ viewBox: string;
115
+ url: string;
116
+ content: string;
117
+ };
118
+ export default symbol;
119
+ }
120
+ ```
121
+
122
+ Make sure this file is included by your `tsconfig.json` (e.g., in the `include` array or alongside your source files).
123
+
124
+ </details>
125
+
77
126
  ## Extract Mode
78
127
 
79
128
  To emit SVGs as an external `.svg` sprite file instead of inlining them, enable extract mode and add the plugin:
@@ -151,6 +200,86 @@ Every `import icon from './icon.svg'` returns an object with:
151
200
 
152
201
  This matches `svg-sprite-loader`'s export shape exactly, so migrating requires no component changes.
153
202
 
203
+ ## Rsbuild Integration
204
+
205
+ If you're using [Rsbuild](https://rsbuild.dev/), use the built-in Rsbuild plugin for one-line setup:
206
+
207
+ ```js
208
+ // rsbuild.config.js
209
+ const { pluginSvgSprite } = require('rspack-plugin-svg-sprite/rsbuild');
210
+
211
+ module.exports = {
212
+ plugins: [
213
+ pluginSvgSprite({
214
+ symbolId: 'icon-[name]',
215
+ extract: true,
216
+ spriteFilename: 'sprites/icons.svg',
217
+ }),
218
+ ],
219
+ };
220
+ ```
221
+
222
+ The Rsbuild plugin handles the loader rule, `type: 'javascript/auto'`, and the `SvgSpritePlugin` automatically.
223
+
224
+ ## Framework Recipes
225
+
226
+ ### Next.js (with next-rspack)
227
+
228
+ ```js
229
+ // next.config.js
230
+ const { SvgSpritePlugin } = require('rspack-plugin-svg-sprite');
231
+
232
+ module.exports = {
233
+ webpack(config) {
234
+ // Remove Next.js default SVG handling
235
+ const fileLoaderRule = config.module.rules.find((rule) => rule.test?.test?.('.svg'));
236
+ if (fileLoaderRule) fileLoaderRule.exclude = /\.svg$/;
237
+
238
+ config.module.rules.push({
239
+ test: /\.svg$/,
240
+ type: 'javascript/auto',
241
+ loader: 'rspack-plugin-svg-sprite/loader',
242
+ options: { symbolId: 'icon-[name]', extract: true },
243
+ });
244
+
245
+ config.plugins.push(new SvgSpritePlugin({ plainSprite: true }));
246
+ return config;
247
+ },
248
+ };
249
+ ```
250
+
251
+ ### Vue + Rspack
252
+
253
+ ```js
254
+ // rspack.config.js
255
+ const { SvgSpritePlugin } = require('rspack-plugin-svg-sprite');
256
+
257
+ module.exports = {
258
+ module: {
259
+ rules: [
260
+ {
261
+ test: /\.svg$/,
262
+ type: 'javascript/auto',
263
+ loader: 'rspack-plugin-svg-sprite/loader',
264
+ options: { symbolId: '[name]' },
265
+ },
266
+ ],
267
+ },
268
+ };
269
+ ```
270
+
271
+ ```vue
272
+ <template>
273
+ <svg :viewBox="icon.viewBox">
274
+ <use :href="icon.url" />
275
+ </svg>
276
+ </template>
277
+
278
+ <script setup>
279
+ import icon from './icon.svg';
280
+ </script>
281
+ ```
282
+
154
283
  ## Migrating from svg-sprite-loader
155
284
 
156
285
  ```diff
@@ -236,6 +365,25 @@ module.exports = {
236
365
  2. During Rspack's `processAssets` stage, the plugin collects all registered symbols and emits a combined `.svg` sprite file.
237
366
  3. The exported JS module contains the external file URL (e.g., `/sprites/icons.svg#symbolId`).
238
367
 
368
+ ## Alternatives & Comparison
369
+
370
+ Looking for the right SVG solution for Rspack? Here's how the options compare:
371
+
372
+ | Feature | rspack-plugin-svg-sprite | svg-sprite-loader | @svgr/webpack | @rsbuild/plugin-svgr | vite-plugin-svg-icons |
373
+ | --------------------- | ------------------------ | --------------------------- | ---------------- | -------------------- | --------------------- |
374
+ | **Rspack support** | Native | No (uses Webpack internals) | Via config | Rsbuild only | No (Vite only) |
375
+ | **Approach** | SVG sprites (`<use>`) | SVG sprites (`<use>`) | React components | React components | SVG sprites |
376
+ | **Inline mode** | Yes | Yes | N/A | N/A | Yes |
377
+ | **Extract mode** | Yes | Yes | N/A | N/A | No |
378
+ | **Webpack 5 support** | Yes | Yes | Yes | No | No |
379
+ | **Runtime deps** | Zero | 1 | Several | Several | Several |
380
+ | **Maintained** | Yes | No (archived) | Yes | Yes | Yes |
381
+ | **Drop-in migration** | — | Yes (same API) | Different API | Different API | Different API |
382
+
383
+ **When to use SVG sprites** (this plugin): You want icons combined into a single file with `<use href="#id">` references — optimal for large icon sets, full CSS styling control, and caching. Best when migrating from `svg-sprite-loader`.
384
+
385
+ **When to use SVGR**: You want each SVG as a React component with props for color, size, etc. Better for SVGs that need dynamic manipulation via React props rather than CSS.
386
+
239
387
  ## Compatibility
240
388
 
241
389
  | Bundler | Version | Status |
package/client.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ declare module '*.svg' {
2
+ const symbol: {
3
+ /** The symbol ID inside the sprite (e.g., "icon-home") */
4
+ id: string;
5
+ /** The original SVG viewBox attribute (e.g., "0 0 24 24") */
6
+ viewBox: string;
7
+ /** Fragment reference (inline: "#icon-home") or full URL (extract: "/sprites/icons.svg#icon-home") */
8
+ url: string;
9
+ /** Raw `<symbol>` markup */
10
+ content: string;
11
+ };
12
+ export default symbol;
13
+ }
package/dist/loader.d.ts CHANGED
@@ -11,6 +11,7 @@ interface LoaderContext {
11
11
  resourcePath: string;
12
12
  getOptions?: () => LoaderOptions;
13
13
  _compilation?: any;
14
+ _compiler?: any;
14
15
  }
15
16
  export declare function parseViewBox(svgContent: string): string;
16
17
  export declare function extractSvgInner(svgContent: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,6BAA6B,CAAC;AAEpD,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,aAAa,CAAC;IACjC,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe1E;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAerF;AAmBD,iBAAS,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgFrE;AAED,QAAA,MAAM,MAAM;;CAAgD,CAAC;AAC7D,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,6BAA6B,CAAC;AAEpD,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,aAAa,CAAC;IACjC,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAgBvD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB1E;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAerF;AAmBD,iBAAS,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyFrE;AAED,QAAA,MAAM,MAAM;;CAAgD,CAAC;AAC7D,eAAe,MAAM,CAAC"}
package/dist/loader.js CHANGED
@@ -41,8 +41,19 @@ exports.generateSymbolId = generateSymbolId;
41
41
  const path = __importStar(require("path"));
42
42
  exports.NAMESPACE = 'rspack-plugin-svg-sprite';
43
43
  function parseViewBox(svgContent) {
44
- const match = svgContent.match(/viewBox=["']([^"']+)["']/);
45
- return match ? match[1] : '0 0 24 24';
44
+ // Extract the root <svg> opening tag to avoid matching attributes on child elements
45
+ const svgTagMatch = svgContent.match(/<svg([^>]*)>/i);
46
+ const svgTag = svgTagMatch ? svgTagMatch[1] : '';
47
+ const match = svgTag.match(/viewBox=["']([^"']+)["']/);
48
+ if (match)
49
+ return match[1];
50
+ // Derive viewBox from width/height attributes on the root <svg> tag only
51
+ const widthMatch = svgTag.match(/\bwidth=["'](\d+(?:\.\d+)?)(?:px)?["']/);
52
+ const heightMatch = svgTag.match(/\bheight=["'](\d+(?:\.\d+)?)(?:px)?["']/);
53
+ if (widthMatch && heightMatch) {
54
+ return '0 0 ' + widthMatch[1] + ' ' + heightMatch[1];
55
+ }
56
+ return '0 0 24 24';
46
57
  }
47
58
  function extractSvgInner(svgContent) {
48
59
  const innerMatch = svgContent.match(/<svg[^>]*>([\s\S]*)<\/svg>/i);
@@ -54,10 +65,15 @@ function extractSvgAttrs(svgContent) {
54
65
  if (!svgTagMatch)
55
66
  return attrs;
56
67
  const attrString = svgTagMatch[1];
57
- const attrRegex = /(\w[\w-]*)=["']([^"']*?)["']/g;
68
+ // Match simple attributes but also capture any namespace prefix (e.g. xml:space, xmlns:xlink)
69
+ const attrRegex = /([\w:-]+)=["']([^"']*?)["']/g;
58
70
  let match;
59
71
  while ((match = attrRegex.exec(attrString)) !== null) {
60
- const name = match[1].toLowerCase();
72
+ const raw = match[1];
73
+ // Skip namespaced attributes (xml:space, xmlns:xlink) and known non-visual attrs
74
+ if (raw.includes(':'))
75
+ continue;
76
+ const name = raw.toLowerCase();
61
77
  if (name !== 'xmlns' && name !== 'version' && name !== 'class' && name !== 'style') {
62
78
  attrs[name] = match[2];
63
79
  }
@@ -119,7 +135,16 @@ function svgSpriteLoader(content) {
119
135
  const spriteModulePath = path.join(runtimeDir, 'browser-sprite').replace(/\\/g, '\\\\');
120
136
  if (extract) {
121
137
  const spriteFilename = options.spriteFilename || 'sprite.svg';
122
- const publicPath = options.publicPath || '';
138
+ let publicPath = options.publicPath || '';
139
+ if (!publicPath && this._compiler && this._compiler.options && this._compiler.options.output) {
140
+ const outputPublicPath = this._compiler.options.output.publicPath;
141
+ if (typeof outputPublicPath === 'string' && outputPublicPath !== 'auto') {
142
+ publicPath = outputPublicPath;
143
+ }
144
+ }
145
+ if (publicPath && !publicPath.endsWith('/')) {
146
+ publicPath += '/';
147
+ }
123
148
  const symbolData = {
124
149
  id: symbolId,
125
150
  viewBox: viewBox,
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAI1D,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD,cAAM,eAAe;IACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;gBAEjB,GAAG,CAAC,EAAE,YAAY;IAK9B,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IASvC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IAuC7C,KAAK,GAAI,UAAU,QAAQ,KAAG,IAAI,CA4ChC;CACH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAOvD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAa,GAAG,GAAG,CAS7F;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAC;AAI1D,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD,cAAM,eAAe;IACZ,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;gBAEjB,GAAG,CAAC,EAAE,YAAY;IAK9B,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IA6BvC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IA2C7C,KAAK,GAAI,UAAU,QAAQ,KAAG,IAAI,CA6ChC;CACH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,QAOvD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAa,GAAG,GAAG,CAS7F;AAED,eAAe,eAAe,CAAC"}
package/dist/plugin.js CHANGED
@@ -19,6 +19,7 @@ class SvgSpritePlugin {
19
19
  constructor(cfg) {
20
20
  this.apply = (compiler) => {
21
21
  compiler.hooks.thisCompilation.tap(NAMESPACE, (compilation) => {
22
+ this.symbols = [];
22
23
  compilation[NAMESPACE] = this;
23
24
  compilation.hooks.processAssets.tap({
24
25
  name: NAMESPACE,
@@ -64,6 +65,22 @@ class SvgSpritePlugin {
64
65
  addSymbol(symbolData) {
65
66
  const existing = this.symbols.findIndex((s) => s.id === symbolData.id);
66
67
  if (existing >= 0) {
68
+ const prev = this.symbols[existing];
69
+ if (prev.resourcePath &&
70
+ symbolData.resourcePath &&
71
+ prev.resourcePath !== symbolData.resourcePath) {
72
+ console.warn('[rspack-plugin-svg-sprite] Duplicate symbol ID "' +
73
+ symbolData.id +
74
+ '" from:\n' +
75
+ ' - ' +
76
+ prev.resourcePath +
77
+ '\n' +
78
+ ' - ' +
79
+ symbolData.resourcePath +
80
+ '\n' +
81
+ 'The second file will overwrite the first. Use a symbolId pattern like ' +
82
+ '"[folder]-[name]" to avoid collisions.');
83
+ }
67
84
  this.symbols[existing] = symbolData;
68
85
  }
69
86
  else {
@@ -71,19 +88,22 @@ class SvgSpritePlugin {
71
88
  }
72
89
  }
73
90
  generateSprite(symbols) {
74
- let attrs = 'xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"';
91
+ let attrs = 'xmlns="http://www.w3.org/2000/svg"';
75
92
  Object.keys(this.config.spriteAttrs).forEach((key) => {
76
93
  attrs += ' ' + key + '="' + this.config.spriteAttrs[key] + '"';
77
94
  });
95
+ const symbolsContent = symbols.map((s) => s.content).join('\n');
96
+ if (this.config.plainSprite) {
97
+ return '<svg ' + attrs + '>\n' + symbolsContent + '\n</svg>';
98
+ }
78
99
  const styles = '<style>\n' +
79
100
  ' .sprite-symbol-usage {display: none;}\n' +
80
101
  ' .sprite-symbol-usage:target {display: inline;}\n' +
81
102
  ' </style>';
82
- const symbolsContent = symbols.map((s) => s.content).join('\n');
83
103
  const usages = symbols
84
104
  .map((s) => '<use id="' +
85
105
  s.id +
86
- '-usage" xlink:href="#' +
106
+ '-usage" href="#' +
87
107
  s.id +
88
108
  '" width="100%" height="100%" class="sprite-symbol-usage" />')
89
109
  .join('\n');
@@ -101,7 +121,7 @@ class SvgSpritePlugin {
101
121
  function FallbackRawSource(str) {
102
122
  this._value = str;
103
123
  this.source = () => str;
104
- this.size = () => str.length;
124
+ this.size = () => Buffer.byteLength(str, 'utf8');
105
125
  this.buffer = () => Buffer.from(str);
106
126
  this.map = () => null;
107
127
  this.sourceAndMap = () => ({ source: str, map: null });
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { RsbuildPlugin } from '@rsbuild/core';
2
+ export interface SvgSpritePluginOptions {
3
+ symbolId?: string | ((resourcePath: string) => string);
4
+ extract?: boolean;
5
+ esModule?: boolean;
6
+ spriteFilename?: string;
7
+ publicPath?: string;
8
+ plainSprite?: boolean;
9
+ spriteAttrs?: Record<string, string>;
10
+ include?: RegExp | string;
11
+ exclude?: RegExp | string;
12
+ }
13
+ /** Returns true when a RegExp targets only .svg files (not a compound pattern). */
14
+ export declare function isSvgOnlyPattern(re: RegExp): boolean;
15
+ export declare function pluginSvgSprite(options?: SvgSpritePluginOptions): RsbuildPlugin;
16
+ //# sourceMappingURL=rsbuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsbuild.d.ts","sourceRoot":"","sources":["../src/rsbuild.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa,CAkDnF"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isSvgOnlyPattern = isSvgOnlyPattern;
40
+ exports.pluginSvgSprite = pluginSvgSprite;
41
+ const path = __importStar(require("path"));
42
+ const plugin_1 = __importDefault(require("./plugin"));
43
+ /** Returns true when a RegExp targets only .svg files (not a compound pattern). */
44
+ function isSvgOnlyPattern(re) {
45
+ // Compound patterns use | for alternation (e.g. /\.(svg|png)$/).
46
+ // If the source contains |, it matches more than just SVG — keep the rule.
47
+ return !re.source.includes('|');
48
+ }
49
+ function pluginSvgSprite(options = {}) {
50
+ const { plainSprite, spriteAttrs, include, exclude, ...loaderOptions } = options;
51
+ return {
52
+ name: 'rsbuild-plugin-svg-sprite',
53
+ setup(api) {
54
+ api.modifyRspackConfig((config) => {
55
+ config.module = config.module || {};
56
+ config.module.rules = config.module.rules || [];
57
+ // Remove existing SVG-only rules to avoid conflicts.
58
+ // Rules with compound patterns (e.g. /\.(svg|png)$/) are kept to avoid
59
+ // breaking non-SVG file handling — users should use include/exclude instead.
60
+ config.module.rules = config.module.rules.filter((rule) => {
61
+ if (!rule || typeof rule !== 'object')
62
+ return true;
63
+ const test = rule.test;
64
+ if (typeof test === 'string')
65
+ return test !== '.svg';
66
+ if (test instanceof RegExp && test.test('.svg')) {
67
+ // Only remove rules that exclusively target SVG files.
68
+ // Compound patterns like /\.(svg|png|jpg)$/ are kept intact.
69
+ return !isSvgOnlyPattern(test);
70
+ }
71
+ return true;
72
+ });
73
+ const svgRule = {
74
+ test: /\.svg$/,
75
+ type: 'javascript/auto',
76
+ loader: path.join(__dirname, 'loader.js'),
77
+ options: {
78
+ symbolId: loaderOptions.symbolId || '[name]',
79
+ extract: loaderOptions.extract || false,
80
+ esModule: loaderOptions.esModule !== false,
81
+ spriteFilename: loaderOptions.spriteFilename || 'sprite.svg',
82
+ publicPath: loaderOptions.publicPath || '',
83
+ },
84
+ };
85
+ if (include)
86
+ svgRule.include = include;
87
+ if (exclude)
88
+ svgRule.exclude = exclude;
89
+ config.module.rules.push(svgRule);
90
+ if (loaderOptions.extract) {
91
+ config.plugins = config.plugins || [];
92
+ config.plugins.push(new plugin_1.default({ plainSprite, spriteAttrs }));
93
+ }
94
+ });
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=rsbuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsbuild.js","sourceRoot":"","sources":["../src/rsbuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,4CAIC;AAED,0CAkDC;AAzED,2CAA6B;AAE7B,sDAAuC;AAcvC,mFAAmF;AACnF,SAAgB,gBAAgB,CAAC,EAAU;IACzC,iEAAiE;IACjE,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,eAAe,CAAC,UAAkC,EAAE;IAClE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAEjF,OAAO;QACL,IAAI,EAAE,2BAA2B;QACjC,KAAK,CAAC,GAAG;YACP,GAAG,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,EAAE;gBAChC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;gBAEhD,qDAAqD;gBACrD,uEAAuE;gBACvE,6EAA6E;gBAC7E,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;oBAC7D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;wBAAE,OAAO,IAAI,CAAC;oBACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;oBACvB,IAAI,OAAO,IAAI,KAAK,QAAQ;wBAAE,OAAO,IAAI,KAAK,MAAM,CAAC;oBACrD,IAAI,IAAI,YAAY,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBAChD,uDAAuD;wBACvD,6DAA6D;wBAC7D,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAQ;oBACnB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,iBAA0B;oBAChC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;oBACzC,OAAO,EAAE;wBACP,QAAQ,EAAE,aAAa,CAAC,QAAQ,IAAI,QAAQ;wBAC5C,OAAO,EAAE,aAAa,CAAC,OAAO,IAAI,KAAK;wBACvC,QAAQ,EAAE,aAAa,CAAC,QAAQ,KAAK,KAAK;wBAC1C,cAAc,EAAE,aAAa,CAAC,cAAc,IAAI,YAAY;wBAC5D,UAAU,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;qBAC3C;iBACF,CAAC;gBAEF,IAAI,OAAO;oBAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;gBACvC,IAAI,OAAO;oBAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;gBAEvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAElC,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC1B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;oBACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAe,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser-sprite.d.ts","sourceRoot":"","sources":["../../src/runtime/browser-sprite.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAkBD,iBAAS,KAAK,IAAI,IAAI,CASrB;AAWD,iBAAS,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAK1C;AAED,oDAAoD;AACpD,iBAAS,MAAM,IAAI,IAAI,CAItB;AAED,gEAAgE;AAChE,iBAAS,SAAS,IAAI,IAAI,CAQzB;;;;;;;AAID,wBAAiD"}
1
+ {"version":3,"file":"browser-sprite.d.ts","sourceRoot":"","sources":["../../src/runtime/browser-sprite.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAiBD,iBAAS,KAAK,IAAI,IAAI,CASrB;AAWD,iBAAS,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,CAO1C;AAED,oDAAoD;AACpD,iBAAS,MAAM,IAAI,IAAI,CAItB;AAED,gEAAgE;AAChE,iBAAS,SAAS,IAAI,IAAI,CAQzB;;;;;;;AAID,wBAAiD"}
@@ -6,7 +6,6 @@ let isMounted = false;
6
6
  function createSpriteElement() {
7
7
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
8
8
  svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
9
- svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
10
9
  svg.style.position = 'absolute';
11
10
  svg.style.width = '0';
12
11
  svg.style.height = '0';
@@ -25,7 +24,7 @@ function mount() {
25
24
  });
26
25
  }
27
26
  function appendSymbolToSprite(symbolData) {
28
- const existing = sprite.querySelector('#' + symbolData.id);
27
+ const existing = sprite.getElementById(symbolData.id);
29
28
  if (existing) {
30
29
  existing.outerHTML = symbolData.content;
31
30
  }
@@ -34,6 +33,9 @@ function appendSymbolToSprite(symbolData) {
34
33
  }
35
34
  }
36
35
  function add(symbolData) {
36
+ // Skip in SSR/Node.js to prevent memory leaks across requests
37
+ if (typeof document === 'undefined')
38
+ return;
37
39
  symbols[symbolData.id] = symbolData;
38
40
  if (isMounted) {
39
41
  appendSymbolToSprite(symbolData);
@@ -1 +1 @@
1
- {"version":3,"file":"browser-sprite.js","sourceRoot":"","sources":["../../src/runtime/browser-sprite.ts"],"names":[],"mappings":";;AAKA,IAAI,OAAO,GAAgC,EAAE,CAAC;AAC9C,IAAI,MAAM,GAAyB,IAAI,CAAC;AACxC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAC1E,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IACxD,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;IAChE,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;IACtB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACvB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK;IACZ,IAAI,SAAS;QAAE,OAAO;IACtB,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,SAAS,GAAG,IAAI,CAAC;IAEjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAClC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAuB;IACnD,MAAM,QAAQ,GAAG,MAAO,CAAC,aAAa,CAAC,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,UAAuB;IAClC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;IACpC,IAAI,SAAS,EAAE,CAAC;QACd,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,MAAM;IACb,OAAO,GAAG,EAAE,CAAC;IACb,MAAM,GAAG,IAAI,CAAC;IACd,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,gEAAgE;AAChE,SAAS,SAAS;IAChB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,EAAE,CAAC;AAEZ,kBAAe,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"browser-sprite.js","sourceRoot":"","sources":["../../src/runtime/browser-sprite.ts"],"names":[],"mappings":";;AAKA,IAAI,OAAO,GAAgC,EAAE,CAAC;AAC9C,IAAI,MAAM,GAAyB,IAAI,CAAC;AACxC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAC1E,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IACxD,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;IACtB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACvB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK;IACZ,IAAI,SAAS;QAAE,OAAO;IACtB,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,SAAS,GAAG,IAAI,CAAC;IAEjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAClC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAuB;IACnD,MAAM,QAAQ,GAAG,MAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,UAAuB;IAClC,8DAA8D;IAC9D,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;IACpC,IAAI,SAAS,EAAE,CAAC;QACd,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,SAAS,MAAM;IACb,OAAO,GAAG,EAAE,CAAC;IACb,MAAM,GAAG,IAAI,CAAC;IACd,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,gEAAgE;AAChE,SAAS,SAAS;IAChB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,EAAE,CAAC;AAEZ,kBAAe,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rspack-plugin-svg-sprite",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "SVG sprite loader and plugin for Rspack — drop-in replacement for svg-sprite-loader with inline and extract mode support",
5
5
  "author": "Yichen Zhu",
6
6
  "license": "MIT",
@@ -16,20 +16,29 @@
16
16
  "rspack",
17
17
  "rspack-plugin",
18
18
  "rspack-loader",
19
+ "rsbuild",
20
+ "rsbuild-plugin",
19
21
  "svg",
20
22
  "svg-sprite",
21
23
  "svg-sprite-loader",
22
24
  "svg-icon",
25
+ "svg-icons",
23
26
  "sprite",
24
27
  "sprite-sheet",
25
28
  "icon",
29
+ "icon-system",
26
30
  "loader",
27
31
  "plugin",
32
+ "bundler-plugin",
28
33
  "webpack",
29
34
  "webpack5",
30
35
  "extract",
31
36
  "inline",
32
- "symbol"
37
+ "symbol",
38
+ "react",
39
+ "vue",
40
+ "migration",
41
+ "drop-in"
33
42
  ],
34
43
  "main": "dist/index.js",
35
44
  "types": "dist/index.d.ts",
@@ -53,10 +62,18 @@
53
62
  "./runtime/symbol": {
54
63
  "types": "./dist/runtime/symbol.d.ts",
55
64
  "default": "./dist/runtime/symbol.js"
65
+ },
66
+ "./rsbuild": {
67
+ "types": "./dist/rsbuild.d.ts",
68
+ "default": "./dist/rsbuild.js"
69
+ },
70
+ "./client": {
71
+ "types": "./client.d.ts"
56
72
  }
57
73
  },
58
74
  "files": [
59
75
  "dist/",
76
+ "client.d.ts",
60
77
  "README.md",
61
78
  "LICENSE"
62
79
  ],
@@ -75,11 +92,15 @@
75
92
  "prepare": "husky"
76
93
  },
77
94
  "peerDependencies": {
78
- "@rspack/core": ">=0.5.0"
95
+ "@rspack/core": ">=0.5.0",
96
+ "@rsbuild/core": ">=1.0.0"
79
97
  },
80
98
  "peerDependenciesMeta": {
81
99
  "@rspack/core": {
82
100
  "optional": true
101
+ },
102
+ "@rsbuild/core": {
103
+ "optional": true
83
104
  }
84
105
  },
85
106
  "devDependencies": {