brikz.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  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. var exclude = mixin(this, {});
  15. this.rebuild = function () {
  16. Object.keys(backup).forEach(function (key) {
  17. mixin({}, api, (backup[key]||0)[apiKey]);
  18. });
  19. var oapi = mixin(api, {}), order = [], chk = {};
  20. brikz.ensure = function(key) {
  21. if (key in exclude) { return null; }
  22. var b = brikz[key], bak = backup[key];
  23. mixin({}, api, api);
  24. while (typeof b === "function") { b = new b(brikz, api, bak); }
  25. if (b && !chk[key]) { chk[key]=true; order.push(b); }
  26. if (b && !b[apiKey]) { b[apiKey] = mixin(api, {}); }
  27. return brikz[key] = b;
  28. };
  29. Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
  30. brikz.ensure = null;
  31. mixin(oapi, mixin({}, api, api));
  32. order.forEach(function(brik) { mixin(brik[apiKey] || {}, api); });
  33. order.forEach(function(brik) { brik[initKey] && brik[initKey](); });
  34. backup = mixin(brikz, {});
  35. };
  36. }