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
179 lines (131 loc) • 4.93 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = determineMainFile;
function path() {
const data = _interopRequireWildcard(require("path"));
path = function () {
return data;
};
return data;
}
function _ramda() {
const data = _interopRequireDefault(require("ramda"));
_ramda = function () {
return data;
};
return data;
}
function _exceptions() {
const data = require("../../bit-map/exceptions");
_exceptions = function () {
return data;
};
return data;
}
function _constants() {
const data = require("../../../constants");
_constants = function () {
return data;
};
return data;
}
function _path2() {
const data = require("../../../utils/path");
_path2 = function () {
return data;
};
return data;
}
function determineMainFile(addedComponent, existingComponentMap) {
const mainFile = addedComponent.mainFile;
const componentIdStr = addedComponent.componentId.toString();
const files = addedComponent.files.filter(file => !file.test);
const rootDir = existingComponentMap && existingComponentMap.rootDir;
const strategies = [getExistingIfNotChanged, getUserSpecifiedMainFile, onlyOneFileEnteredUseIt, searchForFileNameIndex, searchForSameFileNameAsImmediateDir];
for (const strategy of strategies) {
const foundMainFile = strategy();
if (foundMainFile) {
return foundMainFile;
}
}
const mainFileString = `${_constants().DEFAULT_INDEX_NAME}.[${_constants().DEFAULT_INDEX_EXTS.join(', ')}]`;
throw new (_exceptions().MissingMainFile)(componentIdStr, mainFileString, files.map(file => path().normalize(file.relativePath)));
/**
* user didn't enter mainFile but the component already exists with mainFile
*/
function getExistingIfNotChanged() {
if (!mainFile && existingComponentMap) {
return existingComponentMap.mainFile;
}
return null;
}
/**
* user entered mainFile => search the mainFile in the files array, throw error if not found
*/
function getUserSpecifiedMainFile() {
if (mainFile) {
const foundMainFile = _searchMainFile((0, _path2().pathNormalizeToLinux)(mainFile));
if (foundMainFile) return foundMainFile;
throw new (_exceptions().MissingMainFile)(componentIdStr, mainFile, files.map(file => path().normalize(file.relativePath)));
}
return null;
}
/**
* user didn't enter mainFile and the component has only one file, use that file as the main file
*/
function onlyOneFileEnteredUseIt() {
if (files.length === 1) {
return files[0].relativePath;
}
return null;
}
/**
* user didn't enter mainFile and the component has multiple files, search for file name "index",
* e.g. `index.js`, `index.css`, etc.
*/
function searchForFileNameIndex() {
for (const ext of _constants().DEFAULT_INDEX_EXTS) {
const mainFileNameToSearch = `${_constants().DEFAULT_INDEX_NAME}.${ext}`;
const searchResult = _searchMainFile(mainFileNameToSearch);
if (searchResult) {
return searchResult;
}
}
return null;
}
/**
* user didn't enter mainFile and the component has multiple files, search for file with the same
* name as the directory (see #1714)
*/
function searchForSameFileNameAsImmediateDir() {
if (addedComponent.immediateDir) {
for (const ext of _constants().DEFAULT_INDEX_EXTS) {
const mainFileNameToSearch = `${addedComponent.immediateDir}.${ext}`;
const searchResult = _searchMainFile(mainFileNameToSearch);
if (searchResult) {
return searchResult;
}
}
}
return null;
}
function _searchMainFile(baseMainFile) {
// search for an exact relative-path
let mainFileFromFiles = files.find(file => file.relativePath === baseMainFile);
if (mainFileFromFiles) return baseMainFile;
if (rootDir) {
const mainFileUsingRootDir = files.find(file => (0, _path2().pathJoinLinux)(rootDir, file.relativePath) === baseMainFile);
if (mainFileUsingRootDir) return mainFileUsingRootDir.relativePath;
} // search for a file-name
const potentialMainFiles = files.filter(file => file.name === baseMainFile);
if (!potentialMainFiles.length) return null; // when there are several files that met the criteria, choose the closer to the root
const sortByNumOfDirs = (a, b) => a.relativePath.split(_constants().DEFAULT_SEPARATOR).length - b.relativePath.split(_constants().DEFAULT_SEPARATOR).length;
potentialMainFiles.sort(sortByNumOfDirs);
mainFileFromFiles = _ramda().default.head(potentialMainFiles); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return mainFileFromFiles.relativePath;
}
}
;