You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.3 KiB
106 lines
3.3 KiB
var path = require('path');
|
|
var fs = require('fs');
|
|
var config = require( __dirname + '/./config' );
|
|
var Promise = require('bluebird');
|
|
var _exec = Promise.promisify( require('child_process').exec );
|
|
|
|
var REGISTRY_NAME = config.REGISTRY_NAME;
|
|
var LOCAL_REGISTRY = config.LOCAL_REGISTRY;
|
|
var NPM_PATH = config.NPM_PATH;
|
|
|
|
|
|
function exec( cmd, envVars ){
|
|
return _exec( cmd, { env: envVars });
|
|
}
|
|
exports.exec = exec;
|
|
|
|
function fileExists( fname ){
|
|
return new Promise( function( resolve ){
|
|
fs.exists( fname, function(exists){
|
|
resolve( exists );
|
|
});
|
|
});
|
|
}
|
|
exports.fileExists = fileExists;
|
|
|
|
var readFile = Promise.promisify( fs.readFile );
|
|
exports.readFile = readFile;
|
|
|
|
|
|
exports.patchData = function ( data ){
|
|
/* Get the list of versions which is available in local cache */
|
|
var cacheJsonFile, cacheJsonFileData = [];
|
|
|
|
if( config.STRICT ){
|
|
cacheJsonFile = path.join( NPM_PATH, data.name );
|
|
cacheJsonFileData = fs.existsSync( cacheJsonFile ) ? fs.readdirSync( cacheJsonFile ) : [];
|
|
}
|
|
|
|
Object.keys(data.versions).forEach( function( v ){
|
|
var val = data.versions[v];
|
|
|
|
|
|
if( cacheJsonFileData.length && config.STRICT ){
|
|
/* Suppose our cache.json is at latest revision. It contains lot of versions which is not available in local cache.
|
|
Then, Remove the versions which is not in local cache from the list. Otherwise npm will always choose higher versions whcih is not available in our cache */
|
|
if( cacheJsonFileData.indexOf(v) == -1 ){
|
|
delete data.versions[v];
|
|
return;
|
|
}
|
|
}
|
|
|
|
var protocal = 'http://';
|
|
if( val.dist.tarball.indexOf( 'https:' ) !== false ){
|
|
protocal = 'https://';
|
|
}
|
|
val.dist.tarball = val.dist.tarball.replace( protocal + REGISTRY_NAME, LOCAL_REGISTRY );
|
|
});
|
|
};
|
|
|
|
var fetchAndCacheMetadataCmd =[
|
|
'mkdir -p $packageCacheDir',
|
|
'wget -nv "http://$REGISTRY_NAME/$packageName" -O $cacheFile || { wgetExitStatus=$? && rm $cacheFile; exit $wgetExitStatus ; }'
|
|
].join( ';' );
|
|
|
|
var fetchAndCacheTarballCmd = [
|
|
'mkdir -p $packageTarballDir',
|
|
'wget -nv $tarballUrl -O $tarballPath || { wgetExitStatus=$? && rm $tarballPath; exit $wgetExitStatus ; }',
|
|
'cd $packageTarballDir; tar -xzf package.tgz package/package.json',
|
|
].join( ';' );
|
|
|
|
|
|
function encodePackageName( packageName ){
|
|
//handle slash in scoped package name but do not convert @
|
|
return encodeURIComponent(packageName).replace(/^%40/, '@');
|
|
}
|
|
|
|
exports.fetchAndCacheMetadata = function ( packageName, cacheFile ){
|
|
var packageCacheDir = path.dirname( cacheFile );
|
|
packageName = encodePackageName( packageName );
|
|
return exec( fetchAndCacheMetadataCmd, {
|
|
packageCacheDir: packageCacheDir,
|
|
REGISTRY_NAME: REGISTRY_NAME,
|
|
packageName: packageName,
|
|
cacheFile: cacheFile,
|
|
});
|
|
};
|
|
|
|
exports.fetchAndCacheTarball = function ( packageName, version, tarballPath, scopeName ){
|
|
packageName = encodePackageName( packageName );
|
|
|
|
var tarballUrl = 'http://' + REGISTRY_NAME + '/' + packageName + '/-/' + packageName + '-' + version + '.tgz';
|
|
if (scopeName) {
|
|
tarballUrl = 'http://' + REGISTRY_NAME + '/' + scopeName + '/' + packageName + '/-/' + packageName + '-' + version + '.tgz';
|
|
}
|
|
var packageTarballDir = path.dirname( tarballPath );
|
|
|
|
return exec( fetchAndCacheTarballCmd, {
|
|
packageTarballDir: packageTarballDir,
|
|
tarballUrl: tarballUrl,
|
|
tarballPath: tarballPath,
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|