UNPKG

lml-main

Version:

This is now a mono repository published into many standalone packages.

210 lines (156 loc) 8.32 kB
'use strict'; var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _toLooksLikeDirectory = require('./toLooksLikeDirectory'); var _toLooksLikeDirectory2 = _interopRequireDefault(_toLooksLikeDirectory); var _writeFileToAssets = require('./writeFileToAssets'); var _writeFileToAssets2 = _interopRequireDefault(_writeFileToAssets); var _writeDirectoryToAssets = require('./writeDirectoryToAssets'); var _writeDirectoryToAssets2 = _interopRequireDefault(_writeDirectoryToAssets); var _shouldIgnore = require('./shouldIgnore'); var _shouldIgnore2 = _interopRequireDefault(_shouldIgnore); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable import/no-commonjs */ var globAsync = _bluebird2.default.promisify(require('glob')); var fs = _bluebird2.default.promisifyAll(require('fs-extra')); /* eslint-enable */ function CopyWebpackPlugin() { var patterns = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; if (!_lodash2.default.isArray(patterns)) { throw new Error('CopyWebpackPlugin: patterns must be an array'); } var apply = function apply(compiler) { var webpackContext = compiler.options.context; var outputPath = compiler.options.output.path; var fileDependencies = []; var contextDependencies = []; var webpackIgnore = options.ignore || []; var copyUnmodified = options.copyUnmodified; var writtenAssetHashes = {}; compiler.plugin('emit', function (compilation, cb) { _bluebird2.default.each(patterns, function (pattern) { var relDest = void 0; var globOpts = void 0; if (pattern.context && !_path2.default.isAbsolute(pattern.context)) { pattern.context = _path2.default.resolve(webpackContext, pattern.context); } var context = pattern.context || webpackContext; var ignoreList = webpackIgnore.concat(pattern.ignore || []); globOpts = { cwd: context }; // From can be an object if (pattern.from.glob) { globOpts = _lodash2.default.assignIn(globOpts, _lodash2.default.omit(pattern.from, 'glob')); pattern.from = pattern.from.glob; } var relSrc = pattern.from; var absSrc = _path2.default.resolve(context, relSrc); relDest = pattern.to || ''; var forceWrite = Boolean(pattern.force); return fs.statAsync(absSrc).catch(function () { return null; }).then(function (stat) { if (stat && stat.isDirectory()) { contextDependencies.push(absSrc); // Make the relative destination actually relative if (_path2.default.isAbsolute(relDest)) { relDest = _path2.default.relative(outputPath, relDest); } return (0, _writeDirectoryToAssets2.default)({ absDirSrc: absSrc, compilation: compilation, copyUnmodified: copyUnmodified, flatten: pattern.flatten, forceWrite: forceWrite, ignoreList: ignoreList, relDirDest: relDest, writtenAssetHashes: writtenAssetHashes }); } return globAsync(relSrc, globOpts).each(function (relFileSrcParam) { var relFileDest = void 0; var relFileSrc = void 0; relFileSrc = relFileSrcParam; // Skip if it matches any of our ignore list if ((0, _shouldIgnore2.default)(relFileSrc, ignoreList)) { return false; } var absFileSrc = _path2.default.resolve(context, relFileSrc); relFileDest = pattern.to || ''; // Remove any directory references if flattening if (pattern.flatten) { relFileSrc = _path2.default.basename(relFileSrc); } var relFileDirname = _path2.default.dirname(relFileSrc); fileDependencies.push(absFileSrc); // If the pattern is a blob if (!stat) { var isNamePattern = new RegExp(); // If the source is absolute if (_path2.default.isAbsolute(relFileSrc)) { // Make the destination relative relFileDest = _path2.default.join(_path2.default.relative(context, relFileDirname), _path2.default.basename(relFileSrc)); // If this source is a name pattern } else if (isNamePattern.test(relFileSrc)) { // If the source is relative } else { relFileDest = _path2.default.join(relFileDest, relFileSrc); } // If it looks like a directory } else if ((0, _toLooksLikeDirectory2.default)(pattern)) { // Make the path relative to the source relFileDest = _path2.default.join(relFileDest, _path2.default.basename(relFileSrc)); } // If there's still no relFileDest console.log('still no', relFileDest); relFileDest = relFileDest || _path2.default.basename(relFileSrc); console.log('after still no', relFileDest); // Make sure the relative destination is actually relative console.log('is absolute', relFileDest); if (_path2.default.isAbsolute(relFileDest)) { relFileDest = _path2.default.relative(outputPath, relFileDest); } console.log('after is absolute', relFileDest); return (0, _writeFileToAssets2.default)({ absFileSrc: absFileSrc, compilation: compilation, copyUnmodified: copyUnmodified, forceWrite: forceWrite, relFileDest: relFileDest, relFileSrc: relFileSrc, writtenAssetHashes: writtenAssetHashes }); }); }); }).catch(function (err) { compilation.errors.push(err); }).finally(cb); }); compiler.plugin('after-emit', function (compilation, callback) { var trackedFiles = compilation.fileDependencies; _lodash2.default.forEach(fileDependencies, function (file) { if (!_lodash2.default.includes(trackedFiles, file)) { trackedFiles.push(file); } }); var trackedDirs = compilation.contextDependencies; _lodash2.default.forEach(contextDependencies, function (context) { if (!_lodash2.default.includes(trackedDirs, context)) { trackedDirs.push(context); } }); callback(); }); }; return { apply: apply }; } CopyWebpackPlugin['default'] = CopyWebpackPlugin; module.exports = CopyWebpackPlugin;