{ config, pkgs, lib, ... }: let configDir = ../../config; # Read the contents of the upstream config directory configEntries = builtins.readDir configDir; # Check for user overrides userConfigDir = config.nomarchy.configOverrides; userEntries = if userConfigDir != null && builtins.pathExists userConfigDir then builtins.readDir userConfigDir else {}; # Files to explicitly exclude (handled elsewhere or not intended for ~/.config/) excludedFiles = [ "nomarchy.ttf" "waybar" "walker" "alacritty" "swayosd" ]; # Get all unique names from both sources allNames = lib.unique (builtins.attrNames configEntries ++ builtins.attrNames userEntries); # Filter the entries validEntries = builtins.filter (name: !(builtins.elem name excludedFiles)) allNames; # Generate the xdg.configFile attribute set # If a name exists in userEntries, it takes precedence. # For directories, we use `recursive = true;` to allow the user to create their own files alongside the read-only defaults. makeMapping = name: { inherit name; value = lib.mkDefault { source = if userEntries ? ${name} then "${userConfigDir}/${name}" else "${configDir}/${name}"; recursive = (userEntries.${name} or configEntries.${name}) == "directory"; }; }; in { xdg.configFile = (builtins.listToAttrs (map makeMapping validEntries)) // { "nomarchy" = { source = ../../config/nomarchy; recursive = true; }; "hypr" = { source = ../../config/hypr; recursive = true; }; }; }