npmInstallHook: extract nodejsInstall{Manuals,Executables} (#336644)

This commit is contained in:
Doron Behar 2024-08-30 06:06:06 +00:00 committed by GitHub
commit 3326d57216
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 79 additions and 25 deletions

View File

@ -7,6 +7,8 @@
, prefetch-npm-deps
, diffutils
, installShellFiles
, nodejsInstallManuals
, nodejsInstallExecutables
}:
{
@ -39,9 +41,10 @@
propagatedBuildInputs = [
installShellFiles
makeWrapper
nodejsInstallManuals
nodejsInstallExecutables
];
substitutions = {
hostNode = "${nodejs}/bin/node";
jq = "${jq}/bin/jq";
};
} ./npm-install-hook.sh;

View File

@ -14,31 +14,9 @@ npmInstallHook() {
cp "${npmWorkspace-.}/$file" "$dest"
done < <(@jq@ --raw-output '.[0].files | map(.path | select(. | startswith("node_modules/") | not)) | join("\n")' <<< "$(npm_config_cache="$HOME/.npm" npm pack --json --dry-run --loglevel=warn --no-foreground-scripts ${npmWorkspace+--workspace=$npmWorkspace} $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")")
# Based on code from Python's buildPythonPackage wrap.sh script, for
# supporting both the case when makeWrapperArgs is an array and a
# IFS-separated string.
#
# TODO: remove the string branch when __structuredAttrs are used.
if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then
local -a user_args=("${makeWrapperArgs[@]}")
else
local -a user_args="(${makeWrapperArgs:-})"
fi
while IFS=" " read -ra bin; do
mkdir -p "$out/bin"
makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" "${user_args[@]}"
done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then
.name + " " + .bin
elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json")
nodejsInstallExecutables "${npmWorkspace-.}/package.json"
while IFS= read -r man; do
installManPage "$packageOut/$man"
done < <(@jq@ --raw-output '(.man | type) as $typ | if $typ == "string" then .man
elif $typ == "list" then .man | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json")
nodejsInstallManuals "${npmWorkspace-.}/package.json"
local -r nodeModulesPath="$packageOut/node_modules"

View File

@ -0,0 +1,27 @@
# shellcheck shell=bash
nodejsInstallExecutables() {
local -r packageJson="${1-./package.json}"
local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)"
# Based on code from Python's buildPythonPackage wrap.sh script, for
# supporting both the case when makeWrapperArgs is an array and a
# IFS-separated string.
#
# TODO: remove the string branch when __structuredAttrs are used.
if [[ "${makeWrapperArgs+defined}" == "defined" && "$(declare -p makeWrapperArgs)" =~ ^'declare -a makeWrapperArgs=' ]]; then
local -a user_args=("${makeWrapperArgs[@]}")
else
local -a user_args="(${makeWrapperArgs:-})"
fi
while IFS=" " read -ra bin; do
mkdir -p "$out/bin"
makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" "${user_args[@]}"
done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then
.name + " " + .bin
elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "$packageJson")
}

View File

@ -0,0 +1,19 @@
{
makeSetupHook,
installShellFiles,
makeWrapper,
nodejs,
jq,
}:
makeSetupHook {
name = "nodejs-install-executables";
propagatedBuildInputs = [
installShellFiles
makeWrapper
];
substitutions = {
hostNode = "${nodejs}/bin/node";
jq = "${jq}/bin/jq";
};
} ./hook.sh

View File

@ -0,0 +1,14 @@
# shellcheck shell=bash
nodejsInstallManuals() {
local -r packageJson="${1-./package.json}"
local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)"
while IFS= read -r man; do
installManPage "$packageOut/$man"
done < <(@jq@ --raw-output '(.man | type) as $typ | if $typ == "string" then .man
elif $typ == "list" then .man | join("\n")
elif $typ == "null" then empty
else "invalid type " + $typ | halt_error end' "$packageJson")
}

View File

@ -0,0 +1,13 @@
{
makeSetupHook,
installShellFiles,
jq,
}:
makeSetupHook {
name = "nodejs-install-manuals";
propagatedBuildInputs = [ installShellFiles ];
substitutions = {
jq = "${jq}/bin/jq";
};
} ./hook.sh