Skip to content

Commit ce9f267

Browse files
featureless refactors
1 parent b2bd56d commit ce9f267

23 files changed

+344
-228
lines changed

eslint.config.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export default [
4545
'no-console': 'off', // Allow console.log for CLI output
4646
'prefer-const': 'error',
4747
'no-var': 'error',
48+
'func-style': ['error', 'declaration', { allowArrowFunctions: false }],
4849

4950
// Code quality (non-formatting - formatting handled by Prettier)
5051
eqeqeq: ['error', 'always'],
@@ -54,7 +55,5 @@ export default [
5455
'no-script-url': 'error',
5556
},
5657
},
57-
{
58-
ignores: ['dist/', 'lib/', 'node_modules/', '*.js', '*.d.ts', 'scripts/'],
59-
},
58+
{ ignores: ['dist/', 'lib/', 'node_modules/', '*.js', '*.d.ts', 'scripts/'] },
6059
];

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"@vitest/coverage-v8": "3.2.4",
6565
"eslint": "9.29.0",
6666
"eslint-config-prettier": "10.1.5",
67-
"eslint-plugin-prettier": "5.5.0",
67+
"eslint-plugin-prettier": "5.5.1",
6868
"jiti": "2.4.2",
6969
"prettier": "3.6.1",
7070
"tsx": "4.20.3",

src/constant.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { type PackageManager } from './types';
2+
3+
export const PACKAGE_MANAGERS: readonly PackageManager[] = [
4+
'npm',
5+
'pnpm',
6+
'yarn',
7+
'bun',
8+
];

src/core/dependency-checker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@ export async function checkDependencyVersions(
4747
isOutdated = false;
4848
updateType = undefined;
4949
} else if (latestVersion) {
50-
isOutdated = isVersionOutdated(version, latestVersion);
50+
isOutdated = isVersionOutdated({
51+
current: version,
52+
latest: latestVersion,
53+
});
5154
updateType = isOutdated
52-
? getUpdateType(version, latestVersion)
55+
? getUpdateType({ current: version, latest: latestVersion })
5356
: undefined;
5457
}
5558
}

src/index.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
getPackageManagerInfo,
1212
updateDependencies,
1313
} from './services/package-manager';
14-
import { type DependencyInfo } from './types';
14+
import { type DependencyInfo, type UpdateableDependency } from './types';
1515
import { displayHelp } from './ui/display/help';
1616
import { displayLicense } from './ui/display/license';
1717
import { displaySummary } from './ui/display/summary';
@@ -71,23 +71,14 @@ async function main(): Promise<void> {
7171
: detectPackageManager();
7272

7373
// Show update prompt
74-
const updateType = await displayUpdatePrompt(
75-
allDependencies,
76-
packageManager
77-
);
74+
const updateType = await displayUpdatePrompt(allDependencies);
7875

7976
if (updateType) {
8077
const outdatedDeps = allDependencies.filter(
8178
d => d.isOutdated && !d.isSkipped
8279
);
8380

84-
let depsToUpdate: Array<{
85-
packageName: string;
86-
currentVersion: string;
87-
latestVersion: string;
88-
updateType: 'patch' | 'minor' | 'major';
89-
category: string;
90-
}> = [];
81+
let depsToUpdate: UpdateableDependency[] = [];
9182

9283
if (updateType === 'patch') {
9384
depsToUpdate = outdatedDeps
@@ -126,7 +117,10 @@ async function main(): Promise<void> {
126117
}
127118

128119
if (depsToUpdate.length > 0) {
129-
await updateDependencies(depsToUpdate, packageManager);
120+
await updateDependencies({
121+
dependencies: depsToUpdate,
122+
packageManager,
123+
});
130124
}
131125
}
132126
}
@@ -167,23 +161,23 @@ const validFlags = [
167161
'--update-prompt',
168162
'--no-update-prompt',
169163
];
170-
const unknownArgs = getUnknownArgs(args, validFlags);
164+
const unknownArgs = getUnknownArgs({ args, validFlags });
171165
if (unknownArgs.length > 0) {
172166
displayUnknownArguments(unknownArgs);
173167
process.exit(1);
174168
}
175169

176-
if (hasAnyFlag(args, ['--help', '-h', '--info', '-i'])) {
170+
if (hasAnyFlag({ args, flags: ['--help', '-h', '--info', '-i'] })) {
177171
displayHelp();
178172
process.exit(0);
179173
}
180174

181-
if (hasAnyFlag(args, ['--version', '-v'])) {
175+
if (hasAnyFlag({ args, flags: ['--version', '-v'] })) {
182176
displayVersion();
183177
process.exit(0);
184178
}
185179

186-
if (hasAnyFlag(args, ['--license', '-l'])) {
180+
if (hasAnyFlag({ args, flags: ['--license', '-l'] })) {
187181
displayLicense();
188182
process.exit(0);
189183
}

src/services/__tests__/package-manager.test.ts

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import {
66
getPackageManagerInfo,
77
} from '../package-manager';
88

9-
// Mock fs module
109
vi.mock('fs', () => ({
1110
existsSync: vi.fn(),
1211
}));
1312

14-
// Mock path module
1513
vi.mock('path', () => ({
1614
join: vi.fn(),
1715
}));
@@ -26,12 +24,12 @@ describe('package-manager', () => {
2624
const mockExistsSync = vi.mocked(existsSync);
2725
const mockJoin = vi.mocked(join);
2826

29-
mockJoin.mockImplementation((dir: string, file: string) => {
30-
return `${dir}/${file}`;
31-
});
32-
mockExistsSync.mockImplementation((path: any) => {
33-
return path === '/test/package-lock.json';
34-
});
27+
mockJoin.mockImplementation(
28+
(dir: string, file: string) => `${dir}/${file}`
29+
);
30+
mockExistsSync.mockImplementation(
31+
path => path === '/test/package-lock.json'
32+
);
3533

3634
const result = detectPackageManager('/test');
3735

@@ -46,12 +44,12 @@ describe('package-manager', () => {
4644
const mockExistsSync = vi.mocked(existsSync);
4745
const mockJoin = vi.mocked(join);
4846

49-
mockJoin.mockImplementation((dir: string, file: string) => {
50-
return `${dir}/${file}`;
51-
});
52-
mockExistsSync.mockImplementation((path: any) => {
53-
return path === '/test/pnpm-lock.yaml';
54-
});
47+
mockJoin.mockImplementation(
48+
(dir: string, file: string) => `${dir}/${file}`
49+
);
50+
mockExistsSync.mockImplementation(
51+
path => path === '/test/pnpm-lock.yaml'
52+
);
5553

5654
const result = detectPackageManager('/test');
5755

@@ -66,12 +64,10 @@ describe('package-manager', () => {
6664
const mockExistsSync = vi.mocked(existsSync);
6765
const mockJoin = vi.mocked(join);
6866

69-
mockJoin.mockImplementation((dir: string, file: string) => {
70-
return `${dir}/${file}`;
71-
});
72-
mockExistsSync.mockImplementation((path: any) => {
73-
return path === '/test/yarn.lock';
74-
});
67+
mockJoin.mockImplementation(
68+
(dir: string, file: string) => `${dir}/${file}`
69+
);
70+
mockExistsSync.mockImplementation(path => path === '/test/yarn.lock');
7571

7672
const result = detectPackageManager('/test');
7773

@@ -86,12 +82,10 @@ describe('package-manager', () => {
8682
const mockExistsSync = vi.mocked(existsSync);
8783
const mockJoin = vi.mocked(join);
8884

89-
mockJoin.mockImplementation((dir: string, file: string) => {
90-
return `${dir}/${file}`;
91-
});
92-
mockExistsSync.mockImplementation((path: any) => {
93-
return path === '/test/bun.lockb';
94-
});
85+
mockJoin.mockImplementation(
86+
(dir: string, file: string) => `${dir}/${file}`
87+
);
88+
mockExistsSync.mockImplementation(path => path === '/test/bun.lockb');
9589

9690
const result = detectPackageManager('/test');
9791

src/services/config.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { existsSync, readFileSync } from 'fs';
22
import { join } from 'path';
3-
import { type PackageManager } from './package-manager';
3+
import { PACKAGE_MANAGERS } from '../constant';
4+
import { type PackageManager } from '../types';
45

56
export interface PatchPulseConfig {
67
skip?: string[];
@@ -77,8 +78,9 @@ export function parseCliConfig(args: string[]): PatchPulseConfig {
7778
if (packageManagerIndex !== -1 && packageManagerIndex + 1 < args.length) {
7879
const packageManagerValue = args[packageManagerIndex + 1];
7980
if (!packageManagerValue.startsWith('-')) {
80-
if (['npm', 'pnpm', 'yarn', 'bun'].includes(packageManagerValue)) {
81-
config.packageManager = packageManagerValue as any;
81+
const typeSafePackageManager = packageManagerValue as PackageManager;
82+
if (PACKAGE_MANAGERS.includes(typeSafePackageManager)) {
83+
config.packageManager = typeSafePackageManager;
8284
}
8385
}
8486
}

src/services/package-manager.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import chalk from 'chalk';
22
import { spawn } from 'child_process';
33
import { existsSync } from 'fs';
44
import { join } from 'path';
5+
import { type PackageManager, type UpdateableDependency } from '../types';
56
import { pluralize } from '../utils/pluralize';
67

7-
export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';
8-
98
export interface PackageManagerInfo {
109
name: PackageManager;
1110
lockFiles: string[];
@@ -103,30 +102,26 @@ export function runPackageManagerCommand(
103102
/**
104103
* Updates dependencies based on update type
105104
* @param dependencies - Array of dependencies to update
106-
* @param updateType - The type of update to perform ('patch', 'minor', 'all')
107105
* @param packageManager - The package manager to use
108106
* @returns Promise that resolves when all updates are complete
109107
*/
110-
export async function updateDependencies(
111-
dependencies: Array<{
112-
packageName: string;
113-
currentVersion: string;
114-
latestVersion: string;
115-
updateType: 'patch' | 'minor' | 'major';
116-
category: string;
117-
}>,
118-
packageManager: PackageManagerInfo
119-
): Promise<void> {
108+
export async function updateDependencies({
109+
dependencies,
110+
packageManager,
111+
}: {
112+
dependencies: UpdateableDependency[];
113+
packageManager: PackageManagerInfo;
114+
}): Promise<void> {
120115
if (dependencies.length === 0) {
121116
console.log(chalk.yellow('No dependencies to update'));
122117
return;
123118
}
124119

125-
const dependencyWord = pluralize(
126-
dependencies.length,
127-
'dependency',
128-
'dependencies'
129-
);
120+
const dependencyWord = pluralize({
121+
count: dependencies.length,
122+
singular: 'dependency',
123+
plural: 'dependencies',
124+
});
130125

131126
console.log(
132127
chalk.cyan(

src/types.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';
2+
13
export interface PackageJson {
24
dependencies?: Record<string, string>;
35
devDependencies?: Record<string, string>;
@@ -16,6 +18,18 @@ export interface DependencyInfo {
1618
category?: string;
1719
}
1820

21+
/**
22+
* A dependency that is guaranteed to have latestVersion and updateType fields
23+
* Used for dependencies that have been filtered and validated for updates
24+
*/
25+
export interface UpdateableDependency {
26+
packageName: string;
27+
currentVersion: string;
28+
latestVersion: string;
29+
updateType: 'patch' | 'minor' | 'major';
30+
category: string;
31+
}
32+
1933
export interface NpmPackageInfo {
2034
'dist-tags': {
2135
latest: string;

0 commit comments

Comments
 (0)