DirectoryExistsPlugin.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. /** @typedef {import("./Resolver")} Resolver */
  7. /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
  8. module.exports = class DirectoryExistsPlugin {
  9. /**
  10. * @param {string | ResolveStepHook} source source
  11. * @param {string | ResolveStepHook} target target
  12. */
  13. constructor(source, target) {
  14. this.source = source;
  15. this.target = target;
  16. }
  17. /**
  18. * @param {Resolver} resolver the resolver
  19. * @returns {void}
  20. */
  21. apply(resolver) {
  22. const target = resolver.ensureHook(this.target);
  23. resolver
  24. .getHook(this.source)
  25. .tapAsync(
  26. "DirectoryExistsPlugin",
  27. (request, resolveContext, callback) => {
  28. const fs = resolver.fileSystem;
  29. const directory = request.path;
  30. if (!directory) return callback();
  31. fs.stat(directory, (err, stat) => {
  32. if (err || !stat) {
  33. if (resolveContext.missingDependencies) {
  34. resolveContext.missingDependencies.add(directory);
  35. }
  36. if (resolveContext.log) {
  37. resolveContext.log(`${directory} doesn't exist`);
  38. }
  39. return callback();
  40. }
  41. if (!stat.isDirectory()) {
  42. if (resolveContext.missingDependencies) {
  43. resolveContext.missingDependencies.add(directory);
  44. }
  45. if (resolveContext.log) {
  46. resolveContext.log(`${directory} is not a directory`);
  47. }
  48. return callback();
  49. }
  50. if (resolveContext.fileDependencies) {
  51. resolveContext.fileDependencies.add(directory);
  52. }
  53. resolver.doResolve(
  54. target,
  55. request,
  56. `existing directory ${directory}`,
  57. resolveContext,
  58. callback,
  59. );
  60. });
  61. },
  62. );
  63. }
  64. };