nvim/lua/cosmic/lsp/commands.lua
2024-03-06 07:20:13 -08:00

107 lines
3.5 KiB
Lua

local user_config = require('cosmic.core.user')
local found = false
for _, plugin in ipairs(user_config.add_plugins) do
if plugin[1] == 'pmizio/typescript-tools.nvim' then
found = true
break
end
end
if found then
-- Major props to @failen here
-- https://github.com/pmizio/typescript-tools.nvim/issues/124
vim.api.nvim_create_user_command('NxInit', function()
local now = tostring(os.time())
local fileName = string.format('%s_graph.json', now)
-- @TODO check if we should use yarn or npx
local cmd = string.format('yarn -s nx graph --file=%s', fileName)
local function handle_response(_, code)
-- read the file into memory
local projectGraphFile = io.open(fileName, 'r')
if projectGraphFile then
-- read project graph from file
local projectGraph = vim.json.decode(projectGraphFile:read('*a'))
projectGraphFile:close()
-- remove the graph file
os.remove(fileName)
-- get typescript-tools lsp client
local lspClients = vim.lsp.get_clients()
local tsclient
for _, client in ipairs(lspClients) do
if client.name == 'typescript-tools' then
tsclient = client
end
end
if not tsclient then
print('typescript-tools.nvim not active')
return
end
-- get workspace root
-- always first? alternatives to get absolute workspace root?
local workspacePath = tsclient.config.workspace_folders[1].name
if not workspacePath then
print('Could not figure out workspace path')
return
end
-- create external files for monodon
local externalFiles = {}
for _, project in pairs(projectGraph.graph.nodes) do
local sourceRoot = project.data.sourceRoot
-- skip the root
if sourceRoot ~= '.' and sourceRoot then
-- localte the entry file. perhaps use tsconfig.[app|lib].json
local mainFile
if
project.data
and project.data.targets
and project.data.targets.build
and project.data.targets.build.options
and project.data.targets.build.options.main
then
mainFile = workspacePath .. '/' .. project.data.targets.build.options.main
else
mainFile = workspacePath .. '/' .. sourceRoot .. '/index.ts'
end
-- insert to config
table.insert(externalFiles, {
mainFile = mainFile, -- this is not always index.ts!
directory = workspacePath .. '/' .. sourceRoot,
})
end
end
-- print(vim.inspect(externalFiles))
-- send configuration request of monodon plugin to tsserver
local constants = require('typescript-tools.protocol.constants')
local method = constants.CustomMethods.ConfigurePlugin
local args = {
pluginName = '@monodon/typescript-nx-imports-plugin',
configuration = {
externalFiles = externalFiles,
},
}
---@diagnostic disable-next-line: missing-parameter
tsclient.request(method, args, function()
print('tsserver handled configuration request', method)
end)
print('NX Plugin initialized!')
end
end
-- call nx deamon with graph request, run it in the background with job
vim.fn.jobstart(cmd, {
on_exit = handle_response,
stdout_buffered = true,
stderr_buffered = true,
})
end, {})
end