# SPDX-FileCopyrightText: 2021 Simon Bruder # # SPDX-License-Identifier: AGPL-3.0-or-later # This module implements an option with the same structure as the nginx module # but does not extend the nginx module since that would cause infinite # recursion. { config, lib, pkgs, ... }: let enabledLocations = lib.fold (x: a: a ++ x) [ ] (lib.mapAttrsToList (vhostName: vhostConfig: lib.mapAttrsToList (locationName: locationConfig: [ vhostName locationName ]) (lib.filterAttrs (_: location: location.enable) vhostConfig.locations)) config.services.nginx-interactive-index.virtualHosts); in { options.services.nginx-interactive-index.virtualHosts = with lib.types; lib.mkOption { default = { }; type = attrsOf (submodule { options = { locations = lib.mkOption { default = { }; type = attrsOf (submodule { options = { enable = lib.mkEnableOption "interactive directory index"; }; }); }; }; }); }; config.services.nginx.virtualHosts = lib.fold (x: a: a // x) { } (map (path: let vhost = lib.elemAt path 0; location = lib.elemAt path 1; assetsPath = "${location}__nginx-interactive-index-assets__"; in { "${vhost}".locations = { "${location}" = { extraConfig = '' autoindex on; autoindex_exact_size on; add_before_body ${assetsPath}/header.html; ''; }; "${assetsPath}/" = { alias = "${builtins.filterSource (path: type: baseNameOf path != "default.nix") ./.}/"; }; "=${assetsPath}/header.html" = { alias = pkgs.writeText "nginx-interactive-index-${location}-header.html" '' ''; }; }; }) enabledLocations); }