@stated-library/base
Version:
178 lines (150 loc) • 4.92 kB
JavaScript
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