writeFile.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = writeFile;
  6. var _loaderUtils = require('loader-utils');
  7. var _loaderUtils2 = _interopRequireDefault(_loaderUtils);
  8. var _path = require('path');
  9. var _path2 = _interopRequireDefault(_path);
  10. var _cacache = require('cacache');
  11. var _cacache2 = _interopRequireDefault(_cacache);
  12. var _serializeJavascript = require('serialize-javascript');
  13. var _serializeJavascript2 = _interopRequireDefault(_serializeJavascript);
  14. var _package = require('../package.json');
  15. var _findCacheDir = require('find-cache-dir');
  16. var _findCacheDir2 = _interopRequireDefault(_findCacheDir);
  17. var _promisify = require('./utils/promisify');
  18. var _crypto = require('crypto');
  19. var _crypto2 = _interopRequireDefault(_crypto);
  20. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  21. function writeFile(globalRef, pattern, file) {
  22. var info = globalRef.info,
  23. debug = globalRef.debug,
  24. compilation = globalRef.compilation,
  25. fileDependencies = globalRef.fileDependencies,
  26. written = globalRef.written,
  27. inputFileSystem = globalRef.inputFileSystem,
  28. copyUnmodified = globalRef.copyUnmodified;
  29. return (0, _promisify.stat)(inputFileSystem, file.absoluteFrom).then(function (stat) {
  30. // We don't write empty directories
  31. if (stat.isDirectory()) {
  32. return;
  33. }
  34. // If this came from a glob, add it to the file watchlist
  35. if (pattern.fromType === 'glob') {
  36. fileDependencies.push(file.absoluteFrom);
  37. }
  38. info('reading ' + file.absoluteFrom + ' to write to assets');
  39. return (0, _promisify.readFile)(inputFileSystem, file.absoluteFrom).then(function (content) {
  40. if (pattern.transform) {
  41. var transform = function transform(content, absoluteFrom) {
  42. return pattern.transform(content, absoluteFrom);
  43. };
  44. if (pattern.cache) {
  45. if (!globalRef.cacheDir) {
  46. globalRef.cacheDir = (0, _findCacheDir2.default)({ name: 'copy-webpack-plugin' });
  47. }
  48. var cacheKey = pattern.cache.key ? pattern.cache.key : (0, _serializeJavascript2.default)({
  49. name: _package.name,
  50. version: _package.version,
  51. pattern: pattern,
  52. hash: _crypto2.default.createHash('md4').update(content).digest('hex')
  53. });
  54. return _cacache2.default.get(globalRef.cacheDir, cacheKey).then(function (result) {
  55. return result.data;
  56. }, function () {
  57. return Promise.resolve().then(function () {
  58. return transform(content, file.absoluteFrom);
  59. }).then(function (content) {
  60. return _cacache2.default.put(globalRef.cacheDir, cacheKey, content).then(function () {
  61. return content;
  62. });
  63. });
  64. });
  65. }
  66. content = transform(content, file.absoluteFrom);
  67. }
  68. return content;
  69. }).then(function (content) {
  70. if (pattern.toType === 'template') {
  71. info('interpolating template \'' + file.webpackTo + '\' for \'' + file.relativeFrom + '\'');
  72. // If it doesn't have an extension, remove it from the pattern
  73. // ie. [name].[ext] or [name][ext] both become [name]
  74. if (!_path2.default.extname(file.relativeFrom)) {
  75. file.webpackTo = file.webpackTo.replace(/\.?\[ext\]/g, '');
  76. }
  77. file.webpackTo = _loaderUtils2.default.interpolateName({ resourcePath: file.absoluteFrom }, file.webpackTo, {
  78. content: content,
  79. regExp: file.webpackToRegExp,
  80. context: pattern.context
  81. });
  82. }
  83. return content;
  84. }).then(function (content) {
  85. if (pattern.transformPath) {
  86. return Promise.resolve(pattern.transformPath(file.webpackTo, file.absoluteFrom)).then(function (newPath) {
  87. file.webpackTo = newPath;
  88. }).then(function () {
  89. return content;
  90. });
  91. }
  92. return content;
  93. }).then(function (content) {
  94. var hash = _loaderUtils2.default.getHashDigest(content);
  95. if (!copyUnmodified && written[file.absoluteFrom] && written[file.absoluteFrom]['hash'] === hash && written[file.absoluteFrom]['webpackTo'] === file.webpackTo) {
  96. info('skipping \'' + file.webpackTo + '\', because it hasn\'t changed');
  97. return;
  98. } else {
  99. debug('added ' + hash + ' to written tracking for \'' + file.absoluteFrom + '\'');
  100. written[file.absoluteFrom] = {
  101. hash: hash,
  102. webpackTo: file.webpackTo
  103. };
  104. }
  105. if (compilation.assets[file.webpackTo] && !file.force) {
  106. info('skipping \'' + file.webpackTo + '\', because it already exists');
  107. return;
  108. }
  109. info('writing \'' + file.webpackTo + '\' to compilation assets from \'' + file.absoluteFrom + '\'');
  110. compilation.assets[file.webpackTo] = {
  111. size: function size() {
  112. return stat.size;
  113. },
  114. source: function source() {
  115. return content;
  116. }
  117. };
  118. });
  119. });
  120. }