UNPKG

syncpack

Version:

Consistent dependency versions in large JavaScript Monorepos

119 lines (118 loc) 5 kB
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 { BannedVersionGroup } from './banned.js'; import { FilteredOutVersionGroup } from './filtered-out.js'; import { IgnoredVersionGroup } from './ignored.js'; import { VersionGroup } from './index.js'; import { PinnedVersionGroup } from './pinned.js'; import { SameRangeVersionGroup } from './same-range.js'; import { SnappedToVersionGroup } from './snapped-to.js'; import { StandardVersionGroup } from './standard.js'; export function createVersionGroups(ctx) { const { rcFile } = ctx.config; const versionGroups = [Effect.succeed(new FilteredOutVersionGroup(ctx))]; if (isNonEmptyArray(rcFile.versionGroups)) { rcFile.versionGroups.forEach((config) => { if (!isObject(config)) { return versionGroups.push(Effect.fail(new VersionGroup.ConfigError({ config, error: 'config is not an object', }))); } const mutuallyExclusiveProps = ['isBanned', 'isIgnored', 'pinVersion', 'snapTo', 'policy'].filter(prop => Boolean(config[prop])); if (mutuallyExclusiveProps.length > 1) { return versionGroups.push(Effect.fail(new VersionGroup.ConfigError({ config, error: `it's unclear what kind of version 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.isBanned === true) { versionGroups.push(Effect.succeed(new BannedVersionGroup({ dependencies, dependencyTypes, specifierTypes, isBanned: true, label, packages, }))); } else if (config.isIgnored === true) { versionGroups.push(Effect.succeed(new IgnoredVersionGroup({ dependencies, dependencyTypes, specifierTypes, isIgnored: true, label, packages, }))); } else if (isNonEmptyString(config.pinVersion)) { versionGroups.push(Effect.succeed(new PinnedVersionGroup({ dependencies, dependencyTypes, specifierTypes, label, packages, pinVersion: config.pinVersion, }))); } else if (isArrayOfStrings(config.snapTo)) { versionGroups.push(Effect.succeed(new SnappedToVersionGroup({ dependencies, dependencyTypes, specifierTypes, label, packages, snapTo: config.snapTo, }))); } else if (config.policy === 'sameRange') { versionGroups.push(Effect.succeed(new SameRangeVersionGroup(ctx, { dependencies, dependencyTypes, specifierTypes, label, packages, policy: config.policy, }))); } else { versionGroups.push(Effect.succeed(new StandardVersionGroup(false, { dependencies, dependencyTypes, specifierTypes, label, packages, preferVersion: config.preferVersion === 'lowestSemver' ? 'lowestSemver' : 'highestSemver', }))); } }); } versionGroups.push(Effect.succeed(new StandardVersionGroup(true, { dependencies: ['**'], dependencyTypes: ['**'], specifierTypes: ['**'], label: 'Default Version Group', packages: ['**'], preferVersion: 'highestSemver', }))); return Effect.all(versionGroups); }