@torny/state
v0.1.6
Published
Small persistent state store primitives for Torn userscripts.
Readme
@torny/state
Small state store primitives for Torn userscripts, with optional persistence through @torny/storage.
import { createState } from "@torny/state";
const settings = createState({
namespace: "my-script",
initialState: { enabled: true },
persist: true,
});
settings.subscribe((state) => {
console.log(state.enabled);
});
settings.setState({ enabled: false });Stores can also be created with Zustand-style actions:
import { createState } from "@torny/state";
type MenuStore = {
isOpen: boolean;
openMenu: () => void;
closeMenu: () => void;
toggleMenu: () => void;
};
export const menuStore = createState<MenuStore>((set, get) => ({
isOpen: false,
openMenu() {
void set({ isOpen: true });
},
closeMenu() {
void set({ isOpen: false });
},
toggleMenu() {
void set({ isOpen: !get().isOpen });
},
}));When persistence is enabled, function properties are skipped by default so only state data is stored.
For Zustand-style vanilla stores, use createStore:
import { createStore } from "@torny/state";
export const menuStore = createStore<MenuStore>()((set) => ({
isOpen: false,
openMenu() {
set({ isOpen: true });
},
closeMenu() {
set({ isOpen: false });
},
toggleMenu() {
set((state) => ({ isOpen: !state.isOpen }));
},
}));Persistent stores can use name and partialize, similar to Zustand persist:
export const apiKeyStore = createStore<ApiKeyStore>()(
(set) => ({
apiKey: null,
hasApiKey: false,
setApiKey(apiKey) {
set({ apiKey, hasApiKey: apiKey.length > 0 });
},
}),
{
name: "api-key-store",
namespace: "tornpilot",
persist: true,
partialize: (state) => ({
apiKey: state.apiKey,
hasApiKey: state.hasApiKey,
}),
},
);