95a62b81f44902b1539b0e83a811e917be9a577ff74cba120ef50e622e87bf502eb71a9138a3d9bb96773895ffec9e3826587184ea6895e63ad5c276dc269c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. const lchownSync = (path, uid, gid) => {
  4. try {
  5. return fs.lchownSync(path, uid, gid);
  6. }
  7. catch (er) {
  8. if (er?.code !== 'ENOENT')
  9. throw er;
  10. }
  11. };
  12. const chown = (cpath, uid, gid, cb) => {
  13. fs.lchown(cpath, uid, gid, er => {
  14. // Skip ENOENT error
  15. cb(er && er?.code !== 'ENOENT' ? er : null);
  16. });
  17. };
  18. const chownrKid = (p, child, uid, gid, cb) => {
  19. if (child.isDirectory()) {
  20. chownr(path.resolve(p, child.name), uid, gid, (er) => {
  21. if (er)
  22. return cb(er);
  23. const cpath = path.resolve(p, child.name);
  24. chown(cpath, uid, gid, cb);
  25. });
  26. }
  27. else {
  28. const cpath = path.resolve(p, child.name);
  29. chown(cpath, uid, gid, cb);
  30. }
  31. };
  32. export const chownr = (p, uid, gid, cb) => {
  33. fs.readdir(p, { withFileTypes: true }, (er, children) => {
  34. // any error other than ENOTDIR or ENOTSUP means it's not readable,
  35. // or doesn't exist. give up.
  36. if (er) {
  37. if (er.code === 'ENOENT')
  38. return cb();
  39. else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')
  40. return cb(er);
  41. }
  42. if (er || !children.length)
  43. return chown(p, uid, gid, cb);
  44. let len = children.length;
  45. let errState = null;
  46. const then = (er) => {
  47. /* c8 ignore start */
  48. if (errState)
  49. return;
  50. /* c8 ignore stop */
  51. if (er)
  52. return cb((errState = er));
  53. if (--len === 0)
  54. return chown(p, uid, gid, cb);
  55. };
  56. for (const child of children) {
  57. chownrKid(p, child, uid, gid, then);
  58. }
  59. });
  60. };
  61. const chownrKidSync = (p, child, uid, gid) => {
  62. if (child.isDirectory())
  63. chownrSync(path.resolve(p, child.name), uid, gid);
  64. lchownSync(path.resolve(p, child.name), uid, gid);
  65. };
  66. export const chownrSync = (p, uid, gid) => {
  67. let children;
  68. try {
  69. children = fs.readdirSync(p, { withFileTypes: true });
  70. }
  71. catch (er) {
  72. const e = er;
  73. if (e?.code === 'ENOENT')
  74. return;
  75. else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP')
  76. return lchownSync(p, uid, gid);
  77. else
  78. throw e;
  79. }
  80. for (const child of children) {
  81. chownrKidSync(p, child, uid, gid);
  82. }
  83. return lchownSync(p, uid, gid);
  84. };
  85. //# sourceMappingURL=index.js.map