brikz.js 1.9 KB

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