diff options
Diffstat (limited to 'pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh')
-rw-r--r-- | pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh b/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh new file mode 100644 index 0000000000000..4a222de26bbf0 --- /dev/null +++ b/pkgs/build-support/node/build-npm-package/hooks/npm-install-hook.sh @@ -0,0 +1,43 @@ +# shellcheck shell=bash + +npmInstallHook() { + echo "Executing npmInstallHook" + + runHook preInstall + + # `npm pack` writes to cache + npm config delete cache + + local -r packageOut="$out/lib/node_modules/$(@jq@ --raw-output '.name' package.json)" + + while IFS= read -r file; do + local dest="$packageOut/$(dirname "$file")" + mkdir -p "$dest" + cp "$file" "$dest" + done < <(@jq@ --raw-output '.[0].files | map(.path) | join("\n")' <<< "$(npm pack --json --dry-run $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")") + + while IFS=" " read -ra bin; do + mkdir -p "$out/bin" + makeWrapper @hostNode@ "$out/bin/${bin[0]}" --add-flags "$packageOut/${bin[1]}" + 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") + else "invalid type " + $typ | halt_error end' package.json) + + local -r nodeModulesPath="$packageOut/node_modules" + + if [ ! -d "$nodeModulesPath" ]; then + npm prune --omit dev + find node_modules -maxdepth 1 -type d -empty -delete + + cp -r node_modules "$nodeModulesPath" + fi + + runHook postInstall + + echo "Finished npmInstallHook" +} + +if [ -z "${dontNpmInstall-}" ] && [ -z "${installPhase-}" ]; then + installPhase=npmInstallHook +fi |