UNPKG

2.69 kBJavaScriptView Raw
1/**
2 * This is the original RegExp cloned from the original Nuxt.js configuration
3 * files, with only the search for ".svg" files removed. Keep tabs on this in
4 * case the core decides to add additional qualifiers to the pattern.
5 */
6const ORIGINAL_TEST = /\.(png|jpe?g|gif|svg|webp|avif)$/i;
7const ORIGINAL_TEST_OLD_NUXT = /\.(png|jpe?g|gif|svg|webp)$/i;
8const REPLACEMENT_TEST = /\.(png|jpe?g|gif|webp|avif)$/i;
9
10export default function svgModule (moduleOptions) {
11 const options = Object.assign({}, this.options.svg, moduleOptions);
12 this.extendBuild(setup.bind(this, options));
13}
14
15/**
16 * Perform the primary setup for the nuxt-svg module by removing and replacing
17 * all of the rules that match ".svg" with the new one.
18 *
19 * @param options The module options
20 * @param config The webpack configuration object to extend
21 */
22function setup(options, config) {
23 const rules = config.module.rules;
24
25 // Remove any original svg rules.
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 * Create the custom rule that supports multiple resource queries. By default,
56 * use file-loader (no resource query supplied).
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); // Add the rule to the configuration.
96}
97
98module.exports.meta = require("../package.json");