Skip to content

Commit 04beef2

Browse files
committed
Search by node and not id
1 parent 70dd086 commit 04beef2

File tree

1 file changed

+59
-62
lines changed
  • src/shadow/arborist/lib/arborist

1 file changed

+59
-62
lines changed

src/shadow/arborist/lib/arborist/reify.ts

Lines changed: 59 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,27 @@ const {
6262
const formatter = new ColorOrMarkdown(false)
6363

6464
function findBestPatchVersion(
65-
name: string,
65+
node: SafeNode,
6666
availableVersions: string[],
67-
currentMajorVersion: number,
6867
vulnerableVersionRange?: string,
6968
_firstPatchedVersionIdentifier?: string
7069
): string | null {
71-
const manifestData = getManifestData(NPM, name)
72-
// Filter versions that are within the current major version and are not in the vulnerable range
73-
const eligibleVersions =
74-
manifestData && manifestData.name === manifestData.package
75-
? availableVersions
76-
: availableVersions.filter(
77-
version =>
78-
semver.major(version) === currentMajorVersion &&
79-
(!vulnerableVersionRange ||
80-
!semver.satisfies(version, vulnerableVersionRange))
81-
)
82-
if (eligibleVersions.length === 0) {
83-
return null
70+
const manifestData = getManifestData(NPM, node.name)
71+
let eligibleVersions
72+
if (manifestData && manifestData.name === manifestData.package) {
73+
const major = semver.major(manifestData.version)
74+
eligibleVersions = availableVersions.filter(v => semver.major(v) === major)
75+
} else {
76+
const major = semver.major(node.version)
77+
eligibleVersions = availableVersions.filter(
78+
v =>
79+
// Filter for versions that are within the current major version
80+
// and are not in the vulnerable range
81+
semver.major(v) === major &&
82+
(!vulnerableVersionRange ||
83+
!semver.satisfies(v, vulnerableVersionRange))
84+
)
8485
}
85-
// Use semver to find the max satisfying version.
8686
return semver.maxSatisfying(eligibleVersions, '*')
8787
}
8888

@@ -114,15 +114,15 @@ type GetPackageAlertsOptions = {
114114
}
115115

116116
async function getPackagesAlerts(
117-
details: PackageDetail[],
117+
arb: SafeArborist,
118118
options?: GetPackageAlertsOptions
119119
): Promise<SocketPackageAlert[]> {
120-
let { length: remaining } = details
121120
const IPC = await getIPC()
122121
const runningFixCmd = !!IPC[SOCKET_CLI_IN_FIX_CMD]
123122
const needInfoOn = getPackagesToQueryFromDiff(arb.diff, {
124123
includeUnchanged: runningFixCmd
125124
})
125+
let { length: remaining } = needInfoOn
126126
const packageAlerts: SocketPackageAlert[] = []
127127
if (!remaining) {
128128
return packageAlerts
@@ -142,14 +142,13 @@ async function getPackagesAlerts(
142142
spinner?.start(getText())
143143
try {
144144
for await (const artifact of batchScan(
145-
arrayUnique(details.map(d => d.node.pkgid))
145+
arrayUnique(needInfoOn.map(d => d.node.pkgid))
146146
)) {
147147
if (!artifact.name || !artifact.version || !artifact.alerts?.length) {
148148
continue
149149
}
150-
const { version } = artifact
151150
const name = resolvePackageName(<any>artifact)
152-
const id = `${name}@${artifact.version}`
151+
const { version } = artifact
153152

154153
let displayWarning = false
155154
let alerts: SocketPackageAlert[] = []
@@ -178,16 +177,17 @@ async function getPackagesAlerts(
178177
if (includeExisting && !runningFixCmd) {
179178
// Before we ask about problematic issues, check to see if they
180179
// already existed in the old version if they did, be quiet.
181-
const existing = details.find(d =>
180+
const existing = needInfoOn.find(d =>
182181
d.existing?.pkgid.startsWith(`${name}@`)
183182
)?.existing
184183
if (existing) {
185184
const oldArtifact: SocketArtifact | undefined =
186185
// eslint-disable-next-line no-await-in-loop
187186
(await batchScan([existing.pkgid]).next()).value
188-
if (oldArtifact?.alerts?.length) {
187+
const oldAlerts = oldArtifact?.alerts
188+
if (oldAlerts?.length) {
189189
alerts = alerts.filter(
190-
({ type }) => !oldArtifact.alerts!.find(a => a.type === type)
190+
({ type }) => !oldAlerts.find(a => a.type === type)
191191
)
192192
}
193193
}
@@ -196,7 +196,10 @@ async function getPackagesAlerts(
196196
}
197197
if (displayWarning && spinner) {
198198
spinner.stop(
199-
`(socket) ${formatter.hyperlink(id, getSocketDevPackageOverviewUrl(NPM, name, version))} contains risks:`
199+
`(socket) ${formatter.hyperlink(
200+
`${name}@${version}`,
201+
getSocketDevPackageOverviewUrl(NPM, name, version)
202+
)} contains risks:`
200203
)
201204
}
202205
alerts.sort((a, b) => (a.type < b.type ? -1 : 1))
@@ -249,7 +252,7 @@ function getTranslations() {
249252
return _translations!
250253
}
251254

252-
async function updateAdvisoryDependencies(
255+
async function updateAdvisoryNodes(
253256
arb: SafeArborist,
254257
alerts: SocketPackageAlert[]
255258
) {
@@ -311,11 +314,10 @@ async function updateAdvisoryDependencies(
311314
}
312315
}
313316

314-
async function updateSocketRegistryDependencies(arb: SafeArborist) {
317+
async function updateSocketRegistryNodes(arb: SafeArborist) {
315318
await arb.buildIdealTree()
316-
const manifest = getManifestData(NPM)
317319
const tree = arb.idealTree!
318-
for (const { 1: data } of manifest) {
320+
for (const { 1: data } of getManifestData(NPM)) {
319321
const nodes = findPackageNodes(tree, data.name)
320322
const packument = nodes.length
321323
? // eslint-disable-next-line no-await-in-loop
@@ -335,14 +337,11 @@ function updateNode(
335337
vulnerableVersionRange?: string,
336338
firstPatchedVersionIdentifier?: string
337339
) {
338-
const { version } = node
339-
const majorVerNum = semver.major(version)
340340
const availableVersions = Object.keys(packument.versions)
341341
// Find the highest non-vulnerable version within the same major range
342342
const targetVersion = findBestPatchVersion(
343-
node.name,
343+
node,
344344
availableVersions,
345-
majorVerNum,
346345
vulnerableVersionRange,
347346
firstPatchedVersionIdentifier
348347
)
@@ -433,33 +432,31 @@ export async function reify(
433432
) {
434433
throw new Error('Socket npm exiting due to risks')
435434
}
436-
if (!alerts.length || !runningFixCommand) {
437-
return await this[kRiskyReify](...args)
438-
}
439-
const prev = new Set(alerts.map(a => a.key))
440-
let ret: SafeNode | undefined
441-
/* eslint-disable no-await-in-loop */
442-
while (alerts.length > 0) {
443-
await updateAdvisoryDependencies(this, alerts)
444-
ret = await this[kRiskyReify](...args)
445-
await this.loadActual()
446-
await this.buildIdealTree()
447-
needInfoOn = getPackagesToQueryFromDiff(this.diff, {
448-
includeUnchanged: true
449-
})
450-
alerts = (
451-
await getPackagesAlerts(needInfoOn, {
452-
includeExisting: true,
453-
includeUnfixable: true
454-
})
455-
).filter(({ key }) => {
456-
const unseen = !prev.has(key)
457-
if (unseen) {
458-
prev.add(key)
459-
}
460-
return unseen
461-
})
462-
}
463-
/* eslint-enable no-await-in-loop */
464-
return ret!
435+
return await this[kRiskyReify](...args)
436+
// const prev = new Set(alerts.map(a => a.key))
437+
// let ret: SafeNode | undefined
438+
// /* eslint-disable no-await-in-loop */
439+
// while (alerts.length > 0) {
440+
// await updateAdvisoryNodes(this, alerts)
441+
// ret = await this[kRiskyReify](...args)
442+
// await this.loadActual()
443+
// await this.buildIdealTree()
444+
// needInfoOn = getPackagesToQueryFromDiff(this.diff, {
445+
// includeUnchanged: true
446+
// })
447+
// alerts = (
448+
// await getPackagesAlerts(needInfoOn, {
449+
// includeExisting: true,
450+
// includeUnfixable: true
451+
// })
452+
// ).filter(({ key }) => {
453+
// const unseen = !prev.has(key)
454+
// if (unseen) {
455+
// prev.add(key)
456+
// }
457+
// return unseen
458+
// })
459+
// }
460+
// /* eslint-enable no-await-in-loop */
461+
// return ret!
465462
}

0 commit comments

Comments
 (0)