brikz.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. define([], function () {
  2. return function Brikz(api, apiKey, initKey) {
  3. var brikz = this,
  4. backup = {};
  5. apiKey = apiKey || 'exports';
  6. initKey = initKey || '__init__';
  7. function mixin(src, target, what) {
  8. for (var keys = Object.keys(what || src), l = keys.length, i = 0; i < l; ++i) {
  9. if (src == null) {
  10. target[keys[i]] = undefined;
  11. } else {
  12. var value = src[keys[i]];
  13. if (typeof value !== "undefined") {
  14. target[keys[i]] = value;
  15. }
  16. }
  17. }
  18. return target;
  19. }
  20. Object.defineProperties(this, {
  21. rebuild: { value: null, enumerable: false, configurable: true, writable: true }
  22. });
  23. var exclude = mixin(this, {});
  24. this.rebuild = function () {
  25. Object.keys(backup).forEach(function (key) {
  26. mixin(null, api, (backup[key] || 0)[apiKey] || {});
  27. });
  28. var oapi = mixin(api, {}),
  29. order = [],
  30. chk = {};
  31. function ensure(key) {
  32. if (key in exclude) {
  33. return null;
  34. }
  35. var b = brikz[key],
  36. bak = backup[key];
  37. mixin(null, api, api);
  38. while (typeof b === "function") {
  39. (b.deps || []).forEach(ensure);
  40. b = new b(brikz, api, bak);
  41. }
  42. brikz[key] = b;
  43. if (b && !chk[key]) {
  44. chk[key] = true;
  45. order.push(b);
  46. }
  47. if (b && !b[apiKey]) {
  48. b[apiKey] = mixin(api, {});
  49. }
  50. }
  51. Object.keys(brikz).forEach(ensure);
  52. mixin(oapi, mixin(null, api, api));
  53. order.forEach(function (brik) {
  54. mixin(brik[apiKey] || {}, api);
  55. });
  56. order.forEach(function (brik) {
  57. if (brik[initKey]) {
  58. brik[initKey]();
  59. if (brik[initKey].once) {
  60. delete brik[initKey];
  61. }
  62. }
  63. });
  64. backup = mixin(brikz, {});
  65. };
  66. };
  67. });