summaryrefslogtreecommitdiff
path: root/nix
diff options
context:
space:
mode:
Diffstat (limited to 'nix')
-rw-r--r--nix/checks.nix46
-rw-r--r--nix/default.nix106
-rw-r--r--nix/fetchTree.nix172
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