rsnext/packages/next/build/webpack/plugins/unlink-file-plugin.js

36 lines
978 B
JavaScript
Raw Normal View History

// @flow
2016-10-23 18:42:13 +02:00
import { join } from 'path'
import promisify from '../../../lib/promisify'
import fs from 'fs'
import { IS_BUNDLED_PAGE_REGEX } from '../../../lib/constants'
2016-10-23 18:42:13 +02:00
const unlink = promisify(fs.unlink)
// Makes sure removed pages are removed from `.next` in development
2016-10-23 18:42:13 +02:00
export default class UnlinkFilePlugin {
prevAssets: any
2016-10-23 18:42:13 +02:00
constructor () {
this.prevAssets = {}
}
apply (compiler: any) {
compiler.hooks.afterEmit.tapAsync('NextJsUnlinkRemovedPages', (compilation, callback) => {
2016-10-23 18:42:13 +02:00
const removed = Object.keys(this.prevAssets)
.filter((a) => IS_BUNDLED_PAGE_REGEX.test(a) && !compilation.assets[a])
2016-10-23 18:42:13 +02:00
this.prevAssets = compilation.assets
Promise.all(removed.map(async (f) => {
const path = join(compiler.outputPath, f)
try {
await unlink(path)
} catch (err) {
if (err.code === 'ENOENT') return
throw err
}
}))
.then(() => callback(), callback)
2016-10-23 18:42:13 +02:00
})
}
}