brikz.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  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. var value = src[keys[i]];
  8. if (typeof value !== "undefined") { target[keys[i]] = value; }
  9. }
  10. return target;
  11. }
  12. var d={value: null, enumerable: false, configurable: true, writable: true};
  13. Object.defineProperties(this, { ensure: d, rebuild: d });
  14. this.rebuild = function () {
  15. Object.keys(backup).forEach(function (key) {
  16. mixin({}, api, (backup[key]||0)[apiKey]);
  17. });
  18. var oapi = mixin(api, {}), order = [], chk = {};
  19. brikz.ensure = function(key) {
  20. var b = brikz[key], bak = backup[key];
  21. mixin({}, api, api);
  22. while (typeof b === "function") { b = new b(brikz, api, bak); }
  23. if (b && !chk[key]) { chk[key]=true; order.push(b); }
  24. if (b && !b[apiKey]) { b[apiKey] = mixin(api, {}); }
  25. return brikz[key] = b;
  26. };
  27. Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
  28. brikz.ensure = null;
  29. mixin(oapi, mixin({}, api, api));
  30. order.forEach(function(brik) { mixin(brik[apiKey] || {}, api); });
  31. order.forEach(function(brik) { brik[initKey] && brik[initKey](); });
  32. backup = mixin(brikz, {});
  33. };
  34. }