96 lines
2.4 KiB
Lua
96 lines
2.4 KiB
Lua
---@diagnostic disable: inject-field
|
|
if lazyvim_docs then
|
|
-- Enable the option to require a Prettier config file
|
|
-- If no prettier config file is found, the formatter will not be used
|
|
vim.g.lazyvim_prettier_needs_config = false
|
|
end
|
|
|
|
---@alias ConformCtx {buf: number, filename: string, dirname: string}
|
|
local M = {}
|
|
|
|
local supported = {
|
|
"css",
|
|
"graphql",
|
|
"handlebars",
|
|
"html",
|
|
"javascript",
|
|
"javascriptreact",
|
|
"json",
|
|
"jsonc",
|
|
"less",
|
|
"markdown",
|
|
"markdown.mdx",
|
|
"scss",
|
|
"typescript",
|
|
"typescriptreact",
|
|
"vue",
|
|
"yaml",
|
|
}
|
|
|
|
--- Checks if a Prettier config file exists for the given context
|
|
---@param ctx ConformCtx
|
|
function M.has_config(ctx)
|
|
vim.fn.system({ "prettier", "--find-config-path", ctx.filename })
|
|
return vim.v.shell_error == 0
|
|
end
|
|
|
|
--- Checks if a parser can be inferred for the given context:
|
|
--- * If the filetype is in the supported list, return true
|
|
--- * Otherwise, check if a parser can be inferred
|
|
---@param ctx ConformCtx
|
|
function M.has_parser(ctx)
|
|
local ft = vim.bo[ctx.buf].filetype --[[@as string]]
|
|
-- default filetypes are always supported
|
|
if vim.tbl_contains(supported, ft) then
|
|
return true
|
|
end
|
|
-- otherwise, check if a parser can be inferred
|
|
local ret = vim.fn.system({ "prettier", "--file-info", ctx.filename })
|
|
---@type boolean, string?
|
|
local ok, parser = pcall(function()
|
|
return vim.fn.json_decode(ret).inferredParser
|
|
end)
|
|
return ok and parser and parser ~= vim.NIL
|
|
end
|
|
|
|
M.has_config = LazyVim.memoize(M.has_config)
|
|
M.has_parser = LazyVim.memoize(M.has_parser)
|
|
|
|
return {
|
|
{
|
|
"williamboman/mason.nvim",
|
|
opts = { ensure_installed = { "prettier" } },
|
|
},
|
|
|
|
-- conform
|
|
{
|
|
"stevearc/conform.nvim",
|
|
optional = true,
|
|
---@param opts ConformOpts
|
|
opts = function(_, opts)
|
|
opts.formatters_by_ft = opts.formatters_by_ft or {}
|
|
for _, ft in ipairs(supported) do
|
|
opts.formatters_by_ft[ft] = { "prettier" }
|
|
end
|
|
|
|
opts.formatters = opts.formatters or {}
|
|
opts.formatters.prettier = {
|
|
condition = function(_, ctx)
|
|
return M.has_parser(ctx) and (vim.g.lazyvim_prettier_needs_config ~= true or M.has_config(ctx))
|
|
end,
|
|
}
|
|
end,
|
|
},
|
|
|
|
-- none-ls support
|
|
{
|
|
"nvimtools/none-ls.nvim",
|
|
optional = true,
|
|
opts = function(_, opts)
|
|
local nls = require("null-ls")
|
|
opts.sources = opts.sources or {}
|
|
table.insert(opts.sources, nls.builtins.formatting.prettier)
|
|
end,
|
|
},
|
|
}
|