11'use strict' ;
22
33const GitUrlParse = require ( 'git-url-parse' ) ;
4- const Wreck = require ( '@hapi/wreck' ) ;
54
65const Logger = require ( '../logger' ) ;
6+ const OctokitWrapper = require ( './octokit-wrapper' ) ;
77const Utils = require ( '../utils' ) ;
88
99
@@ -30,40 +30,55 @@ exports.create = (repository) => {
3030
3131 return head ;
3232 } ,
33- loadFile : async ( filename , options ) => {
33+ loadFile : async ( filename , options = { } ) => {
3434
3535 if ( parsedRepository . source !== 'github.com' ) {
3636 throw new Error ( 'Only github.com paths supported, feel free to PR at https://github.com/pkgjs/detect-node-support' ) ;
3737 }
3838
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 ) ;
4141
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 ( ) ;
4643
4744 try {
48- const { payload } = await Wreck . get ( url , options ) ;
4945
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 ( ) ) ;
5268 }
5369
54- Logger . log ( [ 'loader' ] , 'Loaded: %s' , url ) ;
55- return payload ;
70+ return content ;
5671 }
5772 catch ( err ) {
5873
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 ) ;
6176 const error = new Error ( `${ repository } does not contain a ${ filename } ` ) ;
6277 error . code = 'ENOENT' ;
6378 throw error ;
6479 }
6580
66- Logger . error ( [ 'loader' ] , 'Failed to load: %s' , url ) ;
81+ Logger . error ( [ 'loader' ] , 'Failed to load: %s' , resource ) ;
6782 throw err ;
6883 }
6984 }
0 commit comments