syncpack
Version:
Consistent dependency versions in large JavaScript Monorepos
84 lines (83 loc) • 3.56 kB
JavaScript
import { Effect } from 'effect';
import { isArrayOfStrings } from 'tightrope/guard/is-array-of-strings.js';
import { isNonEmptyArray } from 'tightrope/guard/is-non-empty-array.js';
import { isNonEmptyString } from 'tightrope/guard/is-non-empty-string.js';
import { isObject } from 'tightrope/guard/is-object.js';
import { isValidSemverRange } from '../guards/is-valid-semver-range.js';
import { DisabledSemverGroup } from './disabled.js';
import { FilteredOutSemverGroup } from './filtered-out.js';
import { IgnoredSemverGroup } from './ignored.js';
import { SemverGroup } from './index.js';
import { WithRangeSemverGroup } from './with-range.js';
export function createSemverGroups(ctx) {
const { rcFile } = ctx.config;
const semverGroups = [
Effect.succeed(new FilteredOutSemverGroup(ctx)),
Effect.succeed(new WithRangeSemverGroup(false, {
dependencies: ['**'],
dependencyTypes: ['local'],
label: 'the version property of package.json files must always be exact',
packages: ['**'],
range: '',
})),
];
if (isNonEmptyArray(rcFile.semverGroups)) {
rcFile.semverGroups.forEach((config) => {
if (!isObject(config)) {
return semverGroups.push(Effect.fail(new SemverGroup.ConfigError({
config,
error: 'config is not an object',
})));
}
const mutuallyExclusiveProps = ['isIgnored', 'range'].filter(prop => Boolean(config[prop]));
if (mutuallyExclusiveProps.length > 1) {
return semverGroups.push(Effect.fail(new SemverGroup.ConfigError({
config,
error: `it's unclear what kind of semver group you want, as it contains both ${mutuallyExclusiveProps.join(' and ')}`,
})));
}
const label = isNonEmptyString(config.label) ? config.label : '';
const dependencyTypes = isArrayOfStrings(config.dependencyTypes)
? config.dependencyTypes
: ['**'];
const dependencies = isArrayOfStrings(config.dependencies)
? config.dependencies
: ['**'];
const packages = isArrayOfStrings(config.packages)
? config.packages
: ['**'];
const specifierTypes = isArrayOfStrings(config.specifierTypes)
? config.specifierTypes
: ['**'];
if (config.isIgnored === true) {
semverGroups.push(Effect.succeed(new IgnoredSemverGroup({
dependencies,
dependencyTypes,
specifierTypes,
isIgnored: true,
label,
packages,
})));
}
else if (isValidSemverRange(config.range)) {
semverGroups.push(Effect.succeed(new WithRangeSemverGroup(false, {
dependencies,
dependencyTypes,
specifierTypes,
label,
packages,
range: config.range,
})));
}
});
}
semverGroups.push(Effect.succeed(new DisabledSemverGroup(true, {
dependencies: ['**'],
dependencyTypes: ['**'],
specifierTypes: ['**'],
label: 'Default Semver Group',
packages: ['**'],
isDisabled: true,
})));
return Effect.all(semverGroups);
}