@teambit/workspace
Version:
149 lines (146 loc) • 6.15 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.statesFilter = exports.Filter = void 0;
function _componentId() {
const data = require("@teambit/component-id");
_componentId = function () {
return data;
};
return data;
}
function _pMapSeries() {
const data = _interopRequireDefault(require("p-map-series"));
_pMapSeries = function () {
return data;
};
return data;
}
function _lodash() {
const data = require("lodash");
_lodash = function () {
return data;
};
return data;
}
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const statesFilter = exports.statesFilter = ['new', 'modified', 'deprecated', 'deleted', 'snappedOnMain', 'softTagged', 'codeModified', 'localOnly'];
class Filter {
constructor(workspace) {
this.workspace = workspace;
}
async by(criteria, ids) {
return criteria.includes(':') ? this.byMultiParamState(criteria, ids) : this.byState(criteria, ids);
}
async byState(state, ids) {
const statePerMethod = {
new: this.byNew,
modified: this.byModified,
deprecated: this.byDeprecated,
deleted: this.byDeleted,
snappedOnMain: this.bySnappedOnMain,
softTagged: this.bySoftTagged,
codeModified: this.byCodeModified,
localOnly: this.byLocalOnly
};
if (!statePerMethod[state]) {
throw new Error(`state ${state} is not recognized, possible values: ${statesFilter.join(', ')}`);
}
return statePerMethod[state].bind(this)(ids);
}
async byMultiParamState(state, ids) {
const stateSplit = state.split(':');
if (stateSplit.length < 2) {
throw new Error(`byMultiParamState expect the state to have at least one param after the colon, got ${state}`);
}
const [stateName, ...stateParams] = stateSplit;
if (stateName === 'env') {
return this.byEnv(stateParams[0], ids);
}
throw new Error(`byMultiParamState expect the state to be one of the following: ['env'], got ${stateName}`);
}
async byEnv(env, withinIds) {
const ids = withinIds || this.workspace.listIds();
const comps = await this.workspace.getMany(ids);
const compsUsingEnv = comps.filter(c => {
const envId = this.workspace.envs.getEnvId(c);
if (envId === env) return true;
// try without version
const envIdWithoutVer = _componentId().ComponentID.getStringWithoutVersion(envId);
return envIdWithoutVer === env;
});
return compsUsingEnv.map(c => c.id);
}
async byModified(withinIds) {
const ids = withinIds || (await this.workspace.listIds());
const comps = await this.workspace.getMany(ids);
const modifiedIds = await Promise.all(comps.map(async comp => (await comp.isModified()) ? comp.id : undefined));
return (0, _lodash().compact)(modifiedIds);
}
async byCodeModified(withinIds) {
const ids = withinIds || (await this.workspace.listIds());
const compFiles = await (0, _pMapSeries().default)(ids, id => this.workspace.getFilesModification(id));
const modifiedIds = compFiles.filter(c => c.isModified()).map(c => c.id);
return (0, _lodash().compact)(modifiedIds);
}
byLocalOnly(withinIds) {
const ids = withinIds || this.workspace.listIds();
return ids.filter(id => this.workspace.bitMap.getBitmapEntry(id, {
ignoreVersion: true
}).localOnly);
}
async byNew(withinIds) {
const ids = withinIds || (await this.workspace.listIds());
return ids.filter(id => !id.hasVersion());
}
async byDeprecated(withinIds) {
const ids = withinIds || (await this.workspace.listIds());
const comps = await this.workspace.getMany(ids);
const results = await Promise.all(comps.map(async c => {
const modelComponent = await this.workspace.consumer.scope.getModelComponentIfExist(c.id);
const deprecated = await modelComponent?.isDeprecated(this.workspace.consumer.scope.objects);
return deprecated ? c.id : null;
}));
return (0, _lodash().compact)(results);
}
async byDeleted(withinIds) {
const ids = withinIds || (await this.workspace.listIds());
const comps = await this.workspace.getMany(ids);
const deletedIds = comps.filter(c => c.isDeleted()).map(c => c.id);
return (0, _lodash().compact)(deletedIds);
}
byDuringMergeState() {
const unmergedComponents = this.workspace.scope.legacyScope.objects.unmergedComponents.getComponents();
return _componentId().ComponentIdList.fromArray(unmergedComponents.map(u => _componentId().ComponentID.fromObject(u.id)));
}
/**
* list components that their head is a snap, not a tag.
* this is relevant only when the lane is the default (main), otherwise, the head is always a snap.
* components that are during-merge are filtered out, we don't want them during tag and don't want
* to show them in the "snapped" section in bit-status.
*/
async bySnappedOnMain(withinIds) {
if (!this.workspace.isOnMain()) {
return [];
}
const ids = withinIds || (await this.workspace.listIds());
const compIds = _componentId().ComponentIdList.fromArray(ids);
const componentsFromModel = await this.getModelComps(ids);
const compsDuringMerge = this.byDuringMergeState();
const localOnly = this.workspace.listLocalOnly();
const comps = componentsFromModel.filter(c => compIds.hasWithoutVersion(c.toComponentId())).filter(c => !compsDuringMerge.hasWithoutVersion(c.toComponentId())).filter(c => !localOnly.hasWithoutVersion(c.toComponentId())).filter(c => c.isHeadSnap());
return comps.map(c => c.toComponentIdWithHead());
}
bySoftTagged(withinIds) {
const withCompIds = _componentId().ComponentIdList.fromArray(withinIds || []);
const all = this.workspace.consumer.bitMap.components.filter(c => c.nextVersion).map(c => c.id);
return withinIds ? all.filter(id => withCompIds.hasWithoutVersion(id)) : all;
}
async getModelComps(ids) {
const comps = await Promise.all(ids.map(id => this.workspace.scope.getBitObjectModelComponent(id, false)));
return (0, _lodash().compact)(comps);
}
}
exports.Filter = Filter;
//# sourceMappingURL=filter.js.map