Skip to content

Getting Started

@maastrich/hashup resolves every import reachable from a given entry file and produces a deterministic SHA-256 hash of their combined content. Use it when you need a stable fingerprint for a module graph — cache keys, build invalidation, content addressing, or change detection.

Installation

bash
pnpm add @maastrich/hashup
bash
npm install @maastrich/hashup
bash
yarn add @maastrich/hashup

Requirements

  • Node.js >= 18
  • ESM-only package

Quick Example

ts
import { hashup } from "@maastrich/hashup";

const { hash, files } = await hashup("./src/index.ts");

console.log(hash); // "48adf62a70c2645d0fc15ee3060973245af5dc30a542372791a7e1f05eaeacf6"
console.log(files.length); // number of resolved files

The returned hash is stable across runs as long as the underlying file contents and the resolved graph do not change.

Including Extra Files

If you want the hash to change when files outside the import graph change (e.g. package.json, a config file), pass them via extras:

ts
const result = await hashup("./src/index.ts", {
  extras: ["./package.json", "./tsconfig.json"],
});

See the Usage guide for more patterns, and the API reference for the full signature.

CLI

The package also ships a hashup binary. With no arguments it reads a hashup.json config from the current directory and prints one hash per named entry:

json
// hashup.json
{
  "baseDir": ".",
  "entries": {
    "app": { "entry": "src/index.ts", "extras": ["package.json"] },
    "worker": { "entry": "src/worker.ts" }
  }
}
bash
$ hashup
app     48adf62a70c2645d0fc15ee3060973245af5dc30a542372791a7e1f05eaeacf6
worker  0c4b8d9f…

$ hashup --json          # machine-readable output
$ hashup --json --files  # include the resolved file list
$ hashup src/index.ts    # one-off, skip the config file
$ hashup -c build.hashup.json

Flags: -c/--config <path>, -b/--base-dir <dir>, -e/--extra <file> (single-file mode, repeatable), --json, --files, -h/--help. An entry's baseDir overrides the top-level one; otherwise paths resolve relative to the config file's directory.

Released under the MIT License.