aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer/managers/npm.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-04-04 22:02:55 +0200
committerGitHub <noreply@github.com>2023-04-04 20:02:55 +0000
commitc625abf171dfaad790f5703465a93a94334e5049 (patch)
tree46d9a2825954c29fb190ac69b8b7d21981074624 /lua/mason-core/installer/managers/npm.lua
parenttest(async): add tests for control mechanisms (#1176) (diff)
downloadmason-c625abf171dfaad790f5703465a93a94334e5049.tar
mason-c625abf171dfaad790f5703465a93a94334e5049.tar.gz
mason-c625abf171dfaad790f5703465a93a94334e5049.tar.bz2
mason-c625abf171dfaad790f5703465a93a94334e5049.tar.lz
mason-c625abf171dfaad790f5703465a93a94334e5049.tar.xz
mason-c625abf171dfaad790f5703465a93a94334e5049.tar.zst
mason-c625abf171dfaad790f5703465a93a94334e5049.zip
fix(npm): set install-strategy on npm >= 9 (#1179)
Closes #1175.
Diffstat (limited to 'lua/mason-core/installer/managers/npm.lua')
-rw-r--r--lua/mason-core/installer/managers/npm.lua24
1 files changed, 22 insertions, 2 deletions
diff --git a/lua/mason-core/installer/managers/npm.lua b/lua/mason-core/installer/managers/npm.lua
index 61cf3a38..f8312829 100644
--- a/lua/mason-core/installer/managers/npm.lua
+++ b/lua/mason-core/installer/managers/npm.lua
@@ -4,10 +4,26 @@ local installer = require "mason-core.installer"
local log = require "mason-core.log"
local path = require "mason-core.path"
local platform = require "mason-core.platform"
+local semver = require "mason-core.semver"
+local spawn = require "mason-core.spawn"
local M = {}
---@async
+---@param predicate fun(npm_version: Semver): boolean
+---@return boolean
+local function npm_version_satisfies(predicate)
+ return Result.try(function(try)
+ local npm_versions = try(spawn.npm { "version", "--json" }).stdout
+ ---@type { npm: string }
+ local versions = try(Result.pcall(vim.json.decode, npm_versions))
+ ---@type Semver
+ local npm_version = try(semver.parse(versions.npm))
+ return predicate(npm_version)
+ end):get_or_else(false)
+end
+
+---@async
function M.init()
log.debug "npm: init"
local ctx = installer.context()
@@ -18,7 +34,7 @@ function M.init()
"--scope=mason",
})
- -- Use global-style. The reasons for this are:
+ -- Use shallow install-strategy. The reasons for this are:
-- a) To avoid polluting the executables (aka bin-links) that npm creates.
-- b) The installation is, after all, more similar to a "global" installation. We don't really gain
-- any of the benefits of not using global style (e.g., deduping the dependency tree).
@@ -27,7 +43,11 @@ function M.init()
-- is a bit unreliable across npm versions (especially <7), so we take extra measures to avoid
-- inadvertently polluting global npm config.
try(Result.pcall(function()
- ctx.fs:append_file(".npmrc", "global-style=true")
+ if npm_version_satisfies(_.gte(semver.new "9.0.0")) then
+ ctx.fs:append_file(".npmrc", "\ninstall-strategy=shallow")
+ else
+ ctx.fs:append_file(".npmrc", "\nglobal-style=true")
+ end
end))
ctx.stdio_sink.stdout "Initialized npm root\n"