npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@slimio/config

v1.2.0

Published

SlimIO Reactive JSON Config loaded

Downloads

341

Readme

Config

version Maintenance mit dep size Known Vulnerabilities Build Status

SlimIO - Reactive JSON Configuration loader. This package is used in SlimIO core and addons to safely hot reload configuration upon JSON Schema.

Features

  • Hot-reloading of configuration
  • Reactive with observable key(s)
  • Safe with JSON Schema validation
  • Support TOML as input (enable the parser when the file extension end with .toml)
  • Read configuration with no extension that start with a dot (like .nodesecurerc for example).

Requirements

Node.js version 12 and upper are required to run this project. We do not provide support for previous versions.

Getting Started

This package is available in the Node Package Repository and can be easily installed with npm or yarn.

$ npm i @slimio/config
# or
$ yarn add @slimio/config

Usage example

Create a simple json file for your project (As below)

{
    "loglevel": 5,
    "logsize": 4048,
    "login": "administrator"
}

Now, create a new Configuration instance and read it

const Config = require("@slimio/config");

async function main() {
    const cfg = new Config("./path/to/config.json");
    await cfg.read();
    console.log(cfg.get("loglevel")); // stdout: 5

    // Observe (with an Observable Like) the update made to login property
    cfg.observableOf("login").subscribe(console.log);
    cfg.set("login", "admin");

    // Payload getter will return a deepClone with all configuration properties
    console.log(cfg.payload);

    await cfg.close();
}
main().catch(console.error);

Note: config.json should exist (if not, it will throw an Error). Look at createOnNoEntry option for more information !

Events

Configuration class is extended by a Node.js EventEmitter. The class can trigger several events:

| event name | description | | --- | --- | | configWritten | The configuration payload has been written on the local disk | | watcherInitialized | The file watcher has been initialized (it will hot reload the configuration on modification) | | reload | The configuration has been hot reloaded successfully | | close | Event triggered when the configuration is asked to be closed |

API

This section describe how works the methods of Config class. For a complete definition, take a look at index.d.ts !

Create a new Config Object:

const cfg = new Config("./path/to/file.json", {
    createOnNoEntry: true,
    autoReload: true
});

Available options are:

| name | type | default value | description | | --- | --- | --- | --- | | createOnNoEntry | boolean | false | Create the file with default payload value if he doesn't exist on the local disk | | writeOnSet | boolean | false | Write the file on the disk after each time .set() is called | | autoReload | boolean | false | Setup hot reload of the configuration file | | reloadDelay | number | 500ms | The delay to wait before hot reloading the configuration, it's a security to avoid event spamming | | defaultSchema | plainObject | null | The default JSON Schema for the configuration |

Note: When no schema is provided, it will search for a file prefixed by .schema with the same config name.

Will trigger and read the local configuration (on disk). A default payload value can be provided in case the file doesn't exist !

const { strictEqual } = require("assert");

const cfg = new Config("./path/to/file.json");
strictEqual(cfg.configHasBeenRead, false); // true
await cfg.read();
strictEqual(cfg.configHasBeenRead, true); // true

Retriggering the method will made an hot-reload of all properties. For a cold reload you will have to close the configuration before.

Warning When the file doesn't exist, the configuration is written at the next loop iteration (with lazyWriteOnDisk).

Setup hot reload (with a file watcher). This method is automatically triggered if the Configuration has been created with the option autoReload set to true.

We use the package node-watch to achieve the hot reload.

Get a value from a key (fieldPath). For example, let take a json payload with a root foo field.

const cfg = new Config("./path/to/file.json");
await cfg.read();
const fooValue = cfg.get("foo");

Under the hood the method work with lodash.get function.

If the retrieved value is a JavaScript object, you can limit the depth by setting depth option.

Set a given field in the configuration.

const cfg = new Config("./config.json", {
    createOnNoEntry: true
});

await cfg.read({ foo: "bar" });
cfg.set("foo", "hello world!");
await cfg.writeOnDisk();

Under the hood the method work with lodash.set function.

Observe a given configuration key with an Observable Like object!

const { writeFile } = require("fs").promises;
const cfg = new Config("./config.json", {
    autoReload: true,
    createOnNoEntry: true
});
await cfg.read({ foo: "bar" });

// Observe initial and next value(s) of foo
cfg.observableOf("foo").subscribe(console.log);

// Re-write local config file
const newPayload = { foo: "world" };
await writeFile("./config.json", JSON.stringify(newPayload, null, 4));

Write the configuration on the disk.

Write the configuration on the disk (only at the next event-loop iteration). Use the event configWritten to known when the configuration will be written.

const cfg = new Config("./config.json", {
    createOnNoEntry: true
});
await cfg.read();
cfg.once("configWritten", () => {
    console.log("Configuration written!");
});
cfg.lazyWriteOnDisk();

Close (and write on disk) the configuration (it will close the watcher and complete/clean all active observers subscribers).

Properties

Following properties are static members of Config class.

The STRINGIFY_SPACE property allow you to redine the espace used internaly for JSON.stringify method. The default value is 4.

The DEFAULTSchema property allow you to redefine the default schema that should be applied if no schema is provided when constructor is triggered!

The default value is the following Object:

{
    title: "CONFIG",
    additionalProperties: true
}

The DEFAULT_EXTENSION property allow you to redefine the default extension when there is no extension detected in the constructor filePath. The extension can be either .json or .toml.

License

MIT