1 ! Copyright (C) 2023 Doug Coleman.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: arrays assocs concurrency.combinators continuations
4 github hashtables http.client io.encodings.string
5 io.encodings.utf8 json kernel math.order semver sequences
6 sorting.specification splitting strings ;
9 MEMO: get-npm-json ( name -- json )
10 "https://registry.npmjs.org/" prepend
11 [ http-get nip utf8 decode json> ] [ 2drop H{ } clone ] recover ;
13 ! "@babel/core-7.12": "npm:@babel/core@7.12.9"
14 : dep-names8 ( deps -- dep-names )
15 [ nip "npm:" head? not ] assoc-partition
19 [ CHAR: @ = ] find-last
24 GENERIC: deps ( obj -- seq )
25 M: hashtable deps "dependencies" of { } or ;
26 M: string deps get-npm-json deps ;
28 GENERIC: dev-deps ( obj -- seq )
29 M: hashtable dev-deps "devDependencies" of { } or ;
30 M: string dev-deps get-npm-json dev-deps ;
31 M: f dev-deps drop { } ;
33 : npm-versions ( name -- version ) get-npm-json "versions" of ;
34 : npm-time ( name -- version ) get-npm-json "time" of ;
36 : sort-versions-asc ( versions -- versions' ) { { >semver <=> } } sort-keys-with-spec keys ;
37 : sort-versions-dsc ( versions -- versions' ) { { >semver >=< } } sort-keys-with-spec keys ;
38 : npm-latest-version ( name -- version )
39 [ npm-versions ] [ npm-versions sort-versions-asc ?last ] bi of ;
41 : ?github-package-json ( owner repo -- json/f )
42 '[ _ _ "package.json" github-file-contents json> ]
45 : github-package-json-latest ( owner repo -- json/f )
46 ?github-package-json [
47 [ "dependencies" of ] [ "devDependencies" of ] bi 2array [
48 [ over npm-latest-version "version" of 2array ] parallel-assoc-map
49 [ first2 = not ] filter-values