feat(prettier): prettier is now enabled for all supported filetypes and no longer requires a config file by default
This commit is contained in:
@ -1,23 +1,95 @@
|
|||||||
|
---@diagnostic disable: inject-field
|
||||||
if lazyvim_docs then
|
if lazyvim_docs then
|
||||||
-- By default, prettier will only be used for formatting
|
-- Enable the option to require a Prettier config file
|
||||||
-- if a prettier configuration file is found in the project.
|
-- If no prettier config file is found, the formatter will not be used
|
||||||
-- Set to `false` to always use prettier for supported filetypes.
|
vim.g.lazyvim_prettier_needs_config = false
|
||||||
vim.g.lazyvim_prettier_needs_config = true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local needs_config = vim.g.lazyvim_prettier_needs_config ~= false
|
---@alias ConformCtx {buf: number, filename: string, dirname: string}
|
||||||
|
local M = {}
|
||||||
|
|
||||||
-- local check = vim.g.lazyvim_prettier
|
local supported = {
|
||||||
|
"css",
|
||||||
|
"fish",
|
||||||
|
"graphql",
|
||||||
|
"handlebars",
|
||||||
|
"html",
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"json",
|
||||||
|
"jsonc",
|
||||||
|
"less",
|
||||||
|
"lua",
|
||||||
|
"markdown",
|
||||||
|
"markdown.mdx",
|
||||||
|
"mysql",
|
||||||
|
"plsql",
|
||||||
|
"scss",
|
||||||
|
"sh",
|
||||||
|
"sql",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact",
|
||||||
|
"vue",
|
||||||
|
"yaml",
|
||||||
|
}
|
||||||
|
|
||||||
local enabled = {} ---@type table<string, boolean>
|
--- 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 {
|
return {
|
||||||
{
|
{
|
||||||
"williamboman/mason.nvim",
|
"williamboman/mason.nvim",
|
||||||
|
opts = { ensure_installed = { "prettier" } },
|
||||||
|
},
|
||||||
|
|
||||||
|
-- conform
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
---@param opts ConformOpts
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
table.insert(opts.ensure_installed, "prettier")
|
opts.formatters_by_ft = opts.formatters_by_ft or {}
|
||||||
|
for _, ft in ipairs(supported) do
|
||||||
|
opts.formatters_by_ft[ft] = { "prettier" }
|
||||||
|
end
|
||||||
|
|
||||||
|
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,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- none-ls support
|
||||||
{
|
{
|
||||||
"nvimtools/none-ls.nvim",
|
"nvimtools/none-ls.nvim",
|
||||||
optional = true,
|
optional = true,
|
||||||
@ -27,43 +99,4 @@ return {
|
|||||||
table.insert(opts.sources, nls.builtins.formatting.prettier)
|
table.insert(opts.sources, nls.builtins.formatting.prettier)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"stevearc/conform.nvim",
|
|
||||||
optional = true,
|
|
||||||
opts = {
|
|
||||||
formatters_by_ft = {
|
|
||||||
["javascript"] = { "prettier" },
|
|
||||||
["javascriptreact"] = { "prettier" },
|
|
||||||
["typescript"] = { "prettier" },
|
|
||||||
["typescriptreact"] = { "prettier" },
|
|
||||||
["vue"] = { "prettier" },
|
|
||||||
["css"] = { "prettier" },
|
|
||||||
["scss"] = { "prettier" },
|
|
||||||
["less"] = { "prettier" },
|
|
||||||
["html"] = { "prettier" },
|
|
||||||
["json"] = { "prettier" },
|
|
||||||
["jsonc"] = { "prettier" },
|
|
||||||
["yaml"] = { "prettier" },
|
|
||||||
["markdown"] = { "prettier" },
|
|
||||||
["markdown.mdx"] = { "prettier" },
|
|
||||||
["graphql"] = { "prettier" },
|
|
||||||
["handlebars"] = { "prettier" },
|
|
||||||
["svelte"] = { "prettier" },
|
|
||||||
},
|
|
||||||
formatters = {
|
|
||||||
prettier = {
|
|
||||||
condition = function(_, ctx)
|
|
||||||
if not needs_config then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
if enabled[ctx.filename] == nil then
|
|
||||||
vim.fn.system({ "prettier", "--find-config-path", ctx.filename })
|
|
||||||
enabled[ctx.filename] = vim.v.shell_error == 0
|
|
||||||
end
|
|
||||||
return enabled[ctx.filename]
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user