Skip to content

Commit

Permalink
feat: remove --dev and --prod flag, introduce depFields option
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Nov 30, 2023
1 parent 6390938 commit f0acc40
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 71 deletions.
12 changes: 0 additions & 12 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,6 @@ function commonOptions(args: Argv<object>): Argv<CommonOptions> {
type: 'string',
describe: 'exclude dependencies to be checked, will override --include options',
})
.option('dev', {
alias: 'D',
type: 'boolean',
describe: 'update only for devDependencies',
conflicts: ['prod'],
})
.option('prod', {
alias: 'P',
type: 'boolean',
describe: 'update only for dependencies',
conflicts: ['dev'],
})
}

// eslint-disable-next-line no-unused-expressions
Expand Down
3 changes: 1 addition & 2 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ export const DEFAULT_COMMON_OPTIONS: CommonOptions = {
ignorePaths: '',
include: '',
exclude: '',
dev: false,
prod: false,
depFields: {},
}

export const DEFAULT_USAGE_OPTIONS: UsageOptions = {
Expand Down
91 changes: 44 additions & 47 deletions src/io/packages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,67 +17,64 @@ export async function writeJSON(filepath: string, data: any) {
return await fs.writeFile(filepath, `${JSON.stringify(data, null, fileIndent)}\n`, 'utf-8')
}

const depsFields = [
'dependencies',
'devDependencies',
'optionalDependencies',
'packageManager',
'pnpm.overrides',
'resolutions',
'overrides',
] as const

export async function writePackage(pkg: PackageMeta, options: CommonOptions) {
const { raw, filepath, resolved } = pkg

let changed = false

const depKeys = [
['dependencies', !options.dev],
['devDependencies', !options.prod],
['optionalDependencies', !options.prod && !options.dev],
// PNPM
['pnpm.overrides', !options.prod && !options.dev],
// YARN
['resolutions', !options.prod && !options.dev],
// NPM
['overrides', !options.prod && !options.dev],
] as const

depKeys.forEach(([key, shouldWrite]) => {
if (getByPath(raw, key) && shouldWrite) {
setByPath(raw, key, dumpDependencies(resolved, key))
changed = true
depsFields.forEach((key) => {
if (options.depFields?.[key] === false)
return
if (key === 'packageManager') {
const value = Object.entries(dumpDependencies(resolved, 'packageManager'))[0]
if (value) {
raw.packageManager = `${value[0]}@${value[1].replace('^', '')}`
changed = true
}
}
})

if (raw.packageManager) {
const value = Object.entries(dumpDependencies(resolved, 'packageManager'))[0]
if (value) {
raw.packageManager = `${value[0]}@${value[1].replace('^', '')}`
changed = true
else {
if (getByPath(raw, key)) {
setByPath(raw, key, dumpDependencies(resolved, key))
changed = true
}
}
}
})

if (changed)
await writeJSON(filepath, raw)
}

export async function loadPackage(relative: string, options: CommonOptions, shouldUpdate: (name: string) => boolean): Promise<PackageMeta> {
export async function loadPackage(
relative: string,
options: CommonOptions,
shouldUpdate: (name: string) => boolean,
): Promise<PackageMeta> {
const filepath = path.resolve(options.cwd ?? '', relative)
const raw = await readJSON(filepath)
let deps: RawDep[] = []

if (options.prod) {
deps = parseDependencies(raw, 'dependencies', shouldUpdate)
}
else if (options.dev) {
deps = parseDependencies(raw, 'devDependencies', shouldUpdate)
}
else {
deps = [
...parseDependencies(raw, 'dependencies', shouldUpdate),
...parseDependencies(raw, 'devDependencies', shouldUpdate),
...parseDependencies(raw, 'optionalDependencies', shouldUpdate),
...parseDependencies(raw, 'pnpm.overrides', shouldUpdate),
...parseDependencies(raw, 'resolutions', shouldUpdate),
...parseDependencies(raw, 'overrides', shouldUpdate),
]
}

if (raw.packageManager) {
const [name, version] = raw.packageManager.split('@')
deps.push(parseDependency(name, `^${version}`, 'packageManager', shouldUpdate))
const deps: RawDep[] = []

for (const key of depsFields) {
if (options.depFields?.[key] !== false) {
if (key === 'packageManager') {
if (raw.packageManager) {
const [name, version] = raw.packageManager.split('@')
deps.push(parseDependency(name, `^${version}`, 'packageManager', shouldUpdate))
}
}
else {
deps.push(...parseDependencies(raw, key, shouldUpdate))
}
}
}

return {
Expand Down
32 changes: 22 additions & 10 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ import type { SortOption } from './utils/sort'
export type RangeMode = 'default' | 'major' | 'minor' | 'patch' | 'latest' | 'newest'
export type PackageMode = Omit<RangeMode, 'default'> | 'ignore'
export type DepType = 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies' | 'packageManager' | 'pnpm.overrides' | 'resolutions' | 'overrides'

export const DependenciesTypeShortMap = {
dependencies: '',
devDependencies: 'dev',
peerDependencies: 'peer',
optionalDependencies: 'optional',
packageManager: 'package-manager',
'pnpm.overrides': 'pnpm-override',
resolutions: 'resolution',
overrides: 'override',
'dependencies': '',
'devDependencies': 'dev',
'peerDependencies': 'peer',
'optionalDependencies': 'optional',
'packageManager': 'package-manager',
'pnpm.overrides': 'pnpm-overrides',
'resolutions': 'resolutions',
'overrides': 'overrides',
}

export interface RawDep {
Expand Down Expand Up @@ -52,12 +53,21 @@ export interface CommonOptions {
ignorePaths?: string | string[]
include?: string | string[]
exclude?: string | string[]
prod?: boolean
dev?: boolean
loglevel?: LogLevel
failOnOutdated?: boolean
silent?: boolean
/**
* Fields in package.json to be checked
* By default all fields will be checked
*/
depFields?: DepFieldOptions
/**
* Bypass cache
*/
force?: boolean
/**
* Override bumping mode for specific dependencies
*/
packageMode?: { [name: string]: PackageMode }
}

Expand All @@ -66,6 +76,8 @@ export interface UsageOptions extends CommonOptions {
recursive?: true
}

export type DepFieldOptions = Partial<Record<DepType, boolean>>

export interface CheckOptions extends CommonOptions {
mode?: RangeMode
write?: boolean
Expand Down

0 comments on commit f0acc40

Please sign in to comment.