1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
local util = require 'lspconfig.util'
local log = require 'vim.lsp.log'
return {
default_config = {
-- (default: false) Whether or not we should automatically start the
-- Relay Compiler in watch mode when you open a project
auto_start_compiler = false,
-- (default: nil) Path to a relay config relative to the `root_dir`.
-- Without this, the compiler will search for your config. This is
-- helpful if your relay project is in a nested directory.
path_to_config = nil,
cmd = { 'relay-compiler', 'lsp' },
filetypes = {
'javascript',
'javascriptreact',
'javascript.jsx',
'typescript',
'typescriptreact',
'typescript.tsx',
},
root_dir = util.root_pattern('relay.config.*', 'package.json'),
on_new_config = function(config, root_dir)
local project_root = util.find_node_modules_ancestor(root_dir)
local node_bin_path = util.path.join(project_root, 'node_modules', '.bin')
local compiler_cmd = { util.path.join(node_bin_path, 'relay-compiler'), '--watch' }
local path = node_bin_path .. util.path.path_separator .. vim.env.PATH
if config.cmd_env then
config.cmd_env.PATH = path
else
config.cmd_env = { PATH = path }
end
if config.path_to_config then
config.path_to_config = util.path.sanitize(config.path_to_config)
local path_to_config = util.path.join(root_dir, config.path_to_config)
if util.path.exists(path_to_config) then
vim.list_extend(config.cmd, { config.path_to_config })
vim.list_extend(compiler_cmd, { config.path_to_config })
else
log.error "[Relay LSP] Can't find Relay config file. Fallback to the default location..."
end
end
if config.auto_start_compiler then
vim.fn.jobstart(compiler_cmd, {
on_exit = function()
log.info '[Relay LSP] Relay Compiler exited'
end,
cwd = project_root,
})
end
end,
handlers = {
['window/showStatus'] = function(_, result)
if not result then
return {}
end
local log_message = string.format('[Relay LSP] %q', result.message)
if result.type == 1 then
log.error(log_message)
end
if result.type == 2 then
log.warn(log_message)
end
if result.type == 3 then
log.info(log_message)
end
return {}
end,
},
},
docs = {
description = [[
https://github.com/facebook/relay
`Relay` is a JavaScript framework for building data-driven React applications
Setup:
- Make sure you have a Relay config file somewhere in your project.
- We support standard config file formats (`.yml`, `.js`, `.json`), and the the `relay` field in your `package.json`
- Make sure you have the `relay-compiler` installed in your project. The bare minimum is v13.
- Make sure you are able to run the `relay-compiler` command from the command line. If `yarn relay-compiler` works, it's very likely that the LSP will work.
- Remove / disable any conflicting GraphQL LSPs you have installed.
Relay LSP is a part of the Relay Compiler binary and available when adding `relay-compiler` to your project's devDependencies.
```lua
require'lspconfig'.relay_lsp.setup {
-- (default: false) Whether or not we should automatically start
-- the Relay Compiler in watch mode when you open a project
auto_start_compiler = false,
-- (default: null) Path to a relay config relative to the
-- `root_dir`. Without this, the compiler will search for your
-- config. This is helpful if your relay project is in a nested
-- directory.
path_to_config = nil,
}
```
]],
default_config = {
root_dir = [[root_pattern("relay.config.*", "package.json")]],
auto_start_compiler = false,
path_to_config = nil,
},
},
}
|