Skip to content

Commit

Permalink
feat(add): skip re-install when signatures match
Browse files Browse the repository at this point in the history
- never compare sigs when --pure is used
- avoid re-installing ".yalc/{name}" when sigs match
- improved logic for updating package dependencies
  • Loading branch information
aleclarson committed Jan 7, 2019
1 parent d7a4f56 commit 487a04f
Showing 1 changed file with 46 additions and 41 deletions.
87 changes: 46 additions & 41 deletions src/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,9 @@ export const addPackages = async (
)
return null
}
const versionToInstall = version || getLatestPackageVersion(name)

const versionToInstall = version || getLatestPackageVersion(name)
const storedPackageDir = getPackageStoreDir(name, versionToInstall)

if (!fs.existsSync(storedPackageDir)) {
console.log(
`Could not find package \`${packageName}\` ` + storedPackageDir,
Expand All @@ -101,13 +100,10 @@ export const addPackages = async (

const pkg = readPackageManifest(storedPackageDir)
if (!pkg) {
return
return null
}
const destYalcCopyDir = join(workingDir, values.yalcPackagesFolder, name)

emptyDirExcludeNodeModules(destYalcCopyDir)
fs.copySync(storedPackageDir, destYalcCopyDir)

const signature = readSignatureFile(storedPackageDir)
let replacedVersion = ''
if (doPure) {
if (localPkg.workspaces) {
Expand All @@ -126,60 +122,69 @@ export const addPackages = async (
)
}
if (!doPure) {
const destModulesDir = join(workingDir, 'node_modules', name)
fs.removeSync(destModulesDir)
if (options.link) {
ensureSymlinkSync(destYalcCopyDir, destModulesDir, 'junction')
} else {
fs.copySync(destYalcCopyDir, destModulesDir)
}

if (!options.noSave) {
if (!options.link) {
const protocol = options.link ? 'link:' : 'file:'
const localAddress =
protocol + values.yalcPackagesFolder + '/' + pkg.name

const dependencies = localPkg.dependencies || {}
const devDependencies = localPkg.devDependencies || {}
let whereToAdd = options.dev ? devDependencies : dependencies

if (options.dev) {
if (dependencies[pkg.name]) {
replacedVersion = dependencies[pkg.name]
delete dependencies[pkg.name]
}
} else {
if (!dependencies[pkg.name]) {
if (devDependencies[pkg.name]) {
whereToAdd = devDependencies
}
}
}
const whereToRemove = devDependencies[pkg.name]
? devDependencies
: dependencies

if (whereToAdd[pkg.name] !== localAddress) {
replacedVersion = replacedVersion || whereToAdd[pkg.name]
whereToAdd[pkg.name] = localAddress
localPkg.dependencies =
whereToAdd === dependencies ? dependencies : localPkg.dependencies
localPkg.devDependencies =
whereToAdd === devDependencies
replacedVersion = whereToRemove[pkg.name] || ''
if (replacedVersion !== localAddress) {
const whereToAdd =
options.dev || whereToRemove === devDependencies
? devDependencies
: localPkg.devDependencies
: dependencies

localPkgUpdated = true
whereToAdd[pkg.name] = localAddress
if (whereToAdd !== whereToRemove) {
delete whereToRemove[pkg.name]
}
} else {
replacedVersion = ''
}
replacedVersion =
replacedVersion == localAddress ? '' : replacedVersion
}

const localPackageDir = join(
workingDir,
values.yalcPackagesFolder,
name
)

if (signature === readSignatureFile(localPackageDir)) {
console.log(
`"${packageName}" already exists in the local ".yalc" directory`
)
return null
}

// Replace the local ".yalc/{name}" directory.
fs.removeSync(localPackageDir)
fs.copySync(storedPackageDir, localPackageDir)

// Replace the local "node_modules/{name}" symlink.
const nodeModulesDest = join(workingDir, 'node_modules', name)
fs.removeSync(nodeModulesDest)
if (options.link) {
ensureSymlinkSync(localPackageDir, nodeModulesDest, 'junction')
} else {
fs.copySync(localPackageDir, nodeModulesDest)
}

const addedAction = options.noSave ? 'linked' : 'added'
console.log(
`Package ${pkg.name}@${
pkg.version
} ${addedAction} ==> ${destModulesDir}.`
} ${addedAction} ==> ${nodeModulesDest}.`
)
}

const signature = readSignatureFile(storedPackageDir)
return {
signature,
name,
Expand Down

0 comments on commit 487a04f

Please sign in to comment.