{"version":3,"sources":["../src/WriteFileWebpackPlugin.js"],"names":["WriteFileWebpackPlugin","debug","isMemoryFileSystem","outputFileSystem","constructor","name","userOptions","options","_","assign","atomicReplace","exitOnErrors","force","log","test","useHashIndex","isBoolean","TypeError","isNull","isRegExp","isFunction","writeFileMethod","writeFileAtomicSync","fs","writeFileSync","append","chalk","dim","format","getAssetSource","asset","source","Array","isArray","join","ArrayBuffer","Buffer","from","assetSourceHashIndex","apply","compiler","outputPath","setupDone","setupStatus","setup","cyan","has","output","path","Error","handleAfterEmit","compilation","callback","errors","length","forEach","assets","assetPath","outputFilePath","isAbsolute","relativeOutputPath","relative","process","cwd","targetDefinition","skip","yellow","assetSize","size","assetSource","assetSourceHash","update","digest","mkdirp","sync","dirname","split","green","magenta","error","bold","red","bgRed","message","hooks","afterEmit","tapAsync","plugin"],"mappings":"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","file":"WriteFileWebpackPlugin.js","sourcesContent":["import fs from 'fs';\nimport {createHash} from 'crypto';\nimport path from 'path';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport chalk from 'chalk';\nimport moment from 'moment';\nimport filesize from 'filesize';\nimport createDebug from 'debug';\nimport {sync as writeFileAtomicSync} from 'write-file-atomic';\n\nconst debug = createDebug('write-file-webpack-plugin');\n\n/**\n * When 'webpack' program is used, constructor name is equal to 'NodeOutputFileSystem'.\n * When 'webpack-dev-server' program is used, constructor name is equal to 'MemoryFileSystem'.\n */\nconst isMemoryFileSystem = (outputFileSystem: Object): boolean => {\n return outputFileSystem.constructor.name === 'MemoryFileSystem';\n};\n\n/**\n * @typedef {Object} options\n * @property {boolean} atomicReplace Atomically replace files content (i.e., to prevent programs like test watchers from seeing partial files) (default: true).\n * @property {boolean} exitOnErrors Stop writing files on webpack errors (default: true).\n * @property {boolean} force Forces the execution of the plugin regardless of being using `webpack-dev-server` or not (default: false).\n * @property {boolean} log Logs names of the files that are being written (or skipped because they have not changed) (default: true).\n * @property {RegExp} test A regular expression or function used to test if file should be written. When not present, all bundle will be written.\n * @property {boolean} useHashIndex Use hash index to write only files that have changed since the last iteration (default: true).\n */\ntype UserOptionsType = {\n atomicReplace: ?boolean,\n exitOnErrors: ?boolean,\n test: ?RegExp,\n useHashIndex: ?boolean,\n log: ?boolean,\n force: ?boolean\n};\n\nexport default function WriteFileWebpackPlugin (userOptions: UserOptionsType = {}): Object {\n const options = _.assign({}, {\n atomicReplace: true,\n exitOnErrors: true,\n force: false,\n log: true,\n test: null,\n useHashIndex: true\n }, userOptions);\n\n if (!_.isBoolean(options.exitOnErrors)) {\n throw new TypeError('options.exitOnErrors value must be of boolean type.');\n }\n\n if (!_.isBoolean(options.force)) {\n throw new TypeError('options.force value must be of boolean type.');\n }\n\n if (!_.isBoolean(options.log)) {\n throw new TypeError('options.log value must be of boolean type.');\n }\n\n if (!_.isNull(options.test) && !(_.isRegExp(options.test) || _.isFunction(options.test))) {\n throw new TypeError('options.test value must be an instance of RegExp or Function.');\n }\n\n if (!_.isBoolean(options.useHashIndex)) {\n throw new TypeError('options.useHashIndex value must be of boolean type.');\n }\n\n if (!_.isBoolean(options.atomicReplace)) {\n throw new TypeError('options.atomicReplace value must be of boolean type.');\n }\n\n const writeFileMethod = options.atomicReplace ? writeFileAtomicSync : fs.writeFileSync;\n\n const log = (...append) => {\n if (!options.log) {\n return;\n }\n\n debug(chalk.dim('[' + moment().format('HH:mm:ss') + '] [write-file-webpack-plugin]'), ...append);\n };\n\n const getAssetSource = (asset) => {\n const source = asset.source();\n\n if (Array.isArray(source)) {\n return source.join('\\n');\n } else if (source instanceof ArrayBuffer) {\n return Buffer.from(source);\n }\n\n return source;\n };\n\n const assetSourceHashIndex = {};\n\n log('options', options);\n\n const apply = (compiler) => {\n let outputPath;\n let setupDone;\n let setupStatus;\n\n const setup = (): boolean => {\n if (setupDone) {\n return setupStatus;\n }\n\n setupDone = true;\n\n log('compiler.outputFileSystem is \"' + chalk.cyan(compiler.outputFileSystem.constructor.name) + '\".');\n\n if (!isMemoryFileSystem(compiler.outputFileSystem) && !options.force) {\n return false;\n }\n\n if (_.has(compiler, 'options.output.path') && compiler.options.output.path !== '/') {\n outputPath = compiler.options.output.path;\n }\n\n if (!outputPath) {\n throw new Error('output.path is not defined. Define output.path.');\n }\n\n log('outputPath is \"' + chalk.cyan(outputPath) + '\".');\n\n setupStatus = true;\n\n return setupStatus;\n };\n\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n const handleAfterEmit = (compilation, callback) => {\n if (!setup()) {\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n callback();\n\n return;\n }\n\n if (options.exitOnErrors && compilation.errors.length) {\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n callback();\n\n return;\n }\n\n log('compilation.errors.length is \"' + chalk.cyan(compilation.errors.length) + '\".');\n\n _.forEach(compilation.assets, (asset, assetPath) => {\n const outputFilePath = path.isAbsolute(assetPath) ? assetPath : path.join(outputPath, assetPath);\n const relativeOutputPath = path.relative(process.cwd(), outputFilePath);\n const targetDefinition = 'asset: ' + chalk.cyan('./' + assetPath) + '; destination: ' + chalk.cyan('./' + relativeOutputPath);\n\n const test = options.test;\n\n if (test) {\n const skip = _.isRegExp(test) ? !test.test(assetPath) : !test(assetPath);\n\n if (skip) {\n log(targetDefinition, chalk.yellow('[skipped; does not match test]'));\n\n return;\n }\n }\n\n // asset.size method returns `undefined` for binary files (e.g. WASM). This is a temporarily workaround.\n const assetSize = asset.size() || 0;\n const assetSource = getAssetSource(asset);\n\n if (options.useHashIndex) {\n const assetSourceHash = createHash('sha256').update(assetSource).digest('hex');\n\n if (assetSourceHashIndex[relativeOutputPath] && assetSourceHashIndex[relativeOutputPath] === assetSourceHash) {\n log(targetDefinition, chalk.yellow('[skipped; matched hash index]'));\n\n return;\n }\n\n assetSourceHashIndex[relativeOutputPath] = assetSourceHash;\n }\n\n mkdirp.sync(path.dirname(relativeOutputPath));\n\n try {\n writeFileMethod(relativeOutputPath.split('?')[0], assetSource);\n log(targetDefinition, chalk.green('[written]'), chalk.magenta('(' + filesize(assetSize) + ')'));\n } catch (error) {\n log(targetDefinition, chalk.bold.red('[is not written]'), chalk.magenta('(' + filesize(assetSize) + ')'));\n log(chalk.bold.bgRed('Exception:'), chalk.bold.red(error.message));\n }\n });\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n callback();\n };\n\n /**\n * webpack 4+ comes with a new plugin system.\n *\n * Check for hooks in-order to support old plugin system\n */\n if (compiler.hooks) {\n compiler.hooks.afterEmit.tapAsync('write-file-webpack-plugin', handleAfterEmit);\n } else {\n compiler.plugin('after-emit', handleAfterEmit);\n }\n };\n\n return {\n apply\n };\n}\n"]}