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

package-extract

v2.3.0

Published

Extract fields from package.json into an ES6 module

Downloads

259

Readme

package-extract

Let's say you would like to extract multiple values from your package.json file into an ES6 module that you can easily import. You might want access to the version, the package name, the homepage URL, etc.

You could use import.meta.url to find the file, read it, JSON parse it, and extract the needed bits. Now you'd like to use your code from the web, and all of that falls apart. Not only do you have to bundle the whole package.json file, exposing information that you might not want to make available to web users, but you also have to figure out how to get the readFile bits to do the right thing.

Instead, use package-extract.

Install

npm install -D package-extract

Run

npx package-extract -o lib/package.js name version homepage

Note that you can extract fields that have structure, like scripts.

It is most convenient to run this script when you run npm version. To do so, add this to your package.json:

{
  "scripts": {
    "version": "package-extract && git add package.js"
  }
}

Use

import {homepage, name, version} from './package.js';

Example output

// Generated by package-extract v0.0.0
// Do not modify by hand.

export const name = 'package-extract';
export const version = '0.0.0';
export const homepage = 'https://github.com/hildjj/package-extract';

Modifying files with a regular expression

Sometimes, version information is embedded in a file that package-extract did not create. In these instances, you can use --regex, with a regex that specifies what to change. In the regex, leave a named capturing group whose name is the package.json field you want to insert at the given point. It can be useful to use look-behind and look-ahead assertions to ensure that you do not match anything other than the field you intend to replace. For instance:

package-extract -o docs/index.html -r '(?<=https:\/\/unpkg.com\/peggy@)(?<version>\d+\.\d+\.\d+)(?=\/browser\/peggy\.min\.js)'

would update this snippet with the current version number:

<a title="Download a minified version of Peggy for the browser"
  href="https://unpkg.com/[email protected]/browser/peggy.min.js">minified</a>

would

Command line options

Usage: package-extract [options] [fields...]

Arguments:
  fields                   fields to extract from package file (default:
                           ["version"])

Options:
  -c, --commonJS           create a commonJS file instead of ESM
  -d, --double             use double quotes
  -i, --indent <number>    number of spaces to indent. -1 for tab. 0 for no
                           newlines. (default: 2)
  -o, --output <filename>  name of output file, relative to package.json.  Use
                           "-" for stdout. (default: "package.js")
  -p, --package            package file to extract from, found from cwd,
                           searching up
  -r, --regex <regex>      Regular expression to replace instead of
                           regenerating output.  Regex should have named
                           matching group to replace, where the matching group
                           name is the desired field
  -s, --semi               add semicolons to the end of each variable
  --startDir <dir>         start looking from this directory, toward the root
                           (default: "/Users/hildjj/track/package-extract")
  -t, --trailing           Add trailing commas
  -V, --version            output the version number
  -h, --help               display help for command

API

import {packageExtract} from 'package-extract';

// All options are optional, have the same defaults as the CLI.
await packageExtract({
  double: false,
  indent: 2,
  output: 'package.js',
  package: 'package.json',
  semi: false,
  startDir: process.cwd(),
  trailing: false,
}, ['version', 'name']);

Other tools

Why not use?

  • genversion: Doesn't extract fields other than version.
  • package-json-versionify: Doesn't extract fields other than version, only works in a browserify setup. Doesn't support ES6.
  • browserify-versionify: Doesn't extract fields other than version, only works in a browserify setup.

Tests codecov