A Neovim plugin that provides the SchemaStore catalog for use with jsonls and yamlls.
{ 'b0o/schemastore.nvim' }
vim.pack (Neovim 0.12+):
vim.pack.add({ 'https://github.com/b0o/schemastore.nvim' })
These examples require Neovim 0.11+, nvim-lspconfig, and the corresponding language server installed.
Configure jsonls:
vim.lsp.config('jsonls', {
settings = {
json = {
schemas = require('schemastore').json.schemas(),
validate = { enable = true },
},
},
})
vim.lsp.enable('jsonls')
validate = { enable = true } is recommended; see #8 for details.
Configure yamlls, disabling its built-in SchemaStore support to use this plugin's catalog and options:
vim.lsp.config('yamlls', {
settings = {
yaml = {
schemaStore = {
enable = false,
-- Avoid TypeError: Cannot read properties of undefined (reading 'length')
url = '',
},
schemas = require('schemastore').yaml.schemas(),
},
},
})
vim.lsp.enable('yamlls')
Pass options to require('schemastore').json.schemas() in the JSON setup above, or to require('schemastore').yaml.schemas() for YAML. Both support the same options.
Both functions return independent deep copies, so customization options and manual changes to the returned data do not affect the internal catalog or other calls. JSON and YAML can use different options independently.
Use schema names from the catalog to include only specific schemas:
require('schemastore').json.schemas {
select = {
'.eslintrc',
'package.json',
},
}
Or exclude specific schemas:
require('schemastore').json.schemas {
ignore = {
'.eslintrc',
'package.json',
},
}
select and ignore are mutually exclusive; using both throws an error.
When combining select with extra, explicitly include the extra schema names in select.
Use replace to override a catalog schema's URL:
require('schemastore').json.schemas {
replace = {
['package.json'] = 'https://example.com/package.json',
},
}
Or replace its full definition, keeping the original schema name:
require('schemastore').json.schemas {
replace = {
['package.json'] = {
description = 'package.json overridden',
fileMatch = { 'package.json' },
name = 'package.json',
url = 'https://example.com/package.json',
},
},
}
Use extra to add schemas to the catalog:
require('schemastore').json.schemas {
extra = {
{
description = 'My custom JSON schema',
fileMatch = { 'foo.json', '.foo.json' },
name = 'foo.json',
url = 'https://example.com/schema/foo.json',
},
},
}
fileMatch accepts a string or a list of strings. For local schemas, set url to a file:// URL (e.g. file:///path/to/schema.json) or a plain file path (e.g. /path/to/schema.json).
© 2021-2026 Maddison Cohodas and Contributors.
Released under the Apache 2.0 License.