kapsule.common.js 6.3 KB

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