]> gitweb.factorcode.org Git - factor.git/blob - extra/npm/npm.factor
assocs.extras: Move some often-used words to core
[factor.git] / extra / npm / npm.factor
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 ;
7 IN: npm
8
9 MEMO: get-npm-json ( name -- json )
10     "https://registry.npmjs.org/" prepend
11     [ http-get nip utf8 decode json> ] [ 2drop H{ } clone ] recover ;
12
13 ! "@babel/core-7.12": "npm:@babel/core@7.12.9"
14 : dep-names8 ( deps -- dep-names )
15     [ nip "npm:" head? not ] assoc-partition
16     [ keys ] [
17         values [
18             "npm:" ?head drop dup
19             [ CHAR: @ = ] find-last
20             [ head ] [ drop ] if
21         ] map
22     ] bi* append ;
23
24 GENERIC: deps ( obj -- seq )
25 M: hashtable deps "dependencies" of { } or ;
26 M: string deps get-npm-json deps ;
27
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 { } ;
32
33 : npm-versions ( name -- version ) get-npm-json "versions" of ;
34 : npm-time ( name -- version ) get-npm-json "time" of ;
35
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 ;
40
41 : ?github-package-json ( owner repo -- json/f )
42     '[ _ _ "package.json" github-file-contents json> ]
43     [ drop f ] recover ;
44
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
50         ] map
51     ] transmute ;