@rsbuild/plugin-svgr 1.0.3 → 1.0.4

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/dist/index.cjs CHANGED
@@ -1,175 +1,216 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- PLUGIN_SVGR_NAME: () => PLUGIN_SVGR_NAME,
34
- pluginSvgr: () => pluginSvgr
2
+ // The require scope
3
+ var __webpack_require__ = {};
4
+ /************************************************************************/ // webpack/runtime/compat_get_default_export
5
+ (()=>{
6
+ // getDefaultExport function for compatibility with non-harmony modules
7
+ __webpack_require__.n = function(module) {
8
+ var getter = module && module.__esModule ? function() {
9
+ return module['default'];
10
+ } : function() {
11
+ return module;
12
+ };
13
+ __webpack_require__.d(getter, {
14
+ a: getter
15
+ });
16
+ return getter;
17
+ };
18
+ })();
19
+ // webpack/runtime/define_property_getters
20
+ (()=>{
21
+ __webpack_require__.d = function(exports1, definition) {
22
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
23
+ enumerable: true,
24
+ get: definition[key]
25
+ });
26
+ };
27
+ })();
28
+ // webpack/runtime/has_own_property
29
+ (()=>{
30
+ __webpack_require__.o = function(obj, prop) {
31
+ return Object.prototype.hasOwnProperty.call(obj, prop);
32
+ };
33
+ })();
34
+ // webpack/runtime/make_namespace_object
35
+ (()=>{
36
+ // define __esModule on exports
37
+ __webpack_require__.r = function(exports1) {
38
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
39
+ value: 'Module'
40
+ });
41
+ Object.defineProperty(exports1, '__esModule', {
42
+ value: true
43
+ });
44
+ };
45
+ })();
46
+ /************************************************************************/ var __webpack_exports__ = {};
47
+ // ESM COMPAT FLAG
48
+ __webpack_require__.r(__webpack_exports__);
49
+ // EXPORTS
50
+ __webpack_require__.d(__webpack_exports__, {
51
+ PLUGIN_SVGR_NAME: ()=>/* binding */ PLUGIN_SVGR_NAME,
52
+ pluginSvgr: ()=>/* binding */ pluginSvgr
35
53
  });
36
- module.exports = __toCommonJS(src_exports);
37
- var import_node_path = __toESM(require("path"));
38
- var import_plugin_react = require("@rsbuild/plugin-react");
39
- var import_deepmerge = __toESM(require("deepmerge"));
40
- var SVG_REGEX = /\.svg$/;
41
- var getSvgoDefaultConfig = () => ({
42
- plugins: [
43
- {
44
- name: "preset-default",
45
- params: {
46
- overrides: {
47
- // viewBox is required to resize SVGs with CSS.
48
- // @see https://github.com/svg/svgo/issues/1128
49
- removeViewBox: false
50
- }
51
- }
52
- },
53
- "prefixIds"
54
- ]
55
- });
56
- var dedupeSvgoPlugins = (config) => {
57
- if (!config.plugins) {
58
- return config;
59
- }
60
- let mergedPlugins = [];
61
- for (const plugin of config.plugins) {
62
- if (typeof plugin === "string") {
63
- const exist = mergedPlugins.find(
64
- (item) => item === plugin || typeof item === "object" && item.name === plugin
65
- );
66
- if (!exist) {
67
- mergedPlugins.push(plugin);
68
- }
69
- continue;
70
- }
71
- const strIndex = mergedPlugins.findIndex(
72
- (item) => typeof item === "string" && item === plugin.name
73
- );
74
- if (strIndex !== -1) {
75
- mergedPlugins[strIndex] = plugin;
76
- continue;
77
- }
78
- let isMerged = false;
79
- mergedPlugins = mergedPlugins.map((item) => {
80
- if (typeof item === "object" && item.name === plugin.name) {
81
- isMerged = true;
82
- return (0, import_deepmerge.default)(item, plugin);
83
- }
84
- return item;
54
+ const external_node_path_namespaceObject = require("node:path");
55
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
56
+ const plugin_react_namespaceObject = require("@rsbuild/plugin-react");
57
+ const external_deepmerge_namespaceObject = require("deepmerge");
58
+ var external_deepmerge_default = /*#__PURE__*/ __webpack_require__.n(external_deepmerge_namespaceObject);
59
+ const SVG_REGEX = /\.svg$/;
60
+ const getSvgoDefaultConfig = ()=>({
61
+ plugins: [
62
+ {
63
+ name: 'preset-default',
64
+ params: {
65
+ overrides: {
66
+ // viewBox is required to resize SVGs with CSS.
67
+ // @see https://github.com/svg/svgo/issues/1128
68
+ removeViewBox: false
69
+ }
70
+ }
71
+ },
72
+ 'prefixIds'
73
+ ]
85
74
  });
86
- if (!isMerged) {
87
- mergedPlugins.push(plugin);
88
- }
89
- }
90
- config.plugins = mergedPlugins;
91
- return config;
92
- };
93
- var PLUGIN_SVGR_NAME = "rsbuild:svgr";
94
- var pluginSvgr = (options = {}) => ({
95
- name: PLUGIN_SVGR_NAME,
96
- pre: [import_plugin_react.PLUGIN_REACT_NAME],
97
- setup(api) {
98
- api.modifyBundlerChain(async (chain, { CHAIN_ID, environment }) => {
99
- const { config } = environment;
100
- const { dataUriLimit } = config.output;
101
- const maxSize = typeof dataUriLimit === "number" ? dataUriLimit : dataUriLimit.svg;
102
- let generatorOptions = {};
103
- if (chain.module.rules.has(CHAIN_ID.RULE.SVG)) {
104
- generatorOptions = chain.module.rules.get(CHAIN_ID.RULE.SVG).oneOfs.get(CHAIN_ID.ONE_OF.SVG_URL).get("generator");
105
- chain.module.rules.delete(CHAIN_ID.RULE.SVG);
106
- }
107
- const rule = chain.module.rule(CHAIN_ID.RULE.SVG).test(SVG_REGEX);
108
- const svgrOptions = (0, import_deepmerge.default)(
109
- {
110
- svgo: true,
111
- svgoConfig: getSvgoDefaultConfig()
112
- },
113
- options.svgrOptions || {}
114
- );
115
- svgrOptions.svgoConfig = dedupeSvgoPlugins(svgrOptions.svgoConfig);
116
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_URL).type("asset/resource").resourceQuery(/(__inline=false|url)/).set("generator", generatorOptions);
117
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_INLINE).type("asset/inline").resourceQuery(/inline/);
118
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_REACT).type("javascript/auto").resourceQuery(options.query || /react/).use(CHAIN_ID.USE.SVGR).loader(import_node_path.default.resolve(__dirname, "./loader.cjs")).options({
119
- ...svgrOptions,
120
- exportType: "default"
121
- }).end();
122
- const { mixedImport = false } = options;
123
- if (mixedImport || svgrOptions.exportType) {
124
- const { exportType = mixedImport ? "named" : void 0 } = svgrOptions;
125
- const issuerInclude = [
126
- /\.(?:js|jsx|mjs|cjs|ts|tsx|mts|cts)$/,
127
- /\.mdx$/
128
- ];
129
- const issuer = options.excludeImporter ? { and: [issuerInclude, { not: options.excludeImporter }] } : issuerInclude;
130
- const svgRule = rule.oneOf(CHAIN_ID.ONE_OF.SVG);
131
- if (options.exclude) {
132
- svgRule.exclude.add(options.exclude);
133
- }
134
- svgRule.type("javascript/auto").set("issuer", issuer).use(CHAIN_ID.USE.SVGR).loader(import_node_path.default.resolve(__dirname, "./loader.cjs")).options({
135
- ...svgrOptions,
136
- exportType
137
- }).end();
138
- if (mixedImport && exportType === "named") {
139
- svgRule.use(CHAIN_ID.USE.URL).loader(import_node_path.default.join(__dirname, "../compiled", "url-loader/index.js")).options({
140
- limit: maxSize,
141
- name: generatorOptions?.filename
142
- });
143
- }
144
- }
145
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_ASSET).type("asset").parser({
146
- // Inline SVG if size < maxSize
147
- dataUrlCondition: {
148
- maxSize
149
- }
150
- }).set("generator", generatorOptions);
151
- const jsRule = chain.module.rules.get(CHAIN_ID.RULE.JS);
152
- [CHAIN_ID.USE.SWC, CHAIN_ID.USE.BABEL].some((jsUseId) => {
153
- const use = jsRule.uses.get(jsUseId);
154
- if (!use) {
155
- return false;
75
+ /**
76
+ * Dedupe SVGO plugins config.
77
+ *
78
+ * @example
79
+ * Input:
80
+ * {
81
+ * plugins: [
82
+ * { name: 'preset-default', params: { foo: true }],
83
+ * { name: 'preset-default', params: { bar: true }],
84
+ * ]
85
+ * }
86
+ * Output:
87
+ * {
88
+ * plugins: [
89
+ * { name: 'preset-default', params: { foo: true, bar: true }],
90
+ * ]
91
+ * }
92
+ */ const dedupeSvgoPlugins = (config)=>{
93
+ if (!config.plugins) return config;
94
+ let mergedPlugins = [];
95
+ for (const plugin of config.plugins){
96
+ if ('string' == typeof plugin) {
97
+ const exist = mergedPlugins.find((item)=>item === plugin || 'object' == typeof item && item.name === plugin);
98
+ if (!exist) mergedPlugins.push(plugin);
99
+ continue;
156
100
  }
157
- for (const oneOfId of [
158
- CHAIN_ID.ONE_OF.SVG,
159
- CHAIN_ID.ONE_OF.SVG_REACT
160
- ]) {
161
- if (!rule.oneOfs.has(oneOfId)) {
101
+ const strIndex = mergedPlugins.findIndex((item)=>'string' == typeof item && item === plugin.name);
102
+ if (-1 !== strIndex) {
103
+ mergedPlugins[strIndex] = plugin;
162
104
  continue;
163
- }
164
- rule.oneOf(oneOfId).use(jsUseId).before(CHAIN_ID.USE.SVGR).loader(use.get("loader")).options(use.get("options"));
165
105
  }
166
- return true;
167
- });
168
- });
169
- }
170
- });
171
- // Annotate the CommonJS export names for ESM import in node:
172
- 0 && (module.exports = {
173
- PLUGIN_SVGR_NAME,
174
- pluginSvgr
106
+ let isMerged = false;
107
+ mergedPlugins = mergedPlugins.map((item)=>{
108
+ if ('object' == typeof item && item.name === plugin.name) {
109
+ isMerged = true;
110
+ return external_deepmerge_default()(item, plugin);
111
+ }
112
+ return item;
113
+ });
114
+ if (!isMerged) mergedPlugins.push(plugin);
115
+ }
116
+ config.plugins = mergedPlugins;
117
+ return config;
118
+ };
119
+ const PLUGIN_SVGR_NAME = 'rsbuild:svgr';
120
+ const pluginSvgr = function() {
121
+ let options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
122
+ return {
123
+ name: PLUGIN_SVGR_NAME,
124
+ pre: [
125
+ plugin_react_namespaceObject.PLUGIN_REACT_NAME
126
+ ],
127
+ setup (api) {
128
+ api.modifyBundlerChain(async (chain, param)=>{
129
+ let { CHAIN_ID, environment } = param;
130
+ const { config } = environment;
131
+ const { dataUriLimit } = config.output;
132
+ const maxSize = 'number' == typeof dataUriLimit ? dataUriLimit : dataUriLimit.svg;
133
+ let generatorOptions = {};
134
+ if (chain.module.rules.has(CHAIN_ID.RULE.SVG)) {
135
+ generatorOptions = chain.module.rules.get(CHAIN_ID.RULE.SVG).oneOfs.get(CHAIN_ID.ONE_OF.SVG_URL).get('generator');
136
+ // delete Rsbuild builtin SVG rules
137
+ chain.module.rules.delete(CHAIN_ID.RULE.SVG);
138
+ }
139
+ const rule = chain.module.rule(CHAIN_ID.RULE.SVG).test(SVG_REGEX);
140
+ const svgrOptions = external_deepmerge_default()({
141
+ svgo: true,
142
+ svgoConfig: getSvgoDefaultConfig()
143
+ }, options.svgrOptions || {});
144
+ svgrOptions.svgoConfig = dedupeSvgoPlugins(svgrOptions.svgoConfig);
145
+ // force to url: "foo.svg?url",
146
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_URL).type('asset/resource').resourceQuery(/(__inline=false|url)/).set('generator', generatorOptions);
147
+ // force to inline: "foo.svg?inline"
148
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_INLINE).type('asset/inline').resourceQuery(/inline/);
149
+ // force to react component: "foo.svg?react"
150
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_REACT).type('javascript/auto').resourceQuery(options.query || /react/).use(CHAIN_ID.USE.SVGR).loader(external_node_path_default().resolve(__dirname, './loader.cjs')).options({
151
+ ...svgrOptions,
152
+ exportType: 'default'
153
+ }).end();
154
+ // SVG in JS files
155
+ const { mixedImport = false } = options;
156
+ if (mixedImport || svgrOptions.exportType) {
157
+ const { exportType = mixedImport ? 'named' : void 0 } = svgrOptions;
158
+ const issuerInclude = [
159
+ /\.(?:js|jsx|mjs|cjs|ts|tsx|mts|cts)$/,
160
+ /\.mdx$/
161
+ ];
162
+ const issuer = options.excludeImporter ? {
163
+ and: [
164
+ issuerInclude,
165
+ {
166
+ not: options.excludeImporter
167
+ }
168
+ ]
169
+ } : issuerInclude;
170
+ const svgRule = rule.oneOf(CHAIN_ID.ONE_OF.SVG);
171
+ if (options.exclude) svgRule.exclude.add(options.exclude);
172
+ svgRule.type('javascript/auto') // The issuer option ensures that SVGR will only apply if the SVG is imported from a JS file.
173
+ .set('issuer', issuer).use(CHAIN_ID.USE.SVGR).loader(external_node_path_default().resolve(__dirname, './loader.cjs')).options({
174
+ ...svgrOptions,
175
+ exportType
176
+ }).end();
177
+ /**
178
+ * For mixed import.
179
+ * @example import logoUrl, { ReactComponent } from './logo.svg';`
180
+ */ if (mixedImport && 'named' === exportType) svgRule.use(CHAIN_ID.USE.URL).loader(external_node_path_default().join(__dirname, '../compiled', 'url-loader/index.js')).options({
181
+ limit: maxSize,
182
+ name: null == generatorOptions ? void 0 : generatorOptions.filename
183
+ });
184
+ }
185
+ // SVG as assets
186
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_ASSET).type('asset').parser({
187
+ // Inline SVG if size < maxSize
188
+ dataUrlCondition: {
189
+ maxSize
190
+ }
191
+ }).set('generator', generatorOptions);
192
+ // apply current JS transform rule to SVGR rules
193
+ const jsRule = chain.module.rules.get(CHAIN_ID.RULE.JS);
194
+ [
195
+ CHAIN_ID.USE.SWC,
196
+ CHAIN_ID.USE.BABEL
197
+ ].some((jsUseId)=>{
198
+ const use = jsRule.uses.get(jsUseId);
199
+ if (!use) return false;
200
+ for (const oneOfId of [
201
+ CHAIN_ID.ONE_OF.SVG,
202
+ CHAIN_ID.ONE_OF.SVG_REACT
203
+ ]){
204
+ if (!!rule.oneOfs.has(oneOfId)) rule.oneOf(oneOfId).use(jsUseId).before(CHAIN_ID.USE.SVGR).loader(use.get('loader')).options(use.get('options'));
205
+ }
206
+ return true;
207
+ });
208
+ });
209
+ }
210
+ };
211
+ };
212
+ var __webpack_export_target__ = exports;
213
+ for(var i in __webpack_exports__)__webpack_export_target__[i] = __webpack_exports__[i];
214
+ if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
215
+ value: true
175
216
  });
package/dist/index.js CHANGED
@@ -1,150 +1,160 @@
1
- import { createRequire } from 'module';
2
- var require = createRequire(import.meta['url']);
3
-
4
-
5
- // ../../node_modules/.pnpm/@modern-js+module-tools@2.60.1_typescript@5.5.2/node_modules/@modern-js/module-tools/shims/esm.js
6
- import path from "path";
7
- import { fileURLToPath } from "url";
8
- var getFilename = () => fileURLToPath(import.meta.url);
9
- var getDirname = () => path.dirname(getFilename());
10
- var __dirname = /* @__PURE__ */ getDirname();
11
-
12
- // src/index.ts
13
- import path2 from "path";
14
- import { PLUGIN_REACT_NAME } from "@rsbuild/plugin-react";
15
- import deepmerge from "deepmerge";
16
- var SVG_REGEX = /\.svg$/;
17
- var getSvgoDefaultConfig = () => ({
18
- plugins: [
19
- {
20
- name: "preset-default",
21
- params: {
22
- overrides: {
23
- // viewBox is required to resize SVGs with CSS.
24
- // @see https://github.com/svg/svgo/issues/1128
25
- removeViewBox: false
26
- }
27
- }
28
- },
29
- "prefixIds"
30
- ]
31
- });
32
- var dedupeSvgoPlugins = (config) => {
33
- if (!config.plugins) {
34
- return config;
35
- }
36
- let mergedPlugins = [];
37
- for (const plugin of config.plugins) {
38
- if (typeof plugin === "string") {
39
- const exist = mergedPlugins.find(
40
- (item) => item === plugin || typeof item === "object" && item.name === plugin
41
- );
42
- if (!exist) {
43
- mergedPlugins.push(plugin);
44
- }
45
- continue;
46
- }
47
- const strIndex = mergedPlugins.findIndex(
48
- (item) => typeof item === "string" && item === plugin.name
49
- );
50
- if (strIndex !== -1) {
51
- mergedPlugins[strIndex] = plugin;
52
- continue;
53
- }
54
- let isMerged = false;
55
- mergedPlugins = mergedPlugins.map((item) => {
56
- if (typeof item === "object" && item.name === plugin.name) {
57
- isMerged = true;
58
- return deepmerge(item, plugin);
59
- }
60
- return item;
1
+ import { fileURLToPath as __webpack_fileURLToPath__ } from "url";
2
+ import { dirname as __webpack_dirname__ } from "path";
3
+ import * as __WEBPACK_EXTERNAL_MODULE_node_path__ from "node:path";
4
+ import * as __WEBPACK_EXTERNAL_MODULE__rsbuild_plugin_react__ from "@rsbuild/plugin-react";
5
+ import * as __WEBPACK_EXTERNAL_MODULE_deepmerge__ from "deepmerge";
6
+ var src_dirname = __webpack_dirname__(__webpack_fileURLToPath__(import.meta.url));
7
+ const SVG_REGEX = /\.svg$/;
8
+ const getSvgoDefaultConfig = ()=>({
9
+ plugins: [
10
+ {
11
+ name: 'preset-default',
12
+ params: {
13
+ overrides: {
14
+ // viewBox is required to resize SVGs with CSS.
15
+ // @see https://github.com/svg/svgo/issues/1128
16
+ removeViewBox: false
17
+ }
18
+ }
19
+ },
20
+ 'prefixIds'
21
+ ]
61
22
  });
62
- if (!isMerged) {
63
- mergedPlugins.push(plugin);
64
- }
65
- }
66
- config.plugins = mergedPlugins;
67
- return config;
68
- };
69
- var PLUGIN_SVGR_NAME = "rsbuild:svgr";
70
- var pluginSvgr = (options = {}) => ({
71
- name: PLUGIN_SVGR_NAME,
72
- pre: [PLUGIN_REACT_NAME],
73
- setup(api) {
74
- api.modifyBundlerChain(async (chain, { CHAIN_ID, environment }) => {
75
- const { config } = environment;
76
- const { dataUriLimit } = config.output;
77
- const maxSize = typeof dataUriLimit === "number" ? dataUriLimit : dataUriLimit.svg;
78
- let generatorOptions = {};
79
- if (chain.module.rules.has(CHAIN_ID.RULE.SVG)) {
80
- generatorOptions = chain.module.rules.get(CHAIN_ID.RULE.SVG).oneOfs.get(CHAIN_ID.ONE_OF.SVG_URL).get("generator");
81
- chain.module.rules.delete(CHAIN_ID.RULE.SVG);
82
- }
83
- const rule = chain.module.rule(CHAIN_ID.RULE.SVG).test(SVG_REGEX);
84
- const svgrOptions = deepmerge(
85
- {
86
- svgo: true,
87
- svgoConfig: getSvgoDefaultConfig()
88
- },
89
- options.svgrOptions || {}
90
- );
91
- svgrOptions.svgoConfig = dedupeSvgoPlugins(svgrOptions.svgoConfig);
92
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_URL).type("asset/resource").resourceQuery(/(__inline=false|url)/).set("generator", generatorOptions);
93
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_INLINE).type("asset/inline").resourceQuery(/inline/);
94
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_REACT).type("javascript/auto").resourceQuery(options.query || /react/).use(CHAIN_ID.USE.SVGR).loader(path2.resolve(__dirname, "./loader.cjs")).options({
95
- ...svgrOptions,
96
- exportType: "default"
97
- }).end();
98
- const { mixedImport = false } = options;
99
- if (mixedImport || svgrOptions.exportType) {
100
- const { exportType = mixedImport ? "named" : void 0 } = svgrOptions;
101
- const issuerInclude = [
102
- /\.(?:js|jsx|mjs|cjs|ts|tsx|mts|cts)$/,
103
- /\.mdx$/
104
- ];
105
- const issuer = options.excludeImporter ? { and: [issuerInclude, { not: options.excludeImporter }] } : issuerInclude;
106
- const svgRule = rule.oneOf(CHAIN_ID.ONE_OF.SVG);
107
- if (options.exclude) {
108
- svgRule.exclude.add(options.exclude);
109
- }
110
- svgRule.type("javascript/auto").set("issuer", issuer).use(CHAIN_ID.USE.SVGR).loader(path2.resolve(__dirname, "./loader.cjs")).options({
111
- ...svgrOptions,
112
- exportType
113
- }).end();
114
- if (mixedImport && exportType === "named") {
115
- svgRule.use(CHAIN_ID.USE.URL).loader(path2.join(__dirname, "../compiled", "url-loader/index.js")).options({
116
- limit: maxSize,
117
- name: generatorOptions?.filename
118
- });
119
- }
120
- }
121
- rule.oneOf(CHAIN_ID.ONE_OF.SVG_ASSET).type("asset").parser({
122
- // Inline SVG if size < maxSize
123
- dataUrlCondition: {
124
- maxSize
125
- }
126
- }).set("generator", generatorOptions);
127
- const jsRule = chain.module.rules.get(CHAIN_ID.RULE.JS);
128
- [CHAIN_ID.USE.SWC, CHAIN_ID.USE.BABEL].some((jsUseId) => {
129
- const use = jsRule.uses.get(jsUseId);
130
- if (!use) {
131
- return false;
23
+ /**
24
+ * Dedupe SVGO plugins config.
25
+ *
26
+ * @example
27
+ * Input:
28
+ * {
29
+ * plugins: [
30
+ * { name: 'preset-default', params: { foo: true }],
31
+ * { name: 'preset-default', params: { bar: true }],
32
+ * ]
33
+ * }
34
+ * Output:
35
+ * {
36
+ * plugins: [
37
+ * { name: 'preset-default', params: { foo: true, bar: true }],
38
+ * ]
39
+ * }
40
+ */ const dedupeSvgoPlugins = (config)=>{
41
+ if (!config.plugins) return config;
42
+ let mergedPlugins = [];
43
+ for (const plugin of config.plugins){
44
+ if ('string' == typeof plugin) {
45
+ const exist = mergedPlugins.find((item)=>item === plugin || 'object' == typeof item && item.name === plugin);
46
+ if (!exist) mergedPlugins.push(plugin);
47
+ continue;
132
48
  }
133
- for (const oneOfId of [
134
- CHAIN_ID.ONE_OF.SVG,
135
- CHAIN_ID.ONE_OF.SVG_REACT
136
- ]) {
137
- if (!rule.oneOfs.has(oneOfId)) {
49
+ const strIndex = mergedPlugins.findIndex((item)=>'string' == typeof item && item === plugin.name);
50
+ if (-1 !== strIndex) {
51
+ mergedPlugins[strIndex] = plugin;
138
52
  continue;
139
- }
140
- rule.oneOf(oneOfId).use(jsUseId).before(CHAIN_ID.USE.SVGR).loader(use.get("loader")).options(use.get("options"));
141
53
  }
142
- return true;
143
- });
144
- });
145
- }
146
- });
147
- export {
148
- PLUGIN_SVGR_NAME,
149
- pluginSvgr
54
+ let isMerged = false;
55
+ mergedPlugins = mergedPlugins.map((item)=>{
56
+ if ('object' == typeof item && item.name === plugin.name) {
57
+ isMerged = true;
58
+ return (0, __WEBPACK_EXTERNAL_MODULE_deepmerge__["default"])(item, plugin);
59
+ }
60
+ return item;
61
+ });
62
+ if (!isMerged) mergedPlugins.push(plugin);
63
+ }
64
+ config.plugins = mergedPlugins;
65
+ return config;
66
+ };
67
+ const PLUGIN_SVGR_NAME = 'rsbuild:svgr';
68
+ const pluginSvgr = function() {
69
+ let options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
70
+ return {
71
+ name: PLUGIN_SVGR_NAME,
72
+ pre: [
73
+ __WEBPACK_EXTERNAL_MODULE__rsbuild_plugin_react__.PLUGIN_REACT_NAME
74
+ ],
75
+ setup (api) {
76
+ api.modifyBundlerChain(async (chain, param)=>{
77
+ let { CHAIN_ID, environment } = param;
78
+ const { config } = environment;
79
+ const { dataUriLimit } = config.output;
80
+ const maxSize = 'number' == typeof dataUriLimit ? dataUriLimit : dataUriLimit.svg;
81
+ let generatorOptions = {};
82
+ if (chain.module.rules.has(CHAIN_ID.RULE.SVG)) {
83
+ generatorOptions = chain.module.rules.get(CHAIN_ID.RULE.SVG).oneOfs.get(CHAIN_ID.ONE_OF.SVG_URL).get('generator');
84
+ // delete Rsbuild builtin SVG rules
85
+ chain.module.rules.delete(CHAIN_ID.RULE.SVG);
86
+ }
87
+ const rule = chain.module.rule(CHAIN_ID.RULE.SVG).test(SVG_REGEX);
88
+ const svgrOptions = (0, __WEBPACK_EXTERNAL_MODULE_deepmerge__["default"])({
89
+ svgo: true,
90
+ svgoConfig: getSvgoDefaultConfig()
91
+ }, options.svgrOptions || {});
92
+ svgrOptions.svgoConfig = dedupeSvgoPlugins(svgrOptions.svgoConfig);
93
+ // force to url: "foo.svg?url",
94
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_URL).type('asset/resource').resourceQuery(/(__inline=false|url)/).set('generator', generatorOptions);
95
+ // force to inline: "foo.svg?inline"
96
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_INLINE).type('asset/inline').resourceQuery(/inline/);
97
+ // force to react component: "foo.svg?react"
98
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_REACT).type('javascript/auto').resourceQuery(options.query || /react/).use(CHAIN_ID.USE.SVGR).loader(__WEBPACK_EXTERNAL_MODULE_node_path__["default"].resolve(src_dirname, './loader.cjs')).options({
99
+ ...svgrOptions,
100
+ exportType: 'default'
101
+ }).end();
102
+ // SVG in JS files
103
+ const { mixedImport = false } = options;
104
+ if (mixedImport || svgrOptions.exportType) {
105
+ const { exportType = mixedImport ? 'named' : void 0 } = svgrOptions;
106
+ const issuerInclude = [
107
+ /\.(?:js|jsx|mjs|cjs|ts|tsx|mts|cts)$/,
108
+ /\.mdx$/
109
+ ];
110
+ const issuer = options.excludeImporter ? {
111
+ and: [
112
+ issuerInclude,
113
+ {
114
+ not: options.excludeImporter
115
+ }
116
+ ]
117
+ } : issuerInclude;
118
+ const svgRule = rule.oneOf(CHAIN_ID.ONE_OF.SVG);
119
+ if (options.exclude) svgRule.exclude.add(options.exclude);
120
+ svgRule.type('javascript/auto') // The issuer option ensures that SVGR will only apply if the SVG is imported from a JS file.
121
+ .set('issuer', issuer).use(CHAIN_ID.USE.SVGR).loader(__WEBPACK_EXTERNAL_MODULE_node_path__["default"].resolve(src_dirname, './loader.cjs')).options({
122
+ ...svgrOptions,
123
+ exportType
124
+ }).end();
125
+ /**
126
+ * For mixed import.
127
+ * @example import logoUrl, { ReactComponent } from './logo.svg';`
128
+ */ if (mixedImport && 'named' === exportType) svgRule.use(CHAIN_ID.USE.URL).loader(__WEBPACK_EXTERNAL_MODULE_node_path__["default"].join(src_dirname, '../compiled', 'url-loader/index.js')).options({
129
+ limit: maxSize,
130
+ name: null == generatorOptions ? void 0 : generatorOptions.filename
131
+ });
132
+ }
133
+ // SVG as assets
134
+ rule.oneOf(CHAIN_ID.ONE_OF.SVG_ASSET).type('asset').parser({
135
+ // Inline SVG if size < maxSize
136
+ dataUrlCondition: {
137
+ maxSize
138
+ }
139
+ }).set('generator', generatorOptions);
140
+ // apply current JS transform rule to SVGR rules
141
+ const jsRule = chain.module.rules.get(CHAIN_ID.RULE.JS);
142
+ [
143
+ CHAIN_ID.USE.SWC,
144
+ CHAIN_ID.USE.BABEL
145
+ ].some((jsUseId)=>{
146
+ const use = jsRule.uses.get(jsUseId);
147
+ if (!use) return false;
148
+ for (const oneOfId of [
149
+ CHAIN_ID.ONE_OF.SVG,
150
+ CHAIN_ID.ONE_OF.SVG_REACT
151
+ ]){
152
+ if (!!rule.oneOfs.has(oneOfId)) rule.oneOf(oneOfId).use(jsUseId).before(CHAIN_ID.USE.SVGR).loader(use.get('loader')).options(use.get('options'));
153
+ }
154
+ return true;
155
+ });
156
+ });
157
+ }
158
+ };
150
159
  };
160
+ export { PLUGIN_SVGR_NAME, pluginSvgr };
package/dist/loader.cjs CHANGED
@@ -1,80 +1,108 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/loader.ts
31
- var loader_exports = {};
32
- __export(loader_exports, {
33
- default: () => loader_default
2
+ // The require scope
3
+ var __webpack_require__ = {};
4
+ /************************************************************************/ // webpack/runtime/compat_get_default_export
5
+ (()=>{
6
+ // getDefaultExport function for compatibility with non-harmony modules
7
+ __webpack_require__.n = function(module) {
8
+ var getter = module && module.__esModule ? function() {
9
+ return module['default'];
10
+ } : function() {
11
+ return module;
12
+ };
13
+ __webpack_require__.d(getter, {
14
+ a: getter
15
+ });
16
+ return getter;
17
+ };
18
+ })();
19
+ // webpack/runtime/define_property_getters
20
+ (()=>{
21
+ __webpack_require__.d = function(exports1, definition) {
22
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
23
+ enumerable: true,
24
+ get: definition[key]
25
+ });
26
+ };
27
+ })();
28
+ // webpack/runtime/has_own_property
29
+ (()=>{
30
+ __webpack_require__.o = function(obj, prop) {
31
+ return Object.prototype.hasOwnProperty.call(obj, prop);
32
+ };
33
+ })();
34
+ // webpack/runtime/make_namespace_object
35
+ (()=>{
36
+ // define __esModule on exports
37
+ __webpack_require__.r = function(exports1) {
38
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
39
+ value: 'Module'
40
+ });
41
+ Object.defineProperty(exports1, '__esModule', {
42
+ value: true
43
+ });
44
+ };
45
+ })();
46
+ /************************************************************************/ var __webpack_exports__ = {};
47
+ // ESM COMPAT FLAG
48
+ __webpack_require__.r(__webpack_exports__);
49
+ // EXPORTS
50
+ __webpack_require__.d(__webpack_exports__, {
51
+ default: ()=>/* binding */ loader
34
52
  });
35
- module.exports = __toCommonJS(loader_exports);
36
- var import_node_path = require("path");
37
- var import_node_util = require("util");
38
- var import_core = require("@svgr/core");
39
- var import_plugin_jsx = __toESM(require("@svgr/plugin-jsx"));
40
- var import_plugin_svgo = __toESM(require("@svgr/plugin-svgo"));
41
- var transformSvg = (0, import_node_util.callbackify)(
42
- async (contents, config, state) => (0, import_core.transform)(contents, config, state)
43
- );
53
+ const external_node_path_namespaceObject = require("node:path");
54
+ const external_node_util_namespaceObject = require("node:util");
55
+ const core_namespaceObject = require("@svgr/core");
56
+ const plugin_jsx_namespaceObject = require("@svgr/plugin-jsx");
57
+ var plugin_jsx_default = /*#__PURE__*/ __webpack_require__.n(plugin_jsx_namespaceObject);
58
+ const plugin_svgo_namespaceObject = require("@svgr/plugin-svgo");
59
+ var plugin_svgo_default = /*#__PURE__*/ __webpack_require__.n(plugin_svgo_namespaceObject);
60
+ /**
61
+ * Copyright (c) 2017, Smooth Code
62
+ *
63
+ * This source code is licensed under the MIT license found in the
64
+ * LICENSE file in the root directory of this source tree.
65
+ * modified from https://github.com/gregberge/svgr/blob/7595d378b73d4826a4cead165b3f32386b07315b/packages/webpack/src/index.ts
66
+ */ const transformSvg = (0, external_node_util_namespaceObject.callbackify)(async (contents, config, state)=>(0, core_namespaceObject.transform)(contents, config, state));
44
67
  function svgrLoader(contents) {
45
- this?.cacheable();
46
- const callback = this.async();
47
- const options = this.getOptions();
48
- const previousExport = (() => {
49
- if (contents.startsWith("export "))
50
- return contents;
51
- const exportMatches = contents.match(/^module.exports\s*=\s*(.*)/);
52
- return exportMatches ? `export default ${exportMatches[1]}` : null;
53
- })();
54
- const state = {
55
- caller: {
56
- name: "@rsbuild/plugin-svgr",
57
- previousExport,
58
- defaultPlugins: [import_plugin_svgo.default, import_plugin_jsx.default]
59
- },
60
- filePath: (0, import_node_path.normalize)(this.resourcePath)
61
- };
62
- if (!previousExport) {
63
- transformSvg(contents, options, state, callback);
64
- } else {
65
- this.fs.readFile(this.resourcePath, (err, result) => {
66
- if (err) {
67
- callback(err);
68
- return;
69
- }
70
- transformSvg(String(result), options, state, (err2, content) => {
71
- if (err2) {
72
- callback(err2);
73
- return;
68
+ var _this;
69
+ null === (_this = this) || void 0 === _this || _this.cacheable();
70
+ const callback = this.async();
71
+ const options = this.getOptions();
72
+ const previousExport = (()=>{
73
+ if (contents.startsWith('export ')) return contents;
74
+ const exportMatches = contents.match(/^module.exports\s*=\s*(.*)/);
75
+ return exportMatches ? `export default ${exportMatches[1]}` : null;
76
+ })();
77
+ const state = {
78
+ caller: {
79
+ name: '@rsbuild/plugin-svgr',
80
+ previousExport,
81
+ defaultPlugins: [
82
+ plugin_svgo_default(),
83
+ plugin_jsx_default()
84
+ ]
85
+ },
86
+ filePath: (0, external_node_path_namespaceObject.normalize)(this.resourcePath)
87
+ };
88
+ if (previousExport) this.fs.readFile(this.resourcePath, (err, result)=>{
89
+ if (err) {
90
+ callback(err);
91
+ return;
74
92
  }
75
- callback(null, content);
76
- });
93
+ transformSvg(String(result), options, state, (err, content)=>{
94
+ if (err) {
95
+ callback(err);
96
+ return;
97
+ }
98
+ callback(null, content);
99
+ });
77
100
  });
78
- }
101
+ else transformSvg(contents, options, state, callback);
79
102
  }
80
- var loader_default = svgrLoader;
103
+ /* harmony default export */ const loader = svgrLoader;
104
+ var __webpack_export_target__ = exports;
105
+ for(var i in __webpack_exports__)__webpack_export_target__[i] = __webpack_exports__[i];
106
+ if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
107
+ value: true
108
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsbuild/plugin-svgr",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "svgr plugin for Rsbuild",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,17 +11,16 @@
11
11
  "type": "module",
12
12
  "exports": {
13
13
  ".": {
14
- "types": "./dist-types/index.d.ts",
14
+ "types": "./dist/index.d.ts",
15
15
  "import": "./dist/index.js",
16
16
  "require": "./dist/index.cjs"
17
17
  }
18
18
  },
19
19
  "main": "./dist/index.cjs",
20
- "types": "./dist-types/index.d.ts",
20
+ "types": "./dist/index.d.ts",
21
21
  "files": [
22
22
  "dist",
23
- "compiled",
24
- "dist-types"
23
+ "compiled"
25
24
  ],
26
25
  "dependencies": {
27
26
  "@svgr/core": "8.1.0",
@@ -29,16 +28,16 @@
29
28
  "@svgr/plugin-svgo": "8.1.0",
30
29
  "deepmerge": "^4.3.1",
31
30
  "loader-utils": "^2.0.4",
32
- "@rsbuild/plugin-react": "1.0.3"
31
+ "@rsbuild/plugin-react": "1.0.4"
33
32
  },
34
33
  "devDependencies": {
35
34
  "@types/node": "18.x",
36
35
  "file-loader": "6.2.0",
37
36
  "prebundle": "1.2.2",
38
37
  "svgo": "^3.3.2",
39
- "typescript": "^5.5.2",
38
+ "typescript": "^5.6.3",
40
39
  "url-loader": "4.1.1",
41
- "@rsbuild/core": "1.0.8",
40
+ "@rsbuild/core": "1.0.14",
42
41
  "@scripts/test-helper": "1.0.1"
43
42
  },
44
43
  "peerDependencies": {
@@ -50,8 +49,8 @@
50
49
  "registry": "https://registry.npmjs.org/"
51
50
  },
52
51
  "scripts": {
53
- "build": "modern build",
54
- "dev": "modern build --watch",
52
+ "build": "rslib build",
53
+ "dev": "rslib build --watch",
55
54
  "prebundle": "prebundle"
56
55
  }
57
56
  }
@@ -1 +0,0 @@
1
- {"//":"This file is for making TypeScript work with moduleResolution node16+.","version":"1.0.0"}
File without changes
File without changes