preProcessPattern.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. pattern.to = pattern.to || '';
  28. pattern.context = pattern.context || context;
  29. if (!_path.default.isAbsolute(pattern.context)) {
  30. pattern.context = _path.default.join(context, pattern.context);
  31. }
  32. const isFromGlobPatten = (0, _isObject.default)(pattern.from) && pattern.from.glob || pattern.globOptions; // Todo remove this in next major
  33. const isToDirectory = _path.default.extname(pattern.to) === '' || pattern.to.slice(-1) === _path.default.sep; // Normalize paths
  34. pattern.from = isFromGlobPatten ? pattern.from : _path.default.normalize(pattern.from);
  35. pattern.context = _path.default.normalize(pattern.context);
  36. pattern.to = _path.default.normalize(pattern.to);
  37. pattern.ignore = globalRef.ignore.concat(pattern.ignore || []);
  38. logger.debug(`processing from: '${pattern.from}' to: '${pattern.to}'`);
  39. switch (true) {
  40. // if toType already exists
  41. case !!pattern.toType:
  42. break;
  43. case (0, _isTemplateLike.default)(pattern.to):
  44. pattern.toType = 'template';
  45. break;
  46. case isToDirectory:
  47. pattern.toType = 'dir';
  48. break;
  49. default:
  50. pattern.toType = 'file';
  51. } // If we know it's a glob, then bail early
  52. if (isFromGlobPatten) {
  53. logger.debug(`determined '${pattern.absoluteFrom}' is a glob`);
  54. pattern.fromType = 'glob';
  55. const globOptions = Object.assign({}, pattern.globOptions ? pattern.globOptions : pattern.from);
  56. delete globOptions.glob;
  57. pattern.absoluteFrom = _path.default.resolve(pattern.context, pattern.globOptions ? pattern.from : pattern.from.glob);
  58. pattern.glob = (0, _normalize.default)(pattern.context, pattern.globOptions ? pattern.from : pattern.from.glob);
  59. pattern.globOptions = globOptions;
  60. return Promise.resolve(pattern);
  61. }
  62. if (_path.default.isAbsolute(pattern.from)) {
  63. pattern.absoluteFrom = pattern.from;
  64. } else {
  65. pattern.absoluteFrom = _path.default.resolve(pattern.context, pattern.from);
  66. }
  67. logger.debug(`determined '${pattern.from}' to be read from '${pattern.absoluteFrom}'`);
  68. const noStatsHandler = () => {
  69. // If from doesn't appear to be a glob, then log a warning
  70. if ((0, _isGlob.default)(pattern.from) || pattern.from.includes('*')) {
  71. logger.debug(`determined '${pattern.absoluteFrom}' is a glob`);
  72. pattern.fromType = 'glob';
  73. 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
  74. // when we already in watch mode and this directories are not in context dependencies
  75. // `glob-parent` always return `/` we need normalize path
  76. contextDependencies.add(_path.default.normalize((0, _globParent.default)(pattern.absoluteFrom)));
  77. } else {
  78. const newWarning = new Error(`unable to locate '${pattern.from}' at '${pattern.absoluteFrom}'`);
  79. const hasWarning = compilation.warnings.some( // eslint-disable-next-line no-shadow
  80. warning => warning.message === newWarning.message); // Only display the same message once
  81. if (!hasWarning) {
  82. logger.warn(newWarning.message);
  83. compilation.warnings.push(newWarning);
  84. }
  85. pattern.fromType = 'nonexistent';
  86. }
  87. };
  88. logger.debug(`getting stats for '${pattern.absoluteFrom}' to determinate 'fromType'`);
  89. return (0, _promisify.stat)(inputFileSystem, pattern.absoluteFrom).catch(() => noStatsHandler()).then(stats => {
  90. if (!stats) {
  91. noStatsHandler();
  92. return pattern;
  93. }
  94. if (stats.isDirectory()) {
  95. logger.debug(`determined '${pattern.absoluteFrom}' is a directory`);
  96. contextDependencies.add(pattern.absoluteFrom);
  97. pattern.fromType = 'dir';
  98. pattern.context = pattern.absoluteFrom;
  99. pattern.glob = (0, _normalize.default)(pattern.absoluteFrom, '**/*');
  100. pattern.absoluteFrom = _path.default.join(pattern.absoluteFrom, '**/*');
  101. pattern.globOptions = {
  102. dot: true
  103. };
  104. } else if (stats.isFile()) {
  105. logger.debug(`determined '${pattern.absoluteFrom}' is a file`);
  106. fileDependencies.add(pattern.absoluteFrom);
  107. pattern.stats = stats;
  108. pattern.fromType = 'file';
  109. pattern.context = _path.default.dirname(pattern.absoluteFrom);
  110. pattern.glob = (0, _normalize.default)(pattern.absoluteFrom);
  111. pattern.globOptions = {
  112. dot: true
  113. };
  114. } else if (!pattern.fromType) {
  115. logger.warn(`unrecognized file type for ${pattern.from}`);
  116. }
  117. return pattern;
  118. });
  119. }