refactor: use DEPENDENCIES_FIELDS from @pnpm/types

@pnpm/utils

BREAKING CHANGE:

removed dependenciesTypes
removed DependenciesType
This commit is contained in:
Zoltan Kochan
2018-09-21 21:34:23 +03:00
parent 912f5032fa
commit fc84afecef
8 changed files with 63 additions and 59 deletions

View File

@@ -1,4 +1,7 @@
import {PackageJson} from '@pnpm/types'
import {
DEPENDENCIES_FIELDS,
PackageJson,
} from '@pnpm/types'
import R = require('ramda')
import {
Shrinkwrap,
@@ -8,20 +11,22 @@ export default (shr: Shrinkwrap, pkg: PackageJson) => {
if (!R.equals({...pkg.devDependencies, ...pkg.dependencies, ...pkg.optionalDependencies}, shr.specifiers)) {
return false
}
for (const depType of ['optionalDependencies', 'dependencies', 'devDependencies']) {
const emptyDep = R.isEmpty(R.keys(pkg[depType]))
if (emptyDep !== R.isEmpty(R.keys(shr[depType]))) return false
for (const depField of DEPENDENCIES_FIELDS) {
const shrDeps = shr[depField] || {}
const pkgDeps = pkg[depField] || {}
const emptyDep = R.isEmpty(pkgDeps)
if (emptyDep !== R.isEmpty(shrDeps)) return false
if (emptyDep) continue
const pkgDepNames = depType === 'optionalDependencies'
? Object.keys(pkg.optionalDependencies || {})
: Object.keys(pkg[depType]).filter((depName) => !pkg.optionalDependencies || !pkg.optionalDependencies[depName])
if (pkgDepNames.length !== Object.keys(shr[depType]).length &&
pkgDepNames.length !== countOfNonLinkedDeps(shr[depType])) {
const pkgDepNames = depField === 'optionalDependencies'
? Object.keys(pkgDeps)
: Object.keys(pkgDeps).filter((depName) => !pkg.optionalDependencies || !pkg.optionalDependencies[depName])
if (pkgDepNames.length !== R.keys(shrDeps).length &&
pkgDepNames.length !== countOfNonLinkedDeps(shrDeps)) {
return false
}
for (const depName of pkgDepNames) {
if (!shr[depType][depName] || shr.specifiers[depName] !== pkg[depType][depName]) return false
if (!shrDeps[depName] || shr.specifiers[depName] !== pkgDeps[depName]) return false
}
}
return true

View File

@@ -17,10 +17,10 @@ import {
} from '@pnpm/resolver-base'
import {
Dependencies,
DEPENDENCIES_FIELDS,
PackageJson,
} from '@pnpm/types'
import {
dependenciesTypes,
getSaveType,
realNodeModulesDir,
safeReadPackageFromDir as safeReadPkgFromDir,
@@ -286,14 +286,16 @@ async function linkedPackagesSatisfyPackageJson (
localPackages?: LocalPackages,
) {
const localPackagesByDirectory = localPackages ? getLocalPackagesByDirectory(localPackages) : {}
for (const depType of ['optionalDependencies', 'dependencies', 'devDependencies']) {
if (!shr[depType] || !pkg[depType]) continue
const depNames = Object.keys(shr[depType])
for (const depField of DEPENDENCIES_FIELDS) {
const shrDeps = shr[depField]
const pkgDeps = pkg[depField]
if (!shrDeps || !pkgDeps) continue
const depNames = Object.keys(shrDeps)
for (const depName of depNames) {
if (!shr[depType][depName].startsWith('link:') || !pkg[depType][depName]) continue
const dir = path.join(prefix, shr[depType][depName].substr(5))
if (!shrDeps[depName].startsWith('link:') || !pkgDeps[depName]) continue
const dir = path.join(prefix, shrDeps[depName].substr(5))
const linkedPkg = localPackagesByDirectory[dir] || await safeReadPkgFromDir(dir)
if (!linkedPkg || !semver.satisfies(linkedPkg.version, pkg[depType][depName])) return false
if (!linkedPkg || !semver.satisfies(linkedPkg.version, pkgDeps[depName])) return false
}
}
return true
@@ -877,7 +879,7 @@ function alignDependencyTypes (pkg: PackageJson, shr: Shrinkwrap) {
const depTypesOfAliases = getAliasToDependencyTypeMap(pkg)
// Aligning the dependency types in shrinkwrap.yaml
for (const depType of dependenciesTypes) {
for (const depType of DEPENDENCIES_FIELDS) {
if (!shr[depType]) continue
for (const alias of Object.keys(shr[depType] || {})) {
if (depType === depTypesOfAliases[alias] || !depTypesOfAliases[alias]) continue
@@ -889,7 +891,7 @@ function alignDependencyTypes (pkg: PackageJson, shr: Shrinkwrap) {
function getAliasToDependencyTypeMap (pkg: PackageJson) {
const depTypesOfAliases = {}
for (const depType of dependenciesTypes) {
for (const depType of DEPENDENCIES_FIELDS) {
if (!pkg[depType]) continue
for (const alias of Object.keys(pkg[depType] || {})) {
if (!depTypesOfAliases[alias]) {

View File

@@ -7,10 +7,12 @@ import {
import { linkBinsOfPackages } from '@pnpm/link-bins'
import logger, { streamParser } from '@pnpm/logger'
import { read as readModulesYaml } from '@pnpm/modules-yaml'
import { PackageJson } from '@pnpm/types'
import {
DependenciesType,
dependenciesTypes,
DEPENDENCIES_FIELDS,
DependenciesField,
PackageJson,
} from '@pnpm/types'
import {
getSaveType,
removeOrphanPackages as removeOrphanPkgs,
safeReadPackage,
@@ -64,7 +66,7 @@ export default async function link (
})
}
const linkedPkgs: Array<{path: string, pkg: PackageJson, alias: string}> = []
const specsToUpsert = [] as Array<{name: string, pref: string, saveType: DependenciesType}>
const specsToUpsert = [] as Array<{name: string, pref: string, saveType: DependenciesField}>
const saveType = getSaveType(opts)
for (const linkFrom of linkFromPkgs) {
@@ -83,7 +85,7 @@ export default async function link (
saveExact: opts.saveExact,
savePrefix: opts.savePrefix,
}),
saveType: (saveType || pkg && guessDependencyType(linkedPkg.name, pkg)) as DependenciesType,
saveType: (saveType || pkg && guessDependencyType(linkedPkg.name, pkg)) as DependenciesField,
})
const packagePath = normalize(path.relative(opts.prefix, linkFromPath))
@@ -164,8 +166,8 @@ function addLinkToShrinkwrap (
},
) {
const id = `link:${opts.packagePath}`
let addedTo: DependenciesType | undefined
for (const depType of dependenciesTypes) {
let addedTo: DependenciesField | undefined
for (const depType of DEPENDENCIES_FIELDS) {
if (!addedTo && opts.pkg && opts.pkg[depType] && opts.pkg[depType]![opts.linkedPkgName]) {
addedTo = depType
shr[depType] = shr[depType] || {}
@@ -203,7 +205,7 @@ async function linkToModules (
packageDir: string,
pkg: PackageJson,
destModulesDir: string,
saveType?: DependenciesType,
saveType?: DependenciesField,
prefix: string,
},
) {

View File

@@ -1,9 +1,9 @@
import { packageJsonLogger } from '@pnpm/core-loggers'
import { PackageJson } from '@pnpm/types'
import {
DependenciesType,
dependenciesTypes,
} from '@pnpm/utils'
DEPENDENCIES_FIELDS,
DependenciesField,
PackageJson,
} from '@pnpm/types'
import loadJsonFile = require('load-json-file')
import writePkg = require('write-pkg')
@@ -11,7 +11,7 @@ export default async function (
pkgJsonPath: string,
removedPackages: string[],
opts: {
saveType?: DependenciesType,
saveType?: DependenciesField,
prefix: string,
},
): Promise<PackageJson> {
@@ -23,14 +23,14 @@ export default async function (
if (!packageJson[opts.saveType]) return packageJson
removedPackages.forEach((dependency) => {
delete packageJson[opts.saveType as DependenciesType][dependency]
delete packageJson[opts.saveType as DependenciesField][dependency]
})
} else {
dependenciesTypes
.filter((deptype) => packageJson[deptype])
.forEach((deptype) => {
DEPENDENCIES_FIELDS
.filter((depField) => packageJson[depField])
.forEach((depField) => {
removedPackages.forEach((dependency) => {
delete packageJson[deptype][dependency]
delete packageJson[depField][dependency]
})
})
}

View File

@@ -1,9 +1,9 @@
import { packageJsonLogger } from '@pnpm/core-loggers'
import { PackageJson } from '@pnpm/types'
import {
DependenciesType,
dependenciesTypes,
} from '@pnpm/utils'
DEPENDENCIES_FIELDS,
DependenciesField,
PackageJson,
} from '@pnpm/types'
import loadJsonFile = require('load-json-file')
import path = require('path')
import writePkg = require('write-pkg')
@@ -13,7 +13,7 @@ export default async function save (
packageSpecs: Array<{
name: string,
pref?: string,
saveType?: DependenciesType,
saveType?: DependenciesField,
}>,
): Promise<PackageJson> {
// Read the latest version of package.json to avoid accidental overwriting
@@ -31,7 +31,7 @@ export default async function save (
packageJson[packageSpec.saveType] = packageJson[packageSpec.saveType] || {}
packageSpecs.forEach((dependency) => {
packageJson[saveType][dependency.name] = dependency.pref || findSpec(dependency.name, packageJson as PackageJson)
dependenciesTypes.filter((deptype) => deptype !== packageSpec.saveType).forEach((deptype) => {
DEPENDENCIES_FIELDS.filter((depField) => depField !== packageSpec.saveType).forEach((deptype) => {
if (packageJson[deptype]) {
delete packageJson[deptype][dependency.name]
}
@@ -59,7 +59,7 @@ function findSpec (depName: string, pkg: PackageJson): string | undefined {
return foundDepType && pkg[foundDepType]![depName]
}
export function guessDependencyType (depName: string, pkg: PackageJson): DependenciesType | undefined {
return dependenciesTypes
.find((deptype) => Boolean(pkg[deptype] && pkg[deptype]![depName]))
export function guessDependencyType (depName: string, pkg: PackageJson): DependenciesField | undefined {
return DEPENDENCIES_FIELDS
.find((depField) => Boolean(pkg[depField] && pkg[depField]![depName]))
}

View File

@@ -1,9 +1,6 @@
import {PnpmOptions} from '@pnpm/types'
export type DependenciesType = 'dependencies' | 'devDependencies' | 'optionalDependencies'
import { DependenciesField, PnpmOptions } from '@pnpm/types'
export const dependenciesTypes: DependenciesType[] = ['optionalDependencies', 'dependencies', 'devDependencies']
export default function getSaveType (opts: PnpmOptions): DependenciesType | undefined {
export default function getSaveType (opts: PnpmOptions): DependenciesField | undefined {
if (opts.saveDev) return 'devDependencies'
if (opts.saveOptional) return 'optionalDependencies'
if (opts.saveProd) return 'dependencies'

View File

@@ -1,4 +1,4 @@
import getSaveType, {DependenciesType, dependenciesTypes} from './getSaveType'
import getSaveType from './getSaveType'
import realNodeModulesDir from './realNodeModulesDir'
import removeOrphanPackages from './removeOrphanPkgs'
import removeTopDependency from './removeTopDependency'
@@ -7,8 +7,6 @@ import {fromDir as safeReadPackageFromDir} from './safeReadPkg'
import readPackage from './safeReadPkg'
export {
DependenciesType,
dependenciesTypes,
getSaveType,
readPackage,
realNodeModulesDir,

View File

@@ -3,14 +3,14 @@ import {
statsLogger,
} from '@pnpm/core-loggers'
import logger from '@pnpm/logger'
import { DEPENDENCIES_FIELDS } from '@pnpm/types'
import * as dp from 'dependency-path'
import vacuumCB = require('fs-vacuum')
import {StoreController} from 'package-store'
import { StoreController } from 'package-store'
import path = require('path')
import {ResolvedPackages, Shrinkwrap} from 'pnpm-shrinkwrap'
import { ResolvedPackages, Shrinkwrap } from 'pnpm-shrinkwrap'
import R = require('ramda')
import promisify = require('util.promisify')
import {dependenciesTypes} from './getSaveType'
import removeTopDependency from './removeTopDependency'
const vacuum = promisify(vacuumCB)
@@ -28,8 +28,8 @@ export default async function removeOrphanPkgs (
storeController: StoreController,
},
): Promise<Set<string>> {
const oldPkgs = R.toPairs(R.mergeAll(R.map((depType) => opts.oldShrinkwrap[depType], dependenciesTypes)))
const newPkgs = R.toPairs(R.mergeAll(R.map((depType) => opts.newShrinkwrap[depType], dependenciesTypes)))
const oldPkgs = R.toPairs(R.mergeAll(R.map((depType) => opts.oldShrinkwrap[depType], DEPENDENCIES_FIELDS)))
const newPkgs = R.toPairs(R.mergeAll(R.map((depType) => opts.newShrinkwrap[depType], DEPENDENCIES_FIELDS)))
const removedTopDeps: Array<[string, string]> = R.difference(oldPkgs, newPkgs) as Array<[string, string]>