Skip to content

Commit a108440

Browse files
committed
Fix aliases for npm overrides
1 parent cacfcdf commit a108440

File tree

4 files changed

+123
-51
lines changed

4 files changed

+123
-51
lines changed

.dep-stats.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"@socketregistry/is-unicode-supported": "^1.0.0",
1111
"@socketregistry/packageurl-js": "^1.0.2",
1212
"@socketsecurity/config": "^2.1.3",
13-
"@socketsecurity/registry": "^1.0.83",
13+
"@socketsecurity/registry": "^1.0.84",
1414
"@socketsecurity/sdk": "^1.4.5",
1515
"blessed": "^0.1.81",
1616
"blessed-contrib": "^4.11.0",

package-lock.json

+75-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@
171171
"has-proto": "npm:@socketregistry/has-proto@^1",
172172
"has-symbols": "npm:@socketregistry/has-symbols@^1",
173173
"hasown": "npm:@socketregistry/hasown@^1",
174-
"indent-string": "npm:@socketregistry/indent-string@^1",
174+
"indent-string": "$@socketregistry/indent-string",
175175
"is-core-module": "npm:@socketregistry/is-core-module@^1",
176176
"isarray": "npm:@socketregistry/isarray@^1",
177177
"npm-package-arg": "$npm-package-arg",

src/commands/optimize.ts

+46-38
Original file line numberDiff line numberDiff line change
@@ -676,35 +676,41 @@ async function addOverrides(
676676
if (spinner) {
677677
spinner.text = `Adding overrides${workspaceName ? ` to ${workspaceName}` : ''}...`
678678
}
679-
const depAliasMap = new Map<string, { id: string; version: string }>()
679+
const depAliasMap = new Map<string, string>()
680680
// Chunk package names to process them in parallel 3 at a time.
681681
await pEach(manifestEntries, 3, async ({ 1: data }) => {
682-
const { name: regPkgName, package: origPkgName, version } = data
682+
const { name: sockRegPkgName, package: origPkgName, version } = data
683683
const major = semver.major(version)
684+
const sockOverridePrefix = `${NPM}:${sockRegPkgName}@`
685+
const sockOverrideSpec = `${sockOverridePrefix}${pin ? version : `^${major}`}`
684686
for (const { 1: depObj } of depEntries) {
685-
let pkgSpec = depObj[origPkgName]
686-
if (pkgSpec) {
687-
let thisVersion = version
687+
const sockSpec = hasOwn(depObj, sockRegPkgName)
688+
? depObj[sockRegPkgName]
689+
: undefined
690+
if (sockSpec) {
691+
depAliasMap.set(sockRegPkgName, sockSpec)
692+
}
693+
const origSpec = hasOwn(depObj, origPkgName)
694+
? depObj[origPkgName]
695+
: undefined
696+
if (origSpec) {
697+
let thisSpec = origSpec
688698
// Add package aliases for direct dependencies to avoid npm EOVERRIDE errors.
689699
// https://docs.npmjs.com/cli/v8/using-npm/package-spec#aliases
690-
const regSpecStartsLike = `npm:${regPkgName}@`
691-
const existingVersion = pkgSpec.startsWith(regSpecStartsLike)
692-
? (semver.coerce(npa(pkgSpec).rawSpec)?.version ?? '')
693-
: ''
694-
if (existingVersion) {
695-
thisVersion = existingVersion
696-
} else {
697-
pkgSpec = `${regSpecStartsLike}^${version}`
698-
depObj[origPkgName] = pkgSpec
699-
state.added.add(regPkgName)
700+
if (
701+
!(
702+
thisSpec.startsWith(sockOverridePrefix) &&
703+
semver.coerce(npa(thisSpec).rawSpec)?.version
704+
)
705+
) {
706+
thisSpec = sockOverrideSpec
707+
depObj[origPkgName] = thisSpec
708+
state.added.add(sockRegPkgName)
700709
if (workspaceName) {
701710
state.addedInWorkspaces.add(workspaceName)
702711
}
703712
}
704-
depAliasMap.set(origPkgName, {
705-
id: pkgSpec,
706-
version: thisVersion
707-
})
713+
depAliasMap.set(origPkgName, thisSpec)
708714
}
709715
}
710716
if (isRoot) {
@@ -716,42 +722,44 @@ async function addOverrides(
716722
thingScanner(thingToScan, origPkgName, lockBasename)
717723
) {
718724
const oldSpec = overrideExists ? overrides[origPkgName] : undefined
719-
const depAlias = depAliasMap.get(origPkgName)
720-
const regSpecStartsLike = `${NPM}:${regPkgName}@`
721-
let newSpec = `${regSpecStartsLike}${pin ? version : `^${major}`}`
722-
let thisVersion = version
723-
if (depAlias && type === NPM) {
725+
const origDepAlias = depAliasMap.get(origPkgName)
726+
const sockRegDepAlias = depAliasMap.get(sockRegPkgName)
727+
const depAlias = sockRegDepAlias ?? origDepAlias
728+
let newSpec = sockOverrideSpec
729+
if (type === NPM && depAlias) {
724730
// With npm one may not set an override for a package that one directly
725731
// depends on unless both the dependency and the override itself share
726732
// the exact same spec. To make this limitation easier to deal with,
727733
// overrides may also be defined as a reference to a spec for a direct
728734
// dependency by prefixing the name of the package to match the version
729735
// of with a $.
730736
// https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides
731-
newSpec = `$${origPkgName}`
737+
newSpec = `$${sockRegDepAlias ? sockRegPkgName : origPkgName}`
732738
} else if (overrideExists) {
733739
const thisSpec = oldSpec.startsWith('$')
734-
? (depAlias?.id ?? newSpec)
735-
: (oldSpec ?? newSpec)
736-
if (thisSpec.startsWith(regSpecStartsLike)) {
737-
if (pin) {
738-
thisVersion =
739-
semver.major(
740-
semver.coerce(npa(thisSpec).rawSpec)?.version ?? version
741-
) === major
742-
? version
743-
: ((await fetchPackageManifest(thisSpec))?.version ??
744-
version)
740+
? depAlias || newSpec
741+
: oldSpec || newSpec
742+
if (thisSpec.startsWith(sockOverridePrefix)) {
743+
if (
744+
pin &&
745+
semver.major(
746+
semver.coerce(npa(thisSpec).rawSpec)?.version ?? version
747+
) !== major
748+
) {
749+
const otherVersion = (await fetchPackageManifest(thisSpec))
750+
?.version
751+
if (otherVersion !== version) {
752+
newSpec = `${sockOverridePrefix}${pin ? otherVersion : `^${semver.major(otherVersion)}`}`
753+
}
745754
}
746-
newSpec = `${regSpecStartsLike}${pin ? thisVersion : `^${semver.major(thisVersion)}`}`
747755
} else {
748756
newSpec = oldSpec
749757
}
750758
}
751759
if (newSpec !== oldSpec) {
752760
overrides[origPkgName] = newSpec
753761
const addedOrUpdated = overrideExists ? 'updated' : 'added'
754-
state[addedOrUpdated].add(regPkgName)
762+
state[addedOrUpdated].add(sockRegPkgName)
755763
}
756764
}
757765
})

0 commit comments

Comments
 (0)