UNPKG

@stated-library/base

Version:
178 lines (150 loc) 4.92 kB
import { shallowEqual, createObservable } from '@stated-library/core'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var identity = function identity(x) { return x; }; function makeStateEvent(rawState, event, meta, opts) { var deriveState = opts && opts.deriveState || identity; var stateData = { rawState: rawState, event: event, state: deriveState(rawState), meta: meta }; if (process.env.NODE_ENV !== 'production') { Object.freeze(stateData); Object.freeze(stateData.state); Object.freeze(stateData.rawState); } return stateData; } function bindMethodsFromProto(obj) { var proto = Object.getPrototypeOf(obj); var descriptors = Object.getOwnPropertyDescriptors(proto); for (var _i = 0, _Object$keys = Object.keys(descriptors); _i < _Object$keys.length; _i++) { var key = _Object$keys[_i]; if (key === 'constructor') { continue; } if (typeof descriptors[key].value === 'function') { obj[key] = obj[key].bind(obj); } } } var StatedLibBase = /*#__PURE__*/ function () { function StatedLibBase(initialState, opts) { _classCallCheck(this, StatedLibBase); this.opts = void 0; this.stateEvent$ = void 0; this.state$ = void 0; this.opts = Object.assign({}, opts); var createObs = this.opts.createObs || createObservable; var initialEvent = makeStateEvent(initialState, 'INIT', undefined, opts); this.stateEvent$ = createObs(initialEvent); this.state$ = createObs(initialEvent.state); } _createClass(StatedLibBase, [{ key: "setState", value: function setState(rawState, event, meta) { var stateData = shallowEqual(rawState, this.stateEvent$.value.rawState) ? _objectSpread({}, this.stateEvent$.value, { event: event, meta: meta }) : makeStateEvent(rawState, event, meta, this.opts); if (!Object.is(stateData.state, this.state$.value)) { this.state$.next(stateData.state); } this.stateEvent$.next(stateData); } }, { key: "updateState", value: function updateState(updatesOrGetUpdates, event, meta) { var updates = typeof updatesOrGetUpdates === 'function' ? updatesOrGetUpdates(this.state) : updatesOrGetUpdates; var rawState = Object.assign({}, this.stateEvent$.value.rawState, updates); this.setState(rawState, event, meta); } }, { key: "resetState", value: function resetState(rawState, event, meta) { this.setState(rawState, event, meta); } }, { key: "state", get: function get() { return this.stateEvent$.value.state; } }], [{ key: "bindMethods", value: function bindMethods(obj) { bindMethodsFromProto(obj); } }]); return StatedLibBase; }(); function createStatedLib(initialState, methodsOrGetMethods, opts) { var base = new StatedLibBase(initialState, opts); bindMethodsFromProto(base); var methods = typeof methodsOrGetMethods === 'function' ? methodsOrGetMethods(base) : methodsOrGetMethods; var obj = { get state() { return this.stateEvent$.value.state; } }; Object.assign(obj, base); Object.keys(methods).forEach(function (method) { if (typeof methods[method] === 'function') { obj[method] = methods[method].bind(obj); } }); // @ts-ignore return obj; } export default StatedLibBase; export { bindMethodsFromProto, StatedLibBase, createStatedLib }; //# sourceMappingURL=index.es.js.map