b0o/SchemaStore.nvim

website github github
lsp
stars 1,047
issues 11
subscribers 8
forks 22
CREATED

UPDATED


SchemaStore.nvim

License: Apache 2.0 Test Status Build Status

A Neovim plugin that provides the SchemaStore catalog for use with jsonls and yamlls.

Installation

Lazy.nvim:

{ 'b0o/schemastore.nvim' }

vim.pack (Neovim 0.12+):

vim.pack.add({ 'https://github.com/b0o/schemastore.nvim' })

Setup

These examples require Neovim 0.11+, nvim-lspconfig, and the corresponding language server installed.

JSON

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.

YAML

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')

Customizing schemas

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.

Select or ignore schemas

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.

Replace schemas

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',
    },
  },
}

Add schemas

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).

License

© 2021-2026 Maddison Cohodas and Contributors.

Released under the Apache 2.0 License.