Skip to content

Commit 948d7ee

Browse files
committed
feat(add): skip re-install when signatures match
- never compare sigs when --pure is used - avoid re-installing ".yalc/{name}" when sigs match - improved logic for updating package dependencies
1 parent d7a4f56 commit 948d7ee

File tree

1 file changed

+42
-41
lines changed

1 file changed

+42
-41
lines changed

src/add.ts

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,9 @@ export const addPackages = async (
8787
)
8888
return null
8989
}
90-
const versionToInstall = version || getLatestPackageVersion(name)
9190

91+
const versionToInstall = version || getLatestPackageVersion(name)
9292
const storedPackageDir = getPackageStoreDir(name, versionToInstall)
93-
9493
if (!fs.existsSync(storedPackageDir)) {
9594
console.log(
9695
`Could not find package \`${packageName}\` ` + storedPackageDir,
@@ -101,13 +100,10 @@ export const addPackages = async (
101100

102101
const pkg = readPackageManifest(storedPackageDir)
103102
if (!pkg) {
104-
return
103+
return null
105104
}
106-
const destYalcCopyDir = join(workingDir, values.yalcPackagesFolder, name)
107-
108-
emptyDirExcludeNodeModules(destYalcCopyDir)
109-
fs.copySync(storedPackageDir, destYalcCopyDir)
110105

106+
const signature = readSignatureFile(storedPackageDir)
111107
let replacedVersion = ''
112108
if (doPure) {
113109
if (localPkg.workspaces) {
@@ -126,60 +122,65 @@ export const addPackages = async (
126122
)
127123
}
128124
if (!doPure) {
129-
const destModulesDir = join(workingDir, 'node_modules', name)
130-
fs.removeSync(destModulesDir)
131-
if (options.link) {
132-
ensureSymlinkSync(destYalcCopyDir, destModulesDir, 'junction')
133-
} else {
134-
fs.copySync(destYalcCopyDir, destModulesDir)
135-
}
136-
137-
if (!options.noSave) {
125+
if (!options.link) {
138126
const protocol = options.link ? 'link:' : 'file:'
139127
const localAddress =
140128
protocol + values.yalcPackagesFolder + '/' + pkg.name
141129

142130
const dependencies = localPkg.dependencies || {}
143131
const devDependencies = localPkg.devDependencies || {}
144-
let whereToAdd = options.dev ? devDependencies : dependencies
145132

146-
if (options.dev) {
147-
if (dependencies[pkg.name]) {
148-
replacedVersion = dependencies[pkg.name]
149-
delete dependencies[pkg.name]
150-
}
151-
} else {
152-
if (!dependencies[pkg.name]) {
153-
if (devDependencies[pkg.name]) {
154-
whereToAdd = devDependencies
155-
}
156-
}
157-
}
133+
const whereToRemove = devDependencies[pkg.name]
134+
? devDependencies
135+
: dependencies
158136

159-
if (whereToAdd[pkg.name] !== localAddress) {
160-
replacedVersion = replacedVersion || whereToAdd[pkg.name]
161-
whereToAdd[pkg.name] = localAddress
162-
localPkg.dependencies =
163-
whereToAdd === dependencies ? dependencies : localPkg.dependencies
164-
localPkg.devDependencies =
165-
whereToAdd === devDependencies
137+
replacedVersion = whereToRemove[pkg.name] || ''
138+
if (replacedVersion !== localAddress) {
139+
const whereToAdd =
140+
options.dev || whereToRemove === devDependencies
166141
? devDependencies
167-
: localPkg.devDependencies
142+
: dependencies
143+
168144
localPkgUpdated = true
145+
whereToAdd[pkg.name] = localAddress
146+
if (whereToAdd !== whereToRemove) {
147+
delete whereToRemove[pkg.name]
148+
}
149+
} else {
150+
replacedVersion = ''
169151
}
170-
replacedVersion =
171-
replacedVersion == localAddress ? '' : replacedVersion
172152
}
173153

154+
const destYalcCopyDir = join(
155+
workingDir,
156+
values.yalcPackagesFolder,
157+
name
158+
)
159+
160+
if (signature === readSignatureFile(destYalcCopyDir)) {
161+
console.log(
162+
`"${packageName}" already exists in the local ".yalc" directory`
163+
)
164+
return null
165+
}
166+
167+
// Replace the local ".yalc/{name}" directory.
168+
fs.removeSync(destYalcCopyDir)
169+
fs.copySync(storedPackageDir, destYalcCopyDir)
170+
171+
// Replace the local "node_modules/{name}" symlink.
172+
const nodeModulesPath = join(workingDir, 'node_modules', name)
173+
fs.removeSync(nodeModulesPath)
174+
ensureSymlinkSync(destYalcCopyDir, nodeModulesPath, 'junction')
175+
174176
const addedAction = options.noSave ? 'linked' : 'added'
175177
console.log(
176178
`Package ${pkg.name}@${
177179
pkg.version
178-
} ${addedAction} ==> ${destModulesDir}.`
180+
} ${addedAction} ==> ${nodeModulesPath}.`
179181
)
180182
}
181183

182-
const signature = readSignatureFile(storedPackageDir)
183184
return {
184185
signature,
185186
name,

0 commit comments

Comments
 (0)