{
  inputs,
  lib,
}: {
  pkgs,
  extraSpecialArgs ? {},
  modules ? [],
  # deprecated
  extraModules ? [],
  configuration ? {},
}: let
  inherit (lib.strings) toString;
  inherit (lib.lists) concatLists;

  # import modules.nix with `check`, `pkgs` and `lib` as arguments
  # check can be disabled while calling this file is called
  # to avoid checking in all modules
  nvimModules = import ./modules.nix {inherit pkgs lib;};

  # evaluate the extended library with the modules
  # optionally with any additional modules passed by the user
  module = lib.evalModules {
    specialArgs =
      extraSpecialArgs
      // {
        inherit inputs;
        modulesPath = toString ./.;
      };
    modules = concatLists [
      nvimModules
      modules
      (lib.optional (configuration != {}) (lib.warn ''
          nvf: passing 'configuration' to lib.neovimConfiguration is deprecated.
        ''
        configuration))

      (lib.optionals (extraModules != []) (lib.warn ''
          nvf: passing 'extraModules' to lib.neovimConfiguration is deprecated, use 'modules' instead.
        ''
        extraModules))
    ];
  };
in {
  inherit (module) options config;
  inherit (module._module.args) pkgs;

  # Expose wrapped neovim-package for userspace
  # or module consumption.
  neovim = module.config.vim.build.finalPackage;
}