rspack-plugin-svg-sprite 1.4.0 → 1.5.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/README.md +12 -9
- package/dist/loader.d.ts +1 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +30 -5
- package/dist/loader.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +23 -3
- package/dist/plugin.js.map +1 -1
- package/dist/rsbuild.d.ts +4 -0
- package/dist/rsbuild.d.ts.map +1 -1
- package/dist/rsbuild.js +31 -3
- package/dist/rsbuild.js.map +1 -1
- package/dist/runtime/browser-sprite.d.ts.map +1 -1
- package/dist/runtime/browser-sprite.js +4 -2
- package/dist/runtime/browser-sprite.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -81,7 +81,7 @@ import logo from './logo.svg';
|
|
|
81
81
|
// logo.url → "#logo"
|
|
82
82
|
|
|
83
83
|
<svg viewBox={logo.viewBox}>
|
|
84
|
-
<use
|
|
84
|
+
<use href={logo.url} />
|
|
85
85
|
</svg>;
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -164,7 +164,7 @@ import icon from './icon.svg';
|
|
|
164
164
|
// icon.url → "/assets/sprites/icons.svg#icon-icon"
|
|
165
165
|
|
|
166
166
|
<svg viewBox={icon.viewBox}>
|
|
167
|
-
<use
|
|
167
|
+
<use href={icon.url} />
|
|
168
168
|
</svg>;
|
|
169
169
|
```
|
|
170
170
|
|
|
@@ -178,7 +178,9 @@ import icon from './icon.svg';
|
|
|
178
178
|
| `esModule` | `boolean` | `true` | Use ES module export (`export default`) vs CommonJS (`module.exports`). |
|
|
179
179
|
| `extract` | `boolean` | `false` | Enable extract mode to emit an external sprite file instead of inlining. |
|
|
180
180
|
| `spriteFilename` | `string` | `'sprite.svg'` | Output filename for the extracted sprite (extract mode only). |
|
|
181
|
-
| `publicPath` | `string` | `''` | Public URL prefix for the sprite file (extract mode only).
|
|
181
|
+
| `publicPath` | `string` | `''` | Public URL prefix for the sprite file (extract mode only). Auto-detected from `output.publicPath` if not set. |
|
|
182
|
+
| `include` | `string[]` | — | Glob patterns or directories to include (only process matching SVGs). |
|
|
183
|
+
| `exclude` | `string[]` | — | Glob patterns or directories to exclude from processing. |
|
|
182
184
|
|
|
183
185
|
### Plugin Options (Extract Mode)
|
|
184
186
|
|
|
@@ -357,7 +359,7 @@ module.exports = {
|
|
|
357
359
|
1. The loader parses each `.svg` file and wraps its content in an SVG `<symbol>` element.
|
|
358
360
|
2. It generates a JS module that imports a browser-side sprite manager.
|
|
359
361
|
3. At runtime, the sprite manager creates a hidden `<svg>` element in `document.body` and appends all symbols.
|
|
360
|
-
4. You reference symbols via `<use
|
|
362
|
+
4. You reference symbols via `<use href="#symbolId" />`.
|
|
361
363
|
|
|
362
364
|
### Extract Mode
|
|
363
365
|
|
|
@@ -393,12 +395,13 @@ Looking for the right SVG solution for Rspack? Here's how the options compare:
|
|
|
393
395
|
|
|
394
396
|
## Examples
|
|
395
397
|
|
|
396
|
-
The repository includes
|
|
398
|
+
The repository includes three runnable demo apps:
|
|
397
399
|
|
|
398
|
-
| Example
|
|
399
|
-
|
|
|
400
|
-
| [`react-rspack`](examples/react-rspack/)
|
|
401
|
-
| [`react-webpack`](examples/react-webpack/)
|
|
400
|
+
| Example | Bundler | Plugin | Port | Description |
|
|
401
|
+
| ---------------------------------------------------- | --------- | -------------------------- | ---- | ----------------------------------------------------------------- |
|
|
402
|
+
| [`react-rspack`](examples/react-rspack/) | Rspack | `rspack-plugin-svg-sprite` | 3000 | Extract mode with icon gallery, sidebar, and buttons |
|
|
403
|
+
| [`react-webpack`](examples/react-webpack/) | Webpack 5 | `svg-sprite-loader` | 4000 | Same UI using the original loader (for comparison) |
|
|
404
|
+
| [`vue-rspack-extract`](examples/vue-rspack-extract/) | Rspack | `rspack-plugin-svg-sprite` | 3002 | Vue 3 + extract mode with `plainSprite` and external `<use href>` |
|
|
402
405
|
|
|
403
406
|
**[Live demo (Rspack)](https://yichenzhu1337.github.io/rspack-plugin-svg-sprite/)** — see the plugin in action.
|
|
404
407
|
|
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;
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
@@ -75,15 +92,18 @@ class SvgSpritePlugin {
|
|
|
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<defs>\n' + symbolsContent + '\n</defs>\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"
|
|
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
|
|
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 });
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/rsbuild.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export interface SvgSpritePluginOptions {
|
|
|
7
7
|
publicPath?: string;
|
|
8
8
|
plainSprite?: boolean;
|
|
9
9
|
spriteAttrs?: Record<string, string>;
|
|
10
|
+
include?: RegExp | string;
|
|
11
|
+
exclude?: RegExp | string;
|
|
10
12
|
}
|
|
13
|
+
/** Returns true when a RegExp targets only .svg files (not a compound pattern). */
|
|
14
|
+
export declare function isSvgOnlyPattern(re: RegExp): boolean;
|
|
11
15
|
export declare function pluginSvgSprite(options?: SvgSpritePluginOptions): RsbuildPlugin;
|
|
12
16
|
//# sourceMappingURL=rsbuild.d.ts.map
|
package/dist/rsbuild.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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"}
|
package/dist/rsbuild.js
CHANGED
|
@@ -36,18 +36,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.isSvgOnlyPattern = isSvgOnlyPattern;
|
|
39
40
|
exports.pluginSvgSprite = pluginSvgSprite;
|
|
40
41
|
const path = __importStar(require("path"));
|
|
41
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
|
+
}
|
|
42
49
|
function pluginSvgSprite(options = {}) {
|
|
43
|
-
const { plainSprite, spriteAttrs, ...loaderOptions } = options;
|
|
50
|
+
const { plainSprite, spriteAttrs, include, exclude, ...loaderOptions } = options;
|
|
44
51
|
return {
|
|
45
52
|
name: 'rsbuild-plugin-svg-sprite',
|
|
46
53
|
setup(api) {
|
|
47
54
|
api.modifyRspackConfig((config) => {
|
|
48
55
|
config.module = config.module || {};
|
|
49
56
|
config.module.rules = config.module.rules || [];
|
|
50
|
-
|
|
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 = {
|
|
51
74
|
test: /\.svg$/,
|
|
52
75
|
type: 'javascript/auto',
|
|
53
76
|
loader: path.join(__dirname, 'loader.js'),
|
|
@@ -58,7 +81,12 @@ function pluginSvgSprite(options = {}) {
|
|
|
58
81
|
spriteFilename: loaderOptions.spriteFilename || 'sprite.svg',
|
|
59
82
|
publicPath: loaderOptions.publicPath || '',
|
|
60
83
|
},
|
|
61
|
-
}
|
|
84
|
+
};
|
|
85
|
+
if (include)
|
|
86
|
+
svgRule.include = include;
|
|
87
|
+
if (exclude)
|
|
88
|
+
svgRule.exclude = exclude;
|
|
89
|
+
config.module.rules.push(svgRule);
|
|
62
90
|
if (loaderOptions.extract) {
|
|
63
91
|
config.plugins = config.plugins || [];
|
|
64
92
|
config.plugins.push(new plugin_1.default({ plainSprite, spriteAttrs }));
|
package/dist/rsbuild.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsbuild.js","sourceRoot":"","sources":["../src/rsbuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;
|
|
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.
|
|
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,
|
|
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
|
+
"version": "1.5.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",
|