core/pkgs/build-support/node/build-npm-package/default.nix
2024-06-30 09:12:46 +01:00

104 lines
2.9 KiB
Nix

{
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;
};
}
)