{ config, lib, pkgs, ... }: with lib; let cfg = config.nix; in { options.nix = { registry = mkOption { type = types.attrsOf (types.submodule (let inputAttrs = types.attrsOf (types.oneOf [ types.str types.int types.bool types.package ]); in { config, name, ... }: { options = { from = mkOption { type = inputAttrs; example = { type = "indirect"; id = "nixpkgs"; }; description = "The flake reference to be rewritten."; }; to = mkOption { type = inputAttrs; example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; }; description = "The flake reference to which is to be rewritten."; }; flake = mkOption { type = types.nullOr types.attrs; default = null; example = literalExpression "nixpkgs"; description = '' The flake input to which is to be rewritten. ''; }; exact = mkOption { type = types.bool; default = true; description = '' Whether the reference needs to match exactly. If set, a reference like nixpkgs does not match with a reference like nixpkgs/nixos-20.03. ''; }; }; config = { from = mkDefault { type = "indirect"; id = name; }; to = mkIf (config.flake != null) ({ type = "path"; path = config.flake.outPath; } // lib.filterAttrs (n: v: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash") config.flake); }; })); default = { }; description = '' User level flake registry. ''; }; registryVersion = mkOption { type = types.int; default = 2; internal = true; description = "The flake registry format version."; }; }; config = mkIf (cfg.registry != { }) { xdg.configFile."nix/registry.json".text = builtins.toJSON { version = cfg.registryVersion; flakes = mapAttrsToList (n: v: { inherit (v) from to exact; }) cfg.registry; }; }; }