diff --git a/modules/environment/nix.nix b/modules/environment/nix.nix
index 274b408..48cc44a 100644
--- a/modules/environment/nix.nix
+++ b/modules/environment/nix.nix
@@ -46,6 +46,65 @@ in
'';
};
+ registry = mkOption {
+ type = types.attrsOf (types.submodule (
+ let
+ referenceAttrs = with types; attrsOf (oneOf [
+ str
+ int
+ bool
+ package
+ ]);
+ in
+ { config, name, ... }:
+ {
+ options = {
+ from = mkOption {
+ type = referenceAttrs;
+ example = { type = "indirect"; id = "nixpkgs"; };
+ description = "The flake reference to be rewritten.";
+ };
+ to = mkOption {
+ type = referenceAttrs;
+ example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; };
+ description = "The flake reference is rewritten to.";
+ };
+ flake = mkOption {
+ type = types.nullOr types.attrs;
+ default = null;
+ example = literalExpression "nixpkgs";
+ description = ''
+ The flake input is rewritten to.
+ '';
+ };
+ 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) (mkDefault
+ {
+ type = "path";
+ path = config.flake.outPath;
+ } // filterAttrs
+ (n: _: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
+ config.flake);
+ };
+ }
+ ));
+ default = { };
+ description = ''
+ A system-wide flake registry.
+ '';
+ };
+
substituters = mkOption {
type = types.listOf types.str;
default = [];
@@ -86,6 +145,11 @@ in
trusted-public-keys = ${concatStringsSep " " cfg.trustedPublicKeys}
${cfg.extraConfig}
'';
+
+ "nix/registry.json".text = builtins.toJSON {
+ version = 2;
+ flakes = mapAttrsToList (n: v: { inherit (v) from to exact; }) cfg.registry;
+ };
};
nix = {