5def9eb173b0d656a3d005e11ef4e0d1c07d033939053dcc96ace1513ba66f78d473bba89b685223f0a42cc5f2a5369901cb3527ec645c2fd12b3a20d40083 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { dirname } from 'path';
  2. import { optsArg } from './opts-arg.js';
  3. export const mkdirpManualSync = (path, options, made) => {
  4. const parent = dirname(path);
  5. const opts = { ...optsArg(options), recursive: false };
  6. if (parent === path) {
  7. try {
  8. return opts.mkdirSync(path, opts);
  9. }
  10. catch (er) {
  11. // swallowed by recursive implementation on posix systems
  12. // any other error is a failure
  13. const fer = er;
  14. if (fer && fer.code !== 'EISDIR') {
  15. throw er;
  16. }
  17. return;
  18. }
  19. }
  20. try {
  21. opts.mkdirSync(path, opts);
  22. return made || path;
  23. }
  24. catch (er) {
  25. const fer = er;
  26. if (fer && fer.code === 'ENOENT') {
  27. return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made));
  28. }
  29. if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {
  30. throw er;
  31. }
  32. try {
  33. if (!opts.statSync(path).isDirectory())
  34. throw er;
  35. }
  36. catch (_) {
  37. throw er;
  38. }
  39. }
  40. };
  41. export const mkdirpManual = Object.assign(async (path, options, made) => {
  42. const opts = optsArg(options);
  43. opts.recursive = false;
  44. const parent = dirname(path);
  45. if (parent === path) {
  46. return opts.mkdirAsync(path, opts).catch(er => {
  47. // swallowed by recursive implementation on posix systems
  48. // any other error is a failure
  49. const fer = er;
  50. if (fer && fer.code !== 'EISDIR') {
  51. throw er;
  52. }
  53. });
  54. }
  55. return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => {
  56. const fer = er;
  57. if (fer && fer.code === 'ENOENT') {
  58. return mkdirpManual(parent, opts).then((made) => mkdirpManual(path, opts, made));
  59. }
  60. if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {
  61. throw er;
  62. }
  63. return opts.statAsync(path).then(st => {
  64. if (st.isDirectory()) {
  65. return made;
  66. }
  67. else {
  68. throw er;
  69. }
  70. }, () => {
  71. throw er;
  72. });
  73. });
  74. }, { sync: mkdirpManualSync });
  75. //# sourceMappingURL=mkdirp-manual.js.map