eddf2054c2
Removes the extra webpack handling that was previously done, this ensures the file which is already minified and compiled does not get passed through minification again. Largely based on #21418 Closes #21418 The polyfill loading already has tests so no other changes are necessary. ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes
89 lines
2.2 KiB
TypeScript
89 lines
2.2 KiB
TypeScript
import { promises as fs } from 'fs'
|
|
import loaderUtils from 'next/dist/compiled/loader-utils'
|
|
import {
|
|
isWebpack5,
|
|
sources,
|
|
webpack,
|
|
} from 'next/dist/compiled/webpack/webpack'
|
|
|
|
const PLUGIN_NAME = 'CopyFilePlugin'
|
|
|
|
export class CopyFilePlugin {
|
|
private filePath: string
|
|
private name: string
|
|
private cacheKey: string
|
|
private info?: object
|
|
|
|
constructor({
|
|
filePath,
|
|
cacheKey,
|
|
name,
|
|
info,
|
|
}: {
|
|
filePath: string
|
|
cacheKey: string
|
|
name: string
|
|
minimize: boolean
|
|
info?: object
|
|
}) {
|
|
this.filePath = filePath
|
|
this.cacheKey = cacheKey
|
|
this.name = name
|
|
this.info = info
|
|
}
|
|
|
|
apply(compiler: webpack.Compiler) {
|
|
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation: any) => {
|
|
const cache = isWebpack5 ? compilation.getCache('CopyFilePlugin') : null
|
|
const hook = isWebpack5
|
|
? // @ts-ignore
|
|
compilation.hooks.processAssets
|
|
: compilation.hooks.additionalAssets
|
|
hook.tapPromise(
|
|
isWebpack5
|
|
? {
|
|
name: PLUGIN_NAME,
|
|
// @ts-ignore TODO: Remove ignore when webpack 5 is stable
|
|
stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
|
|
}
|
|
: PLUGIN_NAME,
|
|
async () => {
|
|
if (cache) {
|
|
const cachedResult = await cache.getPromise(
|
|
this.filePath,
|
|
this.cacheKey
|
|
)
|
|
if (cachedResult) {
|
|
const { file, source } = cachedResult
|
|
compilation.emitAsset(file, source, {
|
|
...this.info,
|
|
})
|
|
return
|
|
}
|
|
}
|
|
const content = await fs.readFile(this.filePath, 'utf8')
|
|
|
|
const file = loaderUtils.interpolateName(
|
|
{ resourcePath: this.filePath },
|
|
this.name,
|
|
{ content, context: compiler.context }
|
|
)
|
|
|
|
const source = new sources.RawSource(content)
|
|
|
|
if (cache) {
|
|
await cache.storePromise(this.filePath, this.cacheKey, {
|
|
file,
|
|
source,
|
|
})
|
|
}
|
|
|
|
// @ts-ignore
|
|
compilation.emitAsset(file, source, {
|
|
...this.info,
|
|
})
|
|
}
|
|
)
|
|
})
|
|
}
|
|
}
|