{ lib, pkgs, ... }: with builtins // lib; basePath: rec { option = mkOption { type = fileType; default = {}; description = "Files relative to ${basePath}"; }; type = types.attrsOf (types.submodule ({ name, config, ... }: { options = { enable = mkEnableOption name // { default = text != ""; }; target = mkOption { type = types.str; default = name; apply = p: if basePath == "" || isPrefix basePath p then p else "${basePath}/${p}"; }; executable = mkOption { type = with types; nullOr bool; default = null; }; source = mkOption { type = types.path; }; text = mkOption { type = with types; nullOr lines; default = null; }; }; config = mkMerge [ (mkIf (config.text != null) { source = mkDefault pkgs.writeTextFile { inherit name; inherit (config) text; executable = config.executable == true; }; }) ]; })) }