index.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. var through = require('through2');
  3. var deepAssign = require('deep-assign');
  4. var Mode = require('stat-mode');
  5. // 511 = 0777
  6. var defaultMode = 511 & (~process.umask());
  7. function normalize(mode) {
  8. var called = false;
  9. var newMode = {
  10. owner: {},
  11. group: {},
  12. others: {}
  13. };
  14. ['read', 'write', 'execute'].forEach(function (key) {
  15. if (typeof mode[key] === 'boolean') {
  16. newMode.owner[key] = mode[key];
  17. newMode.group[key] = mode[key];
  18. newMode.others[key] = mode[key];
  19. called = true;
  20. }
  21. });
  22. return called ? newMode : mode;
  23. }
  24. module.exports = function (mode) {
  25. if (typeof mode !== 'number' && typeof mode !== 'object') {
  26. throw new TypeError('Expected a number or object');
  27. }
  28. return through.obj(function (file, enc, cb) {
  29. if (file.isNull()) {
  30. cb(null, file);
  31. return;
  32. }
  33. file.stat = file.stat || {};
  34. file.stat.mode = file.stat.mode || defaultMode;
  35. if (typeof mode === 'object') {
  36. var statMode = new Mode(file.stat);
  37. deepAssign(statMode, normalize(mode));
  38. file.stat.mode = statMode.stat.mode;
  39. } else {
  40. file.stat.mode = parseInt(mode, 8);
  41. }
  42. cb(null, file);
  43. });
  44. };