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

json5-relaxed

v0.5.4

Published

JSON for the ES5 era.

Downloads

1,122

Readme

JSON5 – JSON for Humans

Build Status

!!This is a fork version of JSON5 for special purpose!!

  • Allow elements of arrays and objects not to have separater ','
  • Allow newlines in strings
  • Do not allow NaN and Infinity
  • Duplicate the same key in an object causes a syntax error

JSON is an excellent data format, but we think it can be better.

JSON5 is a proposed extension to JSON that aims to make it easier for humans to write and maintain by hand. It does this by adding some minimal syntax features directly from ECMAScript 5.

JSON5 remains a strict subset of JavaScript, adds no new data types, and works with all existing JSON content.

JSON5 is not an official successor to JSON, and JSON5 content may not work with existing JSON parsers. For this reason, JSON5 files use a new .json5 extension. (TODO: new MIME type needed too.)

The code here is a reference JavaScript implementation for both Node.js and all browsers. It’s based directly off of Douglas Crockford’s own JSON implementation, and it’s both robust and secure.

Why

JSON isn’t the friendliest to write. Keys need to be quoted, objects and arrays can’t have trailing commas, and comments aren’t allowed — even though none of these are the case with regular JavaScript today.

That was fine when JSON’s goal was to be a great data format, but JSON’s usage has expanded beyond machines. JSON is now used for writing configs, manifests, even tests — all by humans.

There are other formats that are human-friendlier, like YAML, but changing from JSON to a completely different format is undesirable in many cases. JSON5’s aim is to remain close to JSON and JavaScript.

Features

The following is the exact list of additions to JSON’s syntax introduced by JSON5. All of these are optional, and all of these come from ES5.

Objects

  • Object keys can be unquoted if they’re valid identifiers. Yes, even reserved keywords (like default) are valid unquoted keys in ES5 [§11.1.5, §7.6]. (More info)

    (TODO: Unicode characters and escape sequences aren’t yet supported in this implementation.)

  • Object keys can also be single-quoted.

  • Objects can have trailing commas.

Arrays

  • Arrays can have trailing commas.

Strings

  • Strings can be single-quoted.

  • Strings can be split across multiple lines; just prefix each newline with a backslash. [ES5 §7.8.4]

Numbers

  • Numbers can be hexadecimal (base 16).

  • Numbers can begin or end with a (leading or trailing) decimal point.

  • Numbers can include Infinity, -Infinity, NaN, and -NaN.

  • Numbers can begin with an explicit plus sign.

Comments

  • Both inline (single-line) and block (multi-line) comments are allowed.

Example

The following is a contrived example, but it illustrates most of the features:

{
    foo: 'bar',
    while: true,

    this: 'is a \
multi-line string',

    // this is an inline comment
    here: 'is another', // inline comment

    /* this is a block comment
       that continues on another line */

    hex: 0xDEADbeef,
    half: .5,
    delta: +10,
    to: Infinity,   // and beyond!

    finally: 'a trailing comma',
    oh: [
        "we shouldn't forget",
        'arrays can have',
        'trailing commas too',
    ],
}

This implementation’s own package.json5 is more realistic:

// This file is written in JSON5 syntax, naturally, but npm needs a regular
// JSON file, so compile via `npm run build`. Be sure to keep both in sync!

{
    name: 'json5',
    version: '0.5.0',
    description: 'JSON for the ES5 era.',
    keywords: ['json', 'es5'],
    author: 'Aseem Kishore <[email protected]>',
    contributors: [
        // TODO: Should we remove this section in favor of GitHub's list?
        // https://github.com/json5/json5/contributors
        'Max Nanasy <[email protected]>',
        'Andrew Eisenberg <[email protected]>',
        'Jordan Tucker <[email protected]>',
    ],
    main: 'lib/json5.js',
    bin: 'lib/cli.js',
    files: ["lib/"],
    dependencies: {},
    devDependencies: {
        gulp: "^3.9.1",
        'gulp-jshint': "^2.0.0",
        jshint: "^2.9.1",
        'jshint-stylish': "^2.1.0",
        mocha: "^2.4.5"
    },
    scripts: {
        build: 'node ./lib/cli.js -c package.json5',
        test: 'mocha --ui exports --reporter spec',
            // TODO: Would it be better to define these in a mocha.opts file?
    },
    homepage: 'http://json5.org/',
    license: 'MIT',
    repository: {
        type: 'git',
        url: 'https://github.com/json5/json5',
    },
}

Community

Join the Google Group if you’re interested in JSON5 news, updates, and general discussion. Don’t worry, it’s very low-traffic.

The GitHub wiki is a good place to track JSON5 support and usage. Contribute freely there!

GitHub Issues is the place to formally propose feature requests and report bugs. Questions and general feedback are better directed at the Google Group.

Usage

This JavaScript implementation of JSON5 simply provides a JSON5 object just like the native ES5 JSON object.

To use from Node:

npm install json5
var JSON5 = require('json5');

To use in the browser (adds the JSON5 object to the global namespace):

<script src="json5.js"></script>

Then in both cases, you can simply replace native JSON calls with JSON5:

var obj = JSON5.parse('{unquoted:"key",trailing:"comma",}');
var str = JSON5.stringify(obj);

JSON5.parse supports all of the JSON5 features listed above (TODO: except Unicode), as well as the native reviver argument.

JSON5.stringify mainly avoids quoting keys where possible, but we hope to keep expanding it in the future (e.g. to also output trailing commas). It supports the native replacer and space arguments, as well. (TODO: Any implemented toJSON methods aren’t used today.)

Extras

If you’re running this on Node, you can also register a JSON5 require() hook to let you require() .json5 files just like you can .json files:

require('json5/lib/require');
require('./path/to/foo');   // tries foo.json5 after foo.js, foo.json, etc.
require('./path/to/bar.json5');

This module also provides a json5 executable (requires Node) for converting JSON5 files to JSON:

json5 -c path/to/foo.json5    # generates path/to/foo.json

Development

git clone https://github.com/json5/json5
cd json5
npm install
npm test

As the package.json5 file states, be sure to run npm run build on changes to package.json5, since npm requires package.json.

Feel free to file issues and submit pull requests — contributions are welcome. If you do submit a pull request, please be sure to add or update the tests, and ensure that npm test continues to pass.

License

MIT. See LICENSE.md for details.

Credits

Aseem Kishore started this project. He got a lot of flak for it (including this gem).

Michael Bolin independently arrived at and published some of these same ideas with awesome explanations and detail. Recommended reading: Suggested Improvements to JSON

Douglas Crockford of course designed and built JSON, but his state machine diagrams on the JSON website, as cheesy as it may sound, gave me motivation and confidence that building a new parser to implement these ideas this was within my reach! This code is also modeled directly off of Doug’s open-source json_parse.js parser. I’m super grateful for that clean and well-documented code.

Max Nanasy has been an early and prolific supporter, contributing multiple patches and ideas. Thanks Max!

Andrew Eisenberg has contributed the stringify method.

Jordan Tucker has aligned JSON5 more closely with ES5 and is actively maintaining this project.