diff options
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/mason-core/managers/github/client.lua | 6 | ||||
| -rw-r--r-- | lua/mason-core/managers/npm/init.lua | 2 | ||||
| -rw-r--r-- | lua/mason-registry/api.lua | 47 |
3 files changed, 49 insertions, 6 deletions
diff --git a/lua/mason-core/managers/github/client.lua b/lua/mason-core/managers/github/client.lua index 9583ab6d..3ef307c1 100644 --- a/lua/mason-core/managers/github/client.lua +++ b/lua/mason-core/managers/github/client.lua @@ -66,8 +66,7 @@ end ---@return Result # Result<GitHubRelease> function M.fetch_latest_release(repo, opts) opts = opts or { include_prerelease = false } - local path = ("/api/repo/%s/releases/latest"):format(repo) - return api.get(path, { + return api.repo.releases.latest({ repo = repo }, { params = { include_prerelease = opts.include_prerelease and "true" or "false", }, @@ -88,8 +87,7 @@ end ---@param repo string The GitHub repo ("username/repo"). ---@return Result # Result<string> The latest tag name. function M.fetch_latest_tag(repo) - local path = ("/api/repo/%s/tags/latest"):format(repo) - return api.get(path):map(_.prop "tag") + return api.repo.tags.latest({ repo = repo }):map(_.prop "tag") end ---@async diff --git a/lua/mason-core/managers/npm/init.lua b/lua/mason-core/managers/npm/init.lua index 9cfa2be7..61ee4042 100644 --- a/lua/mason-core/managers/npm/init.lua +++ b/lua/mason-core/managers/npm/init.lua @@ -112,7 +112,7 @@ function M.check_outdated_primary_package(receipt, install_dir) local primary_package = receipt.primary_source.package return M.get_installed_primary_package_version(receipt, install_dir) :and_then(function(installed_version) - return api.get(("/api/npm/%s/versions/latest"):format(primary_package)):map(function(response) + return api.npm.versions.latest({ package = primary_package }):map(function(response) return { installed = installed_version, latest = response.version, diff --git a/lua/mason-registry/api.lua b/lua/mason-registry/api.lua index 037d7fd6..b700ba47 100644 --- a/lua/mason-registry/api.lua +++ b/lua/mason-registry/api.lua @@ -8,9 +8,11 @@ local BASE_URL = "https://api.mason-registry.dev" local stringify_params = _.compose(_.join "&", _.map(_.join "="), _.sort_by(_.head), _.to_pairs) +---@alias ApiFetchOpts { params: table<string, any>? } + ---@async ---@param path string ----@param opts { params: table<string, any>? }? +---@param opts ApiFetchOpts? ---@return Result # JSON decoded response. function api.get(path, opts) if opts and opts.params then @@ -24,4 +26,47 @@ function api.get(path, opts) }):map_catching(vim.json.decode) end +---@alias ApiSignature<T> fun(path_params: T, opts?: ApiFetchOpts): Result + +---@param path_template string +local function get(path_template) + ---@param path_params table + ---@param opts ApiFetchOpts? + return function(path_params, opts) + local path = path_template:gsub("{([%w_%.0-9]+)}", function(prop) + return path_params[prop] + end) + -- This is done so that test stubs trigger as expected (you have to explicitly match against nil arguments) + if opts then + return api.get(path, opts) + else + return api.get(path) + end + end +end + +api.repo = { + releases = { + ---@type ApiSignature<{ repo: string }> + latest = get "/api/repo/{repo}/releases/latest", + ---@type ApiSignature<{ repo: string }> + all = get "/api/repo/{repo}/releases/all", + }, + tags = { + ---@type ApiSignature<{ repo: string }> + latest = get "/api/repo/{repo}/tags/latest", + ---@type ApiSignature<{ repo: string }> + all = get "/api/repo/{repo}/tags/all", + }, +} + +api.npm = { + versions = { + ---@type ApiSignature<{ package: string }> + latest = get "/api/npm/{package}/versions/latest", + ---@type ApiSignature<{ package: string }> + all = get "/api/npm/{package}/versions/all", + }, +} + return api |
