preProcessPattern.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = preProcessPattern;
  6. var _path = _interopRequireDefault(require("path"));
  7. var _isGlob = _interopRequireDefault(require("is-glob"));
  8. var _globParent = _interopRequireDefault(require("glob-parent"));
  9. var _normalize = _interopRequireDefault(require("./utils/normalize"));
  10. var _isTemplateLike = _interopRequireDefault(require("./utils/isTemplateLike"));
  11. var _isObject = _interopRequireDefault(require("./utils/isObject"));
  12. var _promisify = require("./utils/promisify");
  13. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  14. /* eslint-disable no-param-reassign */
  15. function preProcessPattern(globalRef, pattern) {
  16. const {
  17. logger,
  18. context,
  19. inputFileSystem,
  20. fileDependencies,
  21. contextDependencies,
  22. compilation
  23. } = globalRef;
  24. pattern = typeof pattern === 'string' ? {
  25. from: pattern
  26. } : Object.assign({}, pattern);
  27. if (pattern.from === '') {
  28. const message = 'path "from" cannot be empty string';
  29. logger.error(message);
  30. compilation.errors.push(new Error(message));
  31. }
  32. pattern.to = pattern.to || '';
  33. pattern.context = pattern.context || context;
  34. if (!_path.default.isAbsolute(pattern.context)) {
  35. pattern.context = _path.default.join(context, pattern.context);
  36. }
  37. const isFromGlobPatten = (0, _isObject.default)(pattern.from) && pattern.from.glob; // Todo remove this in next major
  38. const isToDirectory = _path.default.extname(pattern.to) === '' || pattern.to.slice(-1) === _path.default.sep; // Normalize paths
  39. pattern.from = isFromGlobPatten ? pattern.from : _path.default.normalize(pattern.from);
  40. pattern.context = _path.default.normalize(pattern.context);
  41. pattern.to = _path.default.normalize(pattern.to);
  42. pattern.ignore = globalRef.ignore.concat(pattern.ignore || []);
  43. logger.debug(`processing from: '${pattern.from}' to: '${pattern.to}'`);
  44. switch (true) {
  45. // if toType already exists
  46. case !!pattern.toType:
  47. break;
  48. case (0, _isTemplateLike.default)(pattern.to):
  49. pattern.toType = 'template';
  50. break;
  51. case isToDirectory:
  52. pattern.toType = 'dir';
  53. break;
  54. default:
  55. pattern.toType = 'file';
  56. } // If we know it's a glob, then bail early
  57. if (isFromGlobPatten) {
  58. logger.debug(`determined '${pattern.absoluteFrom}' is a glob`);
  59. pattern.fromType = 'glob';
  60. const globOptions = Object.assign({}, pattern.from);
  61. delete globOptions.glob;
  62. pattern.glob = (0, _normalize.default)(pattern.context, pattern.from.glob);
  63. pattern.globOptions = globOptions;
  64. pattern.absoluteFrom = _path.default.resolve(pattern.context, pattern.from.glob);
  65. return Promise.resolve(pattern);
  66. }
  67. if (_path.default.isAbsolute(pattern.from)) {
  68. pattern.absoluteFrom = pattern.from;
  69. } else {
  70. pattern.absoluteFrom = _path.default.resolve(pattern.context, pattern.from);
  71. }
  72. logger.debug(`determined '${pattern.from}' to be read from '${pattern.absoluteFrom}'`);
  73. const noStatsHandler = () => {
  74. // If from doesn't appear to be a glob, then log a warning
  75. if ((0, _isGlob.default)(pattern.from) || pattern.from.includes('*')) {
  76. logger.debug(`determined '${pattern.absoluteFrom}' is a glob`);
  77. pattern.fromType = 'glob';
  78. pattern.glob = (0, _normalize.default)(pattern.context, pattern.from); // We need to add context directory as dependencies to avoid problems when new files added in directories
  79. // when we already in watch mode and this directories are not in context dependencies
  80. // `glob-parent` always return `/` we need normalize path
  81. contextDependencies.add(_path.default.normalize((0, _globParent.default)(pattern.absoluteFrom)));
  82. } else {
  83. const newWarning = new Error(`unable to locate '${pattern.from}' at '${pattern.absoluteFrom}'`);
  84. const hasWarning = compilation.warnings.some( // eslint-disable-next-line no-shadow
  85. warning => warning.message === newWarning.message); // Only display the same message once
  86. if (!hasWarning) {
  87. logger.warn(newWarning.message);
  88. compilation.warnings.push(newWarning);
  89. }
  90. pattern.fromType = 'nonexistent';
  91. }
  92. };
  93. logger.debug(`getting stats for '${pattern.absoluteFrom}' to determinate 'fromType'`);
  94. return (0, _promisify.stat)(inputFileSystem, pattern.absoluteFrom).catch(() => noStatsHandler()).then(stats => {
  95. if (!stats) {
  96. noStatsHandler();
  97. return pattern;
  98. }
  99. if (stats.isDirectory()) {
  100. logger.debug(`determined '${pattern.absoluteFrom}' is a directory`);
  101. contextDependencies.add(pattern.absoluteFrom);
  102. pattern.fromType = 'dir';
  103. pattern.context = pattern.absoluteFrom;
  104. pattern.glob = (0, _normalize.default)(pattern.absoluteFrom, '**/*');
  105. pattern.absoluteFrom = _path.default.join(pattern.absoluteFrom, '**/*');
  106. pattern.globOptions = {
  107. dot: true
  108. };
  109. } else if (stats.isFile()) {
  110. logger.debug(`determined '${pattern.absoluteFrom}' is a file`);
  111. fileDependencies.add(pattern.absoluteFrom);
  112. pattern.stats = stats;
  113. pattern.fromType = 'file';
  114. pattern.context = _path.default.dirname(pattern.absoluteFrom);
  115. pattern.glob = (0, _normalize.default)(pattern.absoluteFrom);
  116. pattern.globOptions = {
  117. dot: true
  118. };
  119. } else if (!pattern.fromType) {
  120. logger.warn(`unrecognized file type for ${pattern.from}`);
  121. }
  122. return pattern;
  123. });
  124. }