(require 'common-lsp)
(require 'util-tree-sitter)

(use-package js
  :mode (
         ("\\.js\\'" . js-mode)
         ("\\.json\\'" . js-mode)
         )
  :commands js-mode
  :pin manual
  :hook (
         (find-file . (lambda () (when (string= (file-name-extension buffer-file-name) "json") (add-hook 'before-save-hook 'json-fmt-jq nil 'local))))
         (js-mode . (lambda ()
                      (tree-sitter-hl-mode +1)
                      )
                  )
         )
  :config
  (setq js-indent-level 2)
  )

(use-package typescript-mode
  :mode (
         ("\\.ts\\'" . typescript-mode)
         ("\\.tsx\\'" . typescript-mode)
         )
  :hook (
         (typescript-mode . (lambda ()
                              ;; (lsp-register-client
                              ;;  (make-lsp-client :new-connection (lsp-stdio-connection '("deno" "lsp" --compat --unstable --allow-read))
                              ;;                   :major-modes '(typescript-mode)
                              ;;                   :server-id 'typescript-ls))
                              (eglot-ensure)
                              (tree-sitter-hl-mode +1)
                              ))
         ;; (before-save . lsp-format-buffer)
         )
)

(defun json-fmt-jq ()
  "Run jq."
  (run-command-on-buffer "jq" "--monochrome-output" ".")
  )

(use-package web-mode
  :mode (("\\.dust\\'" . web-mode)
         )
  :config
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-enable-current-element-highlight t)
  )

;; Define a custom mode for dust so that org-mode handle #+BEGIN_SRC dust blocks
(define-derived-mode dust-mode web-mode "WebDust"
  "Major mode for editing dust templates in web-mode."
  (web-mode)
  (web-mode-set-engine "dust")
  ;; (setq web-mode-content-type "html")
  )

(provide 'lang-javascript)
