aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/mason-core/managers/github/client.lua6
-rw-r--r--lua/mason-core/managers/npm/init.lua2
-rw-r--r--lua/mason-registry/api.lua47
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