diff options
Diffstat (limited to 'nix')
| -rw-r--r-- | nix/checks.nix | 46 | ||||
| -rw-r--r-- | nix/default.nix | 106 | ||||
| -rw-r--r-- | nix/fetchTree.nix | 172 |
3 files changed, 324 insertions, 0 deletions
diff --git a/nix/checks.nix b/nix/checks.nix new file mode 100644 index 0000000..c7f6547 --- /dev/null +++ b/nix/checks.nix @@ -0,0 +1,46 @@ +{ + lib, + runCommand, + actionlint, + biome, + deadnix, + formatter, + eclint, + statix, + ... +}: { + actionlint = runCommand "check-actionlint" {} '' + ${lib.getExe actionlint} ${../.github/workflows}/* + touch $out + ''; + + biome-fmt = runCommand "check-biome-fmt" {} '' + ${lib.getExe biome} format ${../.}/**/* + touch $out + ''; + + biome-lint = runCommand "check-biome-lint" {} '' + ${lib.getExe biome} lint ${../.}/**/* + touch $out + ''; + + deadnix = runCommand "check-deadnix" {} '' + ${lib.getExe deadnix} ${../.} + touch $out + ''; + + "${formatter.pname}" = runCommand "check-${formatter.pname}" {} '' + ${lib.getExe formatter} --check ${../.} + touch $out + ''; + + eclint = runCommand "check-eclint" {} '' + ${lib.getExe eclint} ${../.}/**/* + touch $out + ''; + + statix = runCommand "check-statix" {} '' + ${lib.getExe statix} check ${../.} + touch $out + ''; +} diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..a0dcda0 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,106 @@ +{ + lib, + stdenvNoCC, + cacert, + jq, + moreutils, + nodejs, +}: +stdenvNoCC.mkDerivation (finalAttrs: { + name = "getchoo-website"; + + src = lib.fileset.toSource { + root = ../.; + fileset = lib.fileset.gitTracked ../.; + }; + + __structuredAttrs = true; + + nativeBuildInputs = [ + nodejs + nodejs.pkgs.pnpm + ]; + + env = { + pnpmDeps = stdenvNoCC.mkDerivation (finalAttrs': { + name = "${finalAttrs.name}-pnpm-deps"; + inherit (finalAttrs) src; + + __structuredAttrs = true; + + nativeBuildInputs = [ + cacert + jq + moreutils + nodejs.pkgs.pnpm + ]; + + dontConfigure = true; + dontBuild = true; + doCheck = false; + + installPhase = '' + runHook preInstall + + export HOME="$(mktemp -d)" + pnpm config set store-dir "$out" + pnpm install --force --frozen-lockfile --ignore-script + + runHook postInstall + ''; + + fixupPhase = '' + runHook preFixup + + rm -rf "$out"/v3/tmp + for f in $(find "$out" -name "*.json"); do + sed -i -E -e 's/"checkedAt":[0-9]+,//g' $f + jq --sort-keys . $f | sponge $f + done + + runHook postFixup + ''; + + outputHashMode = "recursive"; + outputHash = "sha256-pKo1t9K24HUOjjfwfubx+JorlAJeshAQBLSABRoSF/k="; + }); + }; + + postConfigure = '' + export HOME="$(mktemp -d)" + export STORE_PATH="$(mktemp -d)" + + cp -rT "$pnpmDeps" "$STORE_PATH" + chmod -R +w "$STORE_PATH" + + pnpm config set store-dir "$STORE_PATH" + + pnpm install --force --frozen-lockfile --ignore-script --offline + + patchShebangs node_modules/{*,.*} + ''; + + buildPhase = '' + runHook preBuild + pnpm run build + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + mv dist "$out" + runHook postInstall + ''; + + checkPhase = '' + runHook preCheck + pnpm run check + runHook postCheck + ''; + + meta = with lib; { + homepage = "https://github.com/getchoo/website"; + license = licenses.mit; + maintainers = with maintainers; [getchoo]; + }; +}) diff --git a/nix/fetchTree.nix b/nix/fetchTree.nix new file mode 100644 index 0000000..26de85b --- /dev/null +++ b/nix/fetchTree.nix @@ -0,0 +1,172 @@ +# this code is slightly modified from https://github.com/edolstra/flake-compat +## +## Copyright (c) 2020-2021 Eelco Dolstra and the flake-compat contributors +## +## Permission is hereby granted, free of charge, to any person obtaining +## a copy of this software and associated documentation files (the +## "Software"), to deal in the Software without restriction, including +## without limitation the rights to use, copy, modify, merge, publish, +## distribute, sublicense, and/or sell copies of the Software, and to +## permit persons to whom the Software is furnished to do so, subject to +## the following conditions: +## +## The above copyright notice and this permission notice shall be +## included in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +## LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +## OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +## WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +let + formatSecondsSinceEpoch = t: let + rem = x: y: x - x / y * y; + days = t / 86400; + secondsInDay = rem t 86400; + hours = secondsInDay / 3600; + minutes = (rem secondsInDay 3600) / 60; + seconds = rem t 60; + + # Courtesy of https://stackoverflow.com/a/32158604. + z = days + 719468; + era = + ( + if z >= 0 + then z + else z - 146096 + ) + / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = + mp + + ( + if mp < 10 + then 3 + else -9 + ); + y' = + y + + ( + if m <= 2 + then 1 + else 0 + ); + + pad = s: + if builtins.stringLength s < 2 + then "0" + s + else s; + in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; + + fetchTree = info: + if info.type == "github" + then { + outPath = + fetchTarball + ( + {url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + inherit (info) rev lastModified narHash; + shortRev = builtins.substring 0 7 info.rev; + lastModifiedDate = formatSecondsSinceEpoch info.lastModified; + } + else if info.type == "git" + then + { + outPath = + builtins.fetchGit + ( + {inherit (info) url;} + // ( + if info ? rev + then {inherit (info) rev;} + else {} + ) + // ( + if info ? ref + then {inherit (info) ref;} + else {} + ) + // ( + if info ? submodules + then {inherit (info) submodules;} + else {} + ) + ); + inherit (info) lastModified narHash; + lastModifiedDate = formatSecondsSinceEpoch info.lastModified; + } + // ( + if info ? rev + then { + inherit (info) rev; + shortRev = builtins.substring 0 7 info.rev; + } + else { + } + ) + else if info.type == "path" + then { + outPath = builtins.path {inherit (info) path;}; + inherit (info) narHash; + } + else if info.type == "tarball" + then { + outPath = + fetchTarball + ( + {inherit (info) url;} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + } + else if info.type == "gitlab" + then { + inherit (info) rev narHash lastModified; + outPath = + fetchTarball + ( + {url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + shortRev = builtins.substring 0 7 info.rev; + } + else if info.type == "sourcehut" + then { + inherit (info) rev narHash lastModified; + outPath = + fetchTarball + ( + {url = "https://${info.host or "git.sr.ht"}/${info.owner}/${info.repo}/archive/${info.rev}.tar.gz";} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + shortRev = builtins.substring 0 7 info.rev; + } + else + # FIXME: add Mercurial, tarball inputs. + throw "flake input has unsupported input type '${info.type}'"; +in + fetchTree |
