index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _path = _interopRequireDefault(require("path"));
  7. var _schemaUtils = _interopRequireDefault(require("schema-utils"));
  8. var _webpackLog = _interopRequireDefault(require("webpack-log"));
  9. var _options = _interopRequireDefault(require("./options.json"));
  10. var _preProcessPattern = _interopRequireDefault(require("./preProcessPattern"));
  11. var _processPattern = _interopRequireDefault(require("./processPattern"));
  12. var _postProcessPattern = _interopRequireDefault(require("./postProcessPattern"));
  13. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  14. class CopyPlugin {
  15. constructor(patterns = [], options = {}) {
  16. (0, _schemaUtils.default)(_options.default, patterns, this.constructor.name);
  17. this.patterns = patterns;
  18. this.options = options;
  19. }
  20. apply(compiler) {
  21. const fileDependencies = new Set();
  22. const contextDependencies = new Set();
  23. const written = {};
  24. let context;
  25. if (!this.options.context) {
  26. ({
  27. context
  28. } = compiler.options);
  29. } else if (!_path.default.isAbsolute(this.options.context)) {
  30. context = _path.default.join(compiler.options.context, this.options.context);
  31. } else {
  32. ({
  33. context
  34. } = this.options);
  35. }
  36. const logger = (0, _webpackLog.default)({
  37. name: 'copy-webpack-plugin',
  38. level: this.options.logLevel || 'warn'
  39. });
  40. const plugin = {
  41. name: 'CopyPlugin'
  42. };
  43. compiler.hooks.emit.tapAsync(plugin, (compilation, callback) => {
  44. logger.debug('starting emit');
  45. const globalRef = {
  46. logger,
  47. compilation,
  48. written,
  49. fileDependencies,
  50. contextDependencies,
  51. context,
  52. inputFileSystem: compiler.inputFileSystem,
  53. output: compiler.options.output.path,
  54. ignore: this.options.ignore || [],
  55. copyUnmodified: this.options.copyUnmodified,
  56. concurrency: this.options.concurrency
  57. };
  58. if (globalRef.output === '/' && compiler.options.devServer && compiler.options.devServer.outputPath) {
  59. globalRef.output = compiler.options.devServer.outputPath;
  60. }
  61. const {
  62. patterns
  63. } = this;
  64. Promise.all(patterns.map(pattern => Promise.resolve().then(() => (0, _preProcessPattern.default)(globalRef, pattern)) // Every source (from) is assumed to exist here
  65. // eslint-disable-next-line no-shadow
  66. .then(pattern => (0, _processPattern.default)(globalRef, pattern).then(files => {
  67. if (!files) {
  68. return Promise.resolve();
  69. }
  70. return Promise.all(files.filter(Boolean).map(file => (0, _postProcessPattern.default)(globalRef, pattern, file)));
  71. })))).catch(error => {
  72. compilation.errors.push(error);
  73. }).then(() => {
  74. logger.debug('finishing emit');
  75. callback();
  76. });
  77. });
  78. compiler.hooks.afterEmit.tapAsync(plugin, (compilation, callback) => {
  79. logger.debug('starting after-emit'); // Add file dependencies
  80. if ('addAll' in compilation.fileDependencies) {
  81. compilation.fileDependencies.addAll(fileDependencies);
  82. } else {
  83. for (const fileDependency of fileDependencies) {
  84. compilation.fileDependencies.add(fileDependency);
  85. }
  86. } // Add context dependencies
  87. if ('addAll' in compilation.contextDependencies) {
  88. compilation.contextDependencies.addAll(contextDependencies);
  89. } else {
  90. for (const contextDependency of contextDependencies) {
  91. compilation.contextDependencies.add(contextDependency);
  92. }
  93. }
  94. logger.debug('finishing after-emit');
  95. callback();
  96. });
  97. }
  98. }
  99. var _default = CopyPlugin;
  100. exports.default = _default;