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

grunt-json2json

v0.1.0

Published

Populate JSON files with properties from other JSON files.

Downloads

1

Readme

grunt-json2json

Populate JSON files with properties from other JSON files.

Getting Started

This plugin requires Grunt ~0.4.5

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-json2json --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-json2json');

The "json2json" task

Overview

In your project's Gruntfile, add a section named json2json to the data object passed into grunt.initConfig().

grunt.initConfig({
  json2json: {
    // Task specific options
    options: {
      indent: '  '        // Destination files will be indented with two white spaces
    },
    // Target specific options
    example_target: {
      src: ['source1.json', 'source2.json'],           // Source JSON files to read properties from.
      dest: ['destination1.json', 'destination2.json'] // Destination JSON files to be updated or created with properties from sources.
      options: {
        updateOnly: true, // Only existing properties in destinations will be populated from sources. No properties will be added.
        pointers: [       // Only properties in the sources pointed by these JSON pointers will populate destinations.
          '/foo',
          '/bar/baz'
        ]
        map: {            // Map properties in the sources to other properties in the destinations.
          '/foo': '/remapped_foo',
          '/bar/baz': '/remapped_barbaz'
        }
      }
    },
  },
});

Options

options.updateOnly

Type: Boolean Default value: false

If true, only properties already existing in the destination files will be populated with values from the source files. Note that if a specified destination doesn't exist, an empty JSON file will be created.

If false, properties that don't exist yet in the destination files will be added.

options.pointers

Type: Array Default value: []

An Array of JSON pointers that define the properties in the sources that will populate the destinations.

Example:

json2json: {
  options {
    pointers: [
      '/foo',
      '/bar'
    ]
  }
}

with source

{
  "foo": "some value",
  "bar": "some other value",
  "baz": "yet another value"
}

will output

{
  "foo": "some value",
  "bar": "some other value"
}

If options.pointers is not defined or empty, by default all the properties from the source files will populate the destination files.

options.map

Type: Object Default value: {}

An Object that defines how JSON pointers in the source files are mapped in the destination files.

Example:

json2json: {
  options {
    map: {
      '/foo': '/remapped_foo',
      '/bar/baz': '/remapped_barbaz'
    }
  }
}

with source file

{
  "foo": "some value",
  "bar": {
    "baz": "some other value"
  }
}

will output

{
  "remapped_foo": "some value",
  "remapped_barbaz": "some other value"
}

options.indent

Type: String|Number Default value: \t

The String or number of white spaces used for indentation in the destination files (see JSON.stringify).

Usage Examples

Populating bower.json and component.json from package.json

If your project uses Bower and/or Component to manage your front-end packages, you might want to keep in synch data from the different configuration files (package.json, bower.json and component.json). If you decide that package.json is the master file where you edit the common data, you can synch bower.json and/or component.json using json2json:

Simple update

This simply synchs all properties with the same name from package.json to bower.json and component.json.

grunt.initConfig({
  json2json: {
    synchConfigs: {
      src: 'package.json',
      dest: ['bower.json', component.json],
      options: {
        updateOnly: true // This assumes that bower.json and component.json are already set up with the needed properties.
      }
    }
  }
});
Targeted update, add missing properties in destinations
grunt.initConfig({
  json2json: {
    synchConfigs: {
      src: 'package.json',
      dest: ['bower.json', component.json],
      options: {
        pointers: [       // This ensures that only those properties will be updated if found in package.json.
          '/name',        // Because updateOnly defaults to false, they will be added to bower.json and component.json if missing.
          '/description',
          '/version',
          '/license',
          '/keywords',
          '/repository'
          '/private'
        ]
      }
    }
  }
});
Targeted update with remapping

This uses two targets to handle the differences in data models between package.json, bower.json and component.json.

grunt.initConfig({
  json2json: {
    options: {
      src: 'package.json'
      pointers: [
          '/name',
          '/description',
          '/version',
          '/license',
          '/keywords',
          '/repository'
          '/private'
      ]
    },
    bower: {
      dest: 'bower.json',
      options: {
        pointers: <%= json2json.options.pointers %>.concat([
          '/author',
          '/contributors',
          '/homepage'
        ]),
        map {
          '/author': '/authors/-',
          '/contributors': '/authors/-'
        }
      }
    },
    component: {
      dest: 'component.json'
    }
  }
});

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.

Release History

(Nothing yet)