savables
v1.2.4
Published
Create a persistable objects that will be automatically saved and restored from a file
Maintainers
Readme
Auto-save your object in a file, reload it automatically when your program restarts
Example
First run
// $ cat ./data.json
// no file
const data = createStore<any>("./data.json", {
valueIfFileDoesNotExist: {},
})
// console.log(data)
// {}
data.version = "1.0.0"
// console.log(data)
// {version: "1.0.0"}
process.exit()
// $ cat ./data.json
// {"version": "1.0.0"}Second run
// $ cat ./data.json
// {"version": "1.0.0"}
const data = createStore<any>("./data.json", {
valueIfFileDoesNotExist: {},
})
// console.log(data)
// {"version": "1.0.0"}Usage
const data = createStore<any>("./data.json", {
valueIfFileDoesNotExist: {}, // object will start with this value if file is empty
autoSaveMs: 1000 * 60, // auto checks every minute if it has changes and save if any
noIndentJson: true, // will not indent json in saved file
})Getting started
$ npm install savablesimport { createStore } from "savables"
const data = createStore<any>("./data.json", {
valueIfFileDoesNotExist: {},
})Typing
You can pass a type to createStore that will enable TypeScript type-checking features
import { createStore } from "savables"
type Data = {
users?: {
id: number
nickname: string
}[]
}
const data = createStore<Data>("./data.json", { // notice the Data here
valueIfFileDoesNotExist: {},
})
data.users = "123" // error
data.users = [] // good
data.users = [
{
id: 1,
nickname: "snwfdhmp",
}
] // good
data.users.push({
id: 2,
nickname: "notch",
}) // goodImplementation details
// Creating 2 stores at the same path will throw
const dataOne = createStore<Data>("./data.json", ...) // ok
const dataTwo = createStore<Data>("./data_two.json", ...) // ok
const dataThree = createStore<Data>("./data.json", ...) // throws error: Two stores cannot be created for the same path
// You can prevent object from saving
blockSave("./data.json")
saveStore("./data.json") // WARN: Tried to save store but this.blockSave is true
unblockSave("./data/json")
saveStore("./data.json") // ok
// You can perform transactions
console.log(data) // {version: "1.0.0"}
tx(data, (data) => {
data.version = "1.0.1"
})
console.log(data) // {version: "1.0.1"}
// Transactions only apply the changes if function does not throw
tx(data, (data) => {
data.version = "1.0.2"
throw new Error("some error")
})
console.log(data) // {version: "1.0.1"}
// You can manually force save if you need
saveStore("./data.json") // will automatically find the right data object and save itAlso:
- When receiving signals like SIGHUP, SIGINT, SIGTERM, it will save the data before exiting
- When using
process.exit(number), it will save the data before exiting
