Skip to content

Instantly share code, notes, and snippets.

@sverrejoh
Last active October 12, 2022 15:37
Show Gist options
  • Select an option

  • Save sverrejoh/e629f0e3f72f8d9d597b50b7b22d7624 to your computer and use it in GitHub Desktop.

Select an option

Save sverrejoh/e629f0e3f72f8d9d597b50b7b22d7624 to your computer and use it in GitHub Desktop.
(defun svj-npm-get-latest-version (dependency-name)
(let* ((url (format "https://registry.npmjs.org/%s" dependency-name))
(buffer (url-retrieve-synchronously url t)))
(with-current-buffer buffer
(goto-char url-http-end-of-headers)
(unwind-protect
(cdr (assq 'latest (assq 'dist-tags (json-read))))
(kill-buffer buffer)))))
(defun svj-npm-query-replace-dependency ()
(interactive)
(while (re-search-forward "\"\\([^\"]+\\)\": \"\\([~^]*\\)\\(.*\\)\"" nil t)
(let* ((dependency-match-data (match-data))
(dependency-name (match-string 1))
(dependency-modifier (match-string 2))
(dependency-version (match-string 3))
(latest-version (save-match-data (svj-npm-get-latest-version dependency-name)))
(latest-dependency-modifier
(if (string= dependency-modifier "")
"^"
dependency-modifier)))
(cond ((string= dependency-version latest-version)
(message (format "Package '%s' '%s%s' is up to date"
(substring-no-properties dependency-name)
(substring-no-properties dependency-modifier)
(substring-no-properties dependency-version))))
((string= dependency-version "*")
(message (format "Package '%s' '%s%s' is set to whildcard version and not upgradable."
(substring-no-properties dependency-name)
(substring-no-properties dependency-modifier)
(substring-no-properties dependency-version))))
((y-or-n-p (format "Query Upgrade: '%s' from version '%s%s' to '%s%s'?"
(substring-no-properties dependency-name)
(substring-no-properties dependency-modifier)
(substring-no-properties dependency-version)
(substring-no-properties latest-dependency-modifier)
latest-version))
(progn
(set-match-data dependency-match-data)
(replace-match
(format "\"%s\": \"%s%s\""
dependency-name
latest-dependency-modifier
latest-version))))))))
(global-set-key "\C-c\C-u" 'svj-npm-query-replace-dependency)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment