123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = postProcessPattern;
- var _path = _interopRequireDefault(require("path"));
- var _os = _interopRequireDefault(require("os"));
- var _crypto = _interopRequireDefault(require("crypto"));
- var _loaderUtils = _interopRequireDefault(require("loader-utils"));
- var _cacache = _interopRequireDefault(require("cacache"));
- var _serializeJavascript = _interopRequireDefault(require("serialize-javascript"));
- var _findCacheDir = _interopRequireDefault(require("find-cache-dir"));
- var _normalizePath = _interopRequireDefault(require("normalize-path"));
- var _package = require("../package.json");
- var _promisify = require("./utils/promisify");
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- /* eslint-disable no-param-reassign */
- function postProcessPattern(globalRef, pattern, file) {
- const {
- logger,
- compilation,
- fileDependencies,
- written,
- inputFileSystem,
- copyUnmodified
- } = globalRef;
- logger.debug(`getting stats for '${file.absoluteFrom}' to write to assets`);
- const getStats = pattern.stats ? Promise.resolve().then(() => pattern.stats) : (0, _promisify.stat)(inputFileSystem, file.absoluteFrom);
- return getStats.then(stats => {
- // We don't write empty directories
- if (stats.isDirectory()) {
- logger.debug(`skipping '${file.absoluteFrom}' because it is empty directory`);
- return Promise.resolve();
- } // If this came from a glob, add it to the file watchlist
- if (pattern.fromType === 'glob') {
- fileDependencies.add(file.absoluteFrom);
- }
- logger.debug(`reading '${file.absoluteFrom}' to write to assets`);
- return (0, _promisify.readFile)(inputFileSystem, file.absoluteFrom).then(content => {
- if (pattern.transform) {
- logger.info(`transforming content for '${file.absoluteFrom}'`); // eslint-disable-next-line no-shadow
- const transform = (content, absoluteFrom) => pattern.transform(content, absoluteFrom);
- if (pattern.cache) {
- if (!globalRef.cacheDir) {
- globalRef.cacheDir = (0, _findCacheDir.default)({
- name: 'copy-webpack-plugin'
- }) || _os.default.tmpdir();
- }
- const cacheKey = pattern.cache.key ? pattern.cache.key : (0, _serializeJavascript.default)({
- name: _package.name,
- version: _package.version,
- pattern,
- hash: _crypto.default.createHash('md4').update(content).digest('hex')
- });
- return _cacache.default.get(globalRef.cacheDir, cacheKey).then(result => {
- logger.debug(`getting cached transformation for '${file.absoluteFrom}'`);
- return result.data;
- }, () => Promise.resolve().then(() => transform(content, file.absoluteFrom)) // eslint-disable-next-line no-shadow
- .then(content => {
- logger.debug(`caching transformation for '${file.absoluteFrom}'`);
- return _cacache.default.put(globalRef.cacheDir, cacheKey, content).then(() => content);
- }));
- }
- content = transform(content, file.absoluteFrom);
- }
- return content;
- }).then(content => {
- if (pattern.toType === 'template') {
- logger.info(`interpolating template '${file.webpackTo}' for '${file.relativeFrom}'`); // If it doesn't have an extension, remove it from the pattern
- // ie. [name].[ext] or [name][ext] both become [name]
- if (!_path.default.extname(file.relativeFrom)) {
- file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, '');
- }
- file.webpackTo = _loaderUtils.default.interpolateName({
- resourcePath: file.absoluteFrom
- }, file.webpackTo, {
- content,
- regExp: file.webpackToRegExp,
- context: pattern.context
- }); // Bug in `loader-utils`, package convert `\\` to `/`, need fix in loader-utils
- file.webpackTo = _path.default.normalize(file.webpackTo);
- }
- return content;
- }).then(content => {
- if (pattern.transformPath) {
- logger.info(`transforming path '${file.webpackTo}' for '${file.absoluteFrom}'`);
- return Promise.resolve().then(() => pattern.transformPath(file.webpackTo, file.absoluteFrom)).then(newPath => {
- file.webpackTo = newPath;
- return content;
- });
- }
- return content;
- }).then(content => {
- const hash = _loaderUtils.default.getHashDigest(content);
- const targetPath = (0, _normalizePath.default)(file.webpackTo);
- const targetAbsolutePath = (0, _normalizePath.default)(file.absoluteFrom);
- if (!copyUnmodified && written[targetPath] && written[targetPath][targetAbsolutePath] && written[targetPath][targetAbsolutePath] === hash) {
- logger.info(`skipping '${file.webpackTo}', because content hasn't changed`);
- return;
- }
- logger.debug(`adding '${file.webpackTo}' for tracking content changes`);
- if (!written[targetPath]) {
- written[targetPath] = {};
- }
- written[targetPath][targetAbsolutePath] = hash;
- if (compilation.assets[targetPath] && !file.force) {
- logger.info(`skipping '${file.webpackTo}', because it already exists`);
- return;
- }
- logger.info(`writing '${file.webpackTo}' to compilation assets from '${file.absoluteFrom}'`);
- compilation.assets[targetPath] = {
- size() {
- return stats.size;
- },
- source() {
- return content;
- }
- };
- });
- });
- }
|