index.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. var Fs = require("fs"),
  2. Package = require("./package.json"),
  3. version = module.exports.version = Package.version,
  4. Path = require("path"),
  5. DIRNAME = __dirname,
  6. read = function (p) {
  7. var content = Fs.readFileSync(p, 'utf-8');
  8. if (content.charAt(content.length - 1) !== '\n') {
  9. throw new Error("file at " + p + " did not end with a newline character");
  10. }
  11. return JSON.parse(content);
  12. },
  13. P = module.exports.peers = (function () {
  14. var pathFromArray = function (A) {
  15. return A.reduce(function (a, b) { return Path.join(a, b); }, '');
  16. };
  17. var isDir = function (fullPath) {
  18. return Fs.lstatSync(fullPath).isDirectory();
  19. };
  20. var getDir = function (A, f) {
  21. var p = pathFromArray(A);
  22. return Fs.readdirSync(p).filter(function (name) {
  23. var fullPath = pathFromArray([p, name]);
  24. return f(fullPath, A, name);
  25. });
  26. };
  27. var find = function (map, path) {
  28. /* safely search for nested values in an object via a path */
  29. return (map && path.reduce(function (p, n) {
  30. return typeof p[n] !== 'undefined' && p[n];
  31. }, map)) || undefined;
  32. }
  33. var peers = {};
  34. var walk = function (A) {
  35. getDir(A, function (fullPath, A, name) {
  36. if (/^\./.test(name)) {
  37. // ignore hidden files
  38. } else if (isDir(fullPath)) {
  39. find(peers, A.slice(1))[name] = {};
  40. walk(A.concat(name));
  41. } else if (/\.k$/.test(name)) {
  42. find(peers, A.slice(1))[name] = read(fullPath);
  43. }
  44. });
  45. };
  46. walk([DIRNAME]);
  47. return peers;
  48. }()),
  49. map = module.exports.map = function (f) {
  50. var L = [];
  51. // t/f is the object a credential
  52. var isCred = function (k) {
  53. // creds end in .k
  54. return /\.k/.test(k);
  55. };
  56. var walk = function (o, p, f) {
  57. // walk the tree of objects
  58. if (typeof(o) === 'object') {
  59. // for each key in o, walk the key
  60. Object.keys(o).forEach(function (k) {
  61. var path = p.slice(0).concat(k);
  62. if (isCred(k)) {
  63. //console.log(o[k]);
  64. L.push(f(o[k], path));
  65. }
  66. walk(o[k], path, f);
  67. });
  68. }
  69. };
  70. walk(P, [], f);
  71. return L;
  72. },
  73. filter = module.exports.filter = function (f) {
  74. var L = [];
  75. map(function (x, p) {
  76. if (f(x,p)) { L.push(x); }
  77. });
  78. return L;
  79. };