@microcode/flywaydb-cli
Version:
Install latest flywaydb-cli as a node module
239 lines (192 loc) • 7.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.rmTmpDir = exports.makeBinLink = exports.extractTolib = exports.downloadFlywaySource = exports.getReleaseSource = undefined;
var _os = require('os');
var _os2 = _interopRequireDefault(_os);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _request = require('request');
var _request2 = _interopRequireDefault(_request);
var _requestPromise = require('request-promise');
var _requestPromise2 = _interopRequireDefault(_requestPromise);
var _requestProgress = require('request-progress');
var _requestProgress2 = _interopRequireDefault(_requestProgress);
var _progress = require('progress');
var _progress2 = _interopRequireDefault(_progress);
var _extractZip = require('extract-zip');
var _extractZip2 = _interopRequireDefault(_extractZip);
var _child_process = require('child_process');
var _filesize = require('filesize');
var _filesize2 = _interopRequireDefault(_filesize);
var _rimraf = require('rimraf');
var _rimraf2 = _interopRequireDefault(_rimraf);
var _package = require('../../package');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const env = process.env;
const repoBaseUrl = 'https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline';
/**
* @returns sources[os.platform()]
*/
const getReleaseSource = exports.getReleaseSource = () => (0, _requestPromise2.default)({
uri: `${repoBaseUrl}/maven-metadata.xml`
}).then(response => {
let releaseRegularExp = new RegExp('<release>(.+)</release>');
let releaseVersion = _package.flyway.version ? _package.flyway.version : response.match(releaseRegularExp)[1];
let sources = {
'win32': {
url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-windows-x64.zip`,
filename: `flyway-commandline-${releaseVersion}-windows-x64.zip`,
folder: `flyway-${releaseVersion}`
},
'linux': {
url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-linux-x64.tar.gz`,
filename: `flyway-commandline-${releaseVersion}-linux-x64.tar.gz`,
folder: `flyway-${releaseVersion}`
},
'darwin': {
url: `${repoBaseUrl}/${releaseVersion}/flyway-commandline-${releaseVersion}-macosx-x64.tar.gz`,
filename: `flyway-commandline-${releaseVersion}-macosx-x64.tar.gz`,
folder: `flyway-${releaseVersion}`
}
};
return sources[_os2.default.platform()];
});
/**
* @param {any} source
* @returns source.filename
*/
const downloadFlywaySource = exports.downloadFlywaySource = source => {
let downloadDir = _path2.default.join(__dirname, '../../', 'tmp');
if (!source) {
throw new Error('Your platform is not supported');
}
source.filename = _path2.default.join(downloadDir, source.filename);
if (_fs2.default.existsSync(source.filename)) {
return Promise.resolve(source.filename);
} else {
(0, _rimraf2.default)(downloadDir, () => {
_fs2.default.mkdirSync(downloadDir);
});
}
console.log('Downloading', source.url);
console.log('Saving to', source.filename);
return new Promise((resolve, reject) => {
let proxyUrl = env.npm_config_https_proxy || env.npm_config_http_proxy || env.npm_config_proxy;
let downloadOptions = {
uri: source.url,
encoding: null, // Get response as a buffer
followRedirect: true,
headers: {
'User-Agent': env.npm_config_user_agent
},
strictSSL: true,
proxy: proxyUrl
};
let consoleDownloadBar;
(0, _requestProgress2.default)((0, _request2.default)(downloadOptions, (error, response, body) => {
if (!error && response.statusCode === 200) {
_fs2.default.writeFileSync(source.filename, body);
console.log(`\nReceived ${(0, _filesize2.default)(body.length)} total.`);
resolve(source.filename);
} else if (response) {
console.error(`
Error requesting source.
Status: ${response.statusCode}
Request options: ${JSON.stringify(downloadOptions, null, 2)}
Response headers: ${JSON.stringify(response.headers, null, 2)}
Make sure your network and proxy settings are correct.
If you continue to have issues, please report this full log at https://github.com/sgraham/flywaydb-cli`);
process.exit(1);
} else {
console.error('Error downloading : ', error);
process.exit(1);
}
})).on('progress', state => {
try {
if (!consoleDownloadBar) {
consoleDownloadBar = new _progress2.default(' [:bar] :percent', { total: state.size.total, width: 40 });
}
consoleDownloadBar.curr = state.size.transferred;
consoleDownloadBar.tick();
} catch (e) {
console.log('error', e);
}
});
});
};
/**
* @param {any} file
* @returns extractDir
*/
const extractTolib = exports.extractTolib = file => {
let extractDir = _path2.default.join(__dirname, '../../', 'lib');
if (!_fs2.default.existsSync(extractDir)) {
_fs2.default.mkdirSync(extractDir);
} else {
return Promise.resolve(extractDir);
}
if (_path2.default.extname(file) === '.zip') {
return new Promise((resolve, reject) => {
(0, _extractZip2.default)(file, { dir: extractDir }, err => {
if (err) {
console.error('Error extracting zip', err);
reject(new Error('Error extracting zip'));
} else {
resolve(extractDir);
}
});
});
} else {
return new Promise((resolve, reject) => {
(0, _child_process.spawn)('tar', ['zxf', file], {
cwd: extractDir,
stdio: 'inherit'
}).on('close', code => {
if (code === 0) {
resolve(extractDir);
} else {
console.log('Untaring file failed', code);
reject(new Error('Untaring file failed'));
}
});
});
}
};
/**
* @param {any} libDir
* @returns
*/
const makeBinLink = exports.makeBinLink = libDir => {
return new Promise((resolve, reject) => {
let versionDirs = flywayVersionDir(libDir);
let flywayDir = _path2.default.join(libDir, versionDirs[0]);
let binDir = _path2.default.join(__dirname, '../../', 'bin');
let relPath = _path2.default.relative(binDir, flywayDir);
if (_fs2.default.existsSync(flywayDir)) {
if (_fs2.default.existsSync(binDir)) {
_fs2.default.unlinkSync(_path2.default.join(binDir, 'flyway'));
_fs2.default.symlinkSync(_path2.default.join(relPath, 'flyway'), _path2.default.join(binDir, 'flyway'));
} else {
_fs2.default.mkdirSync(binDir);
_fs2.default.symlinkSync(_path2.default.join(relPath, 'flyway'), _path2.default.join(binDir, 'flyway'));
}
resolve();
} else {
reject(new Error(`flywayDir was not found at ${flywayDir}`));
}
});
};
/**
* @param {any} libDir
*/
const flywayVersionDir = libDir => _fs2.default.readdirSync(libDir).filter(file => _fs2.default.statSync(_path2.default.join(libDir, file)).isDirectory());
const rmTmpDir = exports.rmTmpDir = () => {
let tmpDir = _path2.default.join(__dirname, '../../', 'tmp');
(0, _rimraf2.default)(tmpDir, () => {
console.log(`Deleted ${tmpDir}`);
});
};