pkg-fetch
Version:
Github Releases page of this project contains base binaries, used by `pkg` to create executables. `pkg-fetch` npm package downloads base binaries or compiles them from source.
289 lines (209 loc) • 9.04 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.system = exports.need = undefined;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var need = exports.need = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var nodeRange, platform, arch, forceFetch, forceBuild, dryRun, satisfyingNodeVersion, nodeVersion, withStars, fetched, built, remote, fetchFailed;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
satisfyingNodeVersion = function satisfyingNodeVersion(includeLowPriority) {
var versions = (0, _keys2.default)(_patches2.default).filter(function (nv) {
return includeLowPriority || !_patches2.default[nv].lowPriority;
}).filter(function (nv) {
return _semver2.default.satisfies(nv, nodeRange) || nodeRange === 'latest';
}).sort(function (nv1, nv2) {
return _semver2.default.gt(nv1, nv2);
});
return versions.pop();
};
// eslint-disable-line complexity
nodeRange = opts.nodeRange, platform = opts.platform, arch = opts.arch, forceFetch = opts.forceFetch, forceBuild = opts.forceBuild, dryRun = opts.dryRun;
if (nodeRange) {
_context.next = 4;
break;
}
throw (0, _log.wasReported)('nodeRange not specified');
case 4:
if (platform) {
_context.next = 6;
break;
}
throw (0, _log.wasReported)('platform not specified');
case 6:
if (arch) {
_context.next = 8;
break;
}
throw (0, _log.wasReported)('arch not specified');
case 8:
nodeRange = (0, _system.abiToNodeRange)(nodeRange); // 'm48' -> 'node6'
if ((0, _system.isValidNodeRange)(nodeRange)) {
_context.next = 11;
break;
}
throw (0, _log.wasReported)('nodeRange must start with \'node\'');
case 11:
if (nodeRange !== 'latest') {
nodeRange = 'v' + nodeRange.slice(4); // 'node6' -> 'v6' for semver
}
platform = (0, _system.toFancyPlatform)(platform); // win32 -> win
arch = (0, _system.toFancyArch)(arch); // ia32 -> x86
nodeVersion = void 0;
if (nodeRange === 'latest') {
nodeVersion = satisfyingNodeVersion(true);
} else {
nodeVersion = satisfyingNodeVersion(false);
if (!nodeVersion) {
nodeVersion = satisfyingNodeVersion(true);
}
}
if (nodeVersion) {
_context.next = 19;
break;
}
withStars = (0, _keys2.default)(_patches2.default).map(function (nv) {
return nv.slice(1) + (_patches2.default[nv].lowPriority ? '*' : '');
}).reverse().join(', ');
throw (0, _log.wasReported)('No supported node version satisfies \'' + opts.nodeRange + '\'', ['Supported node versions are:', withStars, '(*) Precompiled base binaries are available for limited number of', 'platforms. Pkg will likely have to compile base binaries from source']);
case 19:
fetched = (0, _places.localPlace)({ from: 'fetched', arch: arch, nodeVersion: nodeVersion, platform: platform, version: _package.version });
built = (0, _places.localPlace)({ from: 'built', arch: arch, nodeVersion: nodeVersion, platform: platform, version: _package.version });
remote = (0, _places.remotePlace)({ arch: arch, nodeVersion: nodeVersion, platform: platform, version: _package.version });
fetchFailed = void 0;
if (forceBuild) {
_context.next = 30;
break;
}
_context.next = 26;
return (0, _fsExtra.exists)(fetched);
case 26:
if (!_context.sent) {
_context.next = 30;
break;
}
if (!dryRun) {
_context.next = 29;
break;
}
return _context.abrupt('return', 'exists');
case 29:
return _context.abrupt('return', fetched);
case 30:
if (forceFetch) {
_context.next = 38;
break;
}
_context.next = 33;
return (0, _fsExtra.exists)(built);
case 33:
if (!_context.sent) {
_context.next = 38;
break;
}
if (!dryRun) {
_context.next = 36;
break;
}
return _context.abrupt('return', 'exists');
case 36:
if (forceBuild) _log.log.info('Reusing base binaries built locally:', built);
return _context.abrupt('return', built);
case 38:
if (forceBuild) {
_context.next = 46;
break;
}
if (!dryRun) {
_context.next = 41;
break;
}
return _context.abrupt('return', 'fetched');
case 41:
_context.next = 43;
return cloud.download(remote, fetched);
case 43:
if (!_context.sent) {
_context.next = 45;
break;
}
return _context.abrupt('return', fetched);
case 45:
fetchFailed = true;
case 46:
if (!dryRun && fetchFailed) {
_log.log.info('Not found in GitHub releases:', (0, _stringify2.default)(remote));
}
if (!dryRun) {
_log.log.info('Building base binary from source:', _path2.default.basename(built));
}
if (!(_system.hostPlatform !== platform)) {
_context.next = 50;
break;
}
throw (0, _log.wasReported)('Not able to build for \'' + opts.platform + '\' here, only for \'' + _system.hostPlatform + '\'');
case 50:
if (!(_system.hostArch !== arch)) {
_context.next = 52;
break;
}
throw (0, _log.wasReported)('Not able to build for \'' + opts.arch + '\' here, only for \'' + _system.hostArch + '\'');
case 52:
if (!(_system.knownArchs.indexOf(arch) < 0)) {
_context.next = 54;
break;
}
throw (0, _log.wasReported)('Unknown arch \'' + opts.arch + '\'. Specify ' + _system.knownArchs.join(', '));
case 54:
if (!dryRun) {
_context.next = 56;
break;
}
return _context.abrupt('return', 'built');
case 56:
_context.next = 58;
return (0, _build2.default)(nodeVersion, arch, built);
case 58:
return _context.abrupt('return', built);
case 59:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
return function need() {
return _ref.apply(this, arguments);
};
}();
var _system = require('./system.js');
var system = _interopRequireWildcard(_system);
var _places = require('./places.js');
var _log = require('./log.js');
var _cloud = require('./cloud.js');
var _build = require('./build.js');
var _build2 = _interopRequireDefault(_build);
var _fsExtra = require('fs-extra');
var _patches = require('../patches/patches.json');
var _patches2 = _interopRequireDefault(_patches);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _semver = require('semver');
var _semver2 = _interopRequireDefault(_semver);
var _package = require('../package.json');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var cloud = new _cloud.Cloud({ owner: 'zeit', repo: 'pkg-fetch' });
exports.system = system;