--- Cloudflare Workers and React/shadcn development tools --- Includes Workers-specific LSP, React tooling, and UI helpers --- @module plugins.cloudflare return { -- WASM/WebAssembly support for Workers { "nvim-treesitter/nvim-treesitter", optional = true, opts = function(_, opts) if opts.ensure_installed ~= "all" then opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, { "wgsl", "wgsl_bevy", }) end end, }, -- TOML support for wrangler.toml { "AstroNvim/astrolsp", optional = true, ---@type AstroLSPOpts opts = { ---@diagnostic disable: missing-fields config = { taplo = { settings = { evenBetterToml = { schema = { enabled = true, associations = { ["wrangler\\.toml"] = "https://raw.githubusercontent.com/cloudflare/workers-sdk/main/schemas/wrangler.json", }, }, }, }, }, }, }, }, -- Enhanced search/replace for refactoring React components { "nvim-pack/nvim-spectre", cmd = "Spectre", dependencies = { "nvim-lua/plenary.nvim" }, opts = { mapping = { ["toggle_line"] = { map = "dd", cmd = "lua require('spectre').toggle_line()", desc = "toggle item", }, ["enter_file"] = { map = "", cmd = "lua require('spectre.actions').select_entry()", desc = "open file", }, ["send_to_qf"] = { map = "q", cmd = "lua require('spectre.actions').send_to_qf()", desc = "send all items to quickfix", }, ["replace_cmd"] = { map = "c", cmd = "lua require('spectre.actions').replace_cmd()", desc = "input replace command", }, ["show_option_menu"] = { map = "o", cmd = "lua require('spectre').show_options()", desc = "show options", }, ["run_current_replace"] = { map = "rc", cmd = "lua require('spectre.actions').run_current_replace()", desc = "replace current line", }, ["run_replace"] = { map = "R", cmd = "lua require('spectre.actions').run_replace()", desc = "replace all", }, }, }, }, -- React component preview and development { "roobert/tailwindcss-colorizer-cmp.nvim", event = "VeryLazy", opts = { color_square_width = 2, }, config = function(_, opts) require("tailwindcss-colorizer-cmp").setup(opts) end, }, -- Color highlighting for CSS/Tailwind { "NvChad/nvim-colorizer.lua", event = { "BufReadPost", "BufNewFile" }, opts = { filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact", "css", "scss", "html", "vue", "lua", }, user_default_options = { RGB = true, RRGGBB = true, names = false, RRGGBBAA = true, AARRGGBB = false, rgb_fn = true, hsl_fn = true, css = true, css_fn = true, mode = "background", tailwind = true, sass = { enable = true, parsers = { "css" } }, virtualtext = "■", always_update = false, }, buftypes = {}, }, }, -- Import cost for monitoring bundle size { "yardnsm/vim-import-cost", build = "npm install --production", ft = { "javascript", "typescript", "javascriptreact", "typescriptreact" }, }, -- Live browser reload for Workers development { "Barrett17/browser-sync.nvim", build = "npm install -g browser-sync", cmd = { "BrowserSyncStart", "BrowserSyncReload", "BrowserSyncStop", }, opts = {}, }, -- Component generator for shadcn/ui { "chrisgrieser/nvim-scissors", dependencies = { "nvim-telescope/telescope.nvim" }, cmd = { "ScissorsAddNewSnippet", "ScissorsEditSnippet" }, opts = { snippetDir = vim.fn.stdpath "config" .. "/snippets", editSnippetPopup = { height = 0.4, width = 0.6, border = "rounded", keymaps = { cancel = "q", saveChanges = "", deleteSnippet = "d", duplicateSnippet = "c", }, }, }, }, -- HTTP client for testing Workers { "mistweaverco/kulala.nvim", ft = "http", opts = { default_view = "body", debug = false, contenttypes = { ["application/json"] = { ft = "json", formatter = { "jq", "." }, }, ["application/xml"] = { ft = "xml", formatter = { "xmllint", "--format", "-" }, }, ["text/html"] = { ft = "html", formatter = { "xmllint", "--format", "--html", "-" }, }, }, }, }, -- Enhanced movement for JSX/TSX { "echasnovski/mini.ai", event = { "BufReadPost", "BufNewFile" }, opts = function() local ai = require "mini.ai" return { custom_textobjects = { -- Function calls f = ai.gen_spec.treesitter { a = "@call.outer", i = "@call.inner" }, -- Function definitions F = ai.gen_spec.treesitter { a = "@function.outer", i = "@function.inner" }, -- Classes c = ai.gen_spec.treesitter { a = "@class.outer", i = "@class.inner" }, -- Parameters/arguments a = ai.gen_spec.treesitter { a = "@parameter.outer", i = "@parameter.inner" }, -- JSX elements x = ai.gen_spec.treesitter { a = { "@jsx_element", "@jsx_self_closing_element" }, i = { "@jsx_element", "@jsx_self_closing_element" }, }, }, } end, }, -- React component navigation { "someone-stole-my-name/yaml-companion.nvim", ft = { "yaml" }, dependencies = { { "neovim/nvim-lspconfig" }, { "nvim-lua/plenary.nvim" }, { "nvim-telescope/telescope.nvim" }, }, opts = {}, }, -- Worker-specific terminal commands via toggleterm { "akinsho/toggleterm.nvim", optional = true, opts = function(_, opts) local Terminal = require("toggleterm.terminal").Terminal -- Wrangler dev server local wrangler_dev = Terminal:new { cmd = "bunx wrangler dev", hidden = true, direction = "float", float_opts = { border = "curved", }, on_open = function(term) vim.cmd "startinsert!" vim.api.nvim_buf_set_keymap(term.bufnr, "n", "q", "close", { noremap = true, silent = true }) end, } -- Wrangler tail (logs) local wrangler_tail = Terminal:new { cmd = "bunx wrangler tail", hidden = true, direction = "horizontal", on_open = function(term) vim.cmd "startinsert!" vim.api.nvim_buf_set_keymap(term.bufnr, "n", "q", "close", { noremap = true, silent = true }) end, } -- Wrangler deploy local wrangler_deploy = Terminal:new { cmd = "bunx wrangler deploy", hidden = true, direction = "float", close_on_exit = false, on_open = function(term) vim.api.nvim_buf_set_keymap(term.bufnr, "n", "q", "close", { noremap = true, silent = true }) end, } -- Extend the opts with custom terminals opts.on_create = function() vim.keymap.set("n", "wd", function() wrangler_dev:toggle() end, { desc = "Wrangler Dev" }) vim.keymap.set("n", "wt", function() wrangler_tail:toggle() end, { desc = "Wrangler Tail" }) vim.keymap.set("n", "wp", function() wrangler_deploy:toggle() end, { desc = "Wrangler Deploy" }) end return opts end, }, }