Skip to content

Commit

Permalink
refactor(cli): decouple io and data transformation
Browse files Browse the repository at this point in the history
  • Loading branch information
JamieMason committed Feb 5, 2023
1 parent dbe5a97 commit 39ee3f9
Show file tree
Hide file tree
Showing 71 changed files with 948 additions and 813 deletions.
9 changes: 9 additions & 0 deletions src/bin-fix-mismatches/fix-mismatches-cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { Disk } from '../lib/disk';
import { getContext } from '../lib/get-context';
import type { Config } from '../lib/get-context/get-config/config';
import { writeIfChanged } from '../lib/write-if-changed';
import { fixMismatches } from './fix-mismatches';

export function fixMismatchesCli(input: Partial<Config.All>, disk: Disk): void {
writeIfChanged(fixMismatches(getContext(input, disk)));
}
23 changes: 8 additions & 15 deletions src/bin-fix-mismatches/fix-mismatches.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'expect-more-jest';
import { scenarios } from '../../test/scenarios';
import { getInput } from '../lib/get-input';
import { fixMismatches } from './fix-mismatches';
import { fixMismatchesCli } from './fix-mismatches-cli';

describe('fixMismatches', () => {
beforeEach(() => {
Expand All @@ -13,10 +12,7 @@ describe('fixMismatches', () => {
describe('when using a typical workspace', () => {
it('warns about the workspace version', () => {
const scenario = scenarios.dependentDoesNotMatchWorkspaceVersion();
fixMismatches(
getInput(scenario.disk, scenario.config),
scenario.disk,
);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['packages/a/package.json'].diskWriteWhenChanged,
scenario.files['packages/b/package.json'].diskWriteWhenChanged,
Expand All @@ -33,10 +29,7 @@ describe('fixMismatches', () => {
it('warns about the workspace version', () => {
const scenario =
scenarios.dependentDoesNotMatchNestedWorkspaceVersion();
fixMismatches(
getInput(scenario.disk, scenario.config),
scenario.disk,
);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['workspaces/a/packages/a/package.json']
.diskWriteWhenChanged,
Expand All @@ -57,7 +50,7 @@ describe('fixMismatches', () => {

it('replaces non-semver dependencies with valid semver dependencies', () => {
const scenario = scenarios.mismatchesIncludeNonSemverVersions();
fixMismatches(getInput(scenario.disk, scenario.config), scenario.disk);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['packages/a/package.json'].diskWriteWhenChanged,
scenario.files['packages/b/package.json'].diskWriteWhenChanged,
Expand All @@ -73,7 +66,7 @@ describe('fixMismatches', () => {

it('removes banned/disallowed dependencies', () => {
const scenario = scenarios.dependencyIsBanned();
fixMismatches(getInput(scenario.disk, scenario.config), scenario.disk);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['packages/b/package.json'].diskWriteWhenChanged,
]);
Expand All @@ -86,7 +79,7 @@ describe('fixMismatches', () => {

it('does not consider versions of ignored dependencies', () => {
const scenario = scenarios.versionIsIgnored();
fixMismatches(getInput(scenario.disk, scenario.config), scenario.disk);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync).not.toHaveBeenCalled();
expect(scenario.log.mock.calls).toEqual([
[expect.stringMatching(/Version Group 1/)],
Expand All @@ -97,7 +90,7 @@ describe('fixMismatches', () => {

it('replaces mismatching npm overrides', () => {
const scenario = scenarios.dependentDoesNotMatchNpmOverrideVersion();
fixMismatches(getInput(scenario.disk, scenario.config), scenario.disk);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['packages/a/package.json'].diskWriteWhenChanged,
]);
Expand All @@ -109,7 +102,7 @@ describe('fixMismatches', () => {

it('replaces mismatching pnpm overrides', () => {
const scenario = scenarios.dependentDoesNotMatchPnpmOverrideVersion();
fixMismatches(getInput(scenario.disk, scenario.config), scenario.disk);
fixMismatchesCli(scenario.config, scenario.disk);
expect(scenario.disk.writeFileSync.mock.calls).toEqual([
scenario.files['packages/a/package.json'].diskWriteWhenChanged,
]);
Expand Down
37 changes: 12 additions & 25 deletions src/bin-fix-mismatches/fix-mismatches.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
import chalk from 'chalk';
import { isUndefined } from 'expect-more';
import { listVersionGroups } from '../bin-list/list-version-groups';
import type { Disk } from '../lib/disk';
import type { Context } from '../lib/get-context';
import { getExpectedVersion } from '../lib/get-expected-version';
import type { ProgramInput } from '../lib/get-input';
import type { SourceWrapper } from '../lib/get-input/get-wrappers';
import { writeIfChanged } from '../lib/write-if-changed';
import { getVersionGroupInstances } from '../lib/get-version-group-instances';

export function fixMismatches(input: ProgramInput, disk: Disk): void {
export function fixMismatches(ctx: Context): Context {
/**
* Reverse the list so the default/ungrouped version group is rendered first
* (appears at the top). The actual version groups which the user configured
* will then start from index 1.
*/
input.instances.versionGroups.reverse().forEach((versionGroup, i) => {
const groups = listVersionGroups(versionGroup);
ctx.versionGroups.reverse().forEach((versionGroup, i) => {
const groups = getVersionGroupInstances(versionGroup);

if (!versionGroup.isDefault) {
console.log(chalk`{dim = Version Group ${i} ${'='.repeat(63)}}`);
}

groups.forEach(({ hasMismatches, instances, isIgnored, name }) => {
if (hasMismatches && !isIgnored) {
const nextVersion = getExpectedVersion(name, versionGroup, input);
const nextVersion = getExpectedVersion(name, versionGroup, ctx);
instances.forEach(({ dependencyType, version, wrapper }) => {
const root: any = wrapper.contents;
if (version !== nextVersion) {
Expand All @@ -37,25 +34,15 @@ export function fixMismatches(input: ProgramInput, disk: Disk): void {
});
});

input.wrappers.forEach((wrapper) => {
removeEmptyIndexes(wrapper);
writeIfChanged(disk, {
contents: wrapper.contents,
filePath: wrapper.filePath,
indent: input.indent,
json: wrapper.json,
});
});

/**
* Remove eg `{"dependencies": {}, "devDependencies": {}}`
*/
function removeEmptyIndexes(wrapper: SourceWrapper): void {
input.dependencyTypes.forEach((dependencyType) => {
/** Remove eg `{"dependencies": {}, "devDependencies": {}}` */
ctx.wrappers.forEach((wrapper) => {
ctx.dependencyTypes.forEach((dependencyType) => {
const deps = wrapper.contents[dependencyType];
if (deps && Object.values(deps).every(isUndefined)) {
delete wrapper.contents[dependencyType];
}
});
}
});

return ctx;
}
9 changes: 4 additions & 5 deletions src/bin-fix-mismatches/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import chalk from 'chalk';
import { program } from 'commander';
import { disk } from '../lib/disk';
import { getInput } from '../lib/get-input';
import { option } from '../option';
import { fixMismatches } from './fix-mismatches';
import { fixMismatchesCli } from './fix-mismatches-cli';

program.description(
chalk`
Expand Down Expand Up @@ -63,8 +62,8 @@ program
.option(...option.indent)
.parse(process.argv);

fixMismatches(
getInput(disk, {
fixMismatchesCli(
{
configPath: program.opts().config,
dev: program.opts().dev,
filter: program.opts().filter,
Expand All @@ -76,6 +75,6 @@ fixMismatches(
resolutions: program.opts().resolutions,
source: program.opts().source,
workspace: program.opts().workspace,
}),
},
disk,
);
9 changes: 9 additions & 0 deletions src/bin-format/format-cli.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { Disk } from '../lib/disk';
import { getContext } from '../lib/get-context';
import type { Config } from '../lib/get-context/get-config/config';
import { writeIfChanged } from '../lib/write-if-changed';
import { format } from './format';

export function formatCli(input: Partial<Config.All>, disk: Disk): void {
writeIfChanged(format(getContext(input, disk)));
}

0 comments on commit 39ee3f9

Please sign in to comment.