1+ //Setup
2+ export default async function ( { login, q, imports, data, account} , { enabled = false } = { } ) {
3+ //Plugin execution
4+ try {
5+ //Check if plugin is enabled and requirements are met
6+ if ( ( ! enabled ) || ( ! q . starlists ) )
7+ return null
8+
9+ //Load inputs
10+ let { limit, ignored, only, "limit.repositories" :_limit } = imports . metadata . plugins . starlists . inputs ( { data, account, q} )
11+
12+ //Start puppeteer and navigate to star lists
13+ console . debug ( `metrics/compute/${ login } /plugins > starlists > starting browser` )
14+ const browser = await imports . puppeteer . launch ( )
15+ console . debug ( `metrics/compute/${ login } /plugins > starlists > started ${ await browser . version ( ) } ` )
16+ const page = await browser . newPage ( )
17+
18+ //Fetch star lists
19+ console . debug ( `metrics/compute/${ login } /plugins > starlists > fetching lists` )
20+ await page . goto ( `https://github.com/${ login } ?tab=stars` )
21+ let lists = ( await page . evaluate ( ( ) => [ ...document . querySelectorAll ( "[href^='/stars/lowlighter/lists']" ) ] . map ( element => ( {
22+ link :element . href ,
23+ name :element . querySelector ( "h3" ) ?. innerText ?? "" ,
24+ description :element . querySelector ( "span" ) ?. innerText ?? "" ,
25+ count :Number ( element . querySelector ( "div" ) ?. innerText . match ( / (?< count > \d + ) / ) ?. groups . count ) ,
26+ repositories :[ ]
27+ } ) ) ) )
28+ const count = lists . length
29+ lists = lists . slice ( 0 , limit ) . filter ( ( { name} ) => ( only . includes ( name . toLocaleLowerCase ( ) ) ) || ( ( ! only . length ) && ( ( ! name ) || ( ! ignored . includes ( name . toLocaleLowerCase ( ) ) ) ) ) )
30+ console . debug ( `metrics/compute/${ login } /plugins > starlists > extracted ${ lists . length } lists` )
31+
32+ //Fetch star list content
33+ for ( const list of lists ) {
34+ console . debug ( `metrics/compute/${ login } /plugins > starlists > fetching ${ list . name } ` )
35+ await page . goto ( list . link )
36+ const repositories = await page . evaluate ( ( ) => [ ...document . querySelectorAll ( "#user-list-repositories > div" ) ] . map ( element => ( {
37+ name :element . querySelector ( "div:first-child" ) ?. innerText . replace ( " / " , "/" ) ?? "" ,
38+ description :element . querySelector ( ".py-1" ) ?. innerText ?? ""
39+ } ) ) )
40+ list . repositories . push ( ...repositories )
41+ list . repositories = list . repositories . slice ( 0 , _limit )
42+ }
43+
44+ //Close browser
45+ console . debug ( `metrics/compute/${ login } /plugins > starlists > closing browser` )
46+ await browser . close ( )
47+
48+ //Results
49+ return { lists, count}
50+ }
51+ //Handle errors
52+ catch ( error ) {
53+ throw { error :{ message :"An error occured" , instance :error } }
54+ }
55+ }
0 commit comments