return {
	-- Highlight, edit, and navigate code
	"nvim-treesitter/nvim-treesitter",
	lazy = false,
	build = ":TSUpdate",
	config = function()
		local ts = require("nvim-treesitter")
		ts.setup({
			install_dir = vim.fn.stdpath("data") .. "/site",
		})

		-- Install parsers (async, no-op if already installed)
		ts.install({
			"vimdoc",
			"javascript",
			"typescript",
			"tsx",
			"c",
			"lua",
			"rust",
			"jsdoc",
			"bash",
			"svelte",
			"astro",
			"vue",
			"css",
			"scss",
			"gdscript",
			"nix",
		})

		vim.api.nvim_create_autocmd("FileType", {
			pattern = {
				"svelte",
				"javascript",
				"typescript",
				"tsx",
				"html",
				"css",
				"lua",
				"nix",
			},
			callback = function()
				pcall(vim.treesitter.start)
			end,
		})


		-- Workaround: some svelte parser/query combos don't inject JS for <script>
		-- blocks without an explicit lang attribute, which leaves raw_text as @none.
		vim.treesitter.query.set("svelte", "injections", [=[
; inherits: html_tags

((style_element
  (start_tag
    (attribute
      (attribute_name) @_attr
      (quoted_attribute_value
        (attribute_value) @_lang)))
  (raw_text) @injection.content)
  (#eq? @_attr "lang")
  (#any-of? @_lang "scss" "postcss" "less")
  (#set! injection.language "scss"))

; fallback for plain <script>...</script>
((script_element
  (raw_text) @injection.content)
  (#set! injection.language "javascript"))

((script_element
  (start_tag
    (attribute
      (attribute_name) @_attr
      (quoted_attribute_value
        (attribute_value) @_lang)))
  (raw_text) @injection.content)
  (#eq? @_attr "lang")
  (#any-of? @_lang "ts" "typescript")
  (#set! injection.language "typescript"))

((script_element
  (start_tag
    (attribute
      (attribute_name) @_attr
      (quoted_attribute_value
        (attribute_value) @_lang)))
  (raw_text) @injection.content)
  (#eq? @_attr "lang")
  (#any-of? @_lang "js" "javascript")
  (#set! injection.language "javascript"))

((element
  (start_tag
    (attribute
      (attribute_name) @_attr
      (quoted_attribute_value
        (attribute_value) @injection.language)))
  (text) @injection.content)
  (#eq? @_attr "lang")
  (#eq? @injection.language "pug"))
]=])
	end,
}
