simpler-state
Advanced tools
Comparing version 1.0.0-rc.8 to 1.0.0-rc.9
import { useEntity } from './useEntity'; | ||
import { store } from './store'; | ||
export var entity = function entity(initialValue, plugins) { | ||
if (plugins === void 0) { | ||
plugins = []; | ||
} | ||
export const entity = (initialValue, plugins = []) => { | ||
if (initialValue === undefined) throw new Error('Entity requires an initial value.'); | ||
if (!(plugins instanceof Array)) throw new Error('Invalid plug-ins array.'); | ||
var newEntity = { | ||
const newEntity = { | ||
_value: undefined, | ||
@@ -16,5 +12,3 @@ _subscribers: new Set() | ||
newEntity.get = function () { | ||
return newEntity._value; | ||
}; | ||
newEntity.get = () => newEntity._value; | ||
@@ -31,24 +25,14 @@ newEntity.set = createSetter(newEntity); | ||
var createSetter = function createSetter(entity) { | ||
return function (newValue) { | ||
for (var _len = arguments.length, updaterArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | ||
updaterArgs[_key - 1] = arguments[_key]; | ||
} | ||
const createSetter = entity => (newValue, ...updaterArgs) => { | ||
if (typeof newValue === 'function') newValue = newValue(entity._value, ...updaterArgs); | ||
entity._value = newValue; | ||
if (typeof newValue === 'function') newValue = newValue.apply(void 0, [entity._value].concat(updaterArgs)); | ||
entity._value = newValue; | ||
entity._subscribers.forEach(function (cb) { | ||
return cb(entity._value); | ||
}); | ||
}; | ||
entity._subscribers.forEach(cb => cb(entity._value)); | ||
}; | ||
var createInit = function createInit(entity, initialValue) { | ||
return typeof initialValue.then === 'function' ? function () { | ||
const createInit = (entity, initialValue) => { | ||
return typeof initialValue.then === 'function' ? () => { | ||
// Call the setter so that any bound components are updated | ||
initialValue.then(function (value) { | ||
return entity.set(value); | ||
}); | ||
} : function () { | ||
initialValue.then(value => entity.set(value)); | ||
} : () => { | ||
entity._value = initialValue; | ||
@@ -58,30 +42,22 @@ }; | ||
var createHook = function createHook(entity) { | ||
return function () { | ||
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { | ||
args[_key2] = arguments[_key2]; | ||
} | ||
return useEntity.apply(void 0, [entity].concat(args)); | ||
}; | ||
const createHook = entity => { | ||
return (...args) => useEntity(entity, ...args); | ||
}; | ||
var createSubscribe = function createSubscribe(entity) { | ||
return function (subscriberFn) { | ||
entity._subscribers.add(subscriberFn); | ||
const createSubscribe = entity => subscriberFn => { | ||
entity._subscribers.add(subscriberFn); | ||
return function () { | ||
entity._subscribers["delete"](subscriberFn); | ||
}; | ||
return () => { | ||
entity._subscribers.delete(subscriberFn); | ||
}; | ||
}; | ||
export var applyPlugins = function applyPlugins(entity, plugins) { | ||
plugins.forEach(function (plugin) { | ||
export const applyPlugins = (entity, plugins) => { | ||
plugins.forEach(plugin => { | ||
if (typeof plugin !== 'object') throw new Error('Invalid plug-in'); | ||
var overrideMethod = function overrideMethod(method) { | ||
const overrideMethod = method => { | ||
if (typeof plugin[method] === 'function') { | ||
var override = plugin[method](entity[method], entity); | ||
if (typeof override !== 'function') throw new Error("Invalid override for '" + method + "' in plug-in."); | ||
const override = plugin[method](entity[method], entity); | ||
if (typeof override !== 'function') throw new Error(`Invalid override for '${method}' in plug-in.`); | ||
entity[method] = override; | ||
@@ -88,0 +64,0 @@ } |
@@ -1,10 +0,4 @@ | ||
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator"; | ||
import _regeneratorRuntime from "@babel/runtime/regenerator"; | ||
export var persistence = function persistence(key, options) { | ||
if (options === void 0) { | ||
options = {}; | ||
} | ||
export const persistence = (key, options = {}) => { | ||
if (typeof key !== 'string') throw new Error('Persistence requires a string key.'); | ||
var storage = options.storage || 'local'; | ||
let storage = options.storage || 'local'; | ||
if (storage === 'local') storage = getLocalStorage();else if (storage === 'session') storage = getSessionStorage();else validateCustomStorage(storage); | ||
@@ -18,86 +12,29 @@ | ||
return { | ||
init: function init(origInit, entity) { | ||
return function () { | ||
var deserialize = options.deserializeFn || JSON.parse; | ||
init: (origInit, entity) => () => { | ||
const deserialize = options.deserializeFn || JSON.parse; | ||
var getItem = /*#__PURE__*/function () { | ||
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { | ||
var value; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return storage.getItem(key); | ||
const getItem = () => { | ||
_promise(storage.getItem(key)).then(value => { | ||
if (value) { | ||
_promise(deserialize(value)).then(value => entity.set(value)); | ||
} | ||
}); | ||
}; | ||
case 2: | ||
value = _context.sent; | ||
origInit(); // Fetch persisted value (if any) from storage | ||
if (!value) { | ||
_context.next = 9; | ||
break; | ||
} | ||
getItem(); | ||
}, | ||
set: (origSet, entity) => (...args) => { | ||
const serialize = options.serializeFn || JSON.stringify; | ||
_context.t0 = entity; | ||
_context.next = 7; | ||
return deserialize(value); | ||
case 7: | ||
_context.t1 = _context.sent; | ||
_context.t0.set.call(_context.t0, _context.t1); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return function getItem() { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
origInit(); // Fetch persisted value (if any) from storage | ||
getItem(); | ||
const setItem = () => { | ||
_promise(serialize(entity.get())).then(value => { | ||
storage.setItem(key, value); | ||
}); | ||
}; | ||
}, | ||
set: function set(origSet, entity) { | ||
return function () { | ||
var serialize = options.serializeFn || JSON.stringify; | ||
var setItem = /*#__PURE__*/function () { | ||
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { | ||
var value; | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return serialize(entity.get()); | ||
origSet(...args); // Persist the new value to storage | ||
case 2: | ||
value = _context2.sent; | ||
return _context2.abrupt("return", storage.setItem(key, value)); | ||
case 4: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return function setItem() { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
origSet.apply(void 0, arguments); // Persist the new value to storage | ||
setItem(); | ||
}; | ||
setItem(); | ||
} | ||
@@ -107,3 +44,3 @@ }; | ||
var getLocalStorage = function getLocalStorage() { | ||
const getLocalStorage = () => { | ||
try { | ||
@@ -116,3 +53,3 @@ return localStorage; | ||
var getSessionStorage = function getSessionStorage() { | ||
const getSessionStorage = () => { | ||
try { | ||
@@ -125,6 +62,12 @@ return sessionStorage; | ||
var validateCustomStorage = function validateCustomStorage(storage) { | ||
const validateCustomStorage = storage => { | ||
if (typeof storage.getItem !== 'function' || typeof storage.setItem !== 'function') throw new Error('Persistence: Invalid storage.'); | ||
}; | ||
export default persistence; | ||
export default persistence; | ||
/** Turns a value into a Promise (if it's not already) */ | ||
const _promise = val => { | ||
const notPromise = typeof val !== 'object' || val === null || typeof val.then !== 'function'; | ||
return notPromise ? new Promise(resolve => resolve(val)) : val; | ||
}; |
import store from './store'; | ||
export var resetAll = function resetAll() { | ||
store.forEach(function (entity) { | ||
return entity.init(); | ||
}); | ||
export const resetAll = () => { | ||
store.forEach(entity => entity.init()); | ||
}; | ||
export default resetAll; |
@@ -1,2 +0,2 @@ | ||
export var store = new Set(); | ||
export const store = new Set(); | ||
export default store; |
import { useState, useCallback, useEffect } from 'react'; | ||
import { strictEqual } from './utils'; | ||
var identity = function identity(v) { | ||
return v; | ||
}; | ||
const identity = v => v; | ||
export var useEntity = function useEntity(entity, transform, equality) { | ||
if (transform === void 0) { | ||
transform = identity; | ||
} | ||
if (equality === void 0) { | ||
equality = strictEqual; | ||
} | ||
export const useEntity = (entity, transform = identity, equality = strictEqual) => { | ||
if (!(entity._subscribers instanceof Set)) throw new Error('Invalid entity.'); | ||
var _useState = useState(transform(entity._value)), | ||
state = _useState[0], | ||
setState = _useState[1]; | ||
var subscriberFn = useCallback(function (newValue) { | ||
var newComputed = transform(newValue); | ||
var hasChanged = !equality(state, newComputed); | ||
const [state, setState] = useState(transform(entity._value)); | ||
const subscriberFn = useCallback(newValue => { | ||
const newComputed = transform(newValue); | ||
const hasChanged = !equality(state, newComputed); | ||
if (hasChanged) setState(newComputed); | ||
}, [transform, equality, state]); | ||
useEffect(function () { | ||
return entity._subscribe(subscriberFn); | ||
}, [subscriberFn, entity]); // Re-sync state in case transform function has changed | ||
useEffect(() => entity._subscribe(subscriberFn), [subscriberFn, entity]); // Re-sync state in case transform function has changed | ||
@@ -32,0 +16,0 @@ subscriberFn(entity._value); |
/* Basic equality functions */ | ||
export var strictEqual = function strictEqual(a, b) { | ||
return a === b; | ||
}; | ||
export var shallowEqual = function shallowEqual(a, b) { | ||
return strictEqual(a, b) || bothObjects(a, b) && equalProps(a, b); | ||
}; | ||
export const strictEqual = (a, b) => a === b; | ||
export const shallowEqual = (a, b) => strictEqual(a, b) || bothObjects(a, b) && equalProps(a, b); | ||
var bothObjects = function bothObjects(a, b) { | ||
return typeof a === 'object' && a !== null && typeof b === 'object' && b !== null; | ||
}; | ||
const bothObjects = (a, b) => typeof a === 'object' && a !== null && typeof b === 'object' && b !== null; | ||
var equalProps = function equalProps(a, b) { | ||
var keysOfA = Object.keys(a); | ||
var keysOfB = Object.keys(b); | ||
const equalProps = (a, b) => { | ||
const keysOfA = Object.keys(a); | ||
const keysOfB = Object.keys(b); | ||
if (keysOfA.length !== keysOfB.length) return false; | ||
for (var i = 0; i < keysOfA.length; i++) { | ||
var key = keysOfA[i]; | ||
for (let i = 0; i < keysOfA.length; i++) { | ||
const key = keysOfA[i]; | ||
if (!b.hasOwnProperty(key) || a[key] !== b[key]) return false; | ||
@@ -21,0 +15,0 @@ } |
"use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = exports.applyPlugins = exports.entity = void 0; | ||
exports.default = exports.applyPlugins = exports.entity = void 0; | ||
@@ -81,3 +81,3 @@ var _useEntity = require("./useEntity"); | ||
return function () { | ||
entity._subscribers["delete"](subscriberFn); | ||
entity._subscribers.delete(subscriberFn); | ||
}; | ||
@@ -106,2 +106,2 @@ }; | ||
var _default = entity; | ||
exports["default"] = _default; | ||
exports.default = _default; |
@@ -10,7 +10,7 @@ "use strict"; | ||
exports.entity = _entity["default"]; | ||
exports.entity = _entity.default; | ||
var _useEntity = _interopRequireDefault(require("./useEntity")); | ||
exports.useEntity = _useEntity["default"]; | ||
exports.useEntity = _useEntity.default; | ||
@@ -24,6 +24,6 @@ var _utils = require("./utils"); | ||
exports.persistence = _persistence["default"]; | ||
exports.persistence = _persistence.default; | ||
var _resetAll = _interopRequireDefault(require("./resetAll")); | ||
exports.resetAll = _resetAll["default"]; | ||
exports.resetAll = _resetAll.default; |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
exports.__esModule = true; | ||
exports["default"] = exports.persistence = void 0; | ||
exports.default = exports.persistence = void 0; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var persistence = function persistence(key, options) { | ||
@@ -31,42 +25,12 @@ if (options === void 0) { | ||
var getItem = /*#__PURE__*/function () { | ||
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { | ||
var value; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return storage.getItem(key); | ||
var getItem = function getItem() { | ||
_promise(storage.getItem(key)).then(function (value) { | ||
if (value) { | ||
_promise(deserialize(value)).then(function (value) { | ||
return entity.set(value); | ||
}); | ||
} | ||
}); | ||
}; | ||
case 2: | ||
value = _context.sent; | ||
if (!value) { | ||
_context.next = 9; | ||
break; | ||
} | ||
_context.t0 = entity; | ||
_context.next = 7; | ||
return deserialize(value); | ||
case 7: | ||
_context.t1 = _context.sent; | ||
_context.t0.set.call(_context.t0, _context.t1); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})); | ||
return function getItem() { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
origInit(); // Fetch persisted value (if any) from storage | ||
@@ -81,29 +45,8 @@ | ||
var setItem = /*#__PURE__*/function () { | ||
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { | ||
var value; | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
_context2.next = 2; | ||
return serialize(entity.get()); | ||
var setItem = function setItem() { | ||
_promise(serialize(entity.get())).then(function (value) { | ||
storage.setItem(key, value); | ||
}); | ||
}; | ||
case 2: | ||
value = _context2.sent; | ||
return _context2.abrupt("return", storage.setItem(key, value)); | ||
case 4: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2); | ||
})); | ||
return function setItem() { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
origSet.apply(void 0, arguments); // Persist the new value to storage | ||
@@ -140,2 +83,11 @@ | ||
var _default = persistence; | ||
exports["default"] = _default; | ||
/** Turns a value into a Promise (if it's not already) */ | ||
exports.default = _default; | ||
var _promise = function _promise(val) { | ||
var notPromise = typeof val !== 'object' || val === null || typeof val.then !== 'function'; | ||
return notPromise ? new Promise(function (resolve) { | ||
return resolve(val); | ||
}) : val; | ||
}; |
@@ -6,3 +6,3 @@ "use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = exports.resetAll = void 0; | ||
exports.default = exports.resetAll = void 0; | ||
@@ -12,3 +12,3 @@ var _store = _interopRequireDefault(require("./store")); | ||
var resetAll = function resetAll() { | ||
_store["default"].forEach(function (entity) { | ||
_store.default.forEach(function (entity) { | ||
return entity.init(); | ||
@@ -20,2 +20,2 @@ }); | ||
var _default = resetAll; | ||
exports["default"] = _default; | ||
exports.default = _default; |
"use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = exports.store = void 0; | ||
exports.default = exports.store = void 0; | ||
var store = new Set(); | ||
exports.store = store; | ||
var _default = store; | ||
exports["default"] = _default; | ||
exports.default = _default; |
"use strict"; | ||
exports.__esModule = true; | ||
exports["default"] = exports.useEntity = void 0; | ||
exports.default = exports.useEntity = void 0; | ||
@@ -44,2 +44,2 @@ var _react = require("react"); | ||
var _default = useEntity; | ||
exports["default"] = _default; | ||
exports.default = _default; |
{ | ||
"name": "simpler-state", | ||
"version": "1.0.0-rc.8", | ||
"version": "1.0.0-rc.9", | ||
"description": "The simplest app state management for React", | ||
@@ -27,2 +27,3 @@ "keywords": [ | ||
], | ||
"sideEffects": false, | ||
"scripts": { | ||
@@ -43,14 +44,13 @@ "build:lib": "cross-env BABEL_ENV=commonjs babel src --out-dir lib --ignore **/*.test.js", | ||
"dependencies": { | ||
"@babel/runtime": "^7.9.2" | ||
"@babel/runtime": "^7.13.10" | ||
}, | ||
"devDependencies": { | ||
"@babel/cli": "^7.8.4", | ||
"@babel/core": "^7.9.0", | ||
"@babel/plugin-proposal-class-properties": "^7.8.3", | ||
"@babel/cli": "^7.13.14", | ||
"@babel/core": "^7.13.14", | ||
"@babel/plugin-proposal-object-rest-spread": "^7.9.5", | ||
"@babel/plugin-transform-runtime": "^7.9.0", | ||
"@babel/preset-env": "^7.9.5", | ||
"@babel/preset-react": "^7.9.4", | ||
"@typescript-eslint/eslint-plugin": "^4.10.0", | ||
"@typescript-eslint/parser": "^4.10.0", | ||
"@babel/plugin-transform-runtime": "^7.13.10", | ||
"@babel/preset-env": "^7.13.12", | ||
"@babel/preset-react": "^7.13.13", | ||
"@typescript-eslint/eslint-plugin": "^4.20.0", | ||
"@typescript-eslint/parser": "^4.20.0", | ||
"babel-eslint": "^10.1.0", | ||
@@ -62,8 +62,8 @@ "babel-jest": "^24.9.0", | ||
"enzyme-adapter-react-16": "^1.15.2", | ||
"eslint": "^7.16.0", | ||
"eslint": "^7.23.0", | ||
"eslint-config-react-app": "^6.0.0", | ||
"eslint-plugin-flowtype": "^5.2.0", | ||
"eslint-plugin-flowtype": "^5.4.0", | ||
"eslint-plugin-import": "^2.22.1", | ||
"eslint-plugin-jsx-a11y": "^6.4.1", | ||
"eslint-plugin-react": "^7.21.5", | ||
"eslint-plugin-react": "^7.23.1", | ||
"eslint-plugin-react-hooks": "^4.2.0", | ||
@@ -70,0 +70,0 @@ "jest": "^24.9.0", |
28
24113
480
Updated@babel/runtime@^7.13.10