(use-package js2-mode :ensure t :defer t :commands js2-mode :config (define-key js-mode-map (kbd "M-.") nil) (define-key js2-mode-map (kbd "M-.") nil) (modify-syntax-entry ?_ "w" js2-mode-syntax-table) (add-to-list 'interpreter-mode-alist (cons "node" 'js2-mode)) (setq-default js2-basic-offset 4) (setq-default js-indent-level 4) (define-key js2-mode-map (kbd "t") 'fwoar/trigger-jest) (add-hook 'js2-mode-hook 'flycheck-mode) (customize-set-variable 'js2-mode-show-parse-errors nil) (customize-set-variable 'js2-strict-missing-semi-warning nil) (customize-set-variable 'js2-strict-trailing-comma-warning nil) (customize-set-variable 'js2-strict-inconsistent-return-warning nil)) (use-package js :ensure t :config (modify-syntax-entry ?_ "w" js-mode-syntax-table) ;;; indent ternaries with arrow function correctly--- (defun js--looking-at-operator-p () "Return non-nil if point is on a JavaScript operator, other than a comma." (save-match-data (and (looking-at js--indent-operator-re) (or (not (eq (char-after) ?:)) (save-excursion (js--backward-syntactic-ws) (when (memq (char-before) '(?\) ?})) (backward-list)) (and (js--re-search-backward "[?:{]\\|\\_" nil t) (eq (char-after) ??)))) (not (and (eq (char-after) ?/) (save-excursion (eq (nth 3 (syntax-ppss)) ?/)))) (not (and (eq (char-after) ?*) ;; Generator method (possibly using computed property). (looking-at (concat "\\* *\\(?:\\[\\|" js--name-re " *(\\)")) (save-excursion (js--backward-syntactic-ws) ;; We might misindent some expressions that would ;; return NaN anyway. Shouldn't be a problem. (memq (char-before) '(?, ?} ?{))))))))) (defun fwoar/typescript-mode-hook () (tree-sitter-require 'typescript) (when (s-suffix-p ".tsx" buffer-file-name) (setq-local tree-sitter-language (tree-sitter-require 'tsx))) (flycheck-mode 1) (lsp) (prettier-js-mode 1) (tree-sitter-mode 1) (tree-sitter-hl-mode 1) (set-syntax-table rjsx-mode-syntax-table) (setq-default typescript-indent-level 2) (comment (tide-setup) (tide-hl-identifier-mode 1)) ) (use-package typescript-mode :ensure t :config (define-key typescript-mode-map (kbd "t") 'fwoar/trigger-jest) (add-hook 'typescript-mode-hook 'fwoar/typescript-mode-hook) (add-to-list 'auto-mode-alist '("\\.tsx$" . typescript-mode))) (use-package f :ensure t) (use-package tree-sitter :ensure t :config (cl-pushnew (expand-file-name "~/ts-langs") tree-sitter-load-path)) (use-package tree-sitter-langs :init (message "setting up tree-sitter-langs") (cl-pushnew (f-join *fwoar-git-repos* "github.com" "emacs-tree-sitter" "tree-sitter-langs") load-path :test 'equal) (require 'tree-sitter-langs) :after tree-sitter f :no-require t :ensure nil) (comment (use-package tide :ensure t :config (add-hook 'js2-mode-hook 'tide-setup) (add-hook 'typescript-mode-hook 'fwoar/typescript-mode-hook) (add-hook 'js2-mode-hook 'tide-hl-identifier-mode) (comment (flycheck-add-next-checker 'javascript-eslint 'javascript-tide 'append)))) (use-package rjsx-mode :ensure t :config (add-hook 'js2-mode-hook 'lsp) (define-key rjsx-mode-map (kbd "M-.") nil) (add-to-list 'auto-mode-alist '("\\.js$" . rjsx-mode))) (comment (use-package tern :config (add-hook 'js-mode-hook (lambda () (tern-mode t))) (add-hook 'js2-mode-hook (lambda () (tern-mode t)))) (use-package company-tern :ensure t :config (add-to-list 'company-backends 'company-tern) (setq company-tooltip-align-annotations t))) (comment (use-package jest :ensure t :config (defun jest--project-root () "Find the project root directory." (let ((closest-package-json (fwoar--find-package-json)) (projectile-root (projectile-project-root))) (message "%s <-> %s" closest-package-json projectile-root) (if (s-prefix-p projectile-root closest-package-json) closest-package-json projectile-root))))) (comment (use-package vue-mode :ensure t :config (add-hook 'vue-mode 'prettier-js-mode) (add-hook 'vue-mode 'flycheck-mode))) (use-package prettier-js :ensure t :delight " p" :init (add-hook 'js2-mode-hook 'prettier-js-mode) (add-hook 'css-mode 'prettier-js-mode)) (cl-defgeneric fwoar/test-on-save () (:method ())) (comment (defvar-local fwoar/*test-file-name* nil) (defun fwoar/trigger-jest () (interactive) (comment (when-let ((test-name (if fwoar/*test-file-name* fwoar/*test-file-name* (setq-local fwoar/*test-file-name* (if (projectile-test-file-p buffer-file-name) buffer-file-name (projectile-find-implementation-or-test buffer-file-name)))))) (let ((proc (make-network-process :name "jest-comm" :buffer "*jest-comm*" :family 'local :service "/tmp/jest.sock"))) (unwind-protect (process-send-string proc test-name) (delete-process proc))))) (let ((proc (make-network-process :name "jest-comm" :buffer "*jest-comm*" :family 'local :service "/tmp/jest.sock"))) (unwind-protect (process-send-string proc (format "%s\n" (f-relative buffer-file-name (project-root (project-current))))) (delete-process proc))))) (cl-defmethod fwoar/test-on-save (&context (major-mode (derived-mode typescript-mode))) (fwoar/trigger-jest)) (cl-defmethod fwoar/test-on-save (&context (major-mode (derived-mode js-mode))) (fwoar/trigger-jest)) (defun fwoar/trigger-jest ()) (defvar *tos-hook* (add-hook 'after-save-hook 'fwoar/test-on-save)) (cl-macrolet ((def-js-like-find-system (mode) `(cl-defmethod fwoar--find-system (&context (major-mode ,mode)) (find-package-json default-directory)))) (def-js-like-find-system js-mode) (def-js-like-find-system typescript-mode)) (unless (fboundp 'projectile-project-type) (defun projectile-project-type ())) (cl-defmethod fwoar--find-system (&context ((projectile-project-type) (eql 'npm))) (find-package-json default-directory))