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

conv

v0.4.1

Published

Represent JS datatypes as JSON values, serialize to and restore from any format

Downloads

22

Readme

Conv Coverage Status Build Status

Represent JS datatypes as JSON values, serialize to and restore from any format.

Features

  • Simple and readable way to serialize JS Date, RegExp, Buffer and ES6 types.
  • Define converters for your own types.
  • Use JSON, BSON, YAML or any format you want.
  • Converters composition with consistency checks included.
  • Performance optimized, no dependencies.

Basic usage

conv.parse('{"$Buffer":"Aw4P"}'); // returns <Buffer 03 0e 0f>

console.log(conv.serialize(new Date, null, 4));
/* arguments are passed to JSON.stringify, so it prints:
{
    "$Date": "2015-06-07T12:34:56.789Z"
}
*/

Following types are supported:

  • Date,
  • Buffer,
  • ES6 Map,
  • ES6 Set.

Last three are enabled only when found in the environment. For example, in node v0.10 only Date and Buffer will be enabled, and in Chrome v41 you will get all but Buffer.

Adding your types

To add a new class you must provide a spec - an object that describes rules for dumping a value in JSON values and restoring it back. There is a working spec for Date:

var spec = {
    class: Date,
    dump: (date) => date.toJSON(),
    restore: (str) => new Date(str)
};

Dump and restore method are optional. So there is a minimal working spec for Date class:

var spec = {class: Date};

Make new extended converter using the spec:

var conv = conv.extendWith([{class: Date}]);

When you are defining converters for domain-specific types, use namespaces. There is a more elaborate example:

class User {
    constructor(data) {
        this.id = data.id;
        this.name = data.name;
    }
    toJSON() {
        return {id: this.id, name: this.name};
    }
    // ...
}

var conv = conv.extendWith([{
    class: User,
    namespace: 'mycompany'
    // user.toJSON() as dump() will be used by default
    // new User(dumped) as restore() will be used by default
}]);

var user = new User({id: 13, name: "John"});

console.log(conv.serialize(user, null, 4))
/* prints:
{
    "$mycompany.User": {
        "id": 12
        "name": "John"
    }
}
*/

There are three kinds of specs: class, proto and predicate specs. See documentation for more info.

Gotchas

  • In dump method don't wrap the result in {$Constructor: result}, Conv will do that for you.
  • Do not transform properties of the dumped value, Conv will do that recursively after calling spec.dump() on source value. Dump works from top to bottom.
  • Restore works in the opposite direction: when dumped object is passed to spec.restore(), it's properties are already restored.
  • Check your spec: in almost all cases val should be equal spec.restore(spec.dump(val)), as well as dumped shold be equal spec.dump(spec.restore(dumped)).

Documentation

See the wiki for documentation and conv-immutable for more examples.