1
1
'use strict' ;
2
2
3
3
const GitUrlParse = require ( 'git-url-parse' ) ;
4
- const Wreck = require ( '@hapi/wreck' ) ;
5
4
6
5
const Logger = require ( '../logger' ) ;
6
+ const OctokitWrapper = require ( './octokit-wrapper' ) ;
7
7
const Utils = require ( '../utils' ) ;
8
8
9
9
@@ -30,40 +30,55 @@ exports.create = (repository) => {
30
30
31
31
return head ;
32
32
} ,
33
- loadFile : async ( filename , options ) => {
33
+ loadFile : async ( filename , options = { } ) => {
34
34
35
35
if ( parsedRepository . source !== 'github.com' ) {
36
36
throw new Error ( 'Only github.com paths supported, feel free to PR at https://github.com/pkgjs/detect-node-support' ) ;
37
37
}
38
38
39
- const url = `https://raw.githubusercontent.com/ ${ parsedRepository . full_name } /HEAD/ ${ filename } ` ;
40
- Logger . log ( [ 'loader' ] , 'Loading: %s' , url ) ;
39
+ const resource = `${ parsedRepository . full_name } : ${ filename } @HEAD ` ;
40
+ Logger . log ( [ 'loader' ] , 'Loading: %s' , resource ) ;
41
41
42
- if ( options === undefined && internals . cache . has ( url ) ) {
43
- Logger . log ( [ 'loader' ] , 'From cache: %s' , url ) ;
44
- return internals . cache . get ( url ) ;
45
- }
42
+ const octokit = OctokitWrapper . create ( ) ;
46
43
47
44
try {
48
- const { payload } = await Wreck . get ( url , options ) ;
49
45
50
- if ( options === undefined ) {
51
- internals . cache . set ( url , payload ) ;
46
+ let result ;
47
+ if ( internals . cache . has ( resource ) ) {
48
+ Logger . log ( [ 'loader' ] , 'From cache: %s' , resource ) ;
49
+ result = internals . cache . get ( resource ) ;
50
+ }
51
+ else {
52
+ result = await octokit . repos . getContent ( {
53
+ owner : parsedRepository . owner ,
54
+ repo : parsedRepository . name ,
55
+ path : filename
56
+ } ) ;
57
+ }
58
+
59
+ internals . cache . set ( resource , result ) ;
60
+
61
+ Logger . log ( [ 'loader' ] , 'Loaded: %s' , resource ) ;
62
+
63
+ const content = Buffer . from ( result . data . content , 'base64' ) ;
64
+
65
+ if ( options . json ) {
66
+ // @todo : cache parsed JSON, parse YAML
67
+ return JSON . parse ( content . toString ( ) ) ;
52
68
}
53
69
54
- Logger . log ( [ 'loader' ] , 'Loaded: %s' , url ) ;
55
- return payload ;
70
+ return content ;
56
71
}
57
72
catch ( err ) {
58
73
59
- if ( err . data && err . data . res . statusCode === 404 ) {
60
- Logger . log ( [ 'loader' ] , 'Not found: %s' , url ) ;
74
+ if ( err . status === 404 ) {
75
+ Logger . log ( [ 'loader' ] , 'Not found: %s' , resource ) ;
61
76
const error = new Error ( `${ repository } does not contain a ${ filename } ` ) ;
62
77
error . code = 'ENOENT' ;
63
78
throw error ;
64
79
}
65
80
66
- Logger . error ( [ 'loader' ] , 'Failed to load: %s' , url ) ;
81
+ Logger . error ( [ 'loader' ] , 'Failed to load: %s' , resource ) ;
67
82
throw err ;
68
83
}
69
84
}
0 commit comments