diff options
Diffstat (limited to 'lua/mason-core/installer/registry')
8 files changed, 98 insertions, 94 deletions
diff --git a/lua/mason-core/installer/registry/init.lua b/lua/mason-core/installer/registry/init.lua index 0cec2161..e97a8430 100644 --- a/lua/mason-core/installer/registry/init.lua +++ b/lua/mason-core/installer/registry/init.lua @@ -33,6 +33,7 @@ M.register_provider("luarocks", _.lazy_require "mason-core.installer.registry.pr M.register_provider("npm", _.lazy_require "mason-core.installer.registry.providers.npm") M.register_provider("nuget", _.lazy_require "mason-core.installer.registry.providers.nuget") M.register_provider("opam", _.lazy_require "mason-core.installer.registry.providers.opam") +M.register_provider("openvsx", _.lazy_require "mason-core.installer.registry.providers.openvsx") M.register_provider("pypi", _.lazy_require "mason-core.installer.registry.providers.pypi") ---@param purl Purl diff --git a/lua/mason-core/installer/registry/providers/generic/build.lua b/lua/mason-core/installer/registry/providers/generic/build.lua index 6d2769e1..a0d517d8 100644 --- a/lua/mason-core/installer/registry/providers/generic/build.lua +++ b/lua/mason-core/installer/registry/providers/generic/build.lua @@ -1,6 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" -local build = require "mason-core.installer.managers.build" +local common = require "mason-core.installer.managers.common" local expr = require "mason-core.installer.registry.expr" local util = require "mason-core.installer.registry.util" @@ -15,7 +15,7 @@ local M = {} function M.parse(source, purl, opts) return Result.try(function(try) ---@type BuildInstruction - local build_instruction = try(util.coalesce_by_target(source.build, opts):ok_or "PLATFORM_UNSUPPORTED") + local build_instruction = try(util.coalesce_by_target(source.build, opts)) if build_instruction.env then local expr_ctx = { version = purl.version, target = build_instruction.target } @@ -34,7 +34,7 @@ end ---@param ctx InstallContext ---@param source ParsedGenericBuildSource function M.install(ctx, source) - return build.run(source.build) + return common.run_build_instruction(source.build) end return M diff --git a/lua/mason-core/installer/registry/providers/generic/download.lua b/lua/mason-core/installer/registry/providers/generic/download.lua index a7e4d046..4622a844 100644 --- a/lua/mason-core/installer/registry/providers/generic/download.lua +++ b/lua/mason-core/installer/registry/providers/generic/download.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local common = require "mason-core.installer.managers.common" local expr = require "mason-core.installer.registry.expr" local util = require "mason-core.installer.registry.util" @@ -17,15 +18,25 @@ local M = {} ---@param opts PackageInstallOpts function M.parse(source, purl, opts) return Result.try(function(try) - local download = try(util.coalesce_by_target(source.download, opts):ok_or "PLATFORM_UNSUPPORTED") + local download = try(util.coalesce_by_target(source.download, opts)) local expr_ctx = { version = purl.version } ---@type { files: table<string, string> } local interpolated_download = try(expr.tbl_interpolate(download, expr_ctx)) + ---@type DownloadItem[] + local downloads = _.map(function(pair) + ---@type DownloadItem + return { + out_file = pair[1], + download_url = pair[2], + } + end, _.to_pairs(interpolated_download.files)) + ---@class ParsedGenericDownloadSource : ParsedPackageSource local parsed_source = { download = interpolated_download, + downloads = downloads, } return parsed_source end) @@ -35,13 +46,7 @@ end ---@param ctx InstallContext ---@param source ParsedGenericDownloadSource function M.install(ctx, source) - local std = require "mason-core.installer.managers.std" - return Result.try(function(try) - for out_file, url in pairs(source.download.files) do - try(std.download_file(url, out_file)) - try(std.unpack(out_file)) - end - end) + return common.download_files(ctx, source.downloads) end return M diff --git a/lua/mason-core/installer/registry/providers/github/build.lua b/lua/mason-core/installer/registry/providers/github/build.lua index bda0b655..1c17bb1a 100644 --- a/lua/mason-core/installer/registry/providers/github/build.lua +++ b/lua/mason-core/installer/registry/providers/github/build.lua @@ -1,6 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" -local build = require "mason-core.installer.managers.build" +local common = require "mason-core.installer.managers.common" local expr = require "mason-core.installer.registry.expr" local util = require "mason-core.installer.registry.util" @@ -15,7 +15,7 @@ local M = {} function M.parse(source, purl, opts) return Result.try(function(try) ---@type BuildInstruction - local build_instruction = try(util.coalesce_by_target(source.build, opts):ok_or "PLATFORM_UNSUPPORTED") + local build_instruction = try(util.coalesce_by_target(source.build, opts)) local expr_ctx = { version = purl.version } @@ -44,7 +44,7 @@ function M.install(ctx, source) local std = require "mason-core.installer.managers.std" return Result.try(function(try) try(std.clone(source.repo, { rev = source.rev })) - try(build.run(source.build)) + try(common.run_build_instruction(source.build)) end) end diff --git a/lua/mason-core/installer/registry/providers/github/release.lua b/lua/mason-core/installer/registry/providers/github/release.lua index 5fe95cab..8c8a8a8f 100644 --- a/lua/mason-core/installer/registry/providers/github/release.lua +++ b/lua/mason-core/installer/registry/providers/github/release.lua @@ -1,17 +1,13 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" -local a = require "mason-core.async" +local common = require "mason-core.installer.managers.common" local expr = require "mason-core.installer.registry.expr" local providers = require "mason-core.providers" local settings = require "mason.settings" local util = require "mason-core.installer.registry.util" ----@class GitHubReleaseAsset ----@field target? Platform | Platform[] ----@field file string | string[] - ---@class GitHubReleaseSource : RegistryPackageSource ----@field asset GitHubReleaseAsset | GitHubReleaseAsset[] +---@field asset FileDownloadSpec | FileDownloadSpec[] local M = {} @@ -20,63 +16,22 @@ local M = {} ---@param opts PackageInstallOpts function M.parse(source, purl, opts) return Result.try(function(try) - local asset = try(util.coalesce_by_target(source.asset, opts):ok_or "PLATFORM_UNSUPPORTED") - local expr_ctx = { version = purl.version } + ---@type FileDownloadSpec + local asset = try(util.coalesce_by_target(try(expr.tbl_interpolate(source.asset, expr_ctx)), opts)) - ---@type { out_file: string, download_url: string }[] - local downloads = {} - - local interpolated_asset = try(expr.tbl_interpolate(asset, expr_ctx)) - - ---@param file string - ---@return Result # Result<{ source_file: string, out_file: string }> - local function parse_asset_file(file) - return Result.try(function(try) - local asset_file_components = _.split(":", file) - local source_file = try(expr.interpolate(_.head(asset_file_components), expr_ctx)) - local out_file = try(expr.interpolate(_.last(asset_file_components), expr_ctx)) - - if _.matches("/$", out_file) then - -- out_file is a dir expression (e.g. "libexec/") - out_file = out_file .. source_file - end - - return { - source_file = source_file, - out_file = out_file, - } - end) - end - - local get_downloads = _.map(function(asset_file) - return { - out_file = asset_file.out_file, - download_url = settings.current.github.download_url_template:format( - ("%s/%s"):format(purl.namespace, purl.name), - purl.version, - asset_file.source_file - ), - } + local downloads = common.parse_downloads(asset, function(file) + return settings.current.github.download_url_template:format( + ("%s/%s"):format(purl.namespace, purl.name), + purl.version, + file + ) end) - if type(asset.file) == "string" then - local parsed_asset_file = try(parse_asset_file(asset.file)) - downloads = get_downloads { parsed_asset_file } - interpolated_asset.file = parsed_asset_file.out_file - else - local parsed_asset_files = {} - for _, file in ipairs(asset.file) do - table.insert(parsed_asset_files, try(parse_asset_file(file))) - end - downloads = get_downloads(parsed_asset_files) - interpolated_asset.file = _.map(_.prop "out_file", parsed_asset_files) - end - ---@class ParsedGitHubReleaseSource : ParsedPackageSource local parsed_source = { repo = ("%s/%s"):format(purl.namespace, purl.name), - asset = interpolated_asset, + asset = common.normalize_files(asset), downloads = downloads, } return parsed_source @@ -87,26 +42,7 @@ end ---@param ctx InstallContext ---@param source ParsedGitHubReleaseSource function M.install(ctx, source) - local std = require "mason-core.installer.managers.std" - - return Result.try(function(try) - for __, download in ipairs(source.downloads) do - a.scheduler() - local out_dir = vim.fn.fnamemodify(download.out_file, ":h") - local out_file = vim.fn.fnamemodify(download.out_file, ":t") - if out_dir ~= "." then - try(Result.pcall(function() - ctx.fs:mkdirp(out_dir) - end)) - end - try(ctx:chdir(out_dir, function() - return Result.try(function(try) - try(std.download_file(download.download_url, out_file)) - try(std.unpack(out_file)) - end) - end)) - end - end) + return common.download_files(ctx, source.downloads) end ---@async diff --git a/lua/mason-core/installer/registry/providers/npm.lua b/lua/mason-core/installer/registry/providers/npm.lua index d1865b96..e8489fe8 100644 --- a/lua/mason-core/installer/registry/providers/npm.lua +++ b/lua/mason-core/installer/registry/providers/npm.lua @@ -1,7 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" local providers = require "mason-core.providers" -local util = require "mason-core.installer.registry.util" ---@param purl Purl local function purl_to_npm(purl) diff --git a/lua/mason-core/installer/registry/providers/openvsx.lua b/lua/mason-core/installer/registry/providers/openvsx.lua new file mode 100644 index 00000000..df52807a --- /dev/null +++ b/lua/mason-core/installer/registry/providers/openvsx.lua @@ -0,0 +1,63 @@ +local Result = require "mason-core.result" +local common = require "mason-core.installer.managers.common" +local expr = require "mason-core.installer.registry.expr" +local providers = require "mason-core.providers" +local util = require "mason-core.installer.registry.util" + +local M = {} + +---@class OpenVSXSourceDownload : FileDownloadSpec +---@field target_platform? string + +---@class OpenVSXSource : RegistryPackageSource +---@field download FileDownloadSpec | FileDownloadSpec[] + +---@param source OpenVSXSource +---@param purl Purl +---@param opts PackageInstallOpts +function M.parse(source, purl, opts) + return Result.try(function(try) + local expr_ctx = { version = purl.version } + ---@type OpenVSXSourceDownload + local download = try(util.coalesce_by_target(try(expr.tbl_interpolate(source.download, expr_ctx)), opts)) + + local downloads = common.parse_downloads(download, function(file) + if download.target_platform then + return ("https://open-vsx.org/api/%s/%s/%s/%s/file/%s"):format( + purl.namespace, + purl.name, + download.target_platform, + purl.version, + file + ) + else + return ("https://open-vsx.org/api/%s/%s/%s/file/%s"):format( + purl.namespace, + purl.name, + purl.version, + file + ) + end + end) + + ---@class ParsedOpenVSXSource : ParsedPackageSource + local parsed_source = { + download = common.normalize_files(download), + downloads = downloads, + } + return parsed_source + end) +end + +---@param ctx InstallContext +---@param source ParsedOpenVSXSource +function M.install(ctx, source) + return common.download_files(ctx, source.downloads) +end + +---@param purl Purl +function M.get_versions(purl) + return providers.openvsx.get_all_versions(purl.namespace, purl.name) +end + +return M diff --git a/lua/mason-core/installer/registry/util.lua b/lua/mason-core/installer/registry/util.lua index 33aa5c33..d0045a3e 100644 --- a/lua/mason-core/installer/registry/util.lua +++ b/lua/mason-core/installer/registry/util.lua @@ -10,10 +10,10 @@ local M = {} ---@generic T : { target: Platform | Platform[] } ---@param candidates T[] | T ---@param opts PackageInstallOpts ----@return Optional # Optional<T> +---@return Result # Result<T> function M.coalesce_by_target(candidates, opts) if not vim.tbl_islist(candidates) then - return Optional.of(candidates) + return Result.success(candidates) end return Optional.of_nilable(_.find_first(function(asset) if opts.target then @@ -33,7 +33,7 @@ function M.coalesce_by_target(candidates, opts) return platform.is[asset.target] end end - end, candidates)) + end, candidates)):ok_or "PLATFORM_UNSUPPORTED" end ---Checks whether a custom version of a package installation corresponds to a valid version. |
