{ lib, stdenv, fetchNpmDeps, buildPackages, nodejs, darwin, }@topLevelArgs: { name ? "${args.pname}-${args.version}", src ? null, srcs ? null, sourceRoot ? null, prePatch ? "", patches ? [ ], postPatch ? "", nativeBuildInputs ? [ ], buildInputs ? [ ], # The output hash of the dependencies for this project. # Can be calculated in advance with prefetch-npm-deps. npmDepsHash ? "", # Whether to force the usage of Git dependencies that have install scripts, but not a lockfile. # Use with care. forceGitDeps ? false, # Whether to force allow an empty dependency cache. # This can be enabled if there are truly no remote dependencies, but generally an empty cache indicates something is wrong. forceEmptyCache ? false, # Whether to make the cache writable prior to installing dependencies. # Don't set this unless npm tries to write to the cache directory, as it can slow down the build. makeCacheWritable ? false, # The script to run to build the project. npmBuildScript ? "build", # Flags to pass to all npm commands. npmFlags ? [ ], # Flags to pass to `npm ci`. npmInstallFlags ? [ ], # Flags to pass to `npm rebuild`. npmRebuildFlags ? [ ], # Flags to pass to `npm run ${npmBuildScript}`. npmBuildFlags ? [ ], # Flags to pass to `npm pack`. npmPackFlags ? [ ], # Flags to pass to `npm prune`. npmPruneFlags ? npmInstallFlags, # Value for npm `--workspace` flag and directory in which the files to be installed are found. npmWorkspace ? null, nodejs ? topLevelArgs.nodejs, npmDeps ? fetchNpmDeps { inherit forceGitDeps forceEmptyCache src srcs sourceRoot prePatch patches postPatch ; name = "${name}-npm-deps"; hash = npmDepsHash; }, # Custom npmConfigHook npmConfigHook ? null, # Custom npmBuildHook npmBuildHook ? null, # Custom npmInstallHook npmInstallHook ? null, ... }@args: let # .override {} negates splicing, so we need to use buildPackages explicitly npmHooks = buildPackages.npmHooks.override { inherit nodejs; }; in stdenv.mkDerivation ( args // { inherit npmDeps npmBuildScript; nativeBuildInputs = nativeBuildInputs ++ [ nodejs # Prefer passed hooks (if npmConfigHook != null then npmConfigHook else npmHooks.npmConfigHook) (if npmBuildHook != null then npmBuildHook else npmHooks.npmBuildHook) (if npmInstallHook != null then npmInstallHook else npmHooks.npmInstallHook) nodejs.python ] ++ lib.optionals stdenv.isDarwin [ darwin.cctools ]; buildInputs = buildInputs ++ [ nodejs ]; strictDeps = true; # Stripping takes way too long with the amount of files required by a typical Node.js project. dontStrip = args.dontStrip or true; meta = (args.meta or { }) // { platforms = args.meta.platforms or nodejs.meta.platforms; }; } )