kapsule.module.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import debounce from 'debounce';
  2. function _classCallCheck(instance, Constructor) {
  3. if (!(instance instanceof Constructor)) {
  4. throw new TypeError("Cannot call a class as a function");
  5. }
  6. }
  7. function _slicedToArray(arr, i) {
  8. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
  9. }
  10. function _arrayWithHoles(arr) {
  11. if (Array.isArray(arr)) return arr;
  12. }
  13. function _iterableToArrayLimit(arr, i) {
  14. var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
  15. if (_i == null) return;
  16. var _arr = [];
  17. var _n = true;
  18. var _d = false;
  19. var _s, _e;
  20. try {
  21. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  22. _arr.push(_s.value);
  23. if (i && _arr.length === i) break;
  24. }
  25. } catch (err) {
  26. _d = true;
  27. _e = err;
  28. } finally {
  29. try {
  30. if (!_n && _i["return"] != null) _i["return"]();
  31. } finally {
  32. if (_d) throw _e;
  33. }
  34. }
  35. return _arr;
  36. }
  37. function _unsupportedIterableToArray(o, minLen) {
  38. if (!o) return;
  39. if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  40. var n = Object.prototype.toString.call(o).slice(8, -1);
  41. if (n === "Object" && o.constructor) n = o.constructor.name;
  42. if (n === "Map" || n === "Set") return Array.from(o);
  43. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  44. }
  45. function _arrayLikeToArray(arr, len) {
  46. if (len == null || len > arr.length) len = arr.length;
  47. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  48. return arr2;
  49. }
  50. function _nonIterableRest() {
  51. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  52. }
  53. var Prop = function Prop(name, _ref) {
  54. var _ref$default = _ref["default"],
  55. defaultVal = _ref$default === void 0 ? null : _ref$default,
  56. _ref$triggerUpdate = _ref.triggerUpdate,
  57. triggerUpdate = _ref$triggerUpdate === void 0 ? true : _ref$triggerUpdate,
  58. _ref$onChange = _ref.onChange,
  59. onChange = _ref$onChange === void 0 ? function (newVal, state) {} : _ref$onChange;
  60. _classCallCheck(this, Prop);
  61. this.name = name;
  62. this.defaultVal = defaultVal;
  63. this.triggerUpdate = triggerUpdate;
  64. this.onChange = onChange;
  65. };
  66. function index (_ref2) {
  67. var _ref2$stateInit = _ref2.stateInit,
  68. stateInit = _ref2$stateInit === void 0 ? function () {
  69. return {};
  70. } : _ref2$stateInit,
  71. _ref2$props = _ref2.props,
  72. rawProps = _ref2$props === void 0 ? {} : _ref2$props,
  73. _ref2$methods = _ref2.methods,
  74. methods = _ref2$methods === void 0 ? {} : _ref2$methods,
  75. _ref2$aliases = _ref2.aliases,
  76. aliases = _ref2$aliases === void 0 ? {} : _ref2$aliases,
  77. _ref2$init = _ref2.init,
  78. initFn = _ref2$init === void 0 ? function () {} : _ref2$init,
  79. _ref2$update = _ref2.update,
  80. updateFn = _ref2$update === void 0 ? function () {} : _ref2$update;
  81. // Parse props into Prop instances
  82. var props = Object.keys(rawProps).map(function (propName) {
  83. return new Prop(propName, rawProps[propName]);
  84. });
  85. return function () {
  86. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  87. // Holds component state
  88. var state = Object.assign({}, stateInit instanceof Function ? stateInit(options) : stateInit, // Support plain objects for backwards compatibility
  89. {
  90. initialised: false
  91. }); // keeps track of which props triggered an update
  92. var changedProps = {}; // Component constructor
  93. function comp(nodeElement) {
  94. initStatic(nodeElement, options);
  95. digest();
  96. return comp;
  97. }
  98. var initStatic = function initStatic(nodeElement, options) {
  99. initFn.call(comp, nodeElement, state, options);
  100. state.initialised = true;
  101. };
  102. var digest = debounce(function () {
  103. if (!state.initialised) {
  104. return;
  105. }
  106. updateFn.call(comp, state, changedProps);
  107. changedProps = {};
  108. }, 1); // Getter/setter methods
  109. props.forEach(function (prop) {
  110. comp[prop.name] = getSetProp(prop);
  111. function getSetProp(_ref3) {
  112. var prop = _ref3.name,
  113. _ref3$triggerUpdate = _ref3.triggerUpdate,
  114. redigest = _ref3$triggerUpdate === void 0 ? false : _ref3$triggerUpdate,
  115. _ref3$onChange = _ref3.onChange,
  116. onChange = _ref3$onChange === void 0 ? function (newVal, state) {} : _ref3$onChange,
  117. _ref3$defaultVal = _ref3.defaultVal,
  118. defaultVal = _ref3$defaultVal === void 0 ? null : _ref3$defaultVal;
  119. return function (_) {
  120. var curVal = state[prop];
  121. if (!arguments.length) {
  122. return curVal;
  123. } // Getter mode
  124. var val = _ === undefined ? defaultVal : _; // pick default if value passed is undefined
  125. state[prop] = val;
  126. onChange.call(comp, val, state, curVal); // track changed props
  127. !changedProps.hasOwnProperty(prop) && (changedProps[prop] = curVal);
  128. if (redigest) {
  129. digest();
  130. }
  131. return comp;
  132. };
  133. }
  134. }); // Other methods
  135. Object.keys(methods).forEach(function (methodName) {
  136. comp[methodName] = function () {
  137. var _methods$methodName;
  138. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  139. args[_key] = arguments[_key];
  140. }
  141. return (_methods$methodName = methods[methodName]).call.apply(_methods$methodName, [comp, state].concat(args));
  142. };
  143. }); // Link aliases
  144. Object.entries(aliases).forEach(function (_ref4) {
  145. var _ref5 = _slicedToArray(_ref4, 2),
  146. alias = _ref5[0],
  147. target = _ref5[1];
  148. return comp[alias] = comp[target];
  149. }); // Reset all component props to their default value
  150. comp.resetProps = function () {
  151. props.forEach(function (prop) {
  152. comp[prop.name](prop.defaultVal);
  153. });
  154. return comp;
  155. }; //
  156. comp.resetProps(); // Apply all prop defaults
  157. state._rerender = digest; // Expose digest method
  158. return comp;
  159. };
  160. }
  161. export default index;