Verify published packages against their source code.
npx npm-verified <package-name-with-optional-version-to-verify>
Examples:
npx npm-verified npm-verified@latest
npx npm-verified react
- Downloads and extracts the requested package archive from https://registry.npmjs.org with
download-npm-package
. - Clones the source code repository specified in the downloaded package's
package.json
repository
field withgit clone --branch <version-tag>
where<version-tag>
is eithervX.Y.Z
orX.Y.Z
(both are attempted). If none of the tags are found, themaster
branch is cloned. - Finds in the cloned source code repository the package root directory where a
package.json
with the requested package name is located. - Installs the dependencies there via
yarn
ornpm install
. - Runs
npm pack
there to prepare the package archive that is supposed to be uploaded to thenpm
registry. - Extracts the package archive created from the source code.
- Compares the files from the downloaded archive with the files from the prepared archive.
- Prints the mismatching parts as a human-readable diff, sets the process exit code to
0
if the files are the same, to1
if the files are different.
- The
package.json
with the package name must exist in the source code repository. - The
package.json
in the published package must contain the link to the source code repository. - The repository must have a tag corresponding to the published package version, either
vX.Y.Z
orX.Y.Z
, or themaster
branch must have the published version. - Currently, only
git
repositories are supported. - Currently, the
node
,yarn
, andnpm
applications to prepare the package from the source code are obtained from the environment, not from the source code. - Currently, the tool uses
find
command from the environment (should be re-implemented in JavaScript to be fully cross-platform).
- Package verification as a service.
- README badge.
- CI integration.
- Has to use the same
node
,yarn
, andnpm
versions that the repository maintainers use to prepare packages. - Has to scale: package build processes eat CPU.
- More human-readable stats diff (missing, extra files).
- Machine-readable output (for integrations).
- @davidgilbertson for sharing the ideas on the security of the public
npm
registry and package publishing process. - @mzhurovich for talking me into actually implementing this tool.
- @npm for the largest package registry in the world.