index.js 2.7 KB

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