195 lines
4.3 KiB
Nix
195 lines
4.3 KiB
Nix
{
|
|
stdenv,
|
|
lib,
|
|
makeWrapper,
|
|
installShellFiles,
|
|
nodejsInstallManuals,
|
|
nodejsInstallExecutables,
|
|
coreutils,
|
|
nix-prefetch-git,
|
|
fetchurl,
|
|
jq,
|
|
nodejs,
|
|
nodejs-slim,
|
|
prefetch-yarn-deps,
|
|
fixup-yarn-lock,
|
|
yarn,
|
|
makeSetupHook,
|
|
cacert,
|
|
callPackage,
|
|
nix,
|
|
}:
|
|
|
|
let
|
|
yarnpkg-lockfile-tar = fetchurl {
|
|
url = "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz";
|
|
hash = "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==";
|
|
};
|
|
|
|
tests = callPackage ./tests { };
|
|
in
|
|
{
|
|
prefetch-yarn-deps = stdenv.mkDerivation {
|
|
name = "prefetch-yarn-deps";
|
|
|
|
dontUnpack = true;
|
|
dontBuild = true;
|
|
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
buildInputs = [ nodejs-slim ];
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
mkdir -p $out/bin $out/libexec
|
|
|
|
tar --strip-components=1 -xf ${yarnpkg-lockfile-tar} package/index.js
|
|
mv index.js $out/libexec/yarnpkg-lockfile.js
|
|
cp ${./common.js} $out/libexec/common.js
|
|
cp ${./index.js} $out/libexec/index.js
|
|
|
|
patchShebangs $out/libexec
|
|
makeWrapper $out/libexec/index.js $out/bin/prefetch-yarn-deps \
|
|
--prefix PATH : ${
|
|
lib.makeBinPath [
|
|
coreutils
|
|
nix-prefetch-git
|
|
nix
|
|
]
|
|
}
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
passthru = {
|
|
inherit tests;
|
|
};
|
|
};
|
|
|
|
fixup-yarn-lock = stdenv.mkDerivation {
|
|
name = "fixup-yarn-lock";
|
|
|
|
dontUnpack = true;
|
|
dontBuild = true;
|
|
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
buildInputs = [ nodejs-slim ];
|
|
|
|
installPhase = ''
|
|
runHook preInstall
|
|
|
|
mkdir -p $out/bin $out/libexec
|
|
|
|
tar --strip-components=1 -xf ${yarnpkg-lockfile-tar} package/index.js
|
|
mv index.js $out/libexec/yarnpkg-lockfile.js
|
|
cp ${./common.js} $out/libexec/common.js
|
|
cp ${./fixup.js} $out/libexec/fixup.js
|
|
|
|
patchShebangs $out/libexec
|
|
makeWrapper $out/libexec/fixup.js $out/bin/fixup-yarn-lock
|
|
|
|
runHook postInstall
|
|
'';
|
|
|
|
passthru = {
|
|
inherit tests;
|
|
};
|
|
};
|
|
|
|
fetchYarnDeps =
|
|
let
|
|
f =
|
|
{
|
|
name ? "offline",
|
|
src ? null,
|
|
hash ? "",
|
|
sha256 ? "",
|
|
...
|
|
}@args:
|
|
let
|
|
hash_ =
|
|
if hash != "" then
|
|
{
|
|
outputHashAlgo = null;
|
|
outputHash = hash;
|
|
}
|
|
else if sha256 != "" then
|
|
{
|
|
outputHashAlgo = "sha256";
|
|
outputHash = sha256;
|
|
}
|
|
else
|
|
{
|
|
outputHashAlgo = "sha256";
|
|
outputHash = lib.fakeSha256;
|
|
};
|
|
in
|
|
stdenv.mkDerivation (
|
|
{
|
|
inherit name;
|
|
|
|
dontUnpack = src == null;
|
|
dontInstall = true;
|
|
|
|
nativeBuildInputs = [
|
|
prefetch-yarn-deps
|
|
cacert
|
|
];
|
|
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
|
NODE_EXTRA_CA_CERTS = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
|
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
|
|
yarnLock=''${yarnLock:=$PWD/yarn.lock}
|
|
mkdir -p $out
|
|
(cd $out; prefetch-yarn-deps --verbose --builder $yarnLock)
|
|
|
|
runHook postBuild
|
|
'';
|
|
|
|
outputHashMode = "recursive";
|
|
}
|
|
// hash_
|
|
// (removeAttrs args (
|
|
[
|
|
"name"
|
|
"hash"
|
|
"sha256"
|
|
]
|
|
++ (lib.optional (src == null) "src")
|
|
))
|
|
);
|
|
in
|
|
lib.setFunctionArgs f (lib.functionArgs f) // { inherit tests; };
|
|
|
|
yarnConfigHook = makeSetupHook {
|
|
name = "yarn-config-hook";
|
|
propagatedBuildInputs = [
|
|
yarn
|
|
fixup-yarn-lock
|
|
];
|
|
meta = {
|
|
description = "Install nodejs dependencies from an offline yarn cache produced by fetchYarnDeps";
|
|
};
|
|
} ./yarn-config-hook.sh;
|
|
|
|
yarnBuildHook = makeSetupHook {
|
|
name = "yarn-build-hook";
|
|
meta = {
|
|
description = "Run yarn build in buildPhase";
|
|
};
|
|
} ./yarn-build-hook.sh;
|
|
|
|
yarnInstallHook = makeSetupHook {
|
|
name = "yarn-install-hook";
|
|
propagatedBuildInputs = [
|
|
yarn
|
|
nodejsInstallManuals
|
|
nodejsInstallExecutables
|
|
];
|
|
substitutions = {
|
|
jq = lib.getExe jq;
|
|
};
|
|
} ./yarn-install-hook.sh;
|
|
}
|