613 lines
22 KiB
JavaScript
613 lines
22 KiB
JavaScript
'use strict';
|
|
|
|
function _extends() {
|
|
_extends = Object.assign ? Object.assign.bind() : 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];
|
|
}
|
|
}
|
|
}
|
|
return target;
|
|
};
|
|
return _extends.apply(this, arguments);
|
|
}
|
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
if (source == null) return {};
|
|
var target = {};
|
|
var sourceKeys = Object.keys(source);
|
|
var key, i;
|
|
for (i = 0; i < sourceKeys.length; i++) {
|
|
key = sourceKeys[i];
|
|
if (excluded.indexOf(key) >= 0) continue;
|
|
target[key] = source[key];
|
|
}
|
|
return target;
|
|
}
|
|
|
|
var reduxImpl = function reduxImpl(reducer, initial) {
|
|
return function (set, _get, api) {
|
|
api.dispatch = function (action) {
|
|
set(function (state) {
|
|
return reducer(state, action);
|
|
}, false, action);
|
|
return action;
|
|
};
|
|
api.dispatchFromDevtools = true;
|
|
return _extends({
|
|
dispatch: function dispatch() {
|
|
var _ref;
|
|
return (_ref = api).dispatch.apply(_ref, arguments);
|
|
}
|
|
}, initial);
|
|
};
|
|
};
|
|
var redux = reduxImpl;
|
|
|
|
var _excluded = ["enabled", "anonymousActionType", "store"],
|
|
_excluded2 = ["connection"];
|
|
var trackedConnections = new Map();
|
|
var getTrackedConnectionState = function getTrackedConnectionState(name) {
|
|
var api = trackedConnections.get(name);
|
|
if (!api) return {};
|
|
return Object.fromEntries(Object.entries(api.stores).map(function (_ref) {
|
|
var key = _ref[0],
|
|
api = _ref[1];
|
|
return [key, api.getState()];
|
|
}));
|
|
};
|
|
var extractConnectionInformation = function extractConnectionInformation(store, extensionConnector, options) {
|
|
if (store === undefined) {
|
|
return {
|
|
type: 'untracked',
|
|
connection: extensionConnector.connect(options)
|
|
};
|
|
}
|
|
var existingConnection = trackedConnections.get(options.name);
|
|
if (existingConnection) {
|
|
return _extends({
|
|
type: 'tracked',
|
|
store: store
|
|
}, existingConnection);
|
|
}
|
|
var newConnection = {
|
|
connection: extensionConnector.connect(options),
|
|
stores: {}
|
|
};
|
|
trackedConnections.set(options.name, newConnection);
|
|
return _extends({
|
|
type: 'tracked',
|
|
store: store
|
|
}, newConnection);
|
|
};
|
|
var devtoolsImpl = function devtoolsImpl(fn, devtoolsOptions) {
|
|
if (devtoolsOptions === void 0) {
|
|
devtoolsOptions = {};
|
|
}
|
|
return function (set, get, api) {
|
|
var _devtoolsOptions = devtoolsOptions,
|
|
enabled = _devtoolsOptions.enabled,
|
|
anonymousActionType = _devtoolsOptions.anonymousActionType,
|
|
store = _devtoolsOptions.store,
|
|
options = _objectWithoutPropertiesLoose(_devtoolsOptions, _excluded);
|
|
var extensionConnector;
|
|
try {
|
|
extensionConnector = (enabled != null ? enabled : process.env.NODE_ENV !== 'production') && window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
} catch (e) {}
|
|
if (!extensionConnector) {
|
|
if (process.env.NODE_ENV !== 'production' && enabled) {
|
|
console.warn('[zustand devtools middleware] Please install/enable Redux devtools extension');
|
|
}
|
|
return fn(set, get, api);
|
|
}
|
|
var _extractConnectionInf = extractConnectionInformation(store, extensionConnector, options),
|
|
connection = _extractConnectionInf.connection,
|
|
connectionInformation = _objectWithoutPropertiesLoose(_extractConnectionInf, _excluded2);
|
|
var isRecording = true;
|
|
api.setState = function (state, replace, nameOrAction) {
|
|
var _extends2;
|
|
var r = set(state, replace);
|
|
if (!isRecording) return r;
|
|
var action = nameOrAction === undefined ? {
|
|
type: anonymousActionType || 'anonymous'
|
|
} : typeof nameOrAction === 'string' ? {
|
|
type: nameOrAction
|
|
} : nameOrAction;
|
|
if (store === undefined) {
|
|
connection == null || connection.send(action, get());
|
|
return r;
|
|
}
|
|
connection == null || connection.send(_extends({}, action, {
|
|
type: store + "/" + action.type
|
|
}), _extends({}, getTrackedConnectionState(options.name), (_extends2 = {}, _extends2[store] = api.getState(), _extends2)));
|
|
return r;
|
|
};
|
|
var setStateFromDevtools = function setStateFromDevtools() {
|
|
var originalIsRecording = isRecording;
|
|
isRecording = false;
|
|
set.apply(void 0, arguments);
|
|
isRecording = originalIsRecording;
|
|
};
|
|
var initialState = fn(api.setState, get, api);
|
|
if (connectionInformation.type === 'untracked') {
|
|
connection == null || connection.init(initialState);
|
|
} else {
|
|
connectionInformation.stores[connectionInformation.store] = api;
|
|
connection == null || connection.init(Object.fromEntries(Object.entries(connectionInformation.stores).map(function (_ref2) {
|
|
var key = _ref2[0],
|
|
store = _ref2[1];
|
|
return [key, key === connectionInformation.store ? initialState : store.getState()];
|
|
})));
|
|
}
|
|
if (api.dispatchFromDevtools && typeof api.dispatch === 'function') {
|
|
var didWarnAboutReservedActionType = false;
|
|
var originalDispatch = api.dispatch;
|
|
api.dispatch = function () {
|
|
for (var _len = arguments.length, a = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
a[_key] = arguments[_key];
|
|
}
|
|
if (process.env.NODE_ENV !== 'production' && a[0].type === '__setState' && !didWarnAboutReservedActionType) {
|
|
console.warn('[zustand devtools middleware] "__setState" action type is reserved ' + 'to set state from the devtools. Avoid using it.');
|
|
didWarnAboutReservedActionType = true;
|
|
}
|
|
originalDispatch.apply(void 0, a);
|
|
};
|
|
}
|
|
connection.subscribe(function (message) {
|
|
switch (message.type) {
|
|
case 'ACTION':
|
|
if (typeof message.payload !== 'string') {
|
|
console.error('[zustand devtools middleware] Unsupported action format');
|
|
return;
|
|
}
|
|
return parseJsonThen(message.payload, function (action) {
|
|
if (action.type === '__setState') {
|
|
if (store === undefined) {
|
|
setStateFromDevtools(action.state);
|
|
return;
|
|
}
|
|
if (Object.keys(action.state).length !== 1) {
|
|
console.error("\n [zustand devtools middleware] Unsupported __setState action format. \n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n ");
|
|
}
|
|
var stateFromDevtools = action.state[store];
|
|
if (stateFromDevtools === undefined || stateFromDevtools === null) {
|
|
return;
|
|
}
|
|
if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {
|
|
setStateFromDevtools(stateFromDevtools);
|
|
}
|
|
return;
|
|
}
|
|
if (!api.dispatchFromDevtools) return;
|
|
if (typeof api.dispatch !== 'function') return;
|
|
api.dispatch(action);
|
|
});
|
|
case 'DISPATCH':
|
|
switch (message.payload.type) {
|
|
case 'RESET':
|
|
setStateFromDevtools(initialState);
|
|
if (store === undefined) {
|
|
return connection == null ? void 0 : connection.init(api.getState());
|
|
}
|
|
return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
|
|
case 'COMMIT':
|
|
if (store === undefined) {
|
|
connection == null || connection.init(api.getState());
|
|
return;
|
|
}
|
|
return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));
|
|
case 'ROLLBACK':
|
|
return parseJsonThen(message.state, function (state) {
|
|
if (store === undefined) {
|
|
setStateFromDevtools(state);
|
|
connection == null || connection.init(api.getState());
|
|
return;
|
|
}
|
|
setStateFromDevtools(state[store]);
|
|
connection == null || connection.init(getTrackedConnectionState(options.name));
|
|
});
|
|
case 'JUMP_TO_STATE':
|
|
case 'JUMP_TO_ACTION':
|
|
return parseJsonThen(message.state, function (state) {
|
|
if (store === undefined) {
|
|
setStateFromDevtools(state);
|
|
return;
|
|
}
|
|
if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {
|
|
setStateFromDevtools(state[store]);
|
|
}
|
|
});
|
|
case 'IMPORT_STATE':
|
|
{
|
|
var _nextLiftedState$comp;
|
|
var nextLiftedState = message.payload.nextLiftedState;
|
|
var lastComputedState = (_nextLiftedState$comp = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _nextLiftedState$comp.state;
|
|
if (!lastComputedState) return;
|
|
if (store === undefined) {
|
|
setStateFromDevtools(lastComputedState);
|
|
} else {
|
|
setStateFromDevtools(lastComputedState[store]);
|
|
}
|
|
connection == null || connection.send(null, nextLiftedState);
|
|
return;
|
|
}
|
|
case 'PAUSE_RECORDING':
|
|
return isRecording = !isRecording;
|
|
}
|
|
return;
|
|
}
|
|
});
|
|
return initialState;
|
|
};
|
|
};
|
|
var devtools = devtoolsImpl;
|
|
var parseJsonThen = function parseJsonThen(stringified, f) {
|
|
var parsed;
|
|
try {
|
|
parsed = JSON.parse(stringified);
|
|
} catch (e) {
|
|
console.error('[zustand devtools middleware] Could not parse the received json', e);
|
|
}
|
|
if (parsed !== undefined) f(parsed);
|
|
};
|
|
|
|
var subscribeWithSelectorImpl = function subscribeWithSelectorImpl(fn) {
|
|
return function (set, get, api) {
|
|
var origSubscribe = api.subscribe;
|
|
api.subscribe = function (selector, optListener, options) {
|
|
var listener = selector;
|
|
if (optListener) {
|
|
var equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;
|
|
var currentSlice = selector(api.getState());
|
|
listener = function listener(state) {
|
|
var nextSlice = selector(state);
|
|
if (!equalityFn(currentSlice, nextSlice)) {
|
|
var previousSlice = currentSlice;
|
|
optListener(currentSlice = nextSlice, previousSlice);
|
|
}
|
|
};
|
|
if (options != null && options.fireImmediately) {
|
|
optListener(currentSlice, currentSlice);
|
|
}
|
|
}
|
|
return origSubscribe(listener);
|
|
};
|
|
var initialState = fn(set, get, api);
|
|
return initialState;
|
|
};
|
|
};
|
|
var subscribeWithSelector = subscribeWithSelectorImpl;
|
|
|
|
var combine = function combine(initialState, create) {
|
|
return function () {
|
|
return Object.assign({}, initialState, create.apply(void 0, arguments));
|
|
};
|
|
};
|
|
|
|
function createJSONStorage(getStorage, options) {
|
|
var storage;
|
|
try {
|
|
storage = getStorage();
|
|
} catch (e) {
|
|
return;
|
|
}
|
|
var persistStorage = {
|
|
getItem: function getItem(name) {
|
|
var _getItem;
|
|
var parse = function parse(str) {
|
|
if (str === null) {
|
|
return null;
|
|
}
|
|
return JSON.parse(str, options == null ? void 0 : options.reviver);
|
|
};
|
|
var str = (_getItem = storage.getItem(name)) != null ? _getItem : null;
|
|
if (str instanceof Promise) {
|
|
return str.then(parse);
|
|
}
|
|
return parse(str);
|
|
},
|
|
setItem: function setItem(name, newValue) {
|
|
return storage.setItem(name, JSON.stringify(newValue, options == null ? void 0 : options.replacer));
|
|
},
|
|
removeItem: function removeItem(name) {
|
|
return storage.removeItem(name);
|
|
}
|
|
};
|
|
return persistStorage;
|
|
}
|
|
var toThenable = function toThenable(fn) {
|
|
return function (input) {
|
|
try {
|
|
var result = fn(input);
|
|
if (result instanceof Promise) {
|
|
return result;
|
|
}
|
|
return {
|
|
then: function then(onFulfilled) {
|
|
return toThenable(onFulfilled)(result);
|
|
},
|
|
catch: function _catch(_onRejected) {
|
|
return this;
|
|
}
|
|
};
|
|
} catch (e) {
|
|
return {
|
|
then: function then(_onFulfilled) {
|
|
return this;
|
|
},
|
|
catch: function _catch(onRejected) {
|
|
return toThenable(onRejected)(e);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
};
|
|
var oldImpl = function oldImpl(config, baseOptions) {
|
|
return function (set, get, api) {
|
|
var options = _extends({
|
|
getStorage: function getStorage() {
|
|
return localStorage;
|
|
},
|
|
serialize: JSON.stringify,
|
|
deserialize: JSON.parse,
|
|
partialize: function partialize(state) {
|
|
return state;
|
|
},
|
|
version: 0,
|
|
merge: function merge(persistedState, currentState) {
|
|
return _extends({}, currentState, persistedState);
|
|
}
|
|
}, baseOptions);
|
|
var _hasHydrated = false;
|
|
var hydrationListeners = new Set();
|
|
var finishHydrationListeners = new Set();
|
|
var storage;
|
|
try {
|
|
storage = options.getStorage();
|
|
} catch (e) {}
|
|
if (!storage) {
|
|
return config(function () {
|
|
console.warn("[zustand persist middleware] Unable to update item '" + options.name + "', the given storage is currently unavailable.");
|
|
set.apply(void 0, arguments);
|
|
}, get, api);
|
|
}
|
|
var thenableSerialize = toThenable(options.serialize);
|
|
var setItem = function setItem() {
|
|
var state = options.partialize(_extends({}, get()));
|
|
var errorInSync;
|
|
var thenable = thenableSerialize({
|
|
state: state,
|
|
version: options.version
|
|
}).then(function (serializedValue) {
|
|
return storage.setItem(options.name, serializedValue);
|
|
}).catch(function (e) {
|
|
errorInSync = e;
|
|
});
|
|
if (errorInSync) {
|
|
throw errorInSync;
|
|
}
|
|
return thenable;
|
|
};
|
|
var savedSetState = api.setState;
|
|
api.setState = function (state, replace) {
|
|
savedSetState(state, replace);
|
|
void setItem();
|
|
};
|
|
var configResult = config(function () {
|
|
set.apply(void 0, arguments);
|
|
void setItem();
|
|
}, get, api);
|
|
var stateFromStorage;
|
|
var hydrate = function hydrate() {
|
|
if (!storage) return;
|
|
_hasHydrated = false;
|
|
hydrationListeners.forEach(function (cb) {
|
|
return cb(get());
|
|
});
|
|
var postRehydrationCallback = (options.onRehydrateStorage == null ? void 0 : options.onRehydrateStorage(get())) || undefined;
|
|
return toThenable(storage.getItem.bind(storage))(options.name).then(function (storageValue) {
|
|
if (storageValue) {
|
|
return options.deserialize(storageValue);
|
|
}
|
|
}).then(function (deserializedStorageValue) {
|
|
if (deserializedStorageValue) {
|
|
if (typeof deserializedStorageValue.version === 'number' && deserializedStorageValue.version !== options.version) {
|
|
if (options.migrate) {
|
|
return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
|
|
}
|
|
console.error("State loaded from storage couldn't be migrated since no migrate function was provided");
|
|
} else {
|
|
return deserializedStorageValue.state;
|
|
}
|
|
}
|
|
}).then(function (migratedState) {
|
|
var _get;
|
|
stateFromStorage = options.merge(migratedState, (_get = get()) != null ? _get : configResult);
|
|
set(stateFromStorage, true);
|
|
return setItem();
|
|
}).then(function () {
|
|
postRehydrationCallback == null || postRehydrationCallback(stateFromStorage, undefined);
|
|
_hasHydrated = true;
|
|
finishHydrationListeners.forEach(function (cb) {
|
|
return cb(stateFromStorage);
|
|
});
|
|
}).catch(function (e) {
|
|
postRehydrationCallback == null || postRehydrationCallback(undefined, e);
|
|
});
|
|
};
|
|
api.persist = {
|
|
setOptions: function setOptions(newOptions) {
|
|
options = _extends({}, options, newOptions);
|
|
if (newOptions.getStorage) {
|
|
storage = newOptions.getStorage();
|
|
}
|
|
},
|
|
clearStorage: function clearStorage() {
|
|
var _storage;
|
|
(_storage = storage) == null || _storage.removeItem(options.name);
|
|
},
|
|
getOptions: function getOptions() {
|
|
return options;
|
|
},
|
|
rehydrate: function rehydrate() {
|
|
return hydrate();
|
|
},
|
|
hasHydrated: function hasHydrated() {
|
|
return _hasHydrated;
|
|
},
|
|
onHydrate: function onHydrate(cb) {
|
|
hydrationListeners.add(cb);
|
|
return function () {
|
|
hydrationListeners.delete(cb);
|
|
};
|
|
},
|
|
onFinishHydration: function onFinishHydration(cb) {
|
|
finishHydrationListeners.add(cb);
|
|
return function () {
|
|
finishHydrationListeners.delete(cb);
|
|
};
|
|
}
|
|
};
|
|
hydrate();
|
|
return stateFromStorage || configResult;
|
|
};
|
|
};
|
|
var newImpl = function newImpl(config, baseOptions) {
|
|
return function (set, get, api) {
|
|
var options = _extends({
|
|
storage: createJSONStorage(function () {
|
|
return localStorage;
|
|
}),
|
|
partialize: function partialize(state) {
|
|
return state;
|
|
},
|
|
version: 0,
|
|
merge: function merge(persistedState, currentState) {
|
|
return _extends({}, currentState, persistedState);
|
|
}
|
|
}, baseOptions);
|
|
var _hasHydrated2 = false;
|
|
var hydrationListeners = new Set();
|
|
var finishHydrationListeners = new Set();
|
|
var storage = options.storage;
|
|
if (!storage) {
|
|
return config(function () {
|
|
console.warn("[zustand persist middleware] Unable to update item '" + options.name + "', the given storage is currently unavailable.");
|
|
set.apply(void 0, arguments);
|
|
}, get, api);
|
|
}
|
|
var setItem = function setItem() {
|
|
var state = options.partialize(_extends({}, get()));
|
|
return storage.setItem(options.name, {
|
|
state: state,
|
|
version: options.version
|
|
});
|
|
};
|
|
var savedSetState = api.setState;
|
|
api.setState = function (state, replace) {
|
|
savedSetState(state, replace);
|
|
void setItem();
|
|
};
|
|
var configResult = config(function () {
|
|
set.apply(void 0, arguments);
|
|
void setItem();
|
|
}, get, api);
|
|
api.getInitialState = function () {
|
|
return configResult;
|
|
};
|
|
var stateFromStorage;
|
|
var hydrate = function hydrate() {
|
|
var _get3;
|
|
if (!storage) return;
|
|
_hasHydrated2 = false;
|
|
hydrationListeners.forEach(function (cb) {
|
|
var _get2;
|
|
return cb((_get2 = get()) != null ? _get2 : configResult);
|
|
});
|
|
var postRehydrationCallback = (options.onRehydrateStorage == null ? void 0 : options.onRehydrateStorage((_get3 = get()) != null ? _get3 : configResult)) || undefined;
|
|
return toThenable(storage.getItem.bind(storage))(options.name).then(function (deserializedStorageValue) {
|
|
if (deserializedStorageValue) {
|
|
if (typeof deserializedStorageValue.version === 'number' && deserializedStorageValue.version !== options.version) {
|
|
if (options.migrate) {
|
|
return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
|
|
}
|
|
console.error("State loaded from storage couldn't be migrated since no migrate function was provided");
|
|
} else {
|
|
return deserializedStorageValue.state;
|
|
}
|
|
}
|
|
}).then(function (migratedState) {
|
|
var _get4;
|
|
stateFromStorage = options.merge(migratedState, (_get4 = get()) != null ? _get4 : configResult);
|
|
set(stateFromStorage, true);
|
|
return setItem();
|
|
}).then(function () {
|
|
postRehydrationCallback == null || postRehydrationCallback(stateFromStorage, undefined);
|
|
stateFromStorage = get();
|
|
_hasHydrated2 = true;
|
|
finishHydrationListeners.forEach(function (cb) {
|
|
return cb(stateFromStorage);
|
|
});
|
|
}).catch(function (e) {
|
|
postRehydrationCallback == null || postRehydrationCallback(undefined, e);
|
|
});
|
|
};
|
|
api.persist = {
|
|
setOptions: function setOptions(newOptions) {
|
|
options = _extends({}, options, newOptions);
|
|
if (newOptions.storage) {
|
|
storage = newOptions.storage;
|
|
}
|
|
},
|
|
clearStorage: function clearStorage() {
|
|
var _storage2;
|
|
(_storage2 = storage) == null || _storage2.removeItem(options.name);
|
|
},
|
|
getOptions: function getOptions() {
|
|
return options;
|
|
},
|
|
rehydrate: function rehydrate() {
|
|
return hydrate();
|
|
},
|
|
hasHydrated: function hasHydrated() {
|
|
return _hasHydrated2;
|
|
},
|
|
onHydrate: function onHydrate(cb) {
|
|
hydrationListeners.add(cb);
|
|
return function () {
|
|
hydrationListeners.delete(cb);
|
|
};
|
|
},
|
|
onFinishHydration: function onFinishHydration(cb) {
|
|
finishHydrationListeners.add(cb);
|
|
return function () {
|
|
finishHydrationListeners.delete(cb);
|
|
};
|
|
}
|
|
};
|
|
if (!options.skipHydration) {
|
|
hydrate();
|
|
}
|
|
return stateFromStorage || configResult;
|
|
};
|
|
};
|
|
var persistImpl = function persistImpl(config, baseOptions) {
|
|
if ('getStorage' in baseOptions || 'serialize' in baseOptions || 'deserialize' in baseOptions) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.warn('[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.');
|
|
}
|
|
return oldImpl(config, baseOptions);
|
|
}
|
|
return newImpl(config, baseOptions);
|
|
};
|
|
var persist = persistImpl;
|
|
|
|
exports.combine = combine;
|
|
exports.createJSONStorage = createJSONStorage;
|
|
exports.devtools = devtools;
|
|
exports.persist = persist;
|
|
exports.redux = redux;
|
|
exports.subscribeWithSelector = subscribeWithSelector;
|