local M = { package = nil, packAddMissing = true, } -- fancy plugin loader function require_plugin(moduleName, source, setup, loadFn) local ok, mod = pcall(require, moduleName) if not ok then if M.packAddMissing then if not source then vim.notify("Failed to load plugin module without source " .. moduleName, vim.log.levels.ERROR) return end -- TODO track and do these all at once vim.pack.add { source } end ok, mod = pcall(require, moduleName) if not ok then vim.notify(mod, vim.log.levels.ERROR) return end end if setup and mod.setup then mod.setup(setup == true and {} or setup) end if loadFn then loadFn() end end -- helper for handling dependencies and parsing module function require_plugin_from_module(mod) -- mod == true means it returned nothing if mod == true or mod.enabled == false then return end for _, dMod in ipairs(mod.dependencies or {}) do require_plugin_from_module(dMod) end require_plugin(mod.moduleName or mod[1], mod.source or mod[2], mod.setup, mod.loadFn) for _, dMod in ipairs(mod.dependents or {}) do require_plugin_from_module(dMod) end end -- setup local setup = function(opts) -- handle missing opts if not opts or not opts.package then vim.notify("lazy-like-loader.setup invoked without required options ({ package = '' })", vim.log.levels.ERROR) end -- handle opts for k, v in pairs(opts) do M[k] = v end -- loop over plugins local pluginsPath = vim.fn.stdpath("config") .. "/lua/" .. M.package:gsub("%.", "/") for _, f in ipairs(vim.fn.glob(pluginsPath .. "/*.lua", false, true)) do local name = vim.fn.fnamemodify(f, ":t:r") local modName = M.package .. "." .. name require_plugin_from_module(require(modName)) end end return { setup = setup }