2019-06-24 15:48:26 +02:00
|
|
|
import { Compiler, Plugin } from 'webpack'
|
2019-04-24 10:48:43 +02:00
|
|
|
import { extname } from 'path'
|
2019-04-21 23:25:17 +02:00
|
|
|
|
|
|
|
// Prevents outputting client pages when they are not needed
|
|
|
|
export class DropClientPage implements Plugin {
|
2019-05-29 13:57:26 +02:00
|
|
|
ampPages = new Set()
|
2019-04-24 10:48:43 +02:00
|
|
|
|
2019-04-21 23:25:17 +02:00
|
|
|
apply(compiler: Compiler) {
|
2020-05-18 21:24:37 +02:00
|
|
|
compiler.hooks.emit.tap('DropClientPage', (compilation) => {
|
|
|
|
Object.keys(compilation.assets).forEach((assetKey) => {
|
2019-04-21 23:25:17 +02:00
|
|
|
const asset = compilation.assets[assetKey]
|
|
|
|
|
2020-01-08 17:30:53 +01:00
|
|
|
if (asset?._value?.includes?.('__NEXT_DROP_CLIENT_FILE__')) {
|
2019-05-14 18:49:41 +02:00
|
|
|
const cleanAssetKey = assetKey.replace(/\\/g, '/')
|
|
|
|
const page = '/' + cleanAssetKey.split('pages/')[1]
|
2019-04-24 10:48:43 +02:00
|
|
|
const pageNoExt = page.split(extname(page))[0]
|
|
|
|
|
2019-04-21 23:25:17 +02:00
|
|
|
delete compilation.assets[assetKey]
|
2019-07-25 04:16:32 +02:00
|
|
|
|
|
|
|
// Detect being re-ran through a child compiler and don't re-mark the
|
|
|
|
// page as AMP
|
|
|
|
if (!pageNoExt.endsWith('.module')) {
|
|
|
|
this.ampPages.add(pageNoExt.replace(/\/index$/, '') || '/')
|
|
|
|
}
|
2019-04-21 23:25:17 +02:00
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|