yarn2nix: Convert yarn.lock files to nix expressions

[ distribution, library, mit, nix, program ] [ Propose Tags ]

Convert yarn.lock files to nix expressions. See yarn2nix executable. Contains a nix library to call the generated nix files in nix-lib/. Library functions and module names might be restructured in the future.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.5.0, 0.7.0, 0.8.0, 0.10.1
Dependencies aeson (>=2.0), aeson-better-errors (>=0.9.1.1), async-pool (>=0.9 && <0.10), base (>=4 && <5), bytestring (>=0.10 && <0.11), containers (>=0.5 && <0.7), data-fix (>=0.0.7 && <0.4), directory (>=1.3 && <1.4), filepath (>=1.4 && <1.5), hnix (>=0.6 && <0.15), mtl (>=2.2 && <2.3), optparse-applicative (>=0.16 && <0.17), prettyprinter (>=1.2 && <1.8), process (>=1.4), protolude (>=0.3 && <0.4), regex-tdfa (>=1.3 && <1.4), scientific (>0.3.3.0 && <0.4), stm (>2.4.0 && <2.6.0.0), text (>=1.2 && <1.3), transformers (>=0.5 && <0.6), unix (>=2.7 && <2.8), unordered-containers (>=0.2 && <0.3), yarn-lock (>=0.6 && <0.7), yarn2nix [details]
License MIT
Author Profpatsch
Maintainer mail@profpatsch.de
Category Distribution, Nix
Home page https://github.com/Profpatsch/yarn2nix#readme
Bug tracker https://github.com/Profpatsch/yarn2nix/issues
Source repo head: git clone https://github.com/Profpatsch/yarn2nix
Uploaded by Profpatsch at 2022-03-28T17:22:46Z
Distributions
Executables yarn2nix, node-package-tool
Downloads 1792 total (22 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-03-28 [all 1 reports]

Readme for yarn2nix-0.10.1

[back to package description]

ATTENTION: You are not looking at the yarn2nix as packaged in nixpkgs. This is an alternative implementation, with different tradeoffs. For an overview of the history of these tools and current options, see this nixpkgs issue.

I currently don’t have much time to maintain this project, it should work for some cases, but has not been “battle-tested” very much.

yarn2nix

yarn2nix [--offline] [path/to/yarn.lock]

  Convert a `yarn.lock` into a synonymous nix expression.
  If no path is given, search for `./yarn.lock`.
  If --offline is given, abort if figuring out a hash
  requires network access.

yarn2nix --template [path/to/package.json]

  Generate a package template nix-expression for your `package.json`.

Features

  • Purely transform yarn.lock files into very minimal, line-diffable nix expressions.
  • Nix is used to its fullest. Every package is a derivation, whole dependency subtrees are shared in an optimal way, even between projects.
  • The ability to resolve git dependencies by prefetching their repos and including the hashes.
  • Completely local transformation if there are no git dependencies (can be used inside nix-build, no large file check-in).
  • Extremely fast.
  • Nice code that can be easily extended, new repositories introduced, adapt to new versions of the yarn.lock format.
  • Comes with a nix library that uses the power of overlays to make overriding dependencies possible.
  • POWERED BY HNIX™ since before it was cool.

Probably a few more.

Example Output

The CodiMD server is an elaborate npm package with hundreds of dependencies. yarn2nix flawlessly parses the current (2020-07) yarn.lock file distributed with the project, including resolving their manual git forks of multiple npm packages:

$ yarn2nix ~/tmp/server/yarn.lock | wc
   7320   22701  399111
$ wc ~/tmp/server/yarn.lock
 11938  18615 500078 /home/lukas/tmp/server/yarn.lock

The output of this conversion can be seen here. Also note that git dependencies are resolved correctly.

Pushing it through the provided library of nix functions, we get a complete build of CodiMD's dependencies, using the project template (generated with --template), we also build the CodiMD server. Included executables will be in node_modules/.bin as expected and correctly link to their respective library paths in the nix store, for example:

$ /nix/store/zs9jk7yhdxsasn26m0903fq89cmyllzv-CodiMD-1.6.0/node_modules/.bin/markdown-it -v
10.0.0
$ readlink /nix/store/zs9jk7yhdxsasn26m0903fq89cmyllzv-CodiMD-1.6.0/node_modules/.bin/markdown-it
/nix/store/bgas2l5izznq1b61a3jyf3gpb73x8chn-markdown-it-10.0.0/bin/markdown-it.js

Building yarn2nix

$ nix-build
$ result/bin/yarn2nix

Using the generated nix files to build a project

Note: This is a temporary interface. Ideally, the library will be in nixpkgs and yarn2nix will be callable from inside the build (so the resulting nix files don’t have to be checked in).

Once you have the yarn2nix binary, use it to generate nix files for the yarn.lock file and the package.json:

$ yarn2nix ./jsprotect/yarn.lock > npm-deps.nix
$ yarn2nix --template ./jsproject/package.json > npm-package.nix

Then use the library to assemble the generated files in a default.nix:

let
  pkgs = import <nixpkgs> {};
  yarn2nix = import /path/to/yarn2nix {};
  nixLib = yarn2nix.nixLib;

in
  nixLib.buildNodePackage
    ( { src = nixLib.removePrefixes [ "node_modules" ] ./.; } //
      nixLib.callTemplate ./npm-package.nix
        (nixLib.buildNodeDeps (pkgs.callPackage ./npm-deps.nix {})))

Finally, run nix-build, and voilà, in ./result/ you find the project with all its dependencies correctly linked to their corresponding node_modules folder, recursively.

Using private package repository

Since yarn2nix uses standard fetchurl to download packages, it is possible to authenticate by overriding fetchurl to use the access credentials in /etc/nix/netrc.

Refer to the Enterprise NixOS Wiki article for instructions.

Development

$ nix-shell
nix-shell> ninja
nix-shell> cabal build yarn2nix