Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: locked version by default, new --include-locked option #72

Merged
merged 7 commits into from
Oct 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ taze --include lodash,webpack
taze --include /react/ --exclude react-dom # regex is also supported
```

### Lockedversion

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

### Config file

With `taze.config.js` file, you can configure the same options the command has.
Expand Down
5 changes: 5 additions & 0 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ function commonOptions(args: Argv<object>): Argv<CommonOptions> {
describe: 'update only for dependencies',
conflicts: ['dev'],
})
.option('include-locked', {
alias: 'l',
type: 'boolean',
describe: 'include locked dependencies & devDependencies',
})
}

// eslint-disable-next-line no-unused-expressions
Expand Down
4 changes: 2 additions & 2 deletions src/commands/check/interactive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export async function promptInteractive(pkgs: PackageMeta[], options: CheckOptio
if (i.latestVersionAvailable && !i.update) {
i.interactiveChecked = false
i.update = true
updateTargetVersion(i, i.latestVersionAvailable)
updateTargetVersion(i, i.latestVersionAvailable, undefined, options.includeLocked)
}
})
})
Expand Down Expand Up @@ -166,7 +166,7 @@ export async function promptInteractive(pkgs: PackageMeta[], options: CheckOptio
case 'right':
case 'h':
case 'l':
updateTargetVersion(dep, versions[index].version)
updateTargetVersion(dep, versions[index].version, undefined, options.includeLocked)
renderer = listRenderer
return true
}
Expand Down
30 changes: 28 additions & 2 deletions src/io/resolves.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,36 @@ export function getVersionOfRange(dep: ResolvedDepChange, range: RangeMode) {
return getMaxSatisfying(versions, dep.currentVersion, range, tags)
}

export function updateTargetVersion(dep: ResolvedDepChange, version: string, forgiving = true) {
export function updateTargetVersion(
dep: ResolvedDepChange,
version: string,
forgiving = true,
includeLocked = false,
) {
const versionLocked = /^[0-9]+/.test(dep.currentVersion)
if (versionLocked && !includeLocked) {
dep.targetVersion = dep.currentVersion
dep.targetVersionTime = dep.currentVersionTime
dep.diff = null
dep.update = false
return
}

dep.targetVersion = getPrefixedVersion(dep.currentVersion, version) || dep.currentVersion
dep.targetVersionTime = dep.pkgData.time?.[version]

if (versionLocked && semver.eq(dep.currentVersion, dep.targetVersion)) {
// for example: `taze`/`taze -P` is default mode (and it matched from patch to minor)
// - but this mode will always ignore the locked pkgs
// - so we need to reset the target
const { versions, time = {}, tags } = dep.pkgData
const targetVersion = getMaxSatisfying(versions, dep.currentVersion, 'minor', tags)
if (targetVersion) {
dep.targetVersion = targetVersion
dep.targetVersionTime = time[dep.targetVersion]
}
}

try {
const current = semver.minVersion(dep.currentVersion)!
const target = semver.minVersion(dep.targetVersion)!
Expand Down Expand Up @@ -176,7 +202,7 @@ export async function resolveDependency(
}

if (target)
updateTargetVersion(dep, target)
updateTargetVersion(dep, target, undefined, options.includeLocked)
else
dep.targetVersion = dep.currentVersion

Expand Down
8 changes: 7 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export interface CommonOptions {
exclude?: string | string[]
prod?: boolean
dev?: boolean
loglevel: string
loglevel?: string
failOnOutdated?: boolean
silent?: boolean
force?: boolean
Expand All @@ -71,6 +71,12 @@ export interface CheckOptions extends CommonOptions {
install?: boolean
update?: boolean
global?: boolean
/**
* include locked dependencies & devDependencies
* @default false
* @description exclude the locked deps/devDeps by default
*/
includeLocked?: boolean
}

export interface PackageMeta {
Expand Down
14 changes: 9 additions & 5 deletions test/resolves.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,42 +45,46 @@ it('resolveDependency', async () => {
// major
expect(false).toBe((await resolveDependency(makePkg(''), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('*'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('^4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('>4.0.0'), options, filter)).update)

options.mode = 'minor'
// minor
expect(false).toBe((await resolveDependency(makePkg(''), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('*'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('^4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('>4.0.0'), options, filter)).update)

options.mode = 'patch'
// patch
expect(false).toBe((await resolveDependency(makePkg(''), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('*'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('^4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('>4.0.0'), options, filter)).update)

options.mode = 'latest'
// latest
expect(false).toBe((await resolveDependency(makePkg(''), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('*'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('^4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('>4.0.0'), options, filter)).update)

options.mode = 'newest'
// newest
expect(false).toBe((await resolveDependency(makePkg(''), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('*'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(false).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('^4.0.0'), options, filter)).update)
expect(true).toBe((await resolveDependency(makePkg('>4.0.0'), options, filter)).update)

// include locked
options.includeLocked = true
expect(true).toBe((await resolveDependency(makePkg('4.0.0'), options, filter)).update)

expect((await resolveDependency(makePkg(''), options, filter)).targetVersion)
.toMatch('')
expect((await resolveDependency(makePkg('workspace:*'), options, filter)).targetVersion)
Expand Down