UNPKG

11.6 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/WriteFileWebpackPlugin.js"],"names":["WriteFileWebpackPlugin","debug","isMemoryFileSystem","outputFileSystem","constructor","name","userOptions","options","_","assign","exitOnErrors","force","log","test","useHashIndex","isBoolean","TypeError","isNull","isRegExp","isFunction","append","chalk","dim","format","assetSourceHashIndex","apply","compiler","outputPath","setupDone","setupStatus","setup","cyan","has","output","path","Error","handleAfterEmit","compilation","callback","errors","length","forEach","assets","asset","assetPath","outputFilePath","isAbsolute","join","relativeOutputPath","relative","process","cwd","targetDefinition","skip","yellow","assetSize","size","assetSource","Array","isArray","source","assetSourceHash","update","digest","mkdirp","sync","dirname","fs","writeFileSync","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';\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} 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 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 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 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 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 const assetSize = asset.size();\n const assetSource = Array.isArray(asset.source()) ? asset.source().join('\\n') : asset.source();\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 fs.writeFileSync(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"]}
\No newline at end of file