UNPKG

4.32 kBJavaScriptView Raw
1const { getUrlLoaderOptions } = require('./loaders/url-loader');
2const { getFileLoaderOptions, getFileLoaderPath } = require('./loaders/file-loader');
3const { getLqipLoaderOptions } = require('./loaders/lqip-loader');
4const { getResponsiveLoaderOptions } = require('./loaders/responsive-loader');
5const { getImageTraceLoaderOptions } = require('./loaders/image-trace-loader');
6
7/**
8 * Configure the common resource queries
9 */
10const queries = [
11 // ?url: force a file url/reference, never use inlining
12 {
13 test: 'url',
14 loaders: [getFileLoaderPath()],
15 optimize: true,
16 combinations: ['original'],
17 },
18
19 // ?inline: force inlining an image regardless of the defined limit
20 {
21 test: 'inline',
22 loaders: ['url-loader'],
23 options: [{
24 limit: undefined,
25 }],
26 optimize: true,
27 combinations: ['original'],
28 },
29
30 // ?include: include the image directly, no data uri or external file
31 {
32 test: 'include',
33 loaders: [
34 require.resolve('./loaders/raw-loader/export-loader.js'),
35 'raw-loader',
36 ],
37 optimize: true,
38 combinations: ['original'],
39 },
40
41 // ?original: use the original image and don't optimize it
42 {
43 test: 'original',
44 loaders: ['url-loader'],
45 optimize: false,
46 },
47
48 // ?lqip: low quality image placeholder
49 {
50 test: 'lqip(&|$)',
51 loaders: [
52 require.resolve('./loaders/lqip-loader/picture-export-loader.js'),
53 'lqip-loader',
54 'url-loader',
55 ],
56 optimize: false,
57 },
58
59 // ?lqip: low quality image placeholder
60 {
61 test: 'lqip-colors',
62 loaders: [
63 require.resolve('./loaders/lqip-loader/colors-export-loader.js'),
64 'lqip-loader',
65 'url-loader',
66 ],
67 options: [{}, {
68 base64: false,
69 palette: true,
70 }],
71 optimize: false,
72 },
73
74 // ?resize: resize images
75 {
76 test: 'size',
77 loaders: [
78 'responsive-loader',
79 ],
80 optimize: false,
81 },
82
83 // ?trace: generate svg image traces for placeholders
84 {
85 test: 'trace',
86 loaders: [
87 'image-trace-loader',
88 'url-loader',
89 ],
90 optimize: true,
91 combinations: ['original'],
92 },
93];
94
95/**
96 * Add combinations
97 */
98[].concat(queries).forEach((queryConfig) => {
99 if (queryConfig.combinations) {
100 queryConfig.combinations.forEach((combination) => {
101 if (combination === 'original') {
102 queries.unshift({
103 ...queryConfig,
104 test: `(${queryConfig.test}.*original|original.*${queryConfig.test})`,
105 optimize: false,
106 });
107 }
108 });
109 }
110});
111
112/**
113 * Returns all common resource queries for the given optimization loader
114 *
115 * @param {object} nextConfig - next.js configuration object
116 * @param {boolean} isServer - if the current build is for a server
117 * @param {string} optimizerLoaderName - name of the loader used to optimize the images
118 * @param {object} optimizerLoaderOptions - config for the optimization loader
119 * @returns {array}
120 */
121const getResourceQueries = (
122 nextConfig,
123 isServer,
124 optimizerLoaderName,
125 optimizerLoaderOptions,
126 detectLoaders,
127) => {
128 const loaderOptions = {
129 'url-loader': getUrlLoaderOptions(nextConfig, isServer),
130 'file-loader': getFileLoaderOptions(nextConfig, isServer),
131 [getFileLoaderPath()]: getFileLoaderOptions(nextConfig, isServer),
132 'lqip-loader': getLqipLoaderOptions(nextConfig, isServer),
133 'responsive-loader': getResponsiveLoaderOptions(nextConfig, isServer, detectLoaders),
134 'image-trace-loader': getImageTraceLoaderOptions(nextConfig),
135 };
136
137 return queries.map((queryConfig) => {
138 const loaders = [];
139
140 queryConfig.loaders.forEach((loader, index) => {
141 const loaderConfig = {
142 loader,
143 };
144
145 if (loaderOptions[loader]) {
146 loaderConfig.options = loaderOptions[loader];
147 }
148
149 if (queryConfig.options) {
150 loaderConfig.options = {
151 ...(loaderConfig.options || {}),
152 ...(queryConfig.options[index] || {}),
153 };
154 }
155
156 loaders.push(loaderConfig);
157 });
158
159 return {
160 resourceQuery: new RegExp(queryConfig.test),
161 use: loaders.concat(queryConfig.optimize && optimizerLoaderName !== null ? [
162 {
163 loader: optimizerLoaderName,
164 options: optimizerLoaderOptions,
165 },
166 ] : []),
167 };
168 });
169};
170
171module.exports = {
172 getResourceQueries,
173};