Tools to validate package.json files.
npm install package-json-validatorimport { validate } from "package-json-validator";
validate(/* ... */);For tools that run these validations, see:
- eslint-plugin-package-json: to detect all violations and keep them warned against via ESLint
- package-json-validator-cli: if you want just a one-shot tool to run in the CLI
Following are the types involved in the return type of our granular validate* functions.
The Result type, is the common top-level return type for all of our granular validate* functions.
It provides rich information about the nature of the issues encountered as part of validating.
For complex objects like exports, its tree structure can give information on which parts of the structure have issues.
The full collection of error messages (including errors from child element).
This consists of the Issue.message for all of the items in this Result's issues, as well as the messages of all descendent issues.
Collection of issues for this object (property or array element).
Collection of result objects for child elements (either properties or array elements), if this property is an object or array.
Result object for a child (either a property in an object or an element of an array).
The index of this property in relation to its parent's collection (properties or array elements).
The message with information about this issue.
This function validates an entire package.json and returns a list of errors, if
any violations are found.
datapackageData object or a JSON-stringified version of the package data.optionsis an object with the following:interface Options { recommendations?: boolean; // show recommendations warnings?: boolean; // show warnings }
Example using an object:
import { validate } from "package-json-validator";
const packageData = {
name: "my-package",
version: "1.2.3",
};
validate(packageData);Example using a string:
import { validate } from "package-json-validator";
const text = JSON.stringify({
name: "packageJsonValidator",
version: "0.1.0",
private: true,
dependencies: {
"date-fns": "^2.29.3",
install: "^0.13.0",
react: "^18.2.0",
"react-chartjs-2": "^5.0.1",
"react-dom": "^18.2.0",
"react-material-ui-carousel": "^3.4.2",
"react-multi-carousel": "^2.8.2",
"react-redux": "^8.0.5",
"react-router-dom": "^6.4.3",
"react-scripts": "5.0.1",
redux: "^4.2.0",
"styled-components": "^5.3.6",
"web-vitals": "^2.1.4",
},
scripts: {
start: "react-scripts start",
},
eslintConfig: {
extends: ["react-app", "react-app/jest"],
},
browserslist: {
production: [">0.2%", "not dead", "not op_mini all"],
development: [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
],
},
});
const data = validate(text);Output for above example:
console.log(data);
// {
// valid: true,
// warnings: [
// 'Missing recommended field: description',
// 'Missing recommended field: keywords',
// 'Missing recommended field: bugs',
// 'Missing recommended field: licenses',
// 'Missing recommended field: author',
// 'Missing recommended field: contributors',
// 'Missing recommended field: repository'
// ],
// recommendations: [
// 'Missing optional field: homepage',
// 'Missing optional field: engines'
// ]
// }This function validates the value of the author property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is either a string or an object
- if it's an object, it should include a
namefield and, optionally,emailand / orurlfields. - if present, the
emailandurlfields should be valid email and url, respectively.
It returns a Result object (See Result Types).
import { validateAuthor } from "package-json-validator";
const packageData = {
author: {
email: "b@rubble.com",
name: "Barney Rubble",
url: "http://barnyrubble.tumblr.com/",
},
};
const errors = validateAuthor(packageData.author);import { validateAuthor } from "package-json-validator";
const packageData = {
author: "Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)",
};
const errors = validateAuthor(packageData.author);This function validates the value of the bin property of a package.json.
It takes the value, and validates it against the following criteria.
- It should be of type
stringorobject. - If it's a
string, it should be a relative path to an executable file. - If it's an
object, it should be a key to string value object, and the values should all be relative paths.
It returns a list of error messages, if any violations are found.
import { validateBin } from "package-json-validator";
const packageData = {
bin: "./my-cli.js",
};
const errors = validateBin(packageData.bin);import { validateBin } from "package-json-validator";
const packageData = {
bin: {
"my-cli": "./my-cli.js",
"my-dev-cli": "./dev/my-cli.js",
},
};
const errors = validateBin(packageData.bin);This function validates the value of the bundleDependencies property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is either an array or a boolean
- if it's an array, all items should be strings
It returns a list of error messages, if any violations are found.
import { validateBundleDependencies } from "package-json-validator";
const packageData = {
bundleDependencies: ["renderized", "super-streams"],
};
const errors = validateBundleDependencies(packageData.bundleDependencies);This function validates the value of the config property of a package.json.
It takes the value, and validates that it's an object.
It returns a list of error messages, if a violation is found.
import { validateConfig } from "package-json-validator";
const packageData = {
config: {
debug: true,
host: "localhost",
port: 8080,
},
};
const errors = validateScripts(packageData.config);This function validates the value of the cpu property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is an array
- all items in the array should be non-empty strings
It returns a list of error messages, if any violations are found.
import { validateCpu } from "package-json-validator";
const packageData = {
cpu: ["x64", "ia32"],
};
const errors = validateCpu(packageData.cpu);Also: validateDevDependencies(value), validateOptionalDependencies(value), and validatePeerDependencies(value)
These functions validate the value of their respective dependency property.
They take the value, and validate it against the following criteria.
- It should be of type an
object. - The object should be a record of key value pairs
- For each property, the key should be a valid package name, and the value should be a valid version
It returns a list of error messages, if any violations are found.
import { validateDependencies } from "package-json-validator";
const packageData = {
dependencies: {
"@catalog/package": "catalog:",
"@my/package": "^1.2.3",
"@workspace/package": "workspace:^",
},
};
const errors = validateBin(packageData.dependencies);This function validates the value of the description property of a package.json.
It checks that the value is a non-empty string, and returns a list of error messages, if a violation is found.
import { validateDescription } from "package-json-validator";
const packageData = {
description: "The Fragile",
};
const errors = validateDescription(packageData.description);This function validates the value of the directories property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is an object
- its keys are non-empty strings
- its values are all non-empty strings
It returns a list of error messages, if any violations are found.
import { validateDirectories } from "package-json-validator";
const packageData = {
directories: {
bin: "dist/bin",
man: "docs",
},
};
const errors = validateDirectories(packageData.directories);This function validates the value of the exports property of a package.json.
It takes the value, and validates it against the following criteria.
- It should be of type
stringorobject. - If it's a
string, it should be a path to an entry point. - If it's an export condition
object, its properties should have values that are either a path to an entry point, or another exports condition object.
It returns a list of error messages, if any violations are found.
import { validateExports } from "package-json-validator";
const packageData = {
exports: "./index.js",
};
const errors = validateExports(packageData.exports);/* eslint-disable perfectionist/sort-objects */
import { validateExports } from "package-json-validator";
const packageData = {
exports: {
".": {
types: "./index.d.ts",
default: "./index.js",
},
"./secondary": {
types: "./secondary.d.ts",
default: "./secondary.js",
},
},
};
const errors = validateExports(packageData.exports);
/* eslint-enable perfectionist/sort-objects */This function validates the value of the license property of a package.json.
It takes the value, and validates it using validate-npm-package-license, which is the same package that npm uses.
It returns a list of error messages, if a violation is found.
import { validateLicense } from "package-json-validator";
const packageData = {
license: "MIT",
};
const errors = validateLicense(packageData.license);This function validates the value of the scripts property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is an object
- its keys are non-empty strings
- its values are all non-empty strings
It returns a list of error messages, if any violations are found.
import { validateScripts } from "package-json-validator";
const packageData = {
scripts: {
build: "rollup -c",
lint: "eslint .",
test: "vitest",
},
};
const errors = validateScripts(packageData.scripts);This function validates the value of the type property of a package.json.
It takes the value, and validates it against the following criteria.
- the property is a string
- its value is either
'commonjs'or'module'
It returns an error message, if a violation is found.
import { validateType } from "package-json-validator";
const packageData = {
type: "module",
};
const errors = validateType(packageData.type);This function validates the value of the version property of a package.json.
It takes the value, and validates it using semver, which is the same package that npm uses.
It returns a list of error messages, if a violation is found.
import { validateVersion } from "package-json-validator";
const packageData = {
version: "1.2.3",
};
const errors = validateVersion(packageData.version);This package uses the npm spec along with additional supporting documentation from node, as its source of truth for validation.
We never want to remove things, when we're building them! But the reality is that libraries evolve and deprecations are a fact of life. Following are the different timeframes that we've defined as it relates to deprecating APIs in this project.
When some aspect of our API is going to be deprecated (and eventually removed), it must initially go through an RFC phase. Whoever's motivating the removal of the api, should create an RFC issue explaining the proposal and inviting feedback from the community. That RFC should remain active for at least 6 weeks. The RFC text should make clear what the target date is for closing the RFC. Once the RFC period is over, if the removal is still moving forward, the API(s) should be officially deprecated.
Once an API has been marked as deprecated, it will remain intact for at least 6 months. After 6 months from the date of deprecation, the API is subject to removal.
See .github/CONTRIBUTING.md, then .github/DEVELOPMENT.md.
Thanks! π
Many thanks to @TechNickAI for creating the initial version and core infrastructure of this package! π
π This package was templated with
create-typescript-appusing the Bingo framework.