;;; lang/javascript/autoload.el (defvar +javascript-npm-conf (make-hash-table :test 'equal)) ;;;###autoload (defun +javascript-npm-conf (&optional project-root refresh-p) "Retrieves an alist of this project's 'package.json'. If REFRESH-P is non-nil ignore the cache." (let ((project-root (or project-root (doom-project-root)))) (or (and (not refresh-p) (gethash project-root +javascript-npm-conf)) (let ((package-file (expand-file-name "package.json" project-root))) (when-let (json (and (file-exists-p package-file) (json-read-file package-file))) (puthash project-root json +javascript-npm-conf)))))) ;;;###autoload (defun +javascript/repl () "Open a Javascript REPL. Meaning either `skewer-repl', if any of the skewer-*-mode's are enabled, or `nodejs-repl' otherwise." (interactive) (call-interactively (if (and (featurep 'skewer-mode) (or skewer-mode skewer-css-mode skewer-html-mode)) 'skewer-repl 'nodejs-repl))) ;;;###autoload (defun +javascript/skewer-this-buffer () "Toggle a globalized skewer-mode, attaching an external browser (once), initiating an internal httpd server (once) and enabling the appropriate skewer-mode for the current buffer. Run this for any buffer you want to skewer." (interactive) (when (bound-and-true-p impatient-mode) (error "Skewer-mode isn't compatible with impatient mode")) (require 'skewer-mode) (unless (process-status "httpd") (run-skewer)) (unless (and skewer-mode skewer-css-mode skewer-html-mode) (pcase major-mode ((or 'css-mode 'scss-mode 'less-css-mode) (skewer-css-mode +1)) ((or 'web-mode 'html-mode) (skewer-html-mode +1)) ('js2-mode (skewer-mode +1)) (_ (error "Invalid mode %s" major-mode))))) ;;;###autoload (defun +javascript/skewer-cleanup () "Disable skewer-mode globally and disable the httpd server." (interactive) (when (process-status "httpd") (httpd-stop)) (dolist (buf (buffer-list)) (with-current-buffer buf (if skewer-mode (skewer-mode -1)) (if skewer-css-mode (skewer-css-mode -1)) (if skewer-html-mode (skewer-html-mode -1)))))