Skip to content

Commit 563f2d2

Browse files
committed
refactor: change how the srcset string is generated to avoid problems with es vs commonjs export
1 parent 4cd77b8 commit 563f2d2

File tree

2 files changed

+53
-27
lines changed

2 files changed

+53
-27
lines changed

src/helpers/getRequireStringWithModifiedResizeLoaderOptions.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,27 @@ export default async function getRequireStringWithModifiedResizeLoaderOptions(
4242
const resizeLoaderRequest = resizeLoader.request;
4343
const resizeLoaderPath = resizeLoader.path;
4444

45-
return remainingRequest.replace(
46-
resizeLoaderRequest,
45+
const newResizeLoaderQuery =
4746
resizeLoaderPath +
48-
"?" +
49-
escapeJsonStringForLoader(
50-
JSON.stringify(
51-
resizeLoaderOptionsGenerator(
52-
options.width,
53-
options.scale,
54-
resizeLoaderOptions
55-
)
47+
"?" +
48+
escapeJsonStringForLoader(
49+
JSON.stringify(
50+
resizeLoaderOptionsGenerator(
51+
options.width,
52+
options.scale,
53+
resizeLoaderOptions
5654
)
5755
)
56+
);
57+
const newRequestString = remainingRequest.replace(
58+
resizeLoaderRequest,
59+
newResizeLoaderQuery
5860
);
61+
62+
return newRequestString;
5963
}
6064

6165
// needed so webpack doesn't mistake "!" for query operator "!"
6266
function escapeJsonStringForLoader(s: string): string {
63-
return s.replace(/!/g, "\\\\x21");
67+
return s.replace(/!/g, "\\\\x21").replace(/\\n/g, "\\\\n");
6468
}

src/index.ts

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,9 @@ export function pitch(
6262

6363
validateSizes(options.sizes);
6464

65-
generateSrcSetString(this, remainingRequest, options)
66-
.then((srcSetString) => {
67-
callback(
68-
null,
69-
`${
70-
options.esModule ? "export default" : "module.exports ="
71-
} \`${srcSetString}\`;`
72-
);
65+
generateVirtualModuleCode(this, remainingRequest, options)
66+
.then((code) => {
67+
callback(null, code);
7368
})
7469
.catch((error) => {
7570
callback(error, undefined);
@@ -87,6 +82,11 @@ export function defaultResizeLoaderOptionsGenerator(
8782
): Record<string, any> {
8883
return {
8984
...existingOptions,
85+
...(existingOptions?.fileLoaderOptionsGenerator
86+
? {
87+
fileLoaderOptionsGenerator: existingOptions.fileLoaderOptionsGenerator.toString(),
88+
}
89+
: {}),
9090
// since we filtered out all the width that are too wide,
9191
// nothing to worry about there, need this to make sure
9292
// scales larger than 1x works
@@ -96,22 +96,33 @@ export function defaultResizeLoaderOptionsGenerator(
9696
};
9797
}
9898

99-
// return require('-!some-loader?{...}!resize-loader?{...}!file.png')
100-
async function generateSrcSetString(
99+
/**
100+
* generate
101+
*
102+
* const import_0 = require('-!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/file-loader/dist/cjs.js!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/webpack-image-resize-loader/dist/cjs.js?{"scaleUp":true,"scale":0.5}!/Users/Calvin/GitHub/webpack-image-srcset-loader/test/e2e/fixtures/Macaca_nigra_self-portrait_large.jpg');
103+
* const import_1 = require('-!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/file-loader/dist/cjs.js!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/webpack-image-resize-loader/dist/cjs.js?{"scaleUp":true,"width":300}!/Users/Calvin/GitHub/webpack-image-srcset-loader/test/e2e/fixtures/Macaca_nigra_self-portrait_large.jpg');
104+
* const import_2 = require('-!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/file-loader/dist/cjs.js!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/webpack-image-resize-loader/dist/cjs.js?{"scaleUp":true}!/Users/Calvin/GitHub/webpack-image-srcset-loader/test/e2e/fixtures/Macaca_nigra_self-portrait_large.jpg');
105+
* const import_3 = require('-!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/file-loader/dist/cjs.js!/Users/Calvin/GitHub/webpack-image-srcset-loader/node_modules/webpack-image-resize-loader/dist/cjs.js?{"scaleUp":true,"scale":1}!/Users/Calvin/GitHub/webpack-image-srcset-loader/test/e2e/fixtures/Macaca_nigra_self-portrait_large.jpg');
106+
*
107+
* export default `${import_0.default || import_0} 1x, ${import_1.default || import_1} 300w, ${import_2.default || import_2}, ${import_3.default || import_3} 2x`;
108+
*/
109+
async function generateVirtualModuleCode(
101110
context: loader.LoaderContext,
102111
remainingRequest: string,
103112
options: FullOptions
104113
): Promise<string> {
105114
const { fs, resourcePath } = context;
106115

107-
let result = "";
116+
let importBlock = "";
117+
let exportBlock = "";
118+
let importCount = 0;
108119
let width: number | undefined;
109120

110121
const sizes = options.sizes;
111122
const maxDensity = getMaxDensity(sizes);
112123
const separator = ", ";
113-
const requireStart = "${require('-!";
114-
const requireEnd = "').default}";
124+
const tsStart = "${";
125+
const tsEnd = "}";
115126

116127
for (const size of sizes) {
117128
// no need for options.scale or options.width if size === "orignal"
@@ -124,8 +135,10 @@ async function generateSrcSetString(
124135
options.resizeLoaderOptionsGenerator
125136
);
126137

127-
result += `${requireStart}${requireString}${requireEnd}${separator}`;
138+
importBlock += `const import_${importCount} = require('-!${requireString}');\n`;
139+
exportBlock += `${tsStart}import_${importCount}.default || import_${importCount}${tsEnd}${separator}`;
128140

141+
importCount++;
129142
continue;
130143
}
131144

@@ -148,10 +161,19 @@ async function generateSrcSetString(
148161
options.resizeLoaderOptionsGenerator
149162
);
150163

151-
result += `${requireStart}${requireString}${requireEnd} ${size}${separator}`;
164+
importBlock += `const import_${importCount} = require('-!${requireString}');\n`;
165+
exportBlock += `${tsStart}import_${importCount}.default || import_${importCount}${tsEnd} ${size}${separator}`;
166+
167+
importCount++;
152168
}
153169

154-
result = result.substring(0, result.length - 2);
170+
exportBlock = exportBlock.substring(0, exportBlock.length - 2);
171+
172+
const result = `
173+
${importBlock}
174+
${
175+
options.esModule ? "export default `" : "module.exports = `"
176+
}${exportBlock}\`;`.trim();
155177

156178
return result;
157179
}

0 commit comments

Comments
 (0)