Skip to content
This repository has been archived by the owner on Jan 20, 2022. It is now read-only.

Commit

Permalink
feat: add option to override recorded registry
Browse files Browse the repository at this point in the history
  • Loading branch information
Caleb ツ Everett committed Dec 22, 2021
1 parent 37ad149 commit 28a2d21
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 9 deletions.
30 changes: 24 additions & 6 deletions lib/shrinkwrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,11 @@ class Shrinkwrap {

const resolved = consistentResolve(node.resolved, node.path, path, true)
// hide resolved from registry dependencies.
if (resolved &&
!(options.omitLockfileRegistryResolved && node.isRegistryDependency)) {
if (!resolved) {
// no-op
} else if (node.isRegistryDependency) {
meta.resolved = overrideResolves(resolved, options)
} else {
meta.resolved = resolved
}

Expand Down Expand Up @@ -334,6 +337,8 @@ class Shrinkwrap {
log = procLog,
lockfileVersion,
omitLockfileRegistryResolved = false,
registry,
recordResolvedRegistry,
} = options

this.lockfileVersion = hiddenLockfile ? 3
Expand All @@ -352,7 +357,11 @@ class Shrinkwrap {
this.yarnLock = null
this.hiddenLockfile = hiddenLockfile
this.loadingError = null
this.resolvedOptions = { omitLockfileRegistryResolved }
this.resolvedOptions = {
omitLockfileRegistryResolved,
registry,
recordResolvedRegistry,
}
// only load npm-shrinkwrap.json in dep trees, not package-lock
this.shrinkwrapOnly = shrinkwrapOnly
}
Expand Down Expand Up @@ -1012,16 +1021,14 @@ class Shrinkwrap {
// git, file, dir, or remote, then the resolved value is necessary.
if (node.resolved &&
!node.isLink &&
!(node.isRegistryDependency &&
this.resolvedOptions.omitLockfileRegistryResolved) &&
rSpec.type !== 'git' &&
rSpec.type !== 'file' &&
rSpec.type !== 'directory' &&
spec.type !== 'directory' &&
spec.type !== 'git' &&
spec.type !== 'file' &&
spec.type !== 'remote') {
lock.resolved = node.resolved
lock.resolved = overrideResolves(node.resolved, this.resolvedOptions)
}

if (node.integrity) {
Expand Down Expand Up @@ -1130,4 +1137,15 @@ class Shrinkwrap {
}
}

function overrideResolves (resolved, opts) {
if (opts.omitLockfileRegistryResolved) {
return undefined
}
if (opts.registry && opts.recordResolvedRegistry && resolved.startsWith(opts.registry)) {
// TODO handle scoped packages with their own registries.
return opts.recordResolvedRegistry + resolved.slice(opts.registry.length)
}
return resolved
}

module.exports = Shrinkwrap
60 changes: 57 additions & 3 deletions test/shrinkwrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,13 +227,67 @@ t.test('throws when attempting to access data before loading', t => {
t.end()
})

t.test('recordResolvedRegistry', async t => {
const url = 'https://private.reg.org/deadbeef/registry/-/registry-1.2.3.tgz'
const getData = async (recordResolvedRegistry) => {
const dir = t.testdir()
const meta = await Shrinkwrap.load({
path: dir,
registry: 'https://private.reg.org/deadbeef',
recordResolvedRegistry })

const root = new Node({
pkg: {
name: 'root',
dependencies: {
registry: '^1.0.0',
tar: url,
},
},
path: dir,
realpath: dir,
meta,
})

const registry = new Node({
pkg: { name: 'registry', version: '1.2.3' },
resolved: url,
integrity: 'sha512-registry',
parent: root,
})

const tar = new Node({
pkg: { name: 'tar', version: '1.2.3' },
resolved: url,
integrity: 'sha512-registry',
parent: root,
})

calcDepFlags(root)
meta.add(root)
return { data: meta.commit(), registry, tar, root }
}

await t.test('with override', async t => {
const { data } = await getData('https://registry.npmjs.org')
t.strictSame(data.packages['node_modules/registry'].resolved,
'https://registry.npmjs.org/registry/-/registry-1.2.3.tgz')
t.strictSame(data.dependencies.registry.resolved,
'https://registry.npmjs.org/registry/-/registry-1.2.3.tgz')

// should not affect url dependencies
t.strictSame(data.packages['node_modules/tar'].resolved, url)
t.strictSame(data.dependencies.tar.resolved, undefined)
})
})

t.test('omitLockfileRegistryResolved', async t => {
const url = 'https://registry.npmjs.org/registry/-/registry-1.2.3.tgz'
const getData = async (omitLockfileRegistryResolved) => {
const dir = t.testdir()
const meta = await Shrinkwrap.load({
path: dir,
omitLockfileRegistryResolved})
omitLockfileRegistryResolved })

const root = new Node({
pkg: {
Expand All @@ -249,14 +303,14 @@ t.test('omitLockfileRegistryResolved', async t => {
})

const registry = new Node({
pkg: {name: 'registry', version: '1.2.3' },
pkg: { name: 'registry', version: '1.2.3' },
resolved: url,
integrity: 'sha512-registry',
parent: root,
})

const tar = new Node({
pkg: {name: 'tar', version: '1.2.3'},
pkg: { name: 'tar', version: '1.2.3' },
resolved: url,
integrity: 'sha512-registry',
parent: root,
Expand Down

0 comments on commit 28a2d21

Please sign in to comment.