π Summary β
KeyValues Storage is a lightweight, file-based utility for managing key-value pairs using JSON. It offers intuitive methods for reading, writing, checking, and deleting values β all with support for both synchronous and asynchronous operations.
βWhen Should You Use This Library? β
You should consider using KeyValues Storage when you need:
- β A simple and lightweight key-value store without the overhead of a full database.
 - ποΈ To persist configuration or state in local .json files.
 - π Quick read/write operations for small or medium-sized data.
 - π§© Nested object support with dot notation access ('user.profile.name').
 - π§ͺ Built-in support for both synchronous and asynchronous APIs.
 - π‘οΈ Safe and atomic writes to prevent file corruption.
 - π¦ Minimal dependencies (just lodash and write-file-atomic).
 
π‘ It's a great fit for: β
- Desktop apps (Electron, Tauri, etc.)
 - Low-traffic web servers or services
 - Caching user preferences
 - Storing app metadata
 - Configuration files
 - Testing and development tools
 - CLI Tools
 
π Main Features β
- Manage key-value pairs in a persistent JSON file
 - Support for nested key paths
 - Multiple instances with different file names
 - Sync and async methods
 - Atomic writes and optional formatting
 
π§ Usage β
β Install the library:
npm install @heliomarpm/kvs
# or 
yarn add @heliomarpm/kvsβοΈ Example Code β
// Default options
{
  atomicSave: true,
  fileName: 'keyvalues.json',
  prettify: false,
  numSpaces: 2
}// Create a new instance of KeyValues with or without custom options
const kvs = new KeyValues()
//or 
const kvs = new KeyValues({ fileName: 'config.json',  prettify: true });
const color =
{
  "name": "cerulean",
  "code": {
    "hex": "#003BE6",
    "rgb": [0, 179, 230]
  }
}
// Set a key-value
kvs.setSync(['settings', 'language'], "pt-Br");
kvs.getSync(['settings', 'language'])	
// => 'pt-Br'
// Set/Add a key settings
kvs.setSync("settings.default", "en");
kvs.getSync("settings")
// => { "language": "pt-Br", "default": "en" }
kvs.getSync();	
// => { "settings": { "language": "pt-Br", "default": "en" } }
// replace key settings
kvs.setSync("settings", { theme: "dark"});
kvs.getSync("settings")
// => { "theme": "dark" }
// Added a new key-value
kvs.setSync("color", color);
kvs.getSync();
// => { "theme": "dark", "color": { "name": "cerulean", "code": { "rgb": [0, 179, 230], "hex": "#003BE6" } } }
// Replace all key-values
kvs.setSync(color);
kvs.getSync();
// => { "name": "cerulean", "code": { "rgb": [0, 179, 230], "hex": "#003BE6" } }
// Unset a key-value
kvs.unsetSync();
kvs.getSync();
// => {}
// Set a new key-values
kvs.setSync("color", color);
kvs.getSync();	
// => { "color": { "name": "cerulean", "code": { "rgb": [0, 179, 230], "hex": "#003BE6" } } }
kvs.getSync("color.name")
// => "cerulean"
kvs.getSync("color.code.hex")
// => "#003BE6"
kvs.getSync(["color", "code"])
// or
kvs.getSync("color.code")
// => { "hex": "#003BE6", "rgb": [0, 179, 230] }
kvs.getSync(["color", "hue"])
// => undefined
// Set a key-value pair
await kvs.set("color.name", "sapphire");
// Get the value at a specific key path
const value = await kvs.get("color.name");
// => "sapphire"
// Check if a key path exists
const exists = await kvs.has("color.name");
// => true
// Remove a key-value pair
await kvs.unset("color.name");
await kvs.get(); 
// => { "code": { "rgb": [0, 179, 230], "hex": "#003BE6" } }
const exists = kvs.hasSync("color.name");
// => false
kvs.unset().then(() => {
  console.log("All key-value pairs have been removed.");
});π API Reference β
See the API documentation for a complete list of available functions and their signatures.
π§ͺ Methods β
| Method | Description | 
|---|---|
constructor(options?) | Initializes a new instance of the KeyValues class with optional custom options. | 
file(): string | Returns the path to the JSON file. | 
resetOptions(): void | Resets the configuration of the KeyValues instance to default options. | 
has(keyPath): Promise<boolean> | Checks if a key path exists asynchronously. | 
hasSync(keyPath): boolean | Checks if a key path exists synchronously. | 
get<T>(keyPath?): Promise<T> | Gets the value at a specific key path asynchronously. | 
getSync<T>(keyPath?): T | Gets the value at a specific key path synchronously. | 
set<T>(...args): Promise<void> | Sets a value at a specific key path asynchronously. | 
setSync<T>(...args): void | Sets a value at a specific key path synchronously. | 
unset(keyPath?): Promise<void> | Removes a key-value pair at a specific key path asynchronously. | 
unsetSync(keyPath?): void | Removes a key-value pair at a specific key path synchronously. | 
π¦ Project Scripts β
npm run checkβ runs formatter, linter and import sorting to the requested filesnpm run formatβ run the formatter on a set of filesnpm run lintβ run various checks on a set of filesnpm run testβ run unit testsnpm run test:cβ run unit tests with coveragenpm run commit- run conventional commits checknpm run release:testβ dry run semantic releasenpm run buildβ build library
π¦ Dependencies β
π€ Contributing β
We welcome contributions! Please read:
Thank you to everyone who has already contributed to the project!
Made with contrib.rocks. β
β€οΈ Support this project β
If this project helped you in any way, there are several ways to contribute. 
 Help us maintain and improve this template:
β Starring the repository 
 π Reporting bugs 
 π‘ Suggest features 
 π§Ύ Improving the documentation 
 π’ Share with others
π΅ Supporting via GitHub Sponsors, Ko-fi, Paypal or Liberapay, you decide. π
π License β
MIT Β© Heliomar P. Marques π