Skip to content

Commit 3db3055

Browse files
feat: add support for peerDependencies in update process (#175)
Co-authored-by: Anthony Fu <[email protected]>
1 parent 0339d49 commit 3db3055

File tree

5 files changed

+73
-19
lines changed

5 files changed

+73
-19
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,18 @@ taze --include lodash,webpack
7070
taze --include /react/ --exclude react-dom # regex is also supported
7171
```
7272

73-
### Lockedversion
73+
### Locked Versions
7474

7575
Locked (fixed version without `^` or `~`) packages are skipped by default, use `taze --include-locked` or `taze -l` to show them.
7676

77+
### Peer Dependencies
78+
79+
Bumping version in `peerDependencies` is not enabled by default. Pass `--peer` option to include them in the update process.
80+
81+
```bash
82+
taze --peer
83+
```
84+
7785
### Config file
7886

7987
With `taze.config.js` file, you can configure the same options the command has.

src/cli.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ cli
3434
.option('--group', 'group dependencies by source on display')
3535
.option('--include-locked, -l', 'include locked dependencies & devDependencies')
3636
.option('--timediff', 'show time difference between the current and the updated version')
37+
.option('--peer', 'Include peerDependencies in the update process')
3738
.action(async (mode: RangeMode | undefined, options: Partial<CheckOptions>) => {
3839
if (mode) {
3940
if (!MODE_CHOICES.includes(mode)) {

src/io/packageJson.ts

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
1-
import type { CommonOptions, PackageMeta, RawDep } from '../types'
1+
import type { CommonOptions, DepType, PackageMeta, RawDep } from '../types'
22
import { resolve } from 'pathe'
33
import { builtinAddons } from '../addons'
44
import { dumpDependencies, getByPath, parseDependencies, parseDependency, setByPath } from './dependencies'
55
import { readJSON, writeJSON } from './packages'
66

7-
const depsFields = [
7+
const allDepsFields = [
88
'dependencies',
99
'devDependencies',
10+
'peerDependencies',
1011
'optionalDependencies',
1112
'packageManager',
1213
'pnpm.overrides',
1314
'resolutions',
1415
'overrides',
15-
] as const
16+
] as const satisfies DepType[]
17+
18+
function isDepFieldEnabled(key: DepType, options: CommonOptions): boolean {
19+
if (options.depFields?.[key] === false)
20+
return false
21+
if (key === 'peerDependencies')
22+
return !!options.peer
23+
return true
24+
}
1625

1726
export async function loadPackageJSON(
1827
relative: string,
@@ -23,19 +32,20 @@ export async function loadPackageJSON(
2332
const raw = await readJSON(filepath)
2433
const deps: RawDep[] = []
2534

26-
for (const key of depsFields) {
27-
if (options.depFields?.[key] !== false) {
28-
if (key === 'packageManager') {
29-
if (raw.packageManager) {
30-
const [name, version] = raw.packageManager.split('@')
31-
// `+` sign can be used to pin the hash of the package manager, we remove it to be semver compatible.
32-
deps.push(parseDependency(name, `^${version.split('+')[0]}`, 'packageManager', shouldUpdate))
33-
}
34-
}
35-
else {
36-
deps.push(...parseDependencies(raw, key, shouldUpdate))
35+
for (const key of allDepsFields) {
36+
if (!isDepFieldEnabled(key, options))
37+
continue
38+
39+
if (key === 'packageManager') {
40+
if (raw.packageManager) {
41+
const [name, version] = raw.packageManager.split('@')
42+
// `+` sign can be used to pin the hash of the package manager, we remove it to be semver compatible.
43+
deps.push(parseDependency(name, `^${version.split('+')[0]}`, 'packageManager', shouldUpdate))
3744
}
3845
}
46+
else {
47+
deps.push(...parseDependencies(raw, key, shouldUpdate))
48+
}
3949
}
4050

4151
return [
@@ -59,9 +69,10 @@ export async function writePackageJSON(
5969
) {
6070
let changed = false
6171

62-
depsFields.forEach((key) => {
63-
if (options.depFields?.[key] === false)
64-
return
72+
for (const key of allDepsFields) {
73+
if (!isDepFieldEnabled(key, options))
74+
continue
75+
6576
if (key === 'packageManager') {
6677
const value = Object.entries(dumpDependencies(pkg.resolved, 'packageManager'))[0]
6778
if (value) {
@@ -75,7 +86,7 @@ export async function writePackageJSON(
7586
changed = true
7687
}
7788
}
78-
})
89+
}
7990

8091
if (changed) {
8192
for (const addon of (options.addons || builtinAddons)) {

src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ export interface CommonOptions {
7878
* Bypass cache
7979
*/
8080
force?: boolean
81+
/**
82+
* Include peerDependencies in the update process
83+
*/
84+
peer?: boolean
8185
/**
8286
* Override bumping mode for specific dependencies
8387
*/

test/parseDependencies.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,34 @@ describe('parseDependencies', () => {
279279
]
280280
`)
281281
})
282+
283+
it('parse package `peerDependencies`', () => {
284+
const myPackage = {
285+
name: '@taze/package1',
286+
private: true,
287+
peerDependencies: {
288+
'@taze/not-exists': '^4.13.19',
289+
'@typescript/lib-dom': 'npm:@types/web@^0.0.80',
290+
},
291+
}
292+
const result = parseDependencies(myPackage, 'peerDependencies', () => true)
293+
expect(result).toMatchInlineSnapshot(`
294+
[
295+
{
296+
"currentVersion": "^4.13.19",
297+
"name": "@taze/not-exists",
298+
"parents": [],
299+
"source": "peerDependencies",
300+
"update": true,
301+
},
302+
{
303+
"currentVersion": "npm:@types/web@^0.0.80",
304+
"name": "@typescript/lib-dom",
305+
"parents": [],
306+
"source": "peerDependencies",
307+
"update": true,
308+
},
309+
]
310+
`)
311+
})
282312
})

0 commit comments

Comments
 (0)