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.
npm install -D package-extract
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"
}
}
import {homepage, name, version} from './package.js';
// 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';
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/peggy@4.0.3/browser/peggy.min.js">minified</a>
would
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
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']);
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.