aboutsummaryrefslogtreecommitdiff

Npm4nix

Npm4nix converts Node.js packages into a single Nix build expression for the Npm.nix project. Npm4nix is inspired by Cabal2nix. Unfortunately, npm2nix is already taken :) Thus, npm4nix. It supports local directories and tarballs (e. g. *.tgz), remote tarballs, remote Git repositories.

Requirements

Npm4nix is written in JavaScript with minimum number of dependencies and should be executed by Node.js. Npm4nix invokes curl, Git, GNU Tar, and nix-hash, so these tools should be installed.

Example

$ node cmd/main.js https://github.com/substack/node-mkdirp.git > mkdirp.nix
executing git clone 'https://github.com/substack/node-mkdirp.git' '/tmp/npm4nix-Feo4WM'
Cloning into '/tmp/npm4nix-Feo4WM'...
executing git -C '/tmp/npm4nix-Feo4WM' rev-parse HEAD
executing nix-hash --base32 --type sha256 '/tmp/npm4nix-Feo4WM'

$ cat mkdirp.nix
{ fetchgit, buildNpmPackage, minimist, mock-fs, tap }:

buildNpmPackage {
  pname = "mkdirp";
  version = "0.5.1";
  src = fetchgit {
    url = "https://github.com/substack/node-mkdirp.git";
    rev = "f2003bbcffa80f8c9744579fabab1212fc84545a";
    sha256 = "0qc3l6571aknhlmzcyaah3plmf852cl160jihy3l4b05j25qv45a";
  };

  meta = {
    description = "Recursively mkdir, like `mkdir -p`";
    homepage = "";
    license = "MIT";
  };

  npmInputs = [
    minimist mock-fs tap
  ];
}
$ node cmd/main.js https://github.com/cowboy/javascript-sync-async-foreach/archive/v0.1.3.tar.gz > async-foreach.nix
executing curl -LsSf -o '/tmp/npm4nix-zwGeOX/v0.1.3.tar.gz' 'https://github.com/cowboy/javascript-sync-async-foreach/archive/v0.1.3.tar.gz'
executing nix-hash --flat --base32 --type sha256 '/tmp/npm4nix-zwGeOX/v0.1.3.tar.gz'
executing tar -xOf '/tmp/npm4nix-zwGeOX/v0.1.3.tar.gz' --wildcards '*/package.json'

$ cat async-foreach.nix
{ fetchurl, buildNpmPackage }:

buildNpmPackage {
  pname = "async-foreach";
  version = "0.1.3";
  src = fetchurl {
    url = "https://github.com/cowboy/javascript-sync-async-foreach/archive/v0.1.3.tar.gz";
    sha256 = "1b7h2fgj6rndkviyx1hl0mh72d60a2b2f1sl86ndk8vdvr6mxmj3";
  };

  meta = {
    description = "An optionally-asynchronous forEach with an interesting interface.";
    homepage = "http://github.com/cowboy/javascript-sync-async-foreach";
    license = "";
  };

  npmInputs = [

  ];
}