New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

el-state

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

el-state - npm Package Compare versions

Comparing version 0.1.2 to 0.2.0

dist/action.d.ts

31

dist/dispatcher.d.ts

@@ -1,4 +0,29 @@

import { Dispatcher, DispatchFunction } from './types';
import { Action, ActionFunction, ActionPromise, ActionPromiseFunction } from './action';
import { Store } from './store';
export interface Dispatcher {
<State>(action: Action<State>): void;
<State>(action: ActionPromise<State>): Promise<void>;
}
export declare type ActionContext<State> = {
state: DeepReadonly<State>;
getState(): DeepReadonly<State>;
setState(updater: StateUpdater<State>, forceCommit?: boolean): void;
disableAutoCommit(): void;
commit(): void;
getStore<OtherState>(store: Store<OtherState>): OtherState;
dispatch: Dispatcher;
};
declare type StateUpdater<State> = State | StateUpdaterFunction<State>;
declare type StateUpdaterFunction<State> = (prev: DeepReadonly<State>) => State;
declare type DeepReadonly<T> = T extends (infer R)[] ? DeepReadonlyArray<R> : T extends Function ? T : T extends object ? DeepReadonlyObject<T> : T;
interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {
}
declare type DeepReadonlyObject<T> = {
readonly [P in keyof T]: DeepReadonly<T[P]>;
};
export declare function useDispatcher(): Dispatcher;
export declare function useAction<State, Return>(action: DispatchFunction<State, Return>): () => Return;
export declare function useAction<State, Args extends any[], Return>(action: (...args: Args) => DispatchFunction<State, Return>): (...args: Args) => Return;
export declare function useAction<State>(action: Action<State>): () => void;
export declare function useAction<State>(action: ActionPromise<State>): () => Promise<void>;
export declare function useAction<State, Args extends any[]>(action: ActionFunction<State, Args>): (...args: Args) => void;
export declare function useAction<State, Args extends any[]>(action: ActionPromiseFunction<State, Args>): (...args: Args) => Promise<void>;
export {};

529

dist/el-state.cjs.development.js
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var reactDom = require('react-dom');
function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
function createAction(store, action, name) {
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return target;
return {
store: store,
call: function call(ctx) {
return action.apply(void 0, [ctx].concat(args));
},
name: name,
args: args
};
};
}
return _extends.apply(this, arguments);
function strictComparator(a, b) {
return a === b;
}
function arrayComparator(a, b) {
if (a.length !== b.length) {
return false;
}
for (var i in a) {
if (a[i] !== b[i]) return false;
}
return true;
}
function _objectWithoutPropertiesLoose(source, excluded) {

@@ -38,245 +55,195 @@ if (source == null) return {};

var Context =
/*#__PURE__*/
React.createContext(undefined);
var StoreProvider = function StoreProvider(_ref) {
var initialStates = _ref.initialStates,
props = _objectWithoutPropertiesLoose(_ref, ["initialStates"]);
var value = {
states: initialStates || new WeakMap(),
subscriptions: new WeakMap()
};
return React.createElement(Context.Provider, Object.assign({}, props, {
value: value
}));
var defaultDevToolOptions = {
name: 'el-state',
features: {
pause: true,
lock: true,
"export": true,
"import": 'custom',
jump: true,
skip: false,
reorder: false,
persist: false,
dispatch: false,
test: false
}
};
function useStateContext() {
var ctx = React.useContext(Context);
function initDevTool(states, subscriptions) {
var ext = typeof window !== undefined ? window.__REDUX_DEVTOOLS_EXTENSION__ : undefined;
if (!ext) return undefined;
var connection = ext.connect(defaultDevToolOptions);
connection.init(mapToObject(states));
connection.subscribe(function (_ref) {
var type = _ref.type,
state = _ref.state,
payload = _ref.payload;
if (!ctx) {
throw new Error('Not inside provider');
}
if (type === 'DISPATCH' && (payload.type === 'JUMP_TO_STATE' || payload.type === 'JUMP_TO_ACTION')) {
(function () {
var obj = JSON.parse(state);
states.clear();
var allSubscription = new Set();
return ctx;
}
for (var key in obj) {
var _subscriptions$get;
function createStore(_ref) {
var initialState = _ref.initialState,
actions = _ref.actions;
var data = {
initialState: initialState
states.set(key, obj[key]);
(_subscriptions$get = subscriptions.get(key)) === null || _subscriptions$get === void 0 ? void 0 : _subscriptions$get.forEach(function (fn) {
return allSubscription.add(fn);
});
}
allSubscription.forEach(function (fn) {
return fn();
});
})();
}
});
return {
log: function log(action) {
connection.send(action, mapToObject(states));
},
disconnect: function disconnect() {
ext.disconnect(connection);
}
};
var transformedAction = Object.keys(actions).reduce(function (result, key) {
result[key] = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
}
var fn = function fn(ctx) {
return actions[key].apply(actions, [ctx].concat(args));
};
fn.store = data;
return fn;
};
return result;
}, {});
return _extends({}, transformedAction, {
_storeData: data
function mapToObject(map) {
var obj = {};
map.forEach(function (value, key) {
return obj[key] = value;
});
return obj;
}
function createState(state) {
return state;
}
var defaultMapState = function defaultMapState(state) {
return state;
};
var Context =
/*#__PURE__*/
React.createContext(undefined);
function deepEqual(a, b) {
if (typeof a !== typeof b) {
return false;
}
function createManager(initialStates, enableDevTool) {
var states = initialStates || new Map();
var subscriptions = new Map();
var manager = {
subscribe: function subscribe(store, fn) {
var name = store.name;
if (Array.isArray(a) && Array.isArray(b)) {
return a.length === b.length && a.every(function (item, i) {
return deepEqual(item, b[i]);
});
} else if (typeof a === 'object' && typeof b === 'object') {
var keys = Object.keys(a);
return deepEqual(keys, Object.keys(b)) && keys.every(function (key) {
return deepEqual(a[key], b[key]);
});
}
if (!subscriptions.has(name)) {
subscriptions.set(name, new Set());
}
return a === b;
}
var set = subscriptions.get(name);
set.add(fn);
return function () {
return set["delete"](fn);
};
},
getState: function getState(store) {
var name = store.name;
function defaultStateComparator(prev, current) {
return !deepEqual(prev, current);
} // export function defaultStateComparator(): boolean {
// return true;
// }
if (states.has(name)) {
return states.get(name);
} else {
var state = isInitiatorFunction(store.initialState) ? store.initialState() : store.initialState;
states.set(name, state);
return state;
}
},
commit: function commit(newStates) {
var triggered = new Set();
newStates.forEach(function (state, name) {
states.set(name, state);
var callbacks = subscriptions.get(name);
function subscribeToStateChange(ctx, store, fn) {
var set = ctx.subscriptions.get(store);
if (callbacks) {
callbacks.forEach(function (cb) {
return triggered.add(cb);
});
}
});
if (!set) {
set = new Set();
ctx.subscriptions.set(store, set);
}
if (triggered.size > 0) {
reactDom.unstable_batchedUpdates(function (callbacks) {
return callbacks.forEach(function (cb) {
return cb();
});
}, triggered);
}
}
};
set.add(fn);
return function () {
set["delete"](fn);
};
}
function getOrFillState(ctx, store) {
if (!ctx.states.has(store)) {
var state = store.initialState;
ctx.states.set(store, state);
return state;
if (enableDevTool) {
manager.devTool = initDevTool(states, subscriptions);
}
return ctx.states.get(store);
return manager;
}
function useStore(store, mapState, comparator) {
if (mapState === void 0) {
mapState = defaultMapState;
}
var StoreProvider = function StoreProvider(_ref) {
var initialStates = _ref.initialStates,
enableDevTool = _ref.enableDevTool,
props = _objectWithoutPropertiesLoose(_ref, ["initialStates", "enableDevTool"]);
if (comparator === void 0) {
comparator = defaultStateComparator;
}
var ctx = useStateContext();
var _useState = React.useState(function () {
return mapState(getOrFillState(ctx, store._storeData));
}),
current = _useState[0],
setCurrentValue = _useState[1];
var manager = React.useMemo(function () {
return createManager(initialStates, enableDevTool);
}, [initialStates, enableDevTool]);
React.useEffect(function () {
var subscription = function subscription() {
var newState = getOrFillState(ctx, store._storeData);
var newRes = mapState(newState);
var shouldUpdate = mapState === defaultMapState && comparator === defaultStateComparator ? current !== newRes : comparator(current, newRes);
return function () {
var _manager$devTool;
if (shouldUpdate) {
setCurrentValue(newRes);
}
return (_manager$devTool = manager.devTool) === null || _manager$devTool === void 0 ? void 0 : _manager$devTool.disconnect();
};
});
return React.createElement(Context.Provider, Object.assign({}, props, {
value: manager
}));
};
function useStoreManager() {
var ctx = React.useContext(Context);
return subscribeToStateChange(ctx, store._storeData, subscription);
}, [ctx, current]);
return current;
}
function useStores(stores, mapState, comparator) {
if (mapState === void 0) {
mapState = defaultMapState;
if (!ctx) {
throw new Error('Not inside provider');
}
if (comparator === void 0) {
comparator = defaultStateComparator;
}
return ctx;
}
var ctx = useStateContext();
function isInitiatorFunction(x) {
return typeof x === 'function';
}
var _useState = React.useState(function () {
return mapState(getOrFileStateObject(ctx, stores));
}),
current = _useState[0],
setCurrentValue = _useState[1];
function createDispatcher(manager, root) {
return function (action) {
var _ref;
React.useEffect(function () {
var subscriptionFn = function subscriptionFn() {
var newStates = getOrFileStateObject(ctx, stores);
var newRes = mapState(newStates);
var shouldUpdate = comparator(current, newRes);
var autoCommit = !root; // root dispatcher
if (shouldUpdate) {
setCurrentValue(newRes);
}
var storeName = action.store.name;
var changesMap = (_ref = root === null || root === void 0 ? void 0 : root.changesMap) !== null && _ref !== void 0 ? _ref : new Map();
var commit = root ? root.commit : function () {
manager.commit(changesMap);
changesMap.clear();
};
var unsubscribeFunctions = Object.values(stores).map(function (store) {
return subscribeToStateChange(ctx, store._storeData, subscriptionFn);
});
return function () {
unsubscribeFunctions.map(function (fn) {
return fn();
});
var getState = function getState() {
return changesMap.get(storeName) || manager.getState(action.store);
};
}, [ctx, current]);
return current;
}
function getOrFileStateObject(ctx, stores) {
return Object.keys(stores).reduce(function (result, key) {
result[key] = getOrFillState(ctx, stores[key]._storeData);
return result;
}, {});
}
var setState = function setState(updater, forceCommit) {
if (forceCommit === void 0) {
forceCommit = false;
}
function isStateUpdaterFunction(updater) {
return typeof updater === 'function';
}
var state = isStateUpdaterFunction(updater) ? updater(getState()) : updater;
changesMap.set(storeName, state);
function isPromise(p) {
return 'then' in p && typeof p.then === 'function';
}
function createDispatcher(context, opt) {
return function (dispatchFn) {
var autoCommit = !opt;
var changesSet = opt ? opt.changesSet : new Set();
var changesMap = opt ? opt.changesMap : new WeakMap();
var commit = opt ? opt.commit : function () {
var allSubscription = new Set();
changesSet.forEach(function (id) {
context.states.set(id, changesMap.get(id));
var subscriptions = context.subscriptions.get(id);
if (subscriptions) {
subscriptions.forEach(function (fn) {
return allSubscription.add(fn);
});
}
});
allSubscription.forEach(function (fn) {
try {
fn();
} catch (e) {
console.error('Error when calling subscription', e);
}
});
changesSet.clear();
changesMap = new WeakMap();
if (forceCommit) {
commit();
}
};
var getState = function getState() {
return changesMap.get(dispatchFn.store) || getOrFillState(context, dispatchFn.store);
};
var result = dispatchFn({
var result = action.call({
state: getState(),
getState: getState,
setState: function setState(updater, forceCommit) {
if (forceCommit === void 0) {
forceCommit = false;
}
var state = isStateUpdaterFunction(updater) ? updater(getState()) : updater;
changesSet.add(dispatchFn.store);
changesMap.set(dispatchFn.store, state);
if (forceCommit) {
commit();
}
},
setState: setState,
commit: commit,

@@ -287,30 +254,50 @@ disableAutoCommit: function disableAutoCommit() {

getStore: function getStore(otherStore) {
return changesMap.get(otherStore._storeData) || getOrFillState(context, otherStore._storeData);
return changesMap.get(otherStore.name) || manager.getState(otherStore);
},
dispatch: createDispatcher(context, {
dispatch: createDispatcher(manager, {
changesMap: changesMap,
commit: commit,
changesSet: changesSet
commit: commit
})
});
if (autoCommit) {
if (result && isPromise(result)) {
result.then(function () {
return commit();
});
} else {
var handleResult = function handleResult(newState) {
if (newState !== undefined) {
setState(newState);
}
if (autoCommit) {
commit();
}
if (manager.devTool) {
var type = action.store.name + "." + (action.name || '<unknown>');
if (!autoCommit) {
type += ' (deferred)';
}
manager.devTool.log({
type: type,
args: action.args
});
}
};
if (isPromise(result)) {
return result.then(handleResult);
} else {
handleResult(result);
}
return result;
};
}
function isPromise(p) {
return typeof p === 'object' && 'then' in p && typeof p.then === 'function';
}
function useDispatcher() {
var ctx = useStateContext();
var manager = useStoreManager();
return React.useMemo(function () {
return createDispatcher(ctx);
}, [ctx]);
return createDispatcher(manager);
}, [manager]);
}

@@ -332,9 +319,89 @@ function useAction(action) {

function isStateUpdaterFunction(updater) {
return typeof updater === 'function';
}
function createStore(name, initialState) {
return {
name: name,
initialState: initialState
};
}
function combineStore() {
for (var _len = arguments.length, stores = new Array(_len), _key = 0; _key < _len; _key++) {
stores[_key] = arguments[_key];
}
return stores;
}
function useStore(inputStore, mapState, comparator) {
if (mapState === void 0) {
mapState = identityFn;
}
if (comparator === void 0) {
comparator = defaultComparator(Array.isArray(inputStore));
}
var stores = Array.isArray(inputStore) ? inputStore : [inputStore];
var normalizedMapState = function normalizedMapState(states) {
return Array.isArray(inputStore) ? mapState(states) : mapState(states[0]);
};
var manager = useStoreManager();
var _useState = React.useState(function () {
return normalizedMapState(getOrFillStateArray(manager, stores));
}),
current = _useState[0],
setCurrentValue = _useState[1];
React.useEffect(function () {
var subscriptionFn = function subscriptionFn() {
var newStates = getOrFillStateArray(manager, stores);
var newRes = normalizedMapState(newStates);
var equal = comparator(current, newRes);
if (!equal) {
setCurrentValue(newRes);
}
};
var unsubscribeFunctions = stores.map(function (store) {
return manager.subscribe(store, subscriptionFn);
});
return function () {
return unsubscribeFunctions.forEach(function (fn) {
return fn();
});
};
}, [manager, current]);
return current;
}
function identityFn(states) {
return states;
}
function defaultComparator(isArray) {
return isArray ? arrayComparator : strictComparator;
}
function getOrFillStateArray(manager, stores) {
return stores.map(function (store) {
return manager.getState(store);
});
}
exports.StoreProvider = StoreProvider;
exports.createState = createState;
exports.arrayComparator = arrayComparator;
exports.combineStore = combineStore;
exports.createAction = createAction;
exports.createStore = createStore;
exports.strictComparator = strictComparator;
exports.useAction = useAction;
exports.useDispatcher = useDispatcher;
exports.useStore = useStore;
exports.useStores = useStores;
//# sourceMappingURL=el-state.cjs.development.js.map

@@ -1,2 +0,2 @@

"use strict";var t=require("react");function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(this,arguments)}var r=t.createContext(void 0);function n(){var e=t.useContext(r);if(!e)throw new Error("Not inside provider");return e}var o=function(t){return t};function u(t,e){return!function t(e,r){if(typeof e!=typeof r)return!1;if(Array.isArray(e)&&Array.isArray(r))return e.length===r.length&&e.every(function(e,n){return t(e,r[n])});if("object"==typeof e&&"object"==typeof r){var n=Object.keys(e);return t(n,Object.keys(r))&&n.every(function(n){return t(e[n],r[n])})}return e===r}(t,e)}function i(t,e,r){var n=t.subscriptions.get(e);return n||(n=new Set,t.subscriptions.set(e,n)),n.add(r),function(){n.delete(r)}}function a(t,e){if(!t.states.has(e)){var r=e.initialState;return t.states.set(e,r),r}return t.states.get(e)}function c(t,e){return Object.keys(e).reduce(function(r,n){return r[n]=a(t,e[n]._storeData),r},{})}function s(){var e=n();return t.useMemo(function(){return function t(e,r){return function(n){var o,u=!r,i=r?r.changesSet:new Set,c=r?r.changesMap:new WeakMap,s=r?r.commit:function(){var t=new Set;i.forEach(function(r){e.states.set(r,c.get(r));var n=e.subscriptions.get(r);n&&n.forEach(function(e){return t.add(e)})}),t.forEach(function(t){try{t()}catch(t){console.error("Error when calling subscription",t)}}),i.clear(),c=new WeakMap},f=function(){return c.get(n.store)||a(e,n.store)},v=n({state:f(),getState:f,setState:function(t,e){void 0===e&&(e=!1);var r=function(t){return"function"==typeof t}(t)?t(f()):t;i.add(n.store),c.set(n.store,r),e&&s()},commit:s,disableAutoCommit:function(){u=!1},getStore:function(t){return c.get(t._storeData)||a(e,t._storeData)},dispatch:t(e,{changesMap:c,commit:s,changesSet:i})});return u&&(v&&"then"in(o=v)&&"function"==typeof o.then?v.then(function(){return s()}):s()),v}}(e)},[e])}exports.StoreProvider=function(e){var n=e.initialStates,o=function(t,e){if(null==t)return{};var r,n,o={},u=Object.keys(t);for(n=0;n<u.length;n++)e.indexOf(r=u[n])>=0||(o[r]=t[r]);return o}(e,["initialStates"]),u={states:n||new WeakMap,subscriptions:new WeakMap};return t.createElement(r.Provider,Object.assign({},o,{value:u}))},exports.createState=function(t){return t},exports.createStore=function(t){var r=t.actions,n={initialState:t.initialState};return e({},Object.keys(r).reduce(function(t,e){return t[e]=function(){for(var t=arguments.length,o=new Array(t),u=0;u<t;u++)o[u]=arguments[u];var i=function(t){return r[e].apply(r,[t].concat(o))};return i.store=n,i},t},{}),{_storeData:n})},exports.useAction=function(e){var r=s();return t.useMemo(function(){return"store"in e?function(){return r(e)}:function(){return r(e.apply(void 0,arguments))}},[r])},exports.useDispatcher=s,exports.useStore=function(e,r,c){void 0===r&&(r=o),void 0===c&&(c=u);var s=n(),f=t.useState(function(){return r(a(s,e._storeData))}),v=f[0],p=f[1];return t.useEffect(function(){return i(s,e._storeData,function(){var t=a(s,e._storeData),n=r(t);(r===o&&c===u?v!==n:c(v,n))&&p(n)})},[s,v]),v},exports.useStores=function(e,r,a){void 0===r&&(r=o),void 0===a&&(a=u);var s=n(),f=t.useState(function(){return r(c(s,e))}),v=f[0],p=f[1];return t.useEffect(function(){var t=function(){var t=c(s,e),n=r(t);a(v,n)&&p(n)},n=Object.values(e).map(function(e){return i(s,e._storeData,t)});return function(){n.map(function(t){return t()})}},[s,v]),v};
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react"),n=require("react-dom");function e(t,n){return t===n}function r(t,n){if(t.length!==n.length)return!1;for(var e in t)if(t[e]!==n[e])return!1;return!0}var o={name:"el-state",features:{pause:!0,lock:!0,export:!0,import:"custom",jump:!0,skip:!1,reorder:!1,persist:!1,dispatch:!1,test:!1}};function i(t){var n={};return t.forEach((function(t,e){return n[e]=t})),n}var u=t.createContext(void 0);function a(){var n=t.useContext(u);if(!n)throw new Error("Not inside provider");return n}function c(){var n=a();return t.useMemo((function(){return function t(n,e){return function(r){var o,i,u=!e,a=r.store.name,c=null!==(o=null==e?void 0:e.changesMap)&&void 0!==o?o:new Map,f=e?e.commit:function(){n.commit(c),c.clear()},s=function(){return c.get(a)||n.getState(r.store)},v=function(t,n){void 0===n&&(n=!1);var e=function(t){return"function"==typeof t}(t)?t(s()):t;c.set(a,e),n&&f()},l=r.call({state:s(),getState:s,setState:v,commit:f,disableAutoCommit:function(){u=!1},getStore:function(t){return c.get(t.name)||n.getState(t)},dispatch:t(n,{changesMap:c,commit:f})}),d=function(t){if(void 0!==t&&v(t),u&&f(),n.devTool){var e=r.store.name+"."+(r.name||"<unknown>");u||(e+=" (deferred)"),n.devTool.log({type:e,args:r.args})}};if("object"==typeof(i=l)&&"then"in i&&"function"==typeof i.then)return l.then(d);d(l)}}(n)}),[n])}function f(t){return t}function s(t,n){return n.map((function(n){return t.getState(n)}))}exports.StoreProvider=function(e){var r=e.initialStates,a=e.enableDevTool,c=function(t,n){if(null==t)return{};var e,r,o={},i=Object.keys(t);for(r=0;r<i.length;r++)n.indexOf(e=i[r])>=0||(o[e]=t[e]);return o}(e,["initialStates","enableDevTool"]),f=t.useMemo((function(){return function(t,e){var r=t||new Map,u=new Map,a={subscribe:function(t,n){var e=t.name;u.has(e)||u.set(e,new Set);var r=u.get(e);return r.add(n),function(){return r.delete(n)}},getState:function(t){var n=t.name;if(r.has(n))return r.get(n);var e="function"==typeof t.initialState?t.initialState():t.initialState;return r.set(n,e),e},commit:function(t){var e=new Set;t.forEach((function(t,n){r.set(n,t);var o=u.get(n);o&&o.forEach((function(t){return e.add(t)}))})),e.size>0&&n.unstable_batchedUpdates((function(t){return t.forEach((function(t){return t()}))}),e)}};return e&&(a.devTool=function(t,n){var e=void 0!==typeof window?window.__REDUX_DEVTOOLS_EXTENSION__:void 0;if(e){var r=e.connect(o);return r.init(i(t)),r.subscribe((function(e){var r=e.state,o=e.payload;"DISPATCH"!==e.type||"JUMP_TO_STATE"!==o.type&&"JUMP_TO_ACTION"!==o.type||function(){var e=JSON.parse(r);t.clear();var o=new Set;for(var i in e){var u;t.set(i,e[i]),null===(u=n.get(i))||void 0===u||u.forEach((function(t){return o.add(t)}))}o.forEach((function(t){return t()}))}()})),{log:function(n){r.send(n,i(t))},disconnect:function(){e.disconnect(r)}}}}(r,u)),a}(r,a)}),[r,a]);return t.useEffect((function(){return function(){var t;return null===(t=f.devTool)||void 0===t?void 0:t.disconnect()}})),t.createElement(u.Provider,Object.assign({},c,{value:f}))},exports.arrayComparator=r,exports.combineStore=function(){for(var t=arguments.length,n=new Array(t),e=0;e<t;e++)n[e]=arguments[e];return n},exports.createAction=function(t,n,e){return function(){for(var r=arguments.length,o=new Array(r),i=0;i<r;i++)o[i]=arguments[i];return{store:t,call:function(t){return n.apply(void 0,[t].concat(o))},name:e,args:o}}},exports.createStore=function(t,n){return{name:t,initialState:n}},exports.strictComparator=e,exports.useAction=function(n){var e=c();return t.useMemo((function(){return"store"in n?function(){return e(n)}:function(){return e(n.apply(void 0,arguments))}}),[e])},exports.useDispatcher=c,exports.useStore=function(n,o,i){var u;void 0===o&&(o=f),void 0===i&&(u=Array.isArray(n),i=u?r:e);var c=Array.isArray(n)?n:[n],v=function(t){return Array.isArray(n)?o(t):o(t[0])},l=a(),d=t.useState((function(){return v(s(l,c))})),p=d[0],m=d[1];return t.useEffect((function(){var t=function(){var t=s(l,c),n=v(t);i(p,n)||m(n)},n=c.map((function(n){return l.subscribe(n,t)}));return function(){return n.forEach((function(t){return t()}))}}),[l,p]),p};
//# sourceMappingURL=el-state.cjs.production.min.js.map

@@ -1,21 +0,36 @@

import { createElement, createContext, useContext, useState, useEffect, useMemo } from 'react';
import { useMemo, useEffect, createElement, createContext, useContext, useState } from 'react';
import { unstable_batchedUpdates } from 'react-dom';
function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
function createAction(store, action, name) {
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return target;
return {
store: store,
call: function call(ctx) {
return action.apply(void 0, [ctx].concat(args));
},
name: name,
args: args
};
};
}
return _extends.apply(this, arguments);
function strictComparator(a, b) {
return a === b;
}
function arrayComparator(a, b) {
if (a.length !== b.length) {
return false;
}
for (var i in a) {
if (a[i] !== b[i]) return false;
}
return true;
}
function _objectWithoutPropertiesLoose(source, excluded) {

@@ -36,245 +51,195 @@ if (source == null) return {};

var Context =
/*#__PURE__*/
createContext(undefined);
var StoreProvider = function StoreProvider(_ref) {
var initialStates = _ref.initialStates,
props = _objectWithoutPropertiesLoose(_ref, ["initialStates"]);
var value = {
states: initialStates || new WeakMap(),
subscriptions: new WeakMap()
};
return createElement(Context.Provider, Object.assign({}, props, {
value: value
}));
var defaultDevToolOptions = {
name: 'el-state',
features: {
pause: true,
lock: true,
"export": true,
"import": 'custom',
jump: true,
skip: false,
reorder: false,
persist: false,
dispatch: false,
test: false
}
};
function useStateContext() {
var ctx = useContext(Context);
function initDevTool(states, subscriptions) {
var ext = typeof window !== undefined ? window.__REDUX_DEVTOOLS_EXTENSION__ : undefined;
if (!ext) return undefined;
var connection = ext.connect(defaultDevToolOptions);
connection.init(mapToObject(states));
connection.subscribe(function (_ref) {
var type = _ref.type,
state = _ref.state,
payload = _ref.payload;
if (!ctx) {
throw new Error('Not inside provider');
}
if (type === 'DISPATCH' && (payload.type === 'JUMP_TO_STATE' || payload.type === 'JUMP_TO_ACTION')) {
(function () {
var obj = JSON.parse(state);
states.clear();
var allSubscription = new Set();
return ctx;
}
for (var key in obj) {
var _subscriptions$get;
function createStore(_ref) {
var initialState = _ref.initialState,
actions = _ref.actions;
var data = {
initialState: initialState
states.set(key, obj[key]);
(_subscriptions$get = subscriptions.get(key)) === null || _subscriptions$get === void 0 ? void 0 : _subscriptions$get.forEach(function (fn) {
return allSubscription.add(fn);
});
}
allSubscription.forEach(function (fn) {
return fn();
});
})();
}
});
return {
log: function log(action) {
connection.send(action, mapToObject(states));
},
disconnect: function disconnect() {
ext.disconnect(connection);
}
};
var transformedAction = Object.keys(actions).reduce(function (result, key) {
result[key] = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
}
var fn = function fn(ctx) {
return actions[key].apply(actions, [ctx].concat(args));
};
fn.store = data;
return fn;
};
return result;
}, {});
return _extends({}, transformedAction, {
_storeData: data
function mapToObject(map) {
var obj = {};
map.forEach(function (value, key) {
return obj[key] = value;
});
return obj;
}
function createState(state) {
return state;
}
var defaultMapState = function defaultMapState(state) {
return state;
};
var Context =
/*#__PURE__*/
createContext(undefined);
function deepEqual(a, b) {
if (typeof a !== typeof b) {
return false;
}
function createManager(initialStates, enableDevTool) {
var states = initialStates || new Map();
var subscriptions = new Map();
var manager = {
subscribe: function subscribe(store, fn) {
var name = store.name;
if (Array.isArray(a) && Array.isArray(b)) {
return a.length === b.length && a.every(function (item, i) {
return deepEqual(item, b[i]);
});
} else if (typeof a === 'object' && typeof b === 'object') {
var keys = Object.keys(a);
return deepEqual(keys, Object.keys(b)) && keys.every(function (key) {
return deepEqual(a[key], b[key]);
});
}
if (!subscriptions.has(name)) {
subscriptions.set(name, new Set());
}
return a === b;
}
var set = subscriptions.get(name);
set.add(fn);
return function () {
return set["delete"](fn);
};
},
getState: function getState(store) {
var name = store.name;
function defaultStateComparator(prev, current) {
return !deepEqual(prev, current);
} // export function defaultStateComparator(): boolean {
// return true;
// }
if (states.has(name)) {
return states.get(name);
} else {
var state = isInitiatorFunction(store.initialState) ? store.initialState() : store.initialState;
states.set(name, state);
return state;
}
},
commit: function commit(newStates) {
var triggered = new Set();
newStates.forEach(function (state, name) {
states.set(name, state);
var callbacks = subscriptions.get(name);
function subscribeToStateChange(ctx, store, fn) {
var set = ctx.subscriptions.get(store);
if (callbacks) {
callbacks.forEach(function (cb) {
return triggered.add(cb);
});
}
});
if (!set) {
set = new Set();
ctx.subscriptions.set(store, set);
}
if (triggered.size > 0) {
unstable_batchedUpdates(function (callbacks) {
return callbacks.forEach(function (cb) {
return cb();
});
}, triggered);
}
}
};
set.add(fn);
return function () {
set["delete"](fn);
};
}
function getOrFillState(ctx, store) {
if (!ctx.states.has(store)) {
var state = store.initialState;
ctx.states.set(store, state);
return state;
if (enableDevTool) {
manager.devTool = initDevTool(states, subscriptions);
}
return ctx.states.get(store);
return manager;
}
function useStore(store, mapState, comparator) {
if (mapState === void 0) {
mapState = defaultMapState;
}
var StoreProvider = function StoreProvider(_ref) {
var initialStates = _ref.initialStates,
enableDevTool = _ref.enableDevTool,
props = _objectWithoutPropertiesLoose(_ref, ["initialStates", "enableDevTool"]);
if (comparator === void 0) {
comparator = defaultStateComparator;
}
var ctx = useStateContext();
var _useState = useState(function () {
return mapState(getOrFillState(ctx, store._storeData));
}),
current = _useState[0],
setCurrentValue = _useState[1];
var manager = useMemo(function () {
return createManager(initialStates, enableDevTool);
}, [initialStates, enableDevTool]);
useEffect(function () {
var subscription = function subscription() {
var newState = getOrFillState(ctx, store._storeData);
var newRes = mapState(newState);
var shouldUpdate = mapState === defaultMapState && comparator === defaultStateComparator ? current !== newRes : comparator(current, newRes);
return function () {
var _manager$devTool;
if (shouldUpdate) {
setCurrentValue(newRes);
}
return (_manager$devTool = manager.devTool) === null || _manager$devTool === void 0 ? void 0 : _manager$devTool.disconnect();
};
});
return createElement(Context.Provider, Object.assign({}, props, {
value: manager
}));
};
function useStoreManager() {
var ctx = useContext(Context);
return subscribeToStateChange(ctx, store._storeData, subscription);
}, [ctx, current]);
return current;
}
function useStores(stores, mapState, comparator) {
if (mapState === void 0) {
mapState = defaultMapState;
if (!ctx) {
throw new Error('Not inside provider');
}
if (comparator === void 0) {
comparator = defaultStateComparator;
}
return ctx;
}
var ctx = useStateContext();
function isInitiatorFunction(x) {
return typeof x === 'function';
}
var _useState = useState(function () {
return mapState(getOrFileStateObject(ctx, stores));
}),
current = _useState[0],
setCurrentValue = _useState[1];
function createDispatcher(manager, root) {
return function (action) {
var _ref;
useEffect(function () {
var subscriptionFn = function subscriptionFn() {
var newStates = getOrFileStateObject(ctx, stores);
var newRes = mapState(newStates);
var shouldUpdate = comparator(current, newRes);
var autoCommit = !root; // root dispatcher
if (shouldUpdate) {
setCurrentValue(newRes);
}
var storeName = action.store.name;
var changesMap = (_ref = root === null || root === void 0 ? void 0 : root.changesMap) !== null && _ref !== void 0 ? _ref : new Map();
var commit = root ? root.commit : function () {
manager.commit(changesMap);
changesMap.clear();
};
var unsubscribeFunctions = Object.values(stores).map(function (store) {
return subscribeToStateChange(ctx, store._storeData, subscriptionFn);
});
return function () {
unsubscribeFunctions.map(function (fn) {
return fn();
});
var getState = function getState() {
return changesMap.get(storeName) || manager.getState(action.store);
};
}, [ctx, current]);
return current;
}
function getOrFileStateObject(ctx, stores) {
return Object.keys(stores).reduce(function (result, key) {
result[key] = getOrFillState(ctx, stores[key]._storeData);
return result;
}, {});
}
var setState = function setState(updater, forceCommit) {
if (forceCommit === void 0) {
forceCommit = false;
}
function isStateUpdaterFunction(updater) {
return typeof updater === 'function';
}
var state = isStateUpdaterFunction(updater) ? updater(getState()) : updater;
changesMap.set(storeName, state);
function isPromise(p) {
return 'then' in p && typeof p.then === 'function';
}
function createDispatcher(context, opt) {
return function (dispatchFn) {
var autoCommit = !opt;
var changesSet = opt ? opt.changesSet : new Set();
var changesMap = opt ? opt.changesMap : new WeakMap();
var commit = opt ? opt.commit : function () {
var allSubscription = new Set();
changesSet.forEach(function (id) {
context.states.set(id, changesMap.get(id));
var subscriptions = context.subscriptions.get(id);
if (subscriptions) {
subscriptions.forEach(function (fn) {
return allSubscription.add(fn);
});
}
});
allSubscription.forEach(function (fn) {
try {
fn();
} catch (e) {
console.error('Error when calling subscription', e);
}
});
changesSet.clear();
changesMap = new WeakMap();
if (forceCommit) {
commit();
}
};
var getState = function getState() {
return changesMap.get(dispatchFn.store) || getOrFillState(context, dispatchFn.store);
};
var result = dispatchFn({
var result = action.call({
state: getState(),
getState: getState,
setState: function setState(updater, forceCommit) {
if (forceCommit === void 0) {
forceCommit = false;
}
var state = isStateUpdaterFunction(updater) ? updater(getState()) : updater;
changesSet.add(dispatchFn.store);
changesMap.set(dispatchFn.store, state);
if (forceCommit) {
commit();
}
},
setState: setState,
commit: commit,

@@ -285,30 +250,50 @@ disableAutoCommit: function disableAutoCommit() {

getStore: function getStore(otherStore) {
return changesMap.get(otherStore._storeData) || getOrFillState(context, otherStore._storeData);
return changesMap.get(otherStore.name) || manager.getState(otherStore);
},
dispatch: createDispatcher(context, {
dispatch: createDispatcher(manager, {
changesMap: changesMap,
commit: commit,
changesSet: changesSet
commit: commit
})
});
if (autoCommit) {
if (result && isPromise(result)) {
result.then(function () {
return commit();
});
} else {
var handleResult = function handleResult(newState) {
if (newState !== undefined) {
setState(newState);
}
if (autoCommit) {
commit();
}
if (manager.devTool) {
var type = action.store.name + "." + (action.name || '<unknown>');
if (!autoCommit) {
type += ' (deferred)';
}
manager.devTool.log({
type: type,
args: action.args
});
}
};
if (isPromise(result)) {
return result.then(handleResult);
} else {
handleResult(result);
}
return result;
};
}
function isPromise(p) {
return typeof p === 'object' && 'then' in p && typeof p.then === 'function';
}
function useDispatcher() {
var ctx = useStateContext();
var manager = useStoreManager();
return useMemo(function () {
return createDispatcher(ctx);
}, [ctx]);
return createDispatcher(manager);
}, [manager]);
}

@@ -330,3 +315,81 @@ function useAction(action) {

export { StoreProvider, createState, createStore, useAction, useDispatcher, useStore, useStores };
function isStateUpdaterFunction(updater) {
return typeof updater === 'function';
}
function createStore(name, initialState) {
return {
name: name,
initialState: initialState
};
}
function combineStore() {
for (var _len = arguments.length, stores = new Array(_len), _key = 0; _key < _len; _key++) {
stores[_key] = arguments[_key];
}
return stores;
}
function useStore(inputStore, mapState, comparator) {
if (mapState === void 0) {
mapState = identityFn;
}
if (comparator === void 0) {
comparator = defaultComparator(Array.isArray(inputStore));
}
var stores = Array.isArray(inputStore) ? inputStore : [inputStore];
var normalizedMapState = function normalizedMapState(states) {
return Array.isArray(inputStore) ? mapState(states) : mapState(states[0]);
};
var manager = useStoreManager();
var _useState = useState(function () {
return normalizedMapState(getOrFillStateArray(manager, stores));
}),
current = _useState[0],
setCurrentValue = _useState[1];
useEffect(function () {
var subscriptionFn = function subscriptionFn() {
var newStates = getOrFillStateArray(manager, stores);
var newRes = normalizedMapState(newStates);
var equal = comparator(current, newRes);
if (!equal) {
setCurrentValue(newRes);
}
};
var unsubscribeFunctions = stores.map(function (store) {
return manager.subscribe(store, subscriptionFn);
});
return function () {
return unsubscribeFunctions.forEach(function (fn) {
return fn();
});
};
}, [manager, current]);
return current;
}
function identityFn(states) {
return states;
}
function defaultComparator(isArray) {
return isArray ? arrayComparator : strictComparator;
}
function getOrFillStateArray(manager, stores) {
return stores.map(function (store) {
return manager.getState(store);
});
}
export { StoreProvider, arrayComparator, combineStore, createAction, createStore, strictComparator, useAction, useDispatcher, useStore };
//# sourceMappingURL=el-state.esm.js.map

@@ -0,5 +1,6 @@

export { createAction } from './action';
export { arrayComparator, strictComparator } from './comparator';
export { useAction, useDispatcher } from './dispatcher';
export { StoreProvider } from './provider';
export { createStore, createState } from './createStore';
export { useStore } from './useStore';
export { useStores } from './useStores';
export { useDispatcher, useAction } from './dispatcher';
export { createStore } from './store';
export { combineStore, useStore } from './useStore';
import * as React from 'react';
import { StoreData, SubscriptionSet } from './types';
export declare type ContextType = {
states: WeakMap<StoreData<any>, unknown>;
subscriptions: WeakMap<StoreData<any>, SubscriptionSet>;
import { DevTool } from './devTool';
import { Store } from './store';
export declare type GlobalStates = Map<string, unknown>;
export declare type SubscriptionFn = () => void;
export declare type SubscriptionSet = Set<SubscriptionFn>;
export declare type StoreManager = {
getState<State>(store: Store<State>): State;
commit(states: Map<string, unknown>): void;
subscribe(store: Store<unknown>, cb: SubscriptionFn): () => void;
devTool?: DevTool;
};
declare type ProviderProps = {
initialStates?: WeakMap<StoreData<any>, unknown>;
initialStates?: GlobalStates;
enableDevTool?: boolean;
};
export declare const StoreProvider: React.FC<ProviderProps>;
export declare function useStateContext(): ContextType;
export declare function useStoreManager(): StoreManager;
export {};

@@ -1,3 +0,10 @@

import { StateComparator, Store, ActionMap } from './types';
export declare type SingleStateMapper<State, Return> = (state: State) => Return;
export declare function useStore<State, Return = State>(store: Store<State, ActionMap<any>>, mapState?: SingleStateMapper<State, Return>, comparator?: StateComparator<Return>): Return;
import { Store } from './store';
export declare type StateComparator<T> = (prev: T, current: T) => boolean;
declare type Stores<States extends any[]> = {
[i in keyof States]: Store<States[i]>;
};
export declare function combineStore<States extends any[]>(...stores: Stores<States>): Stores<States>;
export declare function useStore<State, Return = State>(store: Store<State>, mapState?: (state: State) => Return, comparator?: StateComparator<Return>): Return;
export declare function useStore<States extends any[]>(stores: Stores<States>): States;
export declare function useStore<States extends any[], Return = States>(stores: Stores<States>, mapState: (state: States) => Return, comparator?: StateComparator<Return>): Return;
export {};
{
"name": "el-state",
"version": "0.1.2",
"version": "0.2.0",
"license": "MIT",

@@ -13,2 +13,3 @@ "homepage": "https://github.com/abihf/el-state#readme",

"typings": "dist/index.d.ts",
"sideEffects": false,
"files": [

@@ -24,3 +25,4 @@ "dist"

"peerDependencies": {
"react": ">=16"
"react": "^16.9.0",
"react-dom": "^16.9.0"
},

@@ -39,14 +41,15 @@ "husky": {

"devDependencies": {
"@testing-library/react": "^9.4.0",
"@types/jest": "^24.0.18",
"@types/react": "^16.9.2",
"@types/react-dom": "^16.9.0",
"@types/react-dom": "^16.9.5",
"husky": "^3.0.4",
"prettier": "^1.18.2",
"pretty-quick": "^1.11.1",
"react": "^16.9.0",
"react-dom": "^16.9.0",
"tsdx": "^0.9.0",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"tsdx": "^0.12.3",
"tslib": "^1.10.0",
"typescript": "^3.6.2"
"typescript": "^3.7.5"
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc