{
  self,
  nix-filter,
  pkgs,
}: let
  inherit (builtins) removeAttrs;
  inherit (pkgs.lib) concatStringsSep;

  mkNodeCheck = {
    buildInputs ? [],
    checkCommands,
    ...
  } @ attrs: let
    extraAttrs = removeAttrs attrs ["buildInputs"];
  in
    self.packages.${pkgs.system}.default.overrideAttrs (old:
      {
        src = nix-filter {
          root = self;

          include = [
            ../package.json
            ../tsconfig.json
            ../.eslintrc.yaml
            ../.parcelrc
            ../.posthtmlrc
            ../.prettierrc

            nix-filter.isDirectory
            (nix-filter.matchExt "ts")
            (nix-filter.matchExt "tsx")
            (nix-filter.matchExt "html")
            (nix-filter.matchExt "scss")
          ];
        };

        buildInputs = old.buildInputs ++ buildInputs;

        checkPhase = ''
          mkdir -p $out
          ${concatStringsSep "\n" (map (command: "${command} | tee $out/check.log") checkCommands)}
        '';

        doCheck = true;
        dontBuild = true;
        dontInstall = true;
      }
      // extraAttrs);
in {
  style = mkNodeCheck {
    checkCommands = [
      "npm run style"
    ];
  };

  types = mkNodeCheck {
    checkCommands = [
      "npm run check"
    ];
  };

  lints = mkNodeCheck {
    checkCommands = [
      "npm run lint"
    ];
  };
}
