You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
peter 06b13251b8 migrate 10 months ago
src uppercased Loadson 1 year ago
test uppercased Loadson 1 year ago
.drone.yml migrate 10 months ago
.gitignore remove unused 1 year ago
LICENSE.md migrate 10 months ago
README.md migrate 10 months ago
package-lock.json migrate 10 months ago
package.json migrate 10 months ago
tsconfig.json push 1 year ago

README.md

Overview

Build Status Current Version Weekly Downloads License Type

Loadson is a persistent, flat, in file JSON storage powered by lowdb and enables you to conveniently handle objects that have a default configuration as well as getting, setting, deleting and reseting the configuration on disk.

How to install

npm i loadson

Quickstart

Create a configuration Loader

import { ConfigLoader, ConfigExporter }  from 'loadson'
 
 
// create your custom configuration type
type MyCustomConfigType = {
    myConfig: {
        a: number,
        b: string,
        c: { d: string, e: number }
    }
}
 
// implement ConfigExporter by defining the getDefaultConfig method and the name property
class SomethingWithDefaultConfig 
implements ConfigExporter<MyCustomConfigType>{
    
    name: string = "myConfigName"  
    
    getDefaultConfig(): MyCustomConfigType {
       return { 
            myConfig: {
            a: 3,
            b: "hello",
            c: { d: "world", e: 42}
            }
       }
    }
}
 
// Using the loader
const somethingWithDefaultConfig = new SomethingWithDefaultConfig();
let loader = new ConfigLoader(somethingWithDefaultConfig)
 
console.log("loader getConfig returns ", 
    loader.getConfig()
) 
// loader getConfig returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }
 
console.log("loader setConfig returns ", 
    loader.setConfig({ myConfig: { a: 7, b: "d", c: { d: "b", e: 24} } })
) 
// loader setConfig returns  
// { myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } } }
 
console.log("loader resetConfig returns", 
    loader.resetConfig()
) 
// loader resetConfig returns 
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }
 
console.log("loader getConfigKey that does not exist resturns ", 
    loader.getConfigKey('noConfigKey')
) 
// loader getConfigKey that does not exist resturns  
// undefined
 
console.log("loader getConfigKey that does exist returns ", 
    loader.getConfigKey('myConfig')
) 
// loader getConfigKey that does exist returns  
// { a: 3, b: 'hello', c: { d: 'world', e: 42 } }
 
console.log("loader setConfigKey 'anotherKey', { a: 12 } returns ", 
    loader.setConfigKey('anotherKey', { a: 12 })
) 
// loader setConfigKey 'anotherKey', { a: 12 } returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } },
// anotherKey: { a: 12 } }
 
console.log("loader deleteConfigKey 'myConfig' returns ", 
    loader.deleteConfigKey('myConfig')
) 
// loader deleteConfigKey 'myConfig' returns  
// { anotherKey: { a: 12 } }
 
console.log("loader resetConfig returns ", 
    loader.resetConfig()
) 
// loader resetConfig returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }

There should be a file in the current working directory named myConfigName.json with the default configuration

{
    "myConfig": {
      "a": 3,
      "b": "hello",
      "c": {
        "d": "world",
        "e": 42
      }
    }
  }

Using a different configuration folder path

const customConfigDirectoryPath = "./myConfigPath" //otherwise current working directory
let customPathLoader = new ConfigLoader
    (somethingWithDefaultConfig
    , customConfigDirectoryPath)
 
console.log("customPathLoader getConfig returns ", 
    customPathLoader.getConfig()
)
// customPathLoader getConfig returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }
 

There should be a file ./myConfigPath/myConfigName.json with the content of customPathLoader.getConfig()

Using a custom onChange callback

// This hook will only be called if something on disk actually changed and maybe provides a key of type string
const myCustomOnChangeHook = (config: MyCustomConfigType, key?: string) => {
        console.log("a change happened in ", config, "on key ", key)
}
let onChangeLoader = new ConfigLoader
    (somethingWithDefaultConfig
    , customConfigDirectoryPath
    , myCustomOnChangeHook)
 
 
console.log("onChangeLoader setConfig to default returns ", 
    onChangeLoader.setConfig(somethingWithDefaultConfig.getDefaultConfig())
) 
// onChangeLoader setConfig to default returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }
 
console.log("onChangeLoader setConfig to something else returns ", 
    onChangeLoader.setConfig({ myConfig: { a: 7, b: "d", c: { d: "b", e: 24} } })
) 
// a change happened in  
// { myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } } } on key  undefined
// onChangeLoader setConfig to something else returns  
// { myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } } }
 
console.log("onChangeLoader setConfigKey to the same value returns ", 
    onChangeLoader.setConfigKey('myConfig', { a: 7, b: "d", c: { d: "b", e: 24} })
) 
// onChangeLoader setConfigKey to the same value returns  
// { myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } } }
 
console.log("onChangeLoader setConfigKey that does not exist returns", 
    onChangeLoader.setConfigKey('anotherKey', { a: 12 })
) 
/**
a change happened in  
{ myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } },
  anotherKey: { a: 12 } } on key  anotherKey
onChangeLoader setConfigKey that does not exist returns {
  myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } },
  anotherKey: { a: 12 }
}*/
 
console.log("onChangeLoader deleteConfigKey that does not exist returns ", 
    onChangeLoader.deleteConfigKey('noConfigKey')
) 
/**
onChangeLoader deleteConfigKey that does not exist returns {
   myConfig: { a: 7, b: 'd', c: { d: 'b', e: 24 } },
   anotherKey: { a: 12 }
}
*/
 
console.log("onChangeLoader deleteConfigKey that does exist returns ", 
    onChangeLoader.deleteConfigKey('myConfig')
) 
// a change happened in  
// { anotherKey: { a: 12 } } on key  myConfig
// onChangeLoader deleteConfigKey that does exist returns  
// { anotherKey: { a: 12 } }
 
console.log("onChangeLoader the first resetConfig returns ", 
    onChangeLoader.resetConfig()
) 
// a change happened in  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } } on key  undefined
// onChangeLoader the first resetConfig returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }
 
console.log("onChangeLoader the second resetConfig returns ", 
    onChangeLoader.resetConfig()
) 
// onChangeLoader the second resetConfig returns  
// { myConfig: { a: 3, b: 'hello', c: { d: 'world', e: 42 } } }

Full documentation