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 🙏

© 2024 – Pkg Stats / Ryan Hefner

config-elements

v0.2.1

Published

YAML rewrite - Replacement for json

Downloads

15

Readme

Installation

Run the NPM command

npm i config-elements

Overview

A config file reader for human-readable format that is very similar to YAML, prioritizing performance plus a lot of addition features.

This package can help large config files to be readable and clean without affecting performance nor loosing functionality. (In fact, we got additional features!)

Disclaimer

Most yml files work with this package, but not necessarily, as it is completely written by me. Also, I got a full todo list to make it far better than YAML, todo list probably in bottom

What's New 0.2.1

Added support for writing to config files, completing the original goals for the package.

Better caching, major performance improvement in caching.

Format & Functions

A brief introduction to the package so that you can use it without trouble.

To be honest, it is really straightforward so expect no problems.

Format

There not really any syntax, it's just the basic format and stuff

Any File Extensions Will Work

I use .cfg because configs, it just feels right

example.cfg

# Countries I know (comment)
countries:
    - 'Japan'
    - 'USA'
    - 'UK'

# Minecraft values (comments are ignored)
minecraft:
    max_health: 20
    player1_health: NaN
    player1_name: 'steve'

    world_data:
        world_boarder: BigInt(300000000)

Here I'll explain:

The values of countries are stored in an arrays as they used - value, so now countries = ['Japan', 'USA', 'UK']

Note that countries and Countries are completely different

On the other hand, values in minecraft is not stored in an array. For example, minecraft.player1_name = 'steve'. But minecraft.max_health doesn't have double quotes surrounding it, therefore it is stored as a number instead of a string.

Anything that are not surrounded by single/double quotes are not strings

Data Types

This package support a lot more data types then YAML package, these are the data types that it support

Strings

single_quotes: 'hello world'
double_quotes: "hello world"

Numbers

integer: 1
signed_integer: -69
float: 42.069

Booleans

yes: true
no: false

Special values

not_a_number: NaN
nothing: undefined
null: null
infinity: Infinity # capital 'I'

Read & Write

The main use of the package is to read and write config files in a readable format. With that, we need to use 2 functions

readSync()

This function simple "translates" config files into objects, don't know what I mean? Here I'll show you

Remember the example.cfg from above? The one with countries and minecraft world properties? Let's read that file with readSync()

index.js

// Import the package
const cfg = require('config-elements');

// Now read the file and put the data in variable "data"
var data = cfg.readSync({
    path: './example.cfg'
});

// Now data contains all the information the config file has
console.log(data.minecraft.max_health); // 20
console.log(data.countries); // ['Japan', 'USA', 'UK']

// And since "data" is an object, we can get any property with key
console.log(data['minecraft']['player1_name']); // 'steve'

It's quite easy to understand what is happening here, we read the file, and put the data to the variable "data".

Then the other lines are just accessing and printing out the data we had.

writeSync()

This is the opposite of readSync(), what it does it translates objects back to the readable config format.

Let's continue the previous example for this.

index.js

// snippet

// change the value
data.minecraft.player1_name = 'alex'

// writeSync() will return the config file as a string
var config = cfg.writeSync({
    object: data,
    path: './example.cfg'
});

console.log(config); // prints out the formatted config file

So now we can read and write config files, let's take a look some additional options.

Additional Options

Additional options for readSync() and writeSync().

Additional options are not required, but can be used if the function doesn't work

// snippet

cfg.readSync({
    content: string, // string of the config file
    path: string, // ignored when "content" is provided
    encoding: string, // file encoding
    log: boolean // enable/disable user warnings
});

cfg.writeSync({
    object: object, // object that you want to write to file
    path: string, // not required if you only want to use its return value and not writing to file
    encoding: string, // file encoding
});

Settings

The settings() function provide further customisations to adapt to your code, or the config file.

Only enter the value/settings you want to change.

// snippet

cfg.settings({
    comment: string, // symbols/string to start a comment (default: '#')
    log: boolean, // display user warnings by default or not (default: true)
    space: integer // tab increment (default: 4)
});

Performance

Performance is a huge factor when choosing a package, all of the tests are ran on repl.it free version, then taken the average out of 3.

Performance is then compared to JSON - the object format for JavaScript.

Note

JSON will always faster because it is literally an object, the comparison is just to show this package isn't ridiculously slow.

Reading Small Files

How long does it takes to load small files.

JSON: 0.001s

{
  "hello": "world"
}

Readable Format: 0.002s

hello: 'world'

Reading Large Files

To see the performance of package when reading large files

JSON: 0.002s

{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }


Although the readable format is slower, it's much cleaner for large files

> **Readable Format**: 0.006s
> 
> ```
glossary:
    title: 'example glossary'
    GlossDiv:
        title: 'S'
        GlossList:
            GlossEntry:
                ID: 'SGML'
                SortAs: 'SGML'
                GlossTerm: 'Standard Generalized Markup Language'
                Acronym: 'SGML'
                Abbrev: 'ISO 8879:1986'
                GlossDef:
                    para: 'A meta-markup language, used to create markup languages such as DocBook.'
                    GlossSeeAlso:
                        - 'GML'
                        - 'XML'
                GlossSee: 'markup'

To Do

  • Async functions
  • Support more data types (please suggest)
  • Array store objects/arrays