You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.6 KiB
80 lines
1.6 KiB
2 months ago
|
const fs = require('fs')
|
||
|
const crypto = require('crypto')
|
||
|
|
||
|
/**
|
||
|
* Manifest
|
||
|
*
|
||
|
* creates manifest-file
|
||
|
*
|
||
|
* @author Björn Hase <me@herr-hase.wtf>
|
||
|
* @license http://opensource.org/licenses/MIT The MIT License
|
||
|
* @link https://git.node001.net/tiny-components/webpack.git
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
class Manifest {
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*
|
||
|
* @param {string} filename
|
||
|
* @param {string} context
|
||
|
*
|
||
|
*/
|
||
|
constructor(filename, context) {
|
||
|
|
||
|
// filename for manifest-file
|
||
|
this._filename = filename
|
||
|
|
||
|
// context
|
||
|
this._context = context
|
||
|
|
||
|
// results for write to file
|
||
|
this._results = {
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* run through all assets from assetsByChunkName
|
||
|
* for each file create a hash
|
||
|
*
|
||
|
* @param {object} stats
|
||
|
*
|
||
|
*/
|
||
|
run(stats) {
|
||
|
|
||
|
let files = Object.assign({}, stats.assetsByChunkName)
|
||
|
|
||
|
Object.keys(files).forEach((key) => {
|
||
|
files[key].forEach((file) => {
|
||
|
this._results[stats.publicPath + file] = stats.publicPath + file + '?version=' + this._hash(file, stats.outputPath)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
fs.writeFileSync(this._context + '/' + this._filename, JSON.stringify(this._results, null, 4))
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* hash content of file
|
||
|
*
|
||
|
* @param {string} file
|
||
|
* @param {sring} stats
|
||
|
* @return {string}
|
||
|
*
|
||
|
*/
|
||
|
_hash(file, outputPath) {
|
||
|
|
||
|
const data = fs.readFileSync(outputPath + '/' + file, 'utf8')
|
||
|
const hash = crypto
|
||
|
.createHash('md5')
|
||
|
.update(data)
|
||
|
.digest('hex')
|
||
|
|
||
|
return hash
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = Manifest
|