diff --git a/packages/shrinkwrap/src/satisfiesPackageJson.ts b/packages/shrinkwrap/src/satisfiesPackageJson.ts index 30df18e2da..2507b34197 100644 --- a/packages/shrinkwrap/src/satisfiesPackageJson.ts +++ b/packages/shrinkwrap/src/satisfiesPackageJson.ts @@ -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 diff --git a/packages/supi/src/api/install.ts b/packages/supi/src/api/install.ts index 7766c27bc0..c2159acc5f 100644 --- a/packages/supi/src/api/install.ts +++ b/packages/supi/src/api/install.ts @@ -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]) { diff --git a/packages/supi/src/api/link.ts b/packages/supi/src/api/link.ts index 379344e9d7..094db4f563 100644 --- a/packages/supi/src/api/link.ts +++ b/packages/supi/src/api/link.ts @@ -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, }, ) { diff --git a/packages/supi/src/removeDeps.ts b/packages/supi/src/removeDeps.ts index ca702902cd..ef4268faa2 100644 --- a/packages/supi/src/removeDeps.ts +++ b/packages/supi/src/removeDeps.ts @@ -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 { @@ -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] }) }) } diff --git a/packages/supi/src/save.ts b/packages/supi/src/save.ts index 3234f400a8..d9a5bf08f0 100644 --- a/packages/supi/src/save.ts +++ b/packages/supi/src/save.ts @@ -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 { // 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])) } diff --git a/packages/utils/src/getSaveType.ts b/packages/utils/src/getSaveType.ts index 6bc656a6f3..8ae0b086f7 100644 --- a/packages/utils/src/getSaveType.ts +++ b/packages/utils/src/getSaveType.ts @@ -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' diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index c76f67423f..860ac84029 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -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, diff --git a/packages/utils/src/removeOrphanPkgs.ts b/packages/utils/src/removeOrphanPkgs.ts index df6f322e9a..124e7f4a3c 100644 --- a/packages/utils/src/removeOrphanPkgs.ts +++ b/packages/utils/src/removeOrphanPkgs.ts @@ -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> { - 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]>