11const webpack = require ( 'webpack' ) ;
22const path = require ( 'path' ) ;
3- const { resolve } = require ( 'path' ) ;
3+ const { resolve, dirname } = require ( 'path' ) ;
44const { readFileSync, existsSync } = require ( 'fs' ) ;
55const { isInstalledVersionPreactXOrAbove } = require ( './utils' ) ;
66const autoprefixer = require ( 'autoprefixer' ) ;
77const browserslist = require ( 'browserslist' ) ;
8- const requireRelative = require ( 'require-relative' ) ;
98const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
109const FixStyleOnlyEntriesPlugin = require ( 'webpack-fix-style-only-entries' ) ;
1110const ProgressBarPlugin = require ( 'progress-bar-webpack-plugin' ) ;
1211const ReplacePlugin = require ( 'webpack-plugin-replace' ) ;
1312const ForkTsCheckerWebpackPlugin = require ( 'fork-ts-checker-webpack-plugin' ) ;
1413const createBabelConfig = require ( '../babel-config' ) ;
1514const loadPostcssConfig = require ( 'postcss-load-config' ) ;
15+ const PnpWebpackPlugin = require ( `pnp-webpack-plugin` ) ;
1616
1717function readJson ( file ) {
1818 try {
@@ -96,9 +96,16 @@ module.exports = function (env) {
9696
9797 let compat = 'preact-compat' ;
9898 try {
99- requireRelative . resolve ( 'preact/compat' , cwd ) ;
100- compat = 'preact/compat' ;
101- } catch ( e ) { }
99+ compat = dirname (
100+ require . resolve ( 'preact/compat/package.json' , { paths : [ cwd ] } )
101+ ) ;
102+ } catch ( e ) {
103+ try {
104+ compat = dirname (
105+ require . resolve ( 'preact-compat/package.json' , { paths : [ cwd ] } )
106+ ) ;
107+ } catch ( e ) { }
108+ }
102109
103110 let tsconfig = resolveTsconfig ( cwd , isProd ) ;
104111
@@ -110,6 +117,14 @@ module.exports = function (env) {
110117 postcssPlugins = [ autoprefixer ( { overrideBrowserslist : browsers } ) ] ;
111118 }
112119
120+ function tryResolveOptionalLoader ( name ) {
121+ try {
122+ return require . resolve ( name ) ;
123+ } catch ( e ) {
124+ return name ;
125+ }
126+ }
127+
113128 return {
114129 context : src ,
115130
@@ -130,21 +145,23 @@ module.exports = function (env) {
130145 '.css' ,
131146 '.wasm' ,
132147 ] ,
133- alias : Object . assign (
134- {
135- style : source ( 'style' ) ,
136- 'preact-cli-entrypoint' : source ( 'index' ) ,
137- url : 'native-url' ,
138- // preact-compat aliases for supporting React dependencies:
139- react : compat ,
140- 'react-dom' : compat ,
141- 'react-addons-css-transition-group' : 'preact-css-transition-group' ,
142- 'preact-cli/async-component' : IS_SOURCE_PREACT_X_OR_ABOVE
143- ? require . resolve ( '@preact/async-loader/async' )
144- : require . resolve ( '@preact/async-loader/async-legacy' ) ,
145- } ,
146- compat !== 'preact-compat' ? { 'preact-compat' : compat } : { }
147- ) ,
148+ alias : {
149+ style : source ( 'style' ) ,
150+ 'preact-cli-entrypoint' : source ( 'index' ) ,
151+ url : dirname ( require . resolve ( 'native-url/package.json' ) ) ,
152+ // preact-compat aliases for supporting React dependencies:
153+ react : compat ,
154+ 'react-dom' : compat ,
155+ 'preact-compat' : compat ,
156+ 'react-addons-css-transition-group' : 'preact-css-transition-group' ,
157+ 'preact-cli/async-component' : IS_SOURCE_PREACT_X_OR_ABOVE
158+ ? require . resolve ( '@preact/async-loader/async' )
159+ : require . resolve ( '@preact/async-loader/async-legacy' ) ,
160+ } ,
161+ plugins : [
162+ // TODO: Remove when upgrading to webpack 5
163+ PnpWebpackPlugin ,
164+ ] ,
148165 } ,
149166
150167 resolveLoader : {
@@ -162,7 +179,7 @@ module.exports = function (env) {
162179 test : / \. m ? [ j t ] s x ? $ / ,
163180 resolve : { mainFields : [ 'module' , 'jsnext:main' , 'browser' , 'main' ] } ,
164181 type : 'javascript/auto' ,
165- loader : 'babel-loader' ,
182+ loader : require . resolve ( 'babel-loader' ) ,
166183 options : Object . assign (
167184 { babelrc : false } ,
168185 createBabelConfig ( env , { browsers } ) ,
@@ -175,10 +192,10 @@ module.exports = function (env) {
175192 test : / \. l e s s $ / ,
176193 use : [
177194 {
178- loader : ' proxy-loader',
195+ loader : require . resolve ( './ proxy-loader') ,
179196 options : {
180197 cwd,
181- loader : 'less-loader' ,
198+ loader : tryResolveOptionalLoader ( 'less-loader' ) ,
182199 options : {
183200 sourceMap : true ,
184201 lessOptions : {
@@ -195,10 +212,10 @@ module.exports = function (env) {
195212 test : / \. s [ a c ] s s $ / ,
196213 use : [
197214 {
198- loader : ' proxy-loader',
215+ loader : require . resolve ( './ proxy-loader') ,
199216 options : {
200217 cwd,
201- loader : 'sass-loader' ,
218+ loader : tryResolveOptionalLoader ( 'sass-loader' ) ,
202219 options : getSassConfiguration ( ...nodeModules ) ,
203220 } ,
204221 } ,
@@ -210,10 +227,10 @@ module.exports = function (env) {
210227 test : / \. s t y l $ / ,
211228 use : [
212229 {
213- loader : ' proxy-loader',
230+ loader : require . resolve ( './ proxy-loader') ,
214231 options : {
215232 cwd,
216- loader : 'stylus-loader' ,
233+ loader : tryResolveOptionalLoader ( 'stylus-loader' ) ,
217234 options : {
218235 sourceMap : true ,
219236 paths : nodeModules ,
@@ -227,9 +244,11 @@ module.exports = function (env) {
227244 test : / \. ( p ? c s s | l e s s | s [ a c ] s s | s t y l ) $ / ,
228245 include : [ source ( 'components' ) , source ( 'routes' ) ] ,
229246 use : [
230- isWatch ? 'style-loader' : MiniCssExtractPlugin . loader ,
247+ isWatch
248+ ? require . resolve ( 'style-loader' )
249+ : MiniCssExtractPlugin . loader ,
231250 {
232- loader : 'css-loader' ,
251+ loader : require . resolve ( 'css-loader' ) ,
233252 options : {
234253 modules : {
235254 localIdentName : '[local]__[hash:base64:5]' ,
@@ -239,7 +258,7 @@ module.exports = function (env) {
239258 } ,
240259 } ,
241260 {
242- loader : 'postcss-loader' ,
261+ loader : require . resolve ( 'postcss-loader' ) ,
243262 options : {
244263 ident : 'postcss' ,
245264 sourceMap : true ,
@@ -253,15 +272,17 @@ module.exports = function (env) {
253272 test : / \. ( p ? c s s | l e s s | s [ a c ] s s | s t y l ) $ / ,
254273 exclude : [ source ( 'components' ) , source ( 'routes' ) ] ,
255274 use : [
256- isWatch ? 'style-loader' : MiniCssExtractPlugin . loader ,
275+ isWatch
276+ ? require . resolve ( 'style-loader' )
277+ : MiniCssExtractPlugin . loader ,
257278 {
258- loader : 'css-loader' ,
279+ loader : require . resolve ( 'css-loader' ) ,
259280 options : {
260281 sourceMap : true ,
261282 } ,
262283 } ,
263284 {
264- loader : 'postcss-loader' ,
285+ loader : require . resolve ( 'postcss-loader' ) ,
265286 options : {
266287 ident : 'postcss' ,
267288 sourceMap : true ,
@@ -277,11 +298,13 @@ module.exports = function (env) {
277298 } ,
278299 {
279300 test : / \. ( x m l | h t m l | t x t | m d ) $ / ,
280- loader : 'raw-loader' ,
301+ loader : require . resolve ( 'raw-loader' ) ,
281302 } ,
282303 {
283304 test : / \. ( s v g | w o f f 2 ? | t t f | e o t | j p e ? g | p n g | w e b p | g i f | m p 4 | m o v | o g g | w e b m ) ( \? .* ) ? $ / i,
284- loader : isProd ? 'file-loader' : 'url-loader' ,
305+ loader : isProd
306+ ? require . resolve ( 'file-loader' )
307+ : require . resolve ( 'url-loader' ) ,
285308 } ,
286309 ] ,
287310 } ,
0 commit comments