{
  lib,
  config,
  pkgs,
  ...
}:
let
  inherit (import ./utils.nix lib)
    normalizedPluginType
    normalizePlugins
    ;
  byteCompileCfg = config.performance.byteCompileLua;
in
{
  options = {
    build.plugins = lib.mkOption {
      visible = false;
      internal = true;
      readOnly = true;
      type = lib.types.listOf normalizedPluginType;
      description = ''
        Final list of (normalized) plugins that will be passed to the wrapper.

        It notably implements:
        - byte-compilation (performance.byteCompileLua) -> ./byte-compile-plugins.nix
        - plugins combining (performance.combinePlugins) -> ./combine-plugins.nix
      '';
    };
  };

  config = {
    build.plugins =
      let
        shouldCompilePlugins = byteCompileCfg.enable && byteCompileCfg.plugins;
        byteCompilePlugins = pkgs.callPackage ./byte-compile-plugins.nix {
          inherit lib;
          inherit (config.performance.byteCompileLua) excludedPlugins;
        };

        shouldCompileLuaLib = byteCompileCfg.enable && byteCompileCfg.luaLib;
        inherit (pkgs.callPackage ./byte-compile-lua-lib.nix { inherit lib; }) byteCompilePluginDeps;

        shouldCombinePlugins = config.performance.combinePlugins.enable;
        combinePlugins = pkgs.callPackage ./combine-plugins.nix {
          inherit lib;
          inherit (config.performance.combinePlugins)
            standalonePlugins
            pathsToLink
            ;
        };
      in

      lib.pipe config.extraPlugins (
        [ normalizePlugins ]
        ++ lib.optionals shouldCompilePlugins [ byteCompilePlugins ]
        ++ lib.optionals shouldCompileLuaLib [ byteCompilePluginDeps ]
        ++ lib.optionals shouldCombinePlugins [ combinePlugins ]
      );
  };
}
