System.register([], (function (exports) { 'use strict'; return { execute: (function () { exports("createJSONStorage", createJSONStorage); const reduxImpl = (reducer, initial) => (set, _get, api) => { api.dispatch = (action) => { set((state) => reducer(state, action), false, action); return action; }; api.dispatchFromDevtools = true; return { dispatch: (...a) => api.dispatch(...a), ...initial }; }; const redux = exports("redux", reduxImpl); const trackedConnections = /* @__PURE__ */ new Map(); const getTrackedConnectionState = (name) => { const api = trackedConnections.get(name); if (!api) return {}; return Object.fromEntries( Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()]) ); }; const extractConnectionInformation = (store, extensionConnector, options) => { if (store === void 0) { return { type: "untracked", connection: extensionConnector.connect(options) }; } const existingConnection = trackedConnections.get(options.name); if (existingConnection) { return { type: "tracked", store, ...existingConnection }; } const newConnection = { connection: extensionConnector.connect(options), stores: {} }; trackedConnections.set(options.name, newConnection); return { type: "tracked", store, ...newConnection }; }; const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => { const { enabled, anonymousActionType, store, ...options } = devtoolsOptions; let extensionConnector; try { extensionConnector = (enabled != null ? enabled : true) && window.__REDUX_DEVTOOLS_EXTENSION__; } catch (e) { } if (!extensionConnector) { if (enabled) { console.warn( "[zustand devtools middleware] Please install/enable Redux devtools extension" ); } return fn(set, get, api); } const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options); let isRecording = true; api.setState = (state, replace, nameOrAction) => { const r = set(state, replace); if (!isRecording) return r; const action = nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction; if (store === void 0) { connection == null ? void 0 : connection.send(action, get()); return r; } connection == null ? void 0 : connection.send( { ...action, type: `${store}/${action.type}` }, { ...getTrackedConnectionState(options.name), [store]: api.getState() } ); return r; }; const setStateFromDevtools = (...a) => { const originalIsRecording = isRecording; isRecording = false; set(...a); isRecording = originalIsRecording; }; const initialState = fn(api.setState, get, api); if (connectionInformation.type === "untracked") { connection == null ? void 0 : connection.init(initialState); } else { connectionInformation.stores[connectionInformation.store] = api; connection == null ? void 0 : connection.init( Object.fromEntries( Object.entries(connectionInformation.stores).map(([key, store2]) => [ key, key === connectionInformation.store ? initialState : store2.getState() ]) ) ); } if (api.dispatchFromDevtools && typeof api.dispatch === "function") { let didWarnAboutReservedActionType = false; const originalDispatch = api.dispatch; api.dispatch = (...a) => { if (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(...a); }; } connection.subscribe((message) => { var _a; switch (message.type) { case "ACTION": if (typeof message.payload !== "string") { console.error( "[zustand devtools middleware] Unsupported action format" ); return; } return parseJsonThen( message.payload, (action) => { if (action.type === "__setState") { if (store === void 0) { setStateFromDevtools(action.state); return; } if (Object.keys(action.state).length !== 1) { console.error( ` [zustand devtools middleware] Unsupported __setState action format. When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(), and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } } ` ); } const stateFromDevtools = action.state[store]; if (stateFromDevtools === void 0 || 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 === void 0) { return connection == null ? void 0 : connection.init(api.getState()); } return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); case "COMMIT": if (store === void 0) { connection == null ? void 0 : connection.init(api.getState()); return; } return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); case "ROLLBACK": return parseJsonThen(message.state, (state) => { if (store === void 0) { setStateFromDevtools(state); connection == null ? void 0 : connection.init(api.getState()); return; } setStateFromDevtools(state[store]); connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name)); }); case "JUMP_TO_STATE": case "JUMP_TO_ACTION": return parseJsonThen(message.state, (state) => { if (store === void 0) { setStateFromDevtools(state); return; } if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) { setStateFromDevtools(state[store]); } }); case "IMPORT_STATE": { const { nextLiftedState } = message.payload; const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state; if (!lastComputedState) return; if (store === void 0) { setStateFromDevtools(lastComputedState); } else { setStateFromDevtools(lastComputedState[store]); } connection == null ? void 0 : connection.send( null, // FIXME no-any nextLiftedState ); return; } case "PAUSE_RECORDING": return isRecording = !isRecording; } return; } }); return initialState; }; const devtools = exports("devtools", devtoolsImpl); const parseJsonThen = (stringified, f) => { let parsed; try { parsed = JSON.parse(stringified); } catch (e) { console.error( "[zustand devtools middleware] Could not parse the received json", e ); } if (parsed !== void 0) f(parsed); }; const subscribeWithSelectorImpl = (fn) => (set, get, api) => { const origSubscribe = api.subscribe; api.subscribe = (selector, optListener, options) => { let listener = selector; if (optListener) { const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is; let currentSlice = selector(api.getState()); listener = (state) => { const nextSlice = selector(state); if (!equalityFn(currentSlice, nextSlice)) { const previousSlice = currentSlice; optListener(currentSlice = nextSlice, previousSlice); } }; if (options == null ? void 0 : options.fireImmediately) { optListener(currentSlice, currentSlice); } } return origSubscribe(listener); }; const initialState = fn(set, get, api); return initialState; }; const subscribeWithSelector = exports("subscribeWithSelector", subscribeWithSelectorImpl); const combine = exports("combine", (initialState, create) => (...a) => Object.assign({}, initialState, create(...a))); function createJSONStorage(getStorage, options) { let storage; try { storage = getStorage(); } catch (e) { return; } const persistStorage = { getItem: (name) => { var _a; const parse = (str2) => { if (str2 === null) { return null; } return JSON.parse(str2, options == null ? void 0 : options.reviver); }; const str = (_a = storage.getItem(name)) != null ? _a : null; if (str instanceof Promise) { return str.then(parse); } return parse(str); }, setItem: (name, newValue) => storage.setItem( name, JSON.stringify(newValue, options == null ? void 0 : options.replacer) ), removeItem: (name) => storage.removeItem(name) }; return persistStorage; } const toThenable = (fn) => (input) => { try { const result = fn(input); if (result instanceof Promise) { return result; } return { then(onFulfilled) { return toThenable(onFulfilled)(result); }, catch(_onRejected) { return this; } }; } catch (e) { return { then(_onFulfilled) { return this; }, catch(onRejected) { return toThenable(onRejected)(e); } }; } }; const oldImpl = (config, baseOptions) => (set, get, api) => { let options = { getStorage: () => localStorage, serialize: JSON.stringify, deserialize: JSON.parse, partialize: (state) => state, version: 0, merge: (persistedState, currentState) => ({ ...currentState, ...persistedState }), ...baseOptions }; let hasHydrated = false; const hydrationListeners = /* @__PURE__ */ new Set(); const finishHydrationListeners = /* @__PURE__ */ new Set(); let storage; try { storage = options.getStorage(); } catch (e) { } if (!storage) { return config( (...args) => { console.warn( `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.` ); set(...args); }, get, api ); } const thenableSerialize = toThenable(options.serialize); const setItem = () => { const state = options.partialize({ ...get() }); let errorInSync; const thenable = thenableSerialize({ state, version: options.version }).then( (serializedValue) => storage.setItem(options.name, serializedValue) ).catch((e) => { errorInSync = e; }); if (errorInSync) { throw errorInSync; } return thenable; }; const savedSetState = api.setState; api.setState = (state, replace) => { savedSetState(state, replace); void setItem(); }; const configResult = config( (...args) => { set(...args); void setItem(); }, get, api ); let stateFromStorage; const hydrate = () => { var _a; if (!storage) return; hasHydrated = false; hydrationListeners.forEach((cb) => cb(get())); const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0; return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => { if (storageValue) { return options.deserialize(storageValue); } }).then((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((migratedState) => { var _a2; stateFromStorage = options.merge( migratedState, (_a2 = get()) != null ? _a2 : configResult ); set(stateFromStorage, true); return setItem(); }).then(() => { postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0); hasHydrated = true; finishHydrationListeners.forEach((cb) => cb(stateFromStorage)); }).catch((e) => { postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e); }); }; api.persist = { setOptions: (newOptions) => { options = { ...options, ...newOptions }; if (newOptions.getStorage) { storage = newOptions.getStorage(); } }, clearStorage: () => { storage == null ? void 0 : storage.removeItem(options.name); }, getOptions: () => options, rehydrate: () => hydrate(), hasHydrated: () => hasHydrated, onHydrate: (cb) => { hydrationListeners.add(cb); return () => { hydrationListeners.delete(cb); }; }, onFinishHydration: (cb) => { finishHydrationListeners.add(cb); return () => { finishHydrationListeners.delete(cb); }; } }; hydrate(); return stateFromStorage || configResult; }; const newImpl = (config, baseOptions) => (set, get, api) => { let options = { storage: createJSONStorage(() => localStorage), partialize: (state) => state, version: 0, merge: (persistedState, currentState) => ({ ...currentState, ...persistedState }), ...baseOptions }; let hasHydrated = false; const hydrationListeners = /* @__PURE__ */ new Set(); const finishHydrationListeners = /* @__PURE__ */ new Set(); let storage = options.storage; if (!storage) { return config( (...args) => { console.warn( `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.` ); set(...args); }, get, api ); } const setItem = () => { const state = options.partialize({ ...get() }); return storage.setItem(options.name, { state, version: options.version }); }; const savedSetState = api.setState; api.setState = (state, replace) => { savedSetState(state, replace); void setItem(); }; const configResult = config( (...args) => { set(...args); void setItem(); }, get, api ); api.getInitialState = () => configResult; let stateFromStorage; const hydrate = () => { var _a, _b; if (!storage) return; hasHydrated = false; hydrationListeners.forEach((cb) => { var _a2; return cb((_a2 = get()) != null ? _a2 : configResult); }); const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0; return toThenable(storage.getItem.bind(storage))(options.name).then((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((migratedState) => { var _a2; stateFromStorage = options.merge( migratedState, (_a2 = get()) != null ? _a2 : configResult ); set(stateFromStorage, true); return setItem(); }).then(() => { postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0); stateFromStorage = get(); hasHydrated = true; finishHydrationListeners.forEach((cb) => cb(stateFromStorage)); }).catch((e) => { postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e); }); }; api.persist = { setOptions: (newOptions) => { options = { ...options, ...newOptions }; if (newOptions.storage) { storage = newOptions.storage; } }, clearStorage: () => { storage == null ? void 0 : storage.removeItem(options.name); }, getOptions: () => options, rehydrate: () => hydrate(), hasHydrated: () => hasHydrated, onHydrate: (cb) => { hydrationListeners.add(cb); return () => { hydrationListeners.delete(cb); }; }, onFinishHydration: (cb) => { finishHydrationListeners.add(cb); return () => { finishHydrationListeners.delete(cb); }; } }; if (!options.skipHydration) { hydrate(); } return stateFromStorage || configResult; }; const persistImpl = (config, baseOptions) => { if ("getStorage" in baseOptions || "serialize" in baseOptions || "deserialize" in baseOptions) { { console.warn( "[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead." ); } return oldImpl(config, baseOptions); } return newImpl(config, baseOptions); }; const persist = exports("persist", persistImpl); }) }; }));