1- import { parseQuery } from "loader-utils" ;
21import { validate } from "schema-utils" ;
32import { Schema } from "schema-utils/declarations/validate" ;
43import sharp from "sharp" ;
@@ -8,24 +7,24 @@ import { getOptions } from "@calvin-l/webpack-loader-util";
87
98import getMaxDensity from "./helpers/getMaxDensity" ;
109import getOptionFromSize from "./helpers/getOptionFromSize" ;
10+ import getRequireString from "./helpers/getRequireStringWithModifiedResizeLoaderOptions" ;
1111import validateSizes from "./helpers/validateSizes" ;
1212import schema from "./options.json" ;
1313
1414export interface Options {
15- // Waiting for typescript 4.2.0 to fix https://github.com/microsoft/TypeScript/issues/41651
16- // readonly sizes?: (`${number}w` | `${number}x` | "original")[];
17- readonly sizes ?: string [ ] ;
15+ readonly sizes ?: ( `${number } w` | `${number } x` | "original" ) [ ] ;
1816 readonly scaleUp ?: boolean ;
17+ readonly resizeLoader ?: string ;
1918 readonly customOptionsFactory ?: (
2019 width : number | undefined ,
2120 scale : number | undefined ,
2221 existingOptions : Record < string , any > | undefined
23- ) => string ;
22+ ) => Record < string , any > ;
2423 readonly esModule ?: boolean ;
2524}
2625
2726export type FullOptions = Options &
28- Required < Pick < Options , "sizes" | "scaleUp" | "esModule" > > ;
27+ Required < Pick < Options , "sizes" | "scaleUp" | "resizeLoader" | " esModule"> > ;
2928
3029export const raw = true ;
3130
@@ -38,6 +37,7 @@ export function pitch(
3837 // @ts -expect-error setting sizes as undefined and let validate throw error if it doesn't exist
3938 sizes : undefined ,
4039 scaleUp : false ,
40+ resizeLoader : "webpack-image-resize-loader" ,
4141 esModule : true ,
4242 } ;
4343 const options : FullOptions = {
@@ -77,6 +77,7 @@ export default function (this: loader.LoaderContext, source: Buffer): Buffer {
7777 return source ;
7878}
7979
80+ // return require('-!some-loader?{...}!resize-loader?{...}!file.png')
8081async function generateSrcSetString (
8182 remainingRequest : string ,
8283 loaders : any [ ] ,
@@ -95,12 +96,14 @@ async function generateSrcSetString(
9596 const requireEnd = "')}" ;
9697
9798 for ( const size of sizes ) {
99+ // no need for options.scale or options.width if size === "orignal"
98100 if ( size === "original" ) {
99- result += `${ requireStart } ${ addOptionsToResizeLoader (
101+ result += `${ requireStart } ${ getRequireString (
100102 remainingRequest ,
101103 loaders ,
102104 loaderIndex ,
103105 { } ,
106+ options . resizeLoader ,
104107 options . customOptionsFactory
105108 ) } ${ requireEnd } ${ separator } `;
106109
@@ -118,11 +121,12 @@ async function generateSrcSetString(
118121 if ( width !== undefined && resizeLoaderOption . width > width ) continue ;
119122 }
120123
121- result += `${ requireStart } ${ addOptionsToResizeLoader (
124+ result += `${ requireStart } ${ getRequireString (
122125 remainingRequest ,
123126 loaders ,
124127 loaderIndex ,
125128 resizeLoaderOption ,
129+ options . resizeLoader ,
126130 options . customOptionsFactory
127131 ) } ${ requireEnd } ${ size } ${ separator } `;
128132 }
@@ -131,58 +135,3 @@ async function generateSrcSetString(
131135
132136 return result ;
133137}
134-
135- function addOptionsToResizeLoader (
136- remainingRequest : string ,
137- loaders : any [ ] ,
138- loaderIndex : number ,
139- options : { width ?: number ; scale ?: number } ,
140- customOptionsFactory : FullOptions [ "customOptionsFactory" ]
141- ) : string {
142- const nextLoader = loaders [ loaderIndex + 1 ] ;
143-
144- const resizeLoaderOptions =
145- typeof nextLoader . options === "string"
146- ? parseQuery ( "?" + nextLoader . options )
147- : nextLoader . options ;
148- const resizeLoaderRequest = nextLoader . request ;
149- const resizeLoaderPath = nextLoader . path ;
150-
151- if ( customOptionsFactory )
152- return remainingRequest . replace (
153- resizeLoaderRequest ,
154- resizeLoaderPath +
155- "?" +
156- escapeJsonStringForLoader (
157- JSON . stringify (
158- customOptionsFactory (
159- options . width ,
160- options . scale ,
161- resizeLoaderOptions
162- )
163- )
164- )
165- ) ;
166-
167- return remainingRequest . replace (
168- resizeLoaderRequest ,
169- resizeLoaderPath +
170- "?" +
171- escapeJsonStringForLoader (
172- JSON . stringify ( {
173- scaleUp : true ,
174- ...resizeLoaderOptions ,
175- ...options ,
176- fileLoaderOptions : {
177- ...resizeLoaderOptions ?. fileLoaderOptions ,
178- esModule : false , // because we're using require in pitch
179- } ,
180- } )
181- )
182- ) ;
183- }
184-
185- // needed so webpack doesn't mistake "!" for query operator "!"
186- function escapeJsonStringForLoader ( s : string ) : string {
187- return s . replace ( / ! / g, "\\\\x21" ) ;
188- }
0 commit comments