brikz.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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) {
  8. target[keys[i]] = undefined;
  9. } else {
  10. var value = src[keys[i]];
  11. if (typeof value !== "undefined") {
  12. target[keys[i]] = value;
  13. }
  14. }
  15. }
  16. return target;
  17. }
  18. var d = {value: null, enumerable: false, configurable: true, writable: true};
  19. Object.defineProperties(this, {ensure: d, rebuild: d});
  20. var exclude = mixin(this, {});
  21. this.rebuild = function () {
  22. Object.keys(backup).forEach(function (key) {
  23. mixin(null, api, (backup[key] || 0)[apiKey] || {});
  24. });
  25. var oapi = mixin(api, {}), order = [], chk = {};
  26. brikz.ensure = function (key) {
  27. if (key in exclude) {
  28. return null;
  29. }
  30. var b = brikz[key], bak = backup[key];
  31. mixin(null, api, api);
  32. while (typeof b === "function") {
  33. b = new b(brikz, api, bak);
  34. }
  35. if (b && !chk[key]) {
  36. chk[key] = true;
  37. order.push(b);
  38. }
  39. if (b && !b[apiKey]) {
  40. b[apiKey] = mixin(api, {});
  41. }
  42. brikz[key] = b;
  43. return b;
  44. };
  45. Object.keys(brikz).forEach(function (key) {
  46. brikz.ensure(key);
  47. });
  48. brikz.ensure = null;
  49. mixin(oapi, mixin(null, api, api));
  50. order.forEach(function (brik) {
  51. mixin(brik[apiKey] || {}, api);
  52. });
  53. order.forEach(function (brik) {
  54. if (brik[initKey]) brik[initKey]();
  55. });
  56. backup = mixin(brikz, {});
  57. };
  58. }