deep-package-manager
Version:
DEEP Package Manager
136 lines (101 loc) • 3.3 kB
JavaScript
/**
* Created by CCristi on 6/16/16.
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GitHubModuleInstance = undefined;
var _ModuleInstance = require('./ModuleInstance');
var _StandardStrategy = require('../GitHub/ExtractStrategy/StandardStrategy');
var _WaitFor = require('../../Helpers/WaitFor');
var _GitHubDriver = require('../Storage/Driver/GitHubDriver');
var _tarStream = require('tar-stream');
var _tarStream2 = _interopRequireDefault(_tarStream);
var _gunzipMaybe = require('gunzip-maybe');
var _gunzipMaybe2 = _interopRequireDefault(_gunzipMaybe);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _createOutputStream = require('create-output-stream');
var _createOutputStream2 = _interopRequireDefault(_createOutputStream);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class GitHubModuleInstance extends _ModuleInstance.ModuleInstance {
/**
* @param {Object} args
*/
constructor(...args) {
super(...args);
}
/**
* @param {String} dumpPath
* @param {Function} cb
*/
extract(dumpPath, cb) {
let moduleUri = this.storage.strategy.getModuleLocation(this.context);
this._gitHubDriver.readObjStreamed(moduleUri, (error, streamResponse) => {
if (error) {
cb(error, null);
return;
}
this._extractResponse(streamResponse, dumpPath, cb);
});
}
/**
* @param {stream.Stream|*} dataStream
* @param {String} dumpPath
* @param {Function} cb
* @param {AbstractStrategy|StandardStrategy|null} extractStrategy
* @private
*/
_extractResponse(dataStream, dumpPath, cb, extractStrategy = null) {
console.debug(`Dumping '${this.context}' dependency into '${dumpPath}'`);
let unTarStream = _tarStream2.default.extract();
let wait = new _WaitFor.WaitFor();
let filesToExtract = 0;
wait.push(() => {
return filesToExtract <= 0;
});
unTarStream.on('entry', (header, stream, next) => {
if (header.type === 'directory') {
stream.resume().on('end', next);
return;
}
filesToExtract++;
let filePath = header.name.replace(/^([^\/]+\/)/, '');
if (this._haveToDump(filePath)) {
let file = _path2.default.join(dumpPath, _StandardStrategy.StandardStrategy.normalizeFilePath(filePath));
let output = (0, _createOutputStream2.default)(file);
output.on('finish', () => {
filesToExtract--;
next();
});
stream.pipe(output);
return;
}
filesToExtract--;
stream.resume().on('end', next);
});
unTarStream.on('finish', () => {
wait.ready(cb);
});
dataStream.setDefaultEncoding('binary');
dataStream.pipe((0, _gunzipMaybe2.default)()).pipe(unTarStream);
}
/**
* @param {String} filePath
* @returns {Boolean}
* @private
*/
_haveToDump(filePath) {
let depName = this.context.name;
let regExp = new RegExp(`^\/?src\/${depName}\/`, 'i');
return regExp.test(filePath);
}
/**
* @returns {GitHubDriver}
*/
get _gitHubDriver() {
return this.storage.driver.find(_GitHubDriver.GitHubDriver);
}
}
exports.GitHubModuleInstance = GitHubModuleInstance;