@madrimov/electron-store-typed
v1.0.0
Published
Type-safe persistent storage for Electron apps with full TypeScript generics support.
Maintainers
Readme
@madrimov/electron-store-typed
Type-safe persistent storage for Electron apps with full TypeScript generics support.
Unlike
electron-store, everyget()andset()call is fully typed based on your own interface — no moreany.
Features
- Full TypeScript generics — define your own schema interface, get complete type inference
- Zero runtime dependencies — uses Node.js built-in
fsandevents - Persistent JSON storage — saves to
app.getPath('userData')automatically - Change listeners — subscribe to value changes with
onDidChange() - Works with Electron 28+
Installation
npm install @madrimov/electron-store-typedQuick Start
import { createStore } from '@madrimov/electron-store-typed';
// 1. Define your schema
interface AppConfig {
theme: 'light' | 'dark';
language: 'uz' | 'ru' | 'en';
recentFiles: string[];
window: { width: number; height: number };
}
// 2. Create a store
const store = createStore<AppConfig>({
name: 'config', // saves to: userData/config.json
defaults: {
theme: 'light',
language: 'uz',
recentFiles: [],
window: { width: 1200, height: 800 },
},
});
// 3. Use it — fully typed!
store.get('theme'); // type: 'light' | 'dark'
store.set('theme', 'dark'); // ✅ OK
store.set('theme', 'blue'); // ❌ TypeScript error!
store.get('window').width; // type: number
store.getAll(); // type: AppConfigAPI
createStore<T>(options)
Creates a new store instance.
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| defaults | T | required | Default values for all keys |
| name | string | 'config' | JSON file name (without .json) |
| cwd | string | app.getPath('userData') | Directory for the JSON file |
Instance Methods
| Method | Description |
|--------|-------------|
| get(key) | Get a value — fully typed |
| set(key, value) | Set a value — type-safe |
| has(key) | Check if a key exists |
| delete(key) | Remove a key |
| reset(...keys) | Reset key(s) to defaults |
| clear() | Reset entire store to defaults |
| getAll() | Get all values as a typed object |
| onDidChange(key, handler) | Subscribe to changes, returns unsubscribe fn |
| path (readonly) | Absolute path to the JSON file |
onDidChange Example
const unsubscribe = store.onDidChange('theme', (newValue, oldValue) => {
console.log(`Theme changed: ${oldValue} → ${newValue}`);
});
store.set('theme', 'dark'); // logs: "Theme changed: light → dark"
// Stop listening
unsubscribe();Usage in Electron
Call createStore in your main process after the app is ready:
// main.ts
import { app } from 'electron';
import { createStore } from '@madrimov/electron-store-typed';
app.whenReady().then(() => {
const store = createStore<AppConfig>({ defaults: { ... } });
// pass store to your IPC handlers
});Requirements
- Node.js >= 18.0.0
- Electron >= 28.0.0
License
MIT
