Introducing Publish-Diff

@ryan_roemer

Safer, more predictable npm publishing with publish-diff

Publishing JavaScript projects to the npm registry is an exercise that, while commonplace, is often opaque to developers and fraught with peril.

The opacity comes from projects frequently publishing built files that are omitted from git source and the some subtle but important differences between git source and a final npm registry package. (For instance, if a project has a .gitignore file, but no .npmignore file, .gitignore will be renamed to .npmignore on publication.) Moreover, developers can accidentally change files in a locally checked out repository that are successfully published to npm in the incorrect mutated state.

Tools like the wonderful np can help give some assurances by checking various pre-publication pitfalls. But, even then, some errors that cannot be easily discovered beforehand can still slip by into publication.

Until now. publish-diff is a simple tool that produces a prepublication text diff of what is about to be published with what is currently published in the npm registry.

Developers are already very familiar with running a git diff before committing changes to a git source repository. It is thus a natural extension to the land of npm publication to check a diff between the last publication and the proposed new one before taking any permanent action.

Getting started

Installing publish-diff is as simple as:

$ npm install -g publish-diff

The help (-h) gives us a basic rundown of usage options and examples:

  Usage: publish-diff [options]

  Preview npm publish changes.

  Options:

    -h, --help           output usage information
    -V, --version        output the version number
    -o, --old <package>  Old package to diff (default `<package>@latest`)
    -n, --new <package>  New package to diff (default `process.cwd()`)
    --no-colors          Disable colors in the outputted diff

  Examples:

    # Compare (old) npm registry `latest` version vs. (new) local `process.cwd()`
    $ publish-diff

    # Compare (old) npm version vs. (new) latest npm version
    $ publish-diff -o rowdy@0.4.0 -n rowdy@latest

    # Compare (old) git tag/hash vs. (new) git tag/hash
    $ publish-diff -o FormidableLabs/rowdy#v0.4.0 -n FormidableLabs/rowdy#v0.5.0

Let’s diff some releases

The most common expected use case is a local source repository checkout that is ready for publication to the npm registry. Running

$ publish-diff

checks the local project against the latest npm registry package to produce a diff analogous to what will happen when a developer finally types npm publish.

Under the hood, publish-diff relies on the quite flexible npm pack command, which opens up a lot of possibilities for diffing versions of local and/or remote packages via:

  • local file (/PATH/TO/my-project)
  • npm registry tag (my-project@beta) / version (my-project@1.2.3)
  • git tag (GitHubOrg/my-project#v1.2.3) / hash (GitHubOrg/my-project#fe25a22)

In this manner, we can easily audit previous publications to the npm registry or git tagged source. For example, let’s see the diff for the v0.4.0 vs. v0.5.0 release of rowdy (a functional test wrapper):

$ publish-diff -o rowdy@0.4.0 -n rowdy@0.5.0

which gives us:

rowdy-diff

From here, there are lots of other comparison options:

# Diff git tag/hash vs. latest on npm registry
$ publish-diff -o FormidableLabs/rowdy#v0.4.0  -n rowdy
$ publish-diff -o FormidableLabs/rowdy#504735c -n rowdy@latest
$ publish-diff -o FormidableLabs/rowdy#v0.4.0  -n rowdy@latest

# Diff two old versions from git tag/hash
$ publish-diff -o FormidableLabs/rowdy#v0.4.0  -n FormidableLabs/rowdy#v0.5.0
$ publish-diff -o FormidableLabs/rowdy#504735c -n FormidableLabs/rowdy#fe25a22

The ability to diff past published versions is not only useful for package maintainers, but for consuming projects as well. For example, when deciding whether or not to upgrade a given library dependency to a specific version, a developer can now get a very accurate picture of how the code in that dependency will change upon upgrade.

Publish with confidence

With this brief tour under our belt, publish-diff offers a simple means to diff your packages right before publication to ensure everything is correct. The project is available at https://github.com/FormidableLabs/publish-diff and we welcome any comments, issues, and feature requests.

Happy diffing!


We Are Formidable

Formidable is a Seattle-based consultancy and open source shop, with an emphasis on Node.js and React.js. We deploy a mixture of consulting, staff augmentation, and training to level up teams and solve engineering problems. Whether it’s transitioning walmart.com to React, moving speedtest.net off Flash, or helping a startup build and scale an MVP, we’re ready to help teams of any size.

Interested in hiring or working for us? Get in touch or view our careers page.