1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | const ORIGINAL_TEST = /\.(png|jpe?g|gif|svg|webp|avif)$/i;
|
7 | const ORIGINAL_TEST_OLD_NUXT = /\.(png|jpe?g|gif|svg|webp)$/i;
|
8 | const REPLACEMENT_TEST = /\.(png|jpe?g|gif|webp|avif)$/i;
|
9 |
|
10 | export default function svgModule (moduleOptions) {
|
11 | const options = Object.assign({}, this.options.svg, moduleOptions);
|
12 | this.extendBuild(setup.bind(this, options));
|
13 | }
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | function setup(options, config) {
|
23 | const rules = config.module.rules;
|
24 |
|
25 |
|
26 | const svgRules = rules.filter((rule) => rule.test && rule.test.test(".svg"));
|
27 |
|
28 | for (const rule of svgRules) {
|
29 | if (
|
30 | rule.test.source !== ORIGINAL_TEST.source &&
|
31 | rule.test.source !== ORIGINAL_TEST_OLD_NUXT.source &&
|
32 | rule.test.source !== REPLACEMENT_TEST.source
|
33 | ) {
|
34 | throw new Error(
|
35 | "nuxt-svg: Unexpected '.svg' rule in the webpack configuration"
|
36 | );
|
37 | }
|
38 | rule.test = REPLACEMENT_TEST;
|
39 | }
|
40 |
|
41 | const vueSvgLoader = [
|
42 | {
|
43 | loader: "vue-svg-loader",
|
44 | options: options.vueSvgLoader || { svgo: false },
|
45 | },
|
46 | ];
|
47 |
|
48 | if (config.name !== "server") {
|
49 | const jsxRule = config.module.rules.find((r) => r.test.test(".jsx"));
|
50 | const babelLoader = jsxRule.use[jsxRule.use.length - 1];
|
51 | vueSvgLoader.unshift(babelLoader);
|
52 | }
|
53 |
|
54 | |
55 |
|
56 |
|
57 |
|
58 | const rule = {
|
59 | test: /\.svg$/i,
|
60 | oneOf: [
|
61 | {
|
62 | resourceQuery: /inline/,
|
63 | use: vueSvgLoader,
|
64 | },
|
65 | {
|
66 | resourceQuery: /data/,
|
67 | use: {
|
68 | loader: "url-loader",
|
69 | options: { esModule: false },
|
70 | },
|
71 | },
|
72 | {
|
73 | resourceQuery: /raw/,
|
74 | use: {
|
75 | loader: "raw-loader",
|
76 | options: { esModule: false },
|
77 | },
|
78 | },
|
79 | {
|
80 | resourceQuery: /sprite/,
|
81 | use: {
|
82 | loader: "svg-sprite-loader",
|
83 | options: options.svgSpriteLoader || {},
|
84 | },
|
85 | },
|
86 | {
|
87 | use: {
|
88 | loader: "file-loader",
|
89 | options: { esModule: false },
|
90 | },
|
91 | },
|
92 | ],
|
93 | };
|
94 |
|
95 | rules.push(rule);
|
96 | }
|
97 |
|
98 | module.exports.meta = require("../package.json");
|