{ config, lib, pkgs, ... }: let cfg = config.programs.bun; tomlFormat = pkgs.formats.toml { }; in { meta.maintainers = [ lib.hm.maintainers.jack5079 ]; options.programs.bun = { enable = lib.mkEnableOption "Bun JavaScript runtime"; package = lib.mkPackageOption pkgs "bun" { }; settings = lib.mkOption { type = tomlFormat.type; default = { }; example = lib.literalExpression '' { smol = true; telemetry = false; test = { coverage = true; coverageThreshold = 0.9; }; install.lockfile = { print = "yarn"; }; } ''; description = '' Configuration written to {file}`$XDG_CONFIG_HOME/.bunfig.toml`. See for the full list of options. ''; }; enableGitIntegration = lib.mkEnableOption "Git integration" // { default = true; }; }; config = lib.mkIf cfg.enable { home.packages = [ cfg.package ]; xdg.configFile.".bunfig.toml" = lib.mkIf (cfg.settings != { }) { source = tomlFormat.generate "bun-config" cfg.settings; }; # https://bun.sh/docs/install/lockfile#how-do-i-git-diff-bun-s-lockfile programs.git.attributes = lib.mkIf cfg.enableGitIntegration [ "*.lockb binary diff=lockb" ]; programs.git.extraConfig.diff.lockb = lib.mkIf cfg.enableGitIntegration { textconv = lib.getExe cfg.package; binary = true; }; }; }