Like read-package-json, but faster and more accepting of "missing" data.
This is only suitable for reading package.json files in a node_modules tree, since it doesn't do the various cleanups, normalization, and warnings that are beneficial at the root level in a package being published.
const rpj = require('read-package-json-fast') // typical promisey type API rpj('/path/to/package.json') .then(data => ...) .catch(er => ...) // or just normalize a package manifest const normalized = rpj.normalize(packageJsonObject)Errors raised from parsing will use json-parse-even-better-errors, so they'll be of type JSONParseError and have a code: 'EJSONPARSE' property. Errors will also always have a path member referring to the path originally passed into the function.
To preserve indentation when the file is saved back to disk, use data[Symbol.for('indent')] as the third argument to JSON.stringify, and if you want to preserve windows \r\n newlines, replace the \n chars in the string with data[Symbol.for('newline')].
For example:
const data = await readPackageJsonFast('./package.json') const indent = Symbol.for('indent') const newline = Symbol.for('newline') // .. do some stuff to the data .. const string = JSON.stringify(data, null, data[indent]) + '\n' const eolFixed = data[newline] === '\n' ? string : string.replace(/\n/g, data[newline]) await writeFile('./package.json', eolFixed)Indentation is determined by looking at the whitespace between the initial { and the first " that follows it. If you have lots of weird inconsistent indentation, then it won't track that or give you any way to preserve it. Whether this is a bug or a feature is debatable ;)
- Parse JSON
- Normalize
bundledDependencies/bundleDependenciesnaming to justbundleDependencies(without the extrad) - Handle
true,false, or object values passed tobundleDependencies - Normalize
funding: <string>tofunding: { url: <string> } - Remove any
scriptsmembers that are not a string value. - Normalize a string
binmember to{ [name]: bin }. - Fold
optionalDependenciesintodependencies. - Set the
_idproperty if name and version are set. (This is load-bearing in a few places within the npm CLI.)
- Warn about invalid/missing name, version, repository, etc.
- Extract a description from the
README.mdfile, or attach the readme to the parsed data object. - Read the
HEADvalue out of the.gitfolder. - Warn about potentially typo'ed scripts (eg,
tsetinstead oftest) - Check to make sure that all the files in the
filesfield exist and are valid files. - Fix bundleDependencies that are not listed in
dependencies. - Fix
dependenciesfields that are not strictly objects of string values. - Anything involving the
directoriesfield (ie, bins, mans, and so on).