bit-bin
Version:
<a href="https://opensource.org/licenses/Apache-2.0"><img alt="apache" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="https://github.com/teambit/bit/blob/master/CONTRIBUTING.md"><img alt="prs" src="https://img.shields.io/b
384 lines (298 loc) • 11.7 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Compile = void 0;
function _bluebird() {
const data = require("bluebird");
_bluebird = function () {
return data;
};
return data;
}
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _pMapSeries() {
const data = _interopRequireDefault(require("p-map-series"));
_pMapSeries = function () {
return data;
};
return data;
}
function _constants() {
const data = require("./../../constants");
_constants = function () {
return data;
};
return data;
}
function _bitId() {
const data = require("../../bit-id");
_bitId = function () {
return data;
};
return data;
}
function _buildComponent() {
const data = _interopRequireDefault(require("../../consumer/component-ops/build-component"));
_buildComponent = function () {
return data;
};
return data;
}
function _dataToPersist() {
const data = _interopRequireDefault(require("../../consumer/component/sources/data-to-persist"));
_dataToPersist = function () {
return data;
};
return data;
}
function _logger() {
const data = _interopRequireDefault(require("../../logger/logger"));
_logger = function () {
return data;
};
return data;
}
function _loader() {
const data = _interopRequireDefault(require("../../cli/loader"));
_loader = function () {
return data;
};
return data;
}
function _sources() {
const data = require("../../consumer/component/sources");
_sources = function () {
return data;
};
return data;
}
function _componentIdToPackageName() {
const data = _interopRequireDefault(require("../../utils/bit/component-id-to-package-name"));
_componentIdToPackageName = function () {
return data;
};
return data;
}
function _utils() {
const data = require("../../utils");
_utils = function () {
return data;
};
return data;
}
function _packageJsonFile() {
const data = _interopRequireDefault(require("../../consumer/component/package-json-file"));
_packageJsonFile = function () {
return data;
};
return data;
}
class Compile {
constructor(workspace, envs, task) {
this.workspace = workspace;
this.envs = envs;
this.task = task;
}
compileOnWorkspace(componentsIds, // when empty, it compiles all
noCache, verbose, dontPrintEnvMsg) {
var _this = this;
return (0, _bluebird().coroutine)(function* () {
const bitIds = getBitIds(componentsIds, _this.workspace);
const {
components
} = yield _this.workspace.consumer.loadComponents(_bitId().BitIds.fromArray(bitIds));
const componentsWithLegacyCompilers = [];
const componentsAndNewCompilers = [];
components.forEach(c => {
var _c$componentMap;
const environment = _this.envs.getEnvFromExtensions(c.extensions);
const compilerInstance = environment === null || environment === void 0 ? void 0 : environment.getCompiler(); // if there is no componentDir (e.g. author that added files, not dir), then we can't write the dists
// inside the component dir.
if (compilerInstance && ((_c$componentMap = c.componentMap) === null || _c$componentMap === void 0 ? void 0 : _c$componentMap.getComponentDir())) {
const compilerName = compilerInstance.constructor.name || 'compiler';
componentsAndNewCompilers.push({
component: c,
compilerInstance,
compilerName
});
} else {
componentsWithLegacyCompilers.push(c);
}
});
let newCompilersResultOnWorkspace = [];
let oldCompilersResult = [];
if (componentsAndNewCompilers.length) {
newCompilersResultOnWorkspace = yield _this.compileWithNewCompilersOnWorkspace(componentsAndNewCompilers);
}
if (componentsWithLegacyCompilers.length) {
oldCompilersResult = yield _this.compileWithLegacyCompilers(componentsWithLegacyCompilers, noCache, verbose, dontPrintEnvMsg);
}
return [...newCompilersResultOnWorkspace, ...oldCompilersResult];
})();
}
compileWithNewCompilersOnWorkspace(componentsAndNewCompilers) {
var _this2 = this;
return (0, _bluebird().coroutine)(function* () {
const build = /*#__PURE__*/function () {
var _ref = (0, _bluebird().coroutine)(function* ({
component,
compilerName: compilerId,
compilerInstance
}) {
if (!compilerInstance.compileFile) {
throw new Error(`compiler ${compilerId.toString()} doesn't implement "compileFile" interface`);
}
const packageName = (0, _componentIdToPackageName().default)(component.id, component.bindingPrefix, component.defaultScope);
const packageDir = _path().default.join('node_modules', packageName);
const distDirName = _constants().DEFAULT_DIST_DIRNAME;
const distDir = _path().default.join(packageDir, distDirName);
const dists = [];
const compileErrors = [];
yield Promise.all(component.files.map( /*#__PURE__*/function () {
var _ref2 = (0, _bluebird().coroutine)(function* (file) {
var _component$componentM;
const relativeComponentDir = (_component$componentM = component.componentMap) === null || _component$componentM === void 0 ? void 0 : _component$componentM.getComponentDir();
if (!relativeComponentDir) throw new Error(`compileWithNewCompilersOnWorkspace expect to get only components with rootDir`);
const componentDir = _path().default.join(_this2.workspace.path, relativeComponentDir);
const options = {
componentDir,
filePath: file.relative
};
let compileResults;
try {
compileResults = compilerInstance.compileFile(file.contents.toString(), options);
} catch (error) {
compileErrors.push({
path: file.path,
error
});
return;
}
const base = distDir;
if (compileResults) {
dists.push(...compileResults.map(result => new (_sources().Dist)({
base,
path: _path().default.join(base, result.outputPath),
contents: Buffer.from(result.outputText)
})));
} else {
// compiler doesn't support this file type. copy the file as is to the dist dir.
dists.push(new (_sources().Dist)({
base,
path: _path().default.join(base, file.relative),
contents: file.contents
}));
}
});
return function (_x2) {
return _ref2.apply(this, arguments);
};
}()));
if (compileErrors.length) {
const formatError = errorItem => `${errorItem.path}\n${errorItem.error}`;
throw new Error(`compilation failed. see the following errors from the compiler
${compileErrors.map(formatError).join('\n')}`);
} // writing the dists with `component.setDists(dists); component.dists.writeDists` is tricky
// as it uses other base-paths and doesn't respect the new node-modules base path.
const dataToPersist = new (_dataToPersist().default)();
dataToPersist.addManyFiles(dists);
const found = (0, _utils().searchFilesIgnoreExt)(dists, component.mainFile, 'relative');
if (!found) throw new Error(`unable to find dist main file for ${component.id.toString()}`);
const packageJson = _packageJsonFile().default.loadFromPathSync(_this2.workspace.path, packageDir);
if (!packageJson.fileExist) {
throw new Error(`failed finding package.json file in ${packageDir}, please run "bit link"`);
}
packageJson.addOrUpdateProperty('main', (0, _utils().pathJoinLinux)(distDirName, found));
dataToPersist.addFile(packageJson.toVinylFile());
dataToPersist.addBasePath(_this2.workspace.path);
yield dataToPersist.persistAllToFS();
const oneBuildResults = dists.map(distFile => distFile.path);
if (component.compiler) _loader().default.succeed();
return {
component: component.id.toString(),
buildResults: oneBuildResults
};
});
return function build(_x) {
return _ref.apply(this, arguments);
};
}();
const allBuildResults = yield (0, _pMapSeries().default)(componentsAndNewCompilers, build);
return allBuildResults;
})();
}
compileWithLegacyCompilers(components, noCache, verbose, dontPrintEnvMsg) {
var _this3 = this;
return (0, _bluebird().coroutine)(function* () {
_logger().default.debugAndAddBreadCrumb('scope.buildMultiple', 'using the legacy build mechanism');
const build = /*#__PURE__*/function () {
var _ref3 = (0, _bluebird().coroutine)(function* (component) {
if (component.compiler) _loader().default.start(`building component - ${component.id}`);
yield component.build({
scope: _this3.workspace.consumer.scope,
consumer: _this3.workspace.consumer,
noCache,
verbose,
dontPrintEnvMsg
});
const buildResults = yield component.dists.writeDists(component, _this3.workspace.consumer, false);
if (component.compiler) _loader().default.succeed();
return {
component: component.id.toString(),
buildResults
};
});
return function build(_x3) {
return _ref3.apply(this, arguments);
};
}();
const writeLinks = /*#__PURE__*/function () {
var _ref4 = (0, _bluebird().coroutine)(function* (component) {
return component.dists.writeDistsLinks(component, _this3.workspace.consumer);
});
return function writeLinks(_x4) {
return _ref4.apply(this, arguments);
};
}();
const buildResults = yield (0, _pMapSeries().default)(components, build);
yield (0, _pMapSeries().default)(components, writeLinks);
return buildResults;
})();
}
populateComponentDist(params, component) {
return (0, _buildComponent().default)({
component: component.consumerComponent,
scope: this.workspace.consumer.scope,
consumer: this.workspace.consumer,
verbose: params.verbose,
noCache: params.noCache
});
}
writeComponentDist(componentAndCapsule) {
return (0, _bluebird().coroutine)(function* () {
const dataToPersist = new (_dataToPersist().default)();
const distsFiles = componentAndCapsule.consumerComponent.dists.get();
distsFiles.map(d => d.updatePaths({
newBase: 'dist'
}));
dataToPersist.addManyFiles(distsFiles);
yield dataToPersist.persistAllToCapsule(componentAndCapsule.capsule);
return distsFiles.map(d => d.path);
})();
}
}
exports.Compile = Compile;
function getBitIds(componentsIds, workspace) {
if (componentsIds.length) {
return componentsIds.map(compId => compId instanceof _bitId().BitId ? compId : workspace.consumer.getParsedId(compId));
}
return workspace.consumer.bitMap.getAuthoredAndImportedBitIds();
}
;