All Projects → nix-community → napalm

nix-community / napalm

Licence: other
Support for building npm packages in Nix and lightweight npm registry [maintainer @nmattia]

Programming Languages

Nix
1067 projects
haskell
3896 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to napalm

makes
A DevSecOps framework powered by Nix.
Stars: ✭ 158 (+97.5%)
Mutual labels:  build, nix
nix2container
An archive-less dockerTools.buildImage implementation
Stars: ✭ 133 (+66.25%)
Mutual labels:  nix
nixkell
A simple Nix-Haskell skeleton
Stars: ✭ 63 (-21.25%)
Mutual labels:  nix
dotfiles
Dotfiles
Stars: ✭ 25 (-68.75%)
Mutual labels:  nix
nix-home
A Nix Home Manager setup. I've now moved to a new configuration system at hugoreeves/elemental
Stars: ✭ 60 (-25%)
Mutual labels:  nix
xcode-configure
This command can generate makefile to build xcode project in command line just like <configure & make & make install> in C/C++ language world.
Stars: ✭ 34 (-57.5%)
Mutual labels:  build
deblibs-gradle-plugin
A Gradle plugin that creates Github issue and Slack message for outdated dependencies so they can easily be tracked and manually upgraded.
Stars: ✭ 73 (-8.75%)
Mutual labels:  build
tsm
A Hierarchical State Machine Framework in C++
Stars: ✭ 30 (-62.5%)
Mutual labels:  nix
flake-utils-plus
Use Nix flakes without any fluff.
Stars: ✭ 280 (+250%)
Mutual labels:  nix
nixpkgs
Nix Packages collection used in Nubank
Stars: ✭ 24 (-70%)
Mutual labels:  nix
UnityBuildManager
Utility for running builds sequence & pushing them to markets & keeping changelog
Stars: ✭ 53 (-33.75%)
Mutual labels:  build
nix-portable
Nix - Static, Permissionless, Installation-free, Pre-configured
Stars: ✭ 356 (+345%)
Mutual labels:  nix
mopt
Babel plugin to optimize Mithril m() calls into simple JS objects for speed
Stars: ✭ 45 (-43.75%)
Mutual labels:  build
fts
🔍 Postgres full-text search (fts)
Stars: ✭ 28 (-65%)
Mutual labels:  nix
digga
A flake utility library to craft shell-, home-, and hosts- environments.
Stars: ✭ 818 (+922.5%)
Mutual labels:  nix
buildroot
Configure and build dahliaOS Linux-based builds
Stars: ✭ 56 (-30%)
Mutual labels:  build
dotfiles
Dotfiles. Mac and *nix. Handy scripts, configurations for bash, zsh, git, asdf, Sublime Text, Karabiner-Elements, BetterTouchTool and more.
Stars: ✭ 15 (-81.25%)
Mutual labels:  nix
ghcide-nix
Nix installation for ghcide
Stars: ✭ 76 (-5%)
Mutual labels:  nix
nixops-tutorial
Tutorial for practical deployments with NixOps
Stars: ✭ 93 (+16.25%)
Mutual labels:  nix
easy-purescript-nix
Easy PureScript (and other tools) with Nix
Stars: ✭ 169 (+111.25%)
Mutual labels:  nix

Napalm

This project is looking for a new maintainer, see

When faced with a JavaScript codebase, napalm is just what you need.

-- anonymous

Table of contents

Building npm packages in Nix with Napalm

Basic Napalm usage

Use the buildPackage function provided in the default.nix for building npm packages (replace <napalm> with the path to napalm; with niv: niv add nmattia/napalm):

let
    napalm = pkgs.callPackage <napalm> {};
in napalm.buildPackage ./. {}

All executables provided by the npm package will be available in the derivation's bin directory.

NOTE: napalm uses the package's package-lock.json (or npm-shrinkwrap.json) for building a package database. Make sure there is either a package-lock.json or npm-shrinkwrap.json in the source. Alternatively provide the path to the package-lock file:

let
    napalm = pkgs.callPackage <napalm> {};
in napalm.buildPackage ./. { packageLock = <path/to/package-lock>; }

Napalm with Nix flakes

If you want to use Napalm in your flake project, you can do that by adding it to your inputs and passing napalm.overlay to your Nixpkgs instance. There is also a template, that can help you use napalm in your project. You can use it by running nix flake init -t "github:nix-community/napalm".

Handling complicated scenarios with Napalm

Examples below assume that you have imported napalm in some way.

Custom node.js version

Napalm makes it quite simple to use custom node.js (with npm) version. This is controlled via nodejs argument.

Example 1

Changing node.js version to the one that is supplied in nixpkgs:

{ napalm, nodejs-16_x, ... }:
napalm.buildPackage ./. {
	nodejs = nodejs-16_x;
}

Example 2

Changing node.js version to some custom version (just an idea):

{ napalm, nodejs-12_x, ... }:
let
	nodejs = nodejs-12_x.overrideAttrs (old: rec {
		pname = "nodejs";
		version = "12.19.0";
		sha256 = "1qainpkakkl3xip9xz2wbs74g95gvc6125cc05z6vyckqi2iqrrv";
		name = "${pname}-${version}";

		src = builtins.fetchurl {
			url =
			"https://nodejs.org/dist/v${version}/node-v${version}.tar.xz";
			inherit sha256;
		};
	});
in
napalm.buildPackage ./. {
	inherit nodejs;
}

Pre/Post Npm hooks

Napalm allows to specify commands that are run before and after every npm call. These hooks work also for nested npm calls thanks to npm override mechanism.

Example

Patching some folder with executable scripts containing shebangs (that may be generated by npm script):

{ napalm, ... }:
napalm.buildPackage ./. {
	postNpmHook = ''
	patchShebangs tools
	'';
}

Multiple package locks

Napalms allows to specify multiple package locks. This may be useful for some project which consist of some smaller projects.

Example

{ napalm, ... }:
napalm.buildPackage ./. {
	# package-lock.json that is in the root of the project
	# is not required to be specified in `additionalpackagelocks`
	# If you want to specify it, you can use `packageLock` argument.
	additionalPackageLocks = [
	./frontend/package-lock.json
	./tests/package-lock.json
	];
}

Patching npm packages (before fetching them with npm)

This is very useful for errors like: Invalid interpreter

Napalm has an ability to patch fetched npm packages before serving them to the npm. By default patching fixes shebangs and binaries that are localized and the tarballs. Napalm also updates package-lock.json with new integrity hashes.

Example

To enable patching, just use:

{ napalm, ... }:
napalm.buildPackage ./. {
	patchPackages = true;
}

This will force repacking of all dependencies, though, so you might want to patch only specific dependencies by passing an empty attribute set to the next method.

Customizing patching mechanism of npm packages

Sometimes it is required to manually patch some package. Napalm allows that via customPatchPackages attribute. This attribute is a set of that overrides for packages that will be patched.

Example

{ napalm, ... }:
napalm.buildPackage ./. {
	# Arguments that are passed to the overrider:
	# `pkgs` - Nixpkgs used by Napalm
	# `prev` - Current set that will be passed to mkDerivation
	customPatchPackages = {
		"react-native" = {
			"0.65.0" = pkgs: prev: {
				EXAMPLE_ENV_VAR = "XYZ";
				dontBuild = false;
				buildPhase = ''
				# You can copy some stuff here or run some custom stuff
				'';
			};
		};

		# Version is not required. When it is not specified it
		# applies override to all packages with that name.
		"node-gyp-builder" = pkgs: prev: { };
	};
}

How does Napalm work ?

These are general steps that Napalm makes when building packages (if you want to learn more, see source code of default.nix):

  1. Napalm loads all package-lock.json files and parses them. Then it fetches all specified packages into the Nix Store.
  2. (optional) Napalm patches npm packages and stores their output in new location. Then uses this location as default package location in Nix Store.
  3. Napalm creates snapshot that consists of packages names, version and paths to locations in Nix Store that contain them.
  4. (optional) Napalm patches package-lock.json integrity if the packages were patched, so that they will work with npm install.
  5. Napalm sets up napalm-registry which as a main argument accepts snapshot of npm packages and them serves them as if it was npm registry server.
  6. Napalm sets up npm so that it thinks napalm-registry server is default npm registry server.
  7. Napalm overrides npm which allows using custom npm hooks (every time it is called) as well as some other default patching activities.
  8. Napalm calls all the npm commands.
  9. Napalm installs everything automatically or based on what was specified in installPhase.

Napalm - a lightweight npm registry

Under the hood napalm uses its own package registry. The registry is available in default.nix as napalm-registry.

Usage: napalm-registry [-v|--verbose] [--endpoint ARG] [--port ARG] --snapshot ARG

Available options:
  -v,--verbose             Print information about requests
  --endpoint ARG           The endpoint of this server, used in the Tarball URL
  --port ARG               The to serve on, also used in the Tarball URL
  --snapshot ARG           Path to the snapshot file. The snapshot is a JSON
                           file. The top-level keys are the package names. The
                           top-level values are objects mapping from version to
                           the path of the package tarball. Example: { "lodash":
                           { "1.0.0": "/path/to/lodash-1.0.0.tgz" } }
  -h,--help                Show this help text

Similar projects

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].