diff options
| -rw-r--r-- | lua/mason-core/providers/init.lua | 31 | ||||
| -rw-r--r-- | lua/mason-registry/api.lua | 37 | ||||
| -rw-r--r-- | lua/mason-registry/bash-debug-adapter/init.lua | 1 | ||||
| -rw-r--r-- | lua/mason/providers/registry-api/init.lua | 21 | ||||
| -rw-r--r-- | tests/mason-registry/api_spec.lua | 4 |
5 files changed, 84 insertions, 10 deletions
diff --git a/lua/mason-core/providers/init.lua b/lua/mason-core/providers/init.lua index 8aabcde6..dca59d3f 100644 --- a/lua/mason-core/providers/init.lua +++ b/lua/mason-core/providers/init.lua @@ -2,8 +2,7 @@ local settings = require "mason.settings" local log = require "mason-core.log" local Result = require "mason-core.result" ----@alias GitHubReleaseAsset {url: string, id: integer, name: string, browser_download_url: string, created_at: string, updated_at: string, size: integer, download_count: integer} ----@alias GitHubRelease { tag_name: string, prerelease: boolean, draft: boolean, assets:GitHubReleaseAsset[] } +---@alias GitHubRelease { tag_name: string, prerelease: boolean, draft: boolean, assets: table[] } ---@alias GitHubTag { name: string } ---@class GitHubProvider @@ -30,11 +29,29 @@ local Result = require "mason-core.result" ---@field get_latest_version? async fun(gem: string): Result # Result<RubyGem> ---@field get_all_versions? async fun(gem: string): Result # Result<string[]> +---@alias PackagistPackage { name: string, version: string } + +---@class PackagistProvider +---@field get_latest_version? async fun(pkg: string): Result # Result<PackagistPackage> +---@field get_all_versions? async fun(pkg: string): Result # Result<string[]> + +---@alias Crate { name: string, version: string } + +---@class CratesProvider +---@field get_latest_version? async fun(crate: string): Result # Result<Crate> +---@field get_all_versions? async fun(crate: string): Result # Result<string[]> + +---@class GolangProvider +---@field get_all_versions? async fun(pkg: string): Result # Result<string[]> + ---@class Provider ----@field github? GitHubProvider ----@field npm? NpmProvider ----@field pypi? PyPiProvider ----@field rubygems? RubyGemsProvider +---@field github? GitHubProvider +---@field npm? NpmProvider +---@field pypi? PyPiProvider +---@field rubygems? RubyGemsProvider +---@field packagist? PackagistProvider +---@field crates? CratesProvider +---@field golang? GolangProvider local function service_mt(service) return setmetatable({}, { @@ -65,7 +82,7 @@ local function service_mt(service) log.fmt_error("Unable to find provider %s is not registered. %s", provider_module, provider) end end - local err = ("No provider implementation found for %s.%s"):format(service, method) + local err = ("No provider implementation succeeded for %s.%s"):format(service, method) log.error(err) return Result.failure(err) end diff --git a/lua/mason-registry/api.lua b/lua/mason-registry/api.lua index 7d98c7ef..853690b9 100644 --- a/lua/mason-registry/api.lua +++ b/lua/mason-registry/api.lua @@ -26,10 +26,18 @@ function api.get(path, opts) }):map_catching(vim.json.decode) end ----@alias ApiSignature<T> fun(path_params: T, opts?: ApiFetchOpts): Result +---@alias ApiSignature<T> async fun(path_params: T, opts?: ApiFetchOpts): Result + +---@param char string +local function percent_encode(char) + return ("%%%x"):format(string.byte(char, 1, 1)) +end + +api.encode_uri_component = _.gsub("[!#%$&'%(%)%*%+,/:;=%?@%[%]]", percent_encode) ---@param path_template string local function get(path_template) + ---@async ---@param path_params table ---@param opts ApiFetchOpts? return function(path_params, opts) @@ -83,7 +91,32 @@ api.rubygems = { ---@type ApiSignature<{ gem: string }> latest = get "/api/rubygems/{gem}/versions/latest", ---@type ApiSignature<{ gem: string }> - all = get "/api/rubygemspypi/{gem}/versions/all", + all = get "/api/rubygems/{gem}/versions/all", + }, +} + +api.packagist = { + versions = { + ---@type ApiSignature<{ pkg: string }> + latest = get "/api/packagist/{pkg}/versions/latest", + ---@type ApiSignature<{ pkg: string }> + all = get "/api/packagist/{pkg}/versions/all", + }, +} + +api.crate = { + versions = { + ---@type ApiSignature<{ crate: string }> + latest = get "/api/crate/{crate}/versions/latest", + ---@type ApiSignature<{ crate: string }> + all = get "/api/crate/{crate}/versions/all", + }, +} + +api.golang = { + versions = { + ---@type ApiSignature<{ pkg: string }> + all = get "/api/golang/{pkg}/versions/all", }, } diff --git a/lua/mason-registry/bash-debug-adapter/init.lua b/lua/mason-registry/bash-debug-adapter/init.lua index c77abb81..6d98e2e8 100644 --- a/lua/mason-registry/bash-debug-adapter/init.lua +++ b/lua/mason-registry/bash-debug-adapter/init.lua @@ -25,7 +25,6 @@ return Pkg.new { end) :get_or_throw() - ---@type GitHubReleaseAsset local release_asset = _.find_first(_.prop_satisfies(_.matches "%.vsix$", "name"), release.assets) github diff --git a/lua/mason/providers/registry-api/init.lua b/lua/mason/providers/registry-api/init.lua index 8bab8911..0f98a407 100644 --- a/lua/mason/providers/registry-api/init.lua +++ b/lua/mason/providers/registry-api/init.lua @@ -40,4 +40,25 @@ return { return api.rubygems.versions.all { gem = gem } end, }, + packagist = { + get_latest_version = function(pkg) + return api.packagist.versions.latest { pkg = pkg } + end, + get_all_versions = function(pkg) + return api.packagist.versions.all { pkg = pkg } + end, + }, + crates = { + get_latest_version = function(crate) + return api.crate.versions.latest { crate = crate } + end, + get_all_versions = function(crate) + return api.crate.versions.all { crate = crate } + end, + }, + golang = { + get_all_versions = function(pkg) + return api.golang.versions.all { pkg = api.encode_uri_component(pkg) } + end, + }, } diff --git a/tests/mason-registry/api_spec.lua b/tests/mason-registry/api_spec.lua index 18e359b7..548db78b 100644 --- a/tests/mason-registry/api_spec.lua +++ b/tests/mason-registry/api_spec.lua @@ -49,4 +49,8 @@ describe("mason-registry API", function() assert.spy(fetch).was_called(1) assert.spy(fetch).was_called_with(match.is_match "/api/github/myrepo/name/releases/latest$", match.is_table()) end) + + it("should percent encode path parameters", function() + assert.equals("golang.org%2fx%2ftools%2fgopls", api.encode_uri_component "golang.org/x/tools/gopls") + end) end) |
