neant
Version:
The simplest React state management library - direct mutations, direct destructuring, automatic fine-grained reactivity
71 lines (69 loc) • 1.82 kB
JavaScript
"use client";
// src/store.ts
import { produce } from "immer";
import { useDebugValue, useSyncExternalStore } from "react";
var create = (createState) => {
const api = createStore(createState);
const useBoundStore = (selector) => {
const slice = useSyncExternalStore(
api.subscribe,
() => selector(api.getState()),
() => selector(api.getState())
);
useDebugValue(slice);
return slice;
};
Object.assign(useBoundStore, api);
return useBoundStore;
};
var createStore = (createState) => {
let state;
const listeners = /* @__PURE__ */ new Set();
const setState = (updater) => {
const nextState = produce(state, updater);
const previousState = state;
state = nextState;
listeners.forEach((listener) => listener(state, previousState));
};
const getState = () => state;
const subscribe = (listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
};
const api = { setState, getState, subscribe };
state = createState(setState, getState);
return api;
};
// src/index.ts
function createEnhancedStore(createState) {
const store = create(createState);
const state = store.getState();
const useModel = Object.keys(state).reduce((total, key) => {
Object.defineProperty(total, key, {
get() {
return store((s) => s[key]);
},
enumerable: true
});
return total;
}, {});
store.use = useModel;
return store;
}
function createStore2(createState) {
const store = createEnhancedStore(createState);
function useAppStore() {
return store.use;
}
return {
useAppStore,
subscribe: store.subscribe,
getState: store.getState,
setState: store.setState
};
}
export {
createEnhancedStore,
createStore2 as createStore
};
//# sourceMappingURL=index.mjs.map