brikz.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. function Brikz(api, apiKey, initKey) {
  2. var brikz = this, backup = {};
  3. apiKey = apiKey || 'exports';
  4. initKey = initKey || '__init__';
  5. function mixin(src, target, what) {
  6. for (var keys = Object.keys(what||src), l=keys.length, i=0; i<l; ++i) {
  7. if (src == null) { target[keys[i]] = undefined; } else {
  8. var value = src[keys[i]];
  9. if (typeof value !== "undefined") { target[keys[i]] = value; }
  10. }
  11. }
  12. return target;
  13. }
  14. var d={value: null, enumerable: false, configurable: true, writable: true};
  15. Object.defineProperties(this, { ensure: d, rebuild: d });
  16. var exclude = mixin(this, {});
  17. this.rebuild = function () {
  18. Object.keys(backup).forEach(function (key) {
  19. mixin(null, api, (backup[key]||0)[apiKey]||{});
  20. });
  21. var oapi = mixin(api, {}), order = [], chk = {};
  22. brikz.ensure = function(key) {
  23. if (key in exclude) { return null; }
  24. var b = brikz[key], bak = backup[key];
  25. mixin(null, api, api);
  26. while (typeof b === "function") { b = new b(brikz, api, bak); }
  27. if (b && !chk[key]) { chk[key]=true; order.push(b); }
  28. if (b && !b[apiKey]) { b[apiKey] = mixin(api, {}); }
  29. brikz[key] = b;
  30. return b;
  31. };
  32. Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
  33. brikz.ensure = null;
  34. mixin(oapi, mixin(null, api, api));
  35. order.forEach(function(brik) { mixin(brik[apiKey] || {}, api); });
  36. order.forEach(function(brik) { if (brik[initKey]) brik[initKey](); });
  37. backup = mixin(brikz, {});
  38. };
  39. }