feat!: use the same lockfile format in 1-pkg workspace as in multi-pkg one (#7696)

This commit is contained in:
Zoltan Kochan
2024-02-29 10:28:29 +01:00
committed by GitHub
parent 730929e330
commit 5c20db0dd2
61 changed files with 471 additions and 376 deletions

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -1,14 +1,16 @@
lockfileVersion: '7.0'
dependencies:
is-negative:
specifier: ^1.0.0
version: 1.0.1
importers:
devDependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
.:
dependencies:
is-negative:
specifier: ^1.0.0
version: 1.0.1
devDependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
packages:

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -1 +1,5 @@
lockfileVersion: '7.0'
importers:
.: {}

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
is-negative:
specifier: github:kevva/is-negative#master
version: github.com/kevva/is-negative/219c424611ff4a2af15f7deeff4f93c62558c43d
importers:
.:
dependencies:
is-negative:
specifier: github:kevva/is-negative#master
version: github.com/kevva/is-negative/219c424611ff4a2af15f7deeff4f93c62558c43d
packages:

View File

@@ -25,7 +25,6 @@ export type StrictRebuildOptions = {
storeDir: string // TODO: remove this property
storeController: StoreController
force: boolean
forceSharedLockfile: boolean
useLockfile: boolean
registries: Registries
dir: string
@@ -63,7 +62,6 @@ const defaults = async (opts: RebuildOptions) => {
development: true,
dir,
force: false,
forceSharedLockfile: false,
lockfileDir,
nodeLinker: 'isolated',
optional: true,

View File

@@ -31,21 +31,17 @@ export async function writeWantedLockfile (
pkgPath: string,
wantedLockfile: Lockfile,
opts?: {
forceSharedFormat?: boolean
useGitBranchLockfile?: boolean
mergeGitBranchLockfiles?: boolean
}
) {
const wantedLockfileName: string = await getWantedLockfileName(opts)
return writeLockfile(wantedLockfileName, pkgPath, wantedLockfile, opts)
return writeLockfile(wantedLockfileName, pkgPath, wantedLockfile)
}
export async function writeCurrentLockfile (
virtualStoreDir: string,
currentLockfile: Lockfile,
opts?: {
forceSharedFormat?: boolean
}
currentLockfile: Lockfile
) {
// empty lockfile is not saved
if (isEmptyLockfile(currentLockfile)) {
@@ -53,23 +49,18 @@ export async function writeCurrentLockfile (
return
}
await fs.mkdir(virtualStoreDir, { recursive: true })
return writeLockfile('lock.yaml', virtualStoreDir, currentLockfile, opts)
}
interface LockfileFormatOptions {
forceSharedFormat?: boolean
return writeLockfile('lock.yaml', virtualStoreDir, currentLockfile)
}
async function writeLockfile (
lockfileFilename: string,
pkgPath: string,
wantedLockfile: Lockfile,
opts?: LockfileFormatOptions
wantedLockfile: Lockfile
) {
const lockfilePath = path.join(pkgPath, lockfileFilename)
const lockfileToStringify = convertToLockfileFile(wantedLockfile, {
forceSharedFormat: opts?.forceSharedFormat === true,
forceSharedFormat: true,
})
const yamlDoc = yamlStringify(lockfileToStringify)
@@ -88,7 +79,6 @@ export function isEmptyLockfile (lockfile: Lockfile) {
export async function writeLockfiles (
opts: {
forceSharedFormat?: boolean
wantedLockfile: Lockfile
wantedLockfileDir: string
currentLockfile: Lockfile
@@ -101,9 +91,8 @@ export async function writeLockfiles (
const wantedLockfilePath = path.join(opts.wantedLockfileDir, wantedLockfileName)
const currentLockfilePath = path.join(opts.currentLockfileDir, 'lock.yaml')
const forceSharedFormat = opts?.forceSharedFormat === true
const normalizeOpts = {
forceSharedFormat,
forceSharedFormat: true,
}
const wantedLockfileToStringify = convertToLockfileFile(opts.wantedLockfile, normalizeOpts)
const yamlDoc = yamlStringify(wantedLockfileToStringify)

View File

@@ -3,13 +3,16 @@
exports[`writeLockfiles() 1`] = `
"lockfileVersion: '7.0'
dependencies:
is-negative:
specifier: ^1.0.0
version: 1.0.0
is-positive:
specifier: ^1.0.0
version: 1.0.0
importers:
.:
dependencies:
is-negative:
specifier: ^1.0.0
version: 1.0.0
is-positive:
specifier: ^1.0.0
version: 1.0.0
packages:

View File

@@ -31,7 +31,6 @@ export async function getPeerDependencyIssues (
const lockfileDir = opts.lockfileDir ?? process.cwd()
const ctx = await getContext({
force: false,
forceSharedLockfile: false,
extraBinPaths: [],
lockfileDir,
nodeLinker: opts.nodeLinker ?? 'isolated',

View File

@@ -23,7 +23,6 @@ import { type PreResolutionHookContext } from '@pnpm/hooks.types'
export interface StrictInstallOptions {
autoInstallPeers: boolean
autoInstallPeersFromHighestMatch: boolean
forceSharedLockfile: boolean
frozenLockfile: boolean
frozenLockfileIfExists: boolean
enablePnp: boolean
@@ -171,7 +170,6 @@ const defaults = (opts: InstallOptions) => {
engineStrict: false,
force: false,
forceFullResolution: false,
forceSharedLockfile: false,
frozenLockfile: false,
hoistPattern: undefined,
publicHoistPattern: undefined,

View File

@@ -474,7 +474,6 @@ Note that in CI environments, this setting is enabled by default.`,
currentLockfileDir: ctx.virtualStoreDir,
wantedLockfile: ctx.wantedLockfile,
wantedLockfileDir: ctx.lockfileDir,
forceSharedFormat: opts.forceSharedLockfile,
useGitBranchLockfile: opts.useGitBranchLockfile,
mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles,
})
@@ -1080,8 +1079,6 @@ const _installInContext: InstallFunction = async (projects, ctx, opts) => {
const depsStateCache: DepsStateCache = {}
const lockfileOpts = {
forceSharedFormat: opts.forceSharedLockfile,
useInlineSpecifiersFormat: true,
useGitBranchLockfile: opts.useGitBranchLockfile,
mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles,
}
@@ -1269,7 +1266,7 @@ const _installInContext: InstallFunction = async (projects, ctx, opts) => {
wantedLockfileDir: ctx.lockfileDir,
...lockfileOpts,
})
: writeCurrentLockfile(ctx.virtualStoreDir, result.currentLockfile, lockfileOpts),
: writeCurrentLockfile(ctx.virtualStoreDir, result.currentLockfile),
(async () => {
if (result.currentLockfile.packages === undefined && result.removedDepPaths.size === 0) {
return Promise.resolve()

View File

@@ -137,7 +137,7 @@ export async function link (
} else {
newPkg = opts.manifest
}
const lockfileOpts = { forceSharedFormat: opts.forceSharedLockfile, useGitBranchLockfile: opts.useGitBranchLockfile, mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles }
const lockfileOpts = { useGitBranchLockfile: opts.useGitBranchLockfile, mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles }
if (opts.useLockfile) {
await writeLockfiles({
currentLockfile: updatedCurrentLockfile,
@@ -147,7 +147,7 @@ export async function link (
...lockfileOpts,
})
} else {
await writeCurrentLockfile(ctx.virtualStoreDir, updatedCurrentLockfile, lockfileOpts)
await writeCurrentLockfile(ctx.virtualStoreDir, updatedCurrentLockfile)
}
summaryLogger.debug({ prefix: opts.dir })

View File

@@ -13,7 +13,6 @@ interface StrictLinkOptions {
binsDir: string
excludeLinksFromLockfile: boolean
force: boolean
forceSharedLockfile: boolean
useLockfile: boolean
lockfileDir: string
nodeLinker: 'isolated' | 'hoisted' | 'pnp'
@@ -61,7 +60,6 @@ async function defaults (opts: LinkOptions) {
binsDir: path.join(dir, 'node_modules', '.bin'),
dir,
force: false,
forceSharedLockfile: false,
hoistPattern: undefined,
lockfileDir: opts.lockfileDir ?? dir,
nodeLinker: 'isolated',

View File

@@ -100,7 +100,7 @@ test('uninstall package with dependencies and do not touch other deps', async ()
expect(manifest.dependencies).toStrictEqual({ 'is-negative': '2.1.0' })
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-negative': {
specifier: '2.1.0',
version: '2.1.0',

View File

@@ -17,14 +17,18 @@ test('installing aliased dependency', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
negative: {
specifier: 'npm:is-negative@1.0.0',
version: '/is-negative@1.0.0',
},
positive: {
specifier: 'npm:is-positive@^3.1.0',
version: '/is-positive@3.1.0',
importers: {
'.': {
dependencies: {
negative: {
specifier: 'npm:is-negative@1.0.0',
version: '/is-negative@1.0.0',
},
positive: {
specifier: 'npm:is-positive@^3.1.0',
version: '/is-positive@3.1.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -78,10 +82,14 @@ test('a dependency has an aliased subdependency', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'@pnpm.e2e/pkg-with-1-aliased-dep': {
specifier: '^100.0.0',
version: '100.0.0',
importers: {
'.': {
dependencies: {
'@pnpm.e2e/pkg-with-1-aliased-dep': {
specifier: '^100.0.0',
version: '100.0.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,

View File

@@ -197,7 +197,7 @@ test('automatically install root peer dependencies', async () => {
{
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-positive': {
specifier: '^1.0.0',
version: '1.0.0',
@@ -225,7 +225,7 @@ test('automatically install root peer dependencies', async () => {
{
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-odd': {
specifier: '1.0.0',
version: '1.0.0',
@@ -254,7 +254,7 @@ test('automatically install root peer dependencies', async () => {
{
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-positive': {
specifier: '^1.0.0',
version: '1.0.0',
@@ -600,5 +600,5 @@ test('do not override the direct dependency with an auto installed peer dependen
},
}))
const lockfile = project.readLockfile()
expect(lockfile.dependencies.rxjs.version).toStrictEqual('6.6.7')
expect(lockfile.importers['.'].dependencies?.rxjs.version).toStrictEqual('6.6.7')
})

View File

@@ -68,7 +68,7 @@ test('from a github repo with different name via named installation', async () =
expect(manifest.dependencies).toStrictEqual({ 'say-hi': 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' })
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'say-hi': {
specifier: 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd',
version: 'github.com/zkochan/hi/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd',
@@ -111,7 +111,7 @@ test('from a github repo with different name', async () => {
})
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'say-hi': {
specifier: 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd',
version: 'github.com/zkochan/hi/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd',
@@ -248,7 +248,7 @@ test('re-adding a git repo with a different tag', async () => {
})
expect(JSON.parse(fs.readFileSync('./node_modules/is-negative/package.json', 'utf8')).version).toBe('1.0.0')
let lockfile = project.readLockfile()
expect(lockfile.dependencies['is-negative']).toEqual({
expect(lockfile.importers['.'].dependencies?.['is-negative']).toEqual({
specifier: 'github:kevva/is-negative#1.0.0',
version: 'github.com/kevva/is-negative/163360a8d3ae6bee9524541043197ff356f8ed99',
})
@@ -267,7 +267,7 @@ test('re-adding a git repo with a different tag', async () => {
project.has('is-negative')
expect(JSON.parse(fs.readFileSync('./node_modules/is-negative/package.json', 'utf8')).version).toBe('1.0.1')
lockfile = project.readLockfile()
expect(lockfile.dependencies['is-negative']).toEqual({
expect(lockfile.importers['.'].dependencies?.['is-negative']).toEqual({
specifier: 'github:kevva/is-negative#1.0.1',
version: 'github.com/kevva/is-negative/9a89df745b2ec20ae7445d3d9853ceaeef5b0b72',
})
@@ -303,7 +303,7 @@ test('should not update when adding unrelated dependency', async () => {
const project = assertProject(withGitProtocolDepFixture)
project.has('is-number')
expect(fs.existsSync('./node_modules/.pnpm/github.com+kevva+is-negative+219c424611ff4a2af15f7deeff4f93c62558c43d')).toBe(true)
expect((project.readLockfile()).dependencies).toEqual({
expect(project.readLockfile().importers['.'].dependencies).toEqual({
'is-negative': {
specifier: 'github:kevva/is-negative#master',
version: 'github.com/kevva/is-negative/219c424611ff4a2af15f7deeff4f93c62558c43d',

View File

@@ -183,14 +183,18 @@ test('install with --merge-git-branch-lockfiles when merged lockfile is up to da
// is-positive installed in the other branch
const otherLockfilePath: string = path.resolve('pnpm-lock.other.yaml')
const otherLockfileContent = {
dependencies: {
'@types/semver': {
specifier: '5.3.31',
version: '5.3.31',
},
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
importers: {
'.': {
dependencies: {
'@types/semver': {
specifier: '5.3.31',
version: '5.3.31',
},
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,

View File

@@ -49,10 +49,14 @@ test('local file', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
importers: {
'.': {
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -107,10 +111,14 @@ test('local file via link:', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
importers: {
'.': {
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -139,10 +147,14 @@ test('local file with symlinked node_modules', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
importers: {
'.': {
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'link:../local-pkg',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -170,7 +182,7 @@ test('tarball local package', async () => {
expect(manifest.dependencies).toStrictEqual({ 'tar-pkg': pkgSpec })
const lockfile = project.readLockfile()
expect(lockfile.packages[lockfile.dependencies['tar-pkg'].version]).toStrictEqual({
expect(lockfile.packages[lockfile.importers['.'].dependencies!['tar-pkg'].version]).toStrictEqual({
dev: false,
name: 'tar-pkg',
resolution: {
@@ -200,8 +212,8 @@ test('tarball local package from project directory', async () => {
expect(manifest.dependencies).toStrictEqual({ 'tar-pkg': pkgSpec })
const lockfile = project.readLockfile()
expect(lockfile.dependencies['tar-pkg'].version).toBe(pkgSpec)
expect(lockfile.packages[lockfile.dependencies['tar-pkg'].version]).toStrictEqual({
expect(lockfile.importers['.'].dependencies?.['tar-pkg'].version).toBe(pkgSpec)
expect(lockfile.packages[lockfile.importers['.'].dependencies!['tar-pkg'].version]).toStrictEqual({
dev: false,
name: 'tar-pkg',
resolution: {
@@ -404,10 +416,14 @@ test('re-install should update local file dependency', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'file:../local-pkg',
importers: {
'.': {
dependencies: {
'local-pkg': {
specifier: expectedSpecs['local-pkg'],
version: 'file:../local-pkg',
},
},
},
},
packages: {

View File

@@ -28,7 +28,7 @@ test('install with lockfileOnly = true', async () => {
expect(manifest.dependencies!['@pnpm.e2e/pkg-with-1-dep']).toBeTruthy()
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/pkg-with-1-dep']).toBeTruthy()
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/pkg-with-1-dep']).toBeTruthy()
expect(lockfile.packages['/@pnpm.e2e/pkg-with-1-dep@100.0.0']).toBeTruthy()
const currentLockfile = project.readCurrentLockfile()
@@ -68,7 +68,7 @@ test('warn when installing with lockfileOnly = true and node_modules exists', as
expect(manifest.dependencies!.rimraf).toBeTruthy()
const lockfile = project.readLockfile()
expect(lockfile.dependencies.rimraf).toBeTruthy()
expect(lockfile.importers['.'].dependencies?.rimraf).toBeTruthy()
expect(lockfile.packages['/rimraf@2.5.1']).toBeTruthy()
const currentLockfile = project.readCurrentLockfile()

View File

@@ -44,7 +44,7 @@ test('spec not specified in package.json.dependencies', async () => {
}, testDefaults())
const lockfile = project.readLockfile()
expect(lockfile.dependencies['is-positive'].specifier).toBe('')
expect(lockfile.importers['.'].dependencies?.['is-positive'].specifier).toBe('')
})
test.skip('ignoring some files in the dependency', async () => {

View File

@@ -55,7 +55,7 @@ test('skip non-existing optional dependency', async () => {
const lockfile = project.readLockfile()
expect(lockfile.dependencies['is-positive'].specifier).toBe('1.0.0')
expect(lockfile.importers['.'].dependencies?.['is-positive'].specifier).toBe('1.0.0')
})
test('skip optional dependency that does not support the current OS', async () => {

View File

@@ -1674,7 +1674,7 @@ test('resolve peer of peer from the dependencies of the direct dependent package
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/has-has-y-peer-only-as-peer-and-y'].version).toBe('1.0.0(@pnpm.e2e/has-y-peer@1.0.0(@pnpm/y@2.0.0))')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/has-has-y-peer-only-as-peer-and-y'].version).toBe('1.0.0(@pnpm.e2e/has-y-peer@1.0.0(@pnpm/y@2.0.0))')
// Even though @pnpm/y@1.0.0 is in the dependencies of the direct dependent package, we resolve y from above.
// It might make sense to print a warning in this case and suggest to make y a peer dependency in the dependent package too.
expect(lockfile.packages['/@pnpm.e2e/has-has-y-peer-only-as-peer-and-y@1.0.0(@pnpm.e2e/has-y-peer@1.0.0(@pnpm/y@2.0.0))'].dependencies?.['@pnpm.e2e/has-y-peer']).toBe('1.0.0(@pnpm/y@2.0.0)')
@@ -1686,8 +1686,8 @@ test('2 circular peers', async () => {
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/circular-peer-a'].version).toBe('1.0.0(@pnpm.e2e/circular-peer-b@1.0.0)')
expect(lockfile.dependencies['@pnpm.e2e/circular-peer-b'].version).toBe('1.0.0(@pnpm.e2e/circular-peer-a@1.0.0)')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/circular-peer-a'].version).toBe('1.0.0(@pnpm.e2e/circular-peer-b@1.0.0)')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/circular-peer-b'].version).toBe('1.0.0(@pnpm.e2e/circular-peer-a@1.0.0)')
})
test('3 circular peers', async () => {
@@ -1701,9 +1701,9 @@ test('3 circular peers', async () => {
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/circular-peers-1-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-2-of-3@1.0.0)(@pnpm.e2e/peer-a@1.0.0)')
expect(lockfile.dependencies['@pnpm.e2e/circular-peers-2-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-3-of-3@1.0.0)(@pnpm.e2e/peer-a@1.0.0)(@pnpm.e2e/peer-b@1.0.0)')
expect(lockfile.dependencies['@pnpm.e2e/circular-peers-3-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-1-of-3@1.0.0)')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/circular-peers-1-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-2-of-3@1.0.0)(@pnpm.e2e/peer-a@1.0.0)')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/circular-peers-2-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-3-of-3@1.0.0)(@pnpm.e2e/peer-a@1.0.0)(@pnpm.e2e/peer-b@1.0.0)')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/circular-peers-3-of-3'].version).toBe('1.0.0(@pnpm.e2e/circular-peers-1-of-3@1.0.0)')
})
test('3 circular peers in workspace root', async () => {

View File

@@ -74,10 +74,10 @@ test('dependency should not be added to package.json if it is already there', as
const lockfile = project.readLockfile()
expect(lockfile.devDependencies['@pnpm.e2e/foo'].version).toBe('100.0.0')
expect(lockfile.importers['.'].devDependencies?.['@pnpm.e2e/foo'].version).toBe('100.0.0')
expect(lockfile.packages['/@pnpm.e2e/foo@100.0.0'].dev).toBeTruthy()
expect(lockfile.optionalDependencies['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile.importers['.'].optionalDependencies?.['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile.packages['/@pnpm.e2e/bar@100.0.0'].optional).toBeTruthy()
})
@@ -151,7 +151,7 @@ test('dependency should be removed from the old field when installing it as a di
{
const lockfile = project.readCurrentLockfile()
expect(Object.keys(lockfile.dependencies)).toStrictEqual(['@pnpm.e2e/bar', '@pnpm.e2e/foo', '@pnpm.e2e/qar'])
expect(Object.keys(lockfile.importers['.'].dependencies ?? {})).toStrictEqual(['@pnpm.e2e/bar', '@pnpm.e2e/foo', '@pnpm.e2e/qar'])
}
// manually editing package.json. Converting all prod deps to dev deps
@@ -163,7 +163,7 @@ test('dependency should be removed from the old field when installing it as a di
{
const lockfile = project.readCurrentLockfile()
expect(Object.keys(lockfile.devDependencies)).toStrictEqual(['@pnpm.e2e/bar', '@pnpm.e2e/foo', '@pnpm.e2e/qar'])
expect(Object.keys(lockfile.importers['.'].devDependencies ?? {})).toStrictEqual(['@pnpm.e2e/bar', '@pnpm.e2e/foo', '@pnpm.e2e/qar'])
expect(lockfile.dependencies).toBeFalsy()
}
})

View File

@@ -35,13 +35,13 @@ test('relative link', async () => {
project.isExecutable('.bin/hello-world-js-bin')
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.dependencies['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
expect(wantedLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
version: 'link:../hello-world-js-bin',
specifier: '*',
})
const currentLockfile = project.readCurrentLockfile()
expect(currentLockfile.dependencies['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
expect(currentLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
version: 'link:../hello-world-js-bin',
specifier: '*',
})
@@ -66,7 +66,7 @@ test('relative link is linked by the name of the alias', async () => {
project.has('hello')
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.dependencies).toStrictEqual({
expect(wantedLockfile.importers['.'].dependencies).toStrictEqual({
hello: {
specifier: 'link:../hello-world-js-bin',
version: 'link:../hello-world-js-bin',
@@ -154,10 +154,10 @@ test('relative link is rewritten by named installation to regular dependency', a
expect(project.requireModule('@pnpm.e2e/hello-world-js-bin/package.json').isLocal).toBeFalsy()
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.dependencies['@pnpm.e2e/hello-world-js-bin'].version).toBe('1.0.0')
expect(wantedLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin'].version).toBe('1.0.0')
const currentLockfile = project.readCurrentLockfile()
expect(currentLockfile.dependencies['@pnpm.e2e/hello-world-js-bin'].version).toBe('1.0.0')
expect(currentLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin'].version).toBe('1.0.0')
})
test('relative link uses realpath when contained in a symlinked dir', async () => {
@@ -237,7 +237,7 @@ test('link should not change the type of the dependency', async () => {
project.isExecutable('.bin/hello-world-js-bin')
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.devDependencies).toStrictEqual({
expect(wantedLockfile.importers['.'].devDependencies).toStrictEqual({
'@pnpm.e2e/hello-world-js-bin': {
version: 'link:../hello-world-js-bin',
specifier: '*',

View File

@@ -54,10 +54,10 @@ test('lockfile has correct format', async () => {
expect(lockfile.lockfileVersion).toBe(LOCKFILE_VERSION)
expect(lockfile.dependencies).toBeTruthy()
expect(lockfile.dependencies['@pnpm.e2e/pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.dependencies).toHaveProperty(['@rstacruz/tap-spec'])
expect(lockfile.dependencies['is-negative'].version).toContain('/') // has not shortened tarball from the non-standard registry
expect(lockfile.importers?.['.'].dependencies).toBeTruthy()
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.importers?.['.'].dependencies).toHaveProperty(['@rstacruz/tap-spec'])
expect(lockfile.importers?.['.'].dependencies?.['is-negative'].version).toContain('/') // has not shortened tarball from the non-standard registry
expect(lockfile.packages).toBeTruthy() // has packages field
expect(lockfile.packages).toHaveProperty([id])
@@ -84,9 +84,9 @@ test('lockfile has dev deps even when installing for prod only', async () => {
const lockfile = project.readLockfile()
const id = '/is-negative@2.1.0'
expect(lockfile.devDependencies).toBeTruthy()
expect(lockfile.importers['.'].devDependencies).toBeTruthy()
expect(lockfile.devDependencies['is-negative'].version).toBe('2.1.0')
expect(lockfile.importers['.'].devDependencies?.['is-negative'].version).toBe('2.1.0')
expect(lockfile.packages[id]).toBeTruthy()
})
@@ -142,7 +142,7 @@ test("lockfile doesn't lock subdependencies that don't satisfy the new specs", a
const lockfile = project.readLockfile()
expect(Object.keys(lockfile.dependencies).length).toBe(1) // resolutions not duplicated
expect(Object.keys(lockfile.importers!['.'].dependencies!).length).toBe(1) // resolutions not duplicated
})
test('a lockfile created even when there are no deps in package.json', async () => {
@@ -236,9 +236,9 @@ test('lockfile is fixed when it does not match package.json', async () => {
const lockfile = project.readLockfile()
expect(lockfile.devDependencies['is-negative'].version).toBe('2.1.0')
expect(lockfile.optionalDependencies['is-positive'].version).toBe('3.1.0')
expect(lockfile.dependencies).toBeFalsy()
expect(lockfile.importers?.['.'].devDependencies?.['is-negative'].version).toBe('2.1.0')
expect(lockfile.importers?.['.'].optionalDependencies?.['is-positive'].version).toBe('3.1.0')
expect(lockfile.importers?.['.'].dependencies).toBeFalsy()
expect(lockfile.packages).not.toHaveProperty(['/@types/semver@5.3.31'])
})
@@ -388,8 +388,8 @@ test("recreates lockfile if it doesn't match the dependencies in package.json",
manifest = await addDependenciesToPackage(manifest, ['map-obj@1.0.0'], testDefaults({ pinnedVersion: 'patch', targetDependenciesField: 'optionalDependencies' }))
const lockfile1 = project.readLockfile()
expect(lockfile1.dependencies['is-negative'].version).toBe('1.0.0')
expect(lockfile1.dependencies['is-negative'].specifier).toBe('1.0.0')
expect(lockfile1.importers['.'].dependencies?.['is-negative'].version).toBe('1.0.0')
expect(lockfile1.importers['.'].dependencies?.['is-negative'].specifier).toBe('1.0.0')
manifest.dependencies!['is-negative'] = '^2.1.0'
manifest.devDependencies!['is-positive'] = '^2.0.0'
@@ -398,15 +398,16 @@ test("recreates lockfile if it doesn't match the dependencies in package.json",
await install(manifest, testDefaults())
const lockfile = project.readLockfile()
const importer = lockfile.importers!['.']!
expect(lockfile.dependencies['is-negative'].version).toBe('2.1.0')
expect(lockfile.dependencies['is-negative'].specifier).toBe('^2.1.0')
expect(importer.dependencies!['is-negative'].version).toBe('2.1.0')
expect(importer.dependencies!['is-negative'].specifier).toBe('^2.1.0')
expect(lockfile.devDependencies['is-positive'].version).toBe('2.0.0')
expect(lockfile.devDependencies['is-positive'].specifier).toBe('^2.0.0')
expect(importer.devDependencies!['is-positive'].version).toBe('2.0.0')
expect(importer.devDependencies!['is-positive'].specifier).toBe('^2.0.0')
expect(lockfile.optionalDependencies['map-obj'].version).toBe('1.0.1')
expect(lockfile.optionalDependencies['map-obj'].specifier).toBe('1.0.1')
expect(importer.optionalDependencies!['map-obj'].version).toBe('1.0.1')
expect(importer.optionalDependencies!['map-obj'].specifier).toBe('1.0.1')
})
test('repeat install with lockfile should not mutate lockfile when dependency has version specified with v prefix', async () => {
@@ -416,7 +417,7 @@ test('repeat install with lockfile should not mutate lockfile when dependency ha
const lockfile1 = project.readLockfile()
expect(lockfile1.dependencies['highmaps-release'].version).toBe('5.0.11')
expect(lockfile1.importers['.'].dependencies?.['highmaps-release'].version).toBe('5.0.11')
rimraf('node_modules')
@@ -478,18 +479,22 @@ test('scoped module from different registry', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'@foo/has-dep-from-same-scope': {
specifier: '^1.0.0',
version: '1.0.0',
},
'@zkochan/foo': {
specifier: '^1.0.0',
version: '1.0.0',
},
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
importers: {
'.': {
dependencies: {
'@foo/has-dep-from-same-scope': {
specifier: '^1.0.0',
version: '1.0.0',
},
'@zkochan/foo': {
specifier: '^1.0.0',
version: '1.0.0',
},
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -564,10 +569,10 @@ test('packages are placed in devDependencies even if they are present as non-dev
},
}, testDefaults({ reporter }))
const lockfile = project.readLockfile()
const importer = project.readLockfile().importers!['.']!
expect(lockfile.devDependencies).toHaveProperty(['@pnpm.e2e/dep-of-pkg-with-1-dep'])
expect(lockfile.devDependencies).toHaveProperty(['@pnpm.e2e/pkg-with-1-dep'])
expect(importer.devDependencies).toHaveProperty(['@pnpm.e2e/dep-of-pkg-with-1-dep'])
expect(importer.devDependencies).toHaveProperty(['@pnpm.e2e/pkg-with-1-dep'])
expect(reporter.calledWithMatch({
added: {
@@ -789,14 +794,18 @@ test('packages installed via tarball URL from the default registry are normalize
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'is-positive': {
specifier: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
version: '@registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
},
'@pnpm.e2e/pkg-with-tarball-dep-from-registry': {
specifier: `http://localhost:${REGISTRY_MOCK_PORT}/@pnpm.e2e/pkg-with-tarball-dep-from-registry/-/pkg-with-tarball-dep-from-registry-1.0.0.tgz`,
version: '1.0.0',
importers: {
'.': {
dependencies: {
'is-positive': {
specifier: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
version: '@registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
},
'@pnpm.e2e/pkg-with-tarball-dep-from-registry': {
specifier: `http://localhost:${REGISTRY_MOCK_PORT}/@pnpm.e2e/pkg-with-tarball-dep-from-registry/-/pkg-with-tarball-dep-from-registry-1.0.0.tgz`,
version: '1.0.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -1124,10 +1133,14 @@ test('tarball domain differs from registry domain', async () => {
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
importers: {
'.': {
dependencies: {
'is-positive': {
specifier: '^3.1.0',
version: '3.1.0',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -1171,10 +1184,14 @@ test('tarball installed through non-standard URL endpoint from the registry doma
autoInstallPeers: true,
excludeLinksFromLockfile: false,
},
dependencies: {
'is-positive': {
specifier: 'https://registry.npmjs.org/is-positive/download/is-positive-3.1.0.tgz',
version: '@registry.npmjs.org/is-positive/download/is-positive-3.1.0.tgz',
importers: {
'.': {
dependencies: {
'is-positive': {
specifier: 'https://registry.npmjs.org/is-positive/download/is-positive-3.1.0.tgz',
version: '@registry.npmjs.org/is-positive/download/is-positive-3.1.0.tgz',
},
},
},
},
lockfileVersion: LOCKFILE_VERSION,
@@ -1228,7 +1245,7 @@ packages:
}, testDefaults())
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.1.0')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.1.0')
})
test('a lockfile v6 with merge conflicts is autofixed', async () => {
@@ -1266,7 +1283,7 @@ packages:
}, testDefaults())
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep']).toHaveProperty('version', '100.1.0')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toHaveProperty('version', '100.1.0')
})
test('a lockfile with duplicate keys is fixed', async () => {
@@ -1295,7 +1312,7 @@ packages:
}, testDefaults({ reporter }))
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.importers?.['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(reporter).toBeCalledWith(expect.objectContaining({
level: 'warn',

View File

@@ -160,7 +160,7 @@ test('uninstall package with dependencies and do not touch other deps', async ()
expect(manifest.dependencies).toStrictEqual({ 'is-negative': '2.1.0' })
const lockfile = project.readLockfile()
expect(lockfile.dependencies).toStrictEqual({
expect(lockfile.importers['.'].dependencies).toStrictEqual({
'is-negative': {
specifier: '2.1.0',
version: '2.1.0',

View File

@@ -78,7 +78,6 @@ export interface GetContextOptions {
confirmModulesPurge?: boolean
force: boolean
forceNewModules?: boolean
forceSharedLockfile: boolean
frozenLockfile?: boolean
extraBinPaths: string[]
extendNodePath?: boolean
@@ -185,7 +184,6 @@ export async function getContext (
autoInstallPeers: opts.autoInstallPeers,
excludeLinksFromLockfile: opts.excludeLinksFromLockfile,
force: opts.force,
forceSharedLockfile: opts.forceSharedLockfile,
frozenLockfile: opts.frozenLockfile === true,
lockfileDir: opts.lockfileDir,
projects: importersContext.projects,
@@ -409,7 +407,6 @@ export async function getContextForSingleImporter (
excludeLinksFromLockfile: boolean
force: boolean
forceNewModules?: boolean
forceSharedLockfile: boolean
confirmModulesPurge?: boolean
extraBinPaths: string[]
extendNodePath?: boolean
@@ -524,7 +521,6 @@ export async function getContextForSingleImporter (
autoInstallPeers: opts.autoInstallPeers,
excludeLinksFromLockfile: opts.excludeLinksFromLockfile,
force: opts.force,
forceSharedLockfile: opts.forceSharedLockfile,
frozenLockfile: false,
lockfileDir: opts.lockfileDir,
projects: [{ id: importerId, rootDir: opts.dir }],

View File

@@ -30,7 +30,6 @@ export async function readLockfiles (
autoInstallPeers: boolean
excludeLinksFromLockfile: boolean
force: boolean
forceSharedLockfile: boolean
frozenLockfile: boolean
projects: Array<{
id: string

View File

@@ -9,7 +9,6 @@ const DEFAULT_OPTIONS: GetContextOptions = {
excludeLinksFromLockfile: false,
extraBinPaths: [],
force: false,
forceSharedLockfile: false,
lockfileDir: path.join(__dirname, 'lockfile'),
nodeLinker: 'isolated',
hoistPattern: ['*'],

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
'@pnpm.e2e/pre-and-postinstall-scripts-example':
specifier: '*'
version: 2.0.0
importers:
.:
dependencies:
'@pnpm.e2e/pre-and-postinstall-scripts-example':
specifier: '*'
version: 2.0.0
packages:

View File

@@ -4,13 +4,16 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
glob:
specifier: ^7.0.5
version: 7.2.3
rimraf:
specifier: ^2.6.2
version: 2.7.1
importers:
.:
dependencies:
glob:
specifier: ^7.0.5
version: 7.2.3
rimraf:
specifier: ^2.6.2
version: 2.7.1
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
glob:
specifier: ^7.0.5
version: 7.2.3
importers:
.:
dependencies:
glob:
specifier: ^7.0.5
version: 7.2.3
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
'@pnpm.e2e/pkg-with-optional':
specifier: 1.0.0
version: 1.0.0
importers:
.:
dependencies:
'@pnpm.e2e/pkg-with-optional':
specifier: 1.0.0
version: 1.0.0
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
tar-pkg:
specifier: file:../tar-pkg-1.0.0.tgz
version: file:../tar-pkg-1.0.0.tgz
importers:
.:
dependencies:
tar-pkg:
specifier: file:../tar-pkg-1.0.0.tgz
version: file:../tar-pkg-1.0.0.tgz
packages:

View File

@@ -3,3 +3,7 @@ lockfileVersion: '7.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.: {}

View File

@@ -4,7 +4,10 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
example:
specifier: link:example
version: link:example
importers:
.:
dependencies:
example:
specifier: link:example
version: link:example

View File

@@ -4,18 +4,20 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
importers:
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
.:
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
packages:

View File

@@ -4,16 +4,19 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
has-flag:
specifier: 1.0.0
version: 1.0.0
ms:
specifier: 1.0.0
version: 1.0.0
send:
specifier: 0.17.2
version: 0.17.2
importers:
.:
dependencies:
has-flag:
specifier: 1.0.0
version: 1.0.0
ms:
specifier: 1.0.0
version: 1.0.0
send:
specifier: 0.17.2
version: 0.17.2
packages:

View File

@@ -4,18 +4,20 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
is-positive:
specifier: 1.0.0
version: 1.0.0
once:
specifier: ^1.4.0
version: 1.4.0
importers:
devDependencies:
inflight:
specifier: 1.0.6
version: 1.0.6
.:
dependencies:
is-positive:
specifier: 1.0.0
version: 1.0.0
once:
specifier: ^1.4.0
version: 1.4.0
devDependencies:
inflight:
specifier: 1.0.6
version: 1.0.6
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
devDependencies:
'@pnpm.e2e/abc':
specifier: 1.0.0
version: 1.0.0(@pnpm.e2e/peer-a@1.0.1)(@pnpm.e2e/peer-b@1.0.0)(@pnpm.e2e/peer-c@1.0.0)
importers:
.:
devDependencies:
'@pnpm.e2e/abc':
specifier: 1.0.0
version: 1.0.0(@pnpm.e2e/peer-a@1.0.1)(@pnpm.e2e/peer-b@1.0.0)(@pnpm.e2e/peer-c@1.0.0)
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: false
excludeLinksFromLockfile: false
dependencies:
pnpm-default-reporter:
specifier: 0.14.7
version: 0.14.7
importers:
.:
dependencies:
pnpm-default-reporter:
specifier: 0.14.7
version: 0.14.7
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
expire-fs:
specifier: 2.2.3
version: 2.2.3
importers:
.:
dependencies:
expire-fs:
specifier: 2.2.3
version: 2.2.3
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
'@pnpm.e2e/pre-and-postinstall-scripts-example':
specifier: 1.0.0
version: 1.0.0
importers:
.:
dependencies:
'@pnpm.e2e/pre-and-postinstall-scripts-example':
specifier: 1.0.0
version: 1.0.0
packages:

View File

@@ -4,26 +4,27 @@ settings:
autoInstallPeers: false
excludeLinksFromLockfile: false
dependencies:
'@pnpm.e2e/pkg-with-peer-having-bin':
specifier: 1.0.0
version: 1.0.0
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
importers:
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
.:
dependencies:
'@pnpm.e2e/pkg-with-peer-having-bin':
specifier: 1.0.0
version: 1.0.0
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
packages:

View File

@@ -4,26 +4,27 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
resolve-from:
specifier: 4.0.0
version: 4.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
importers:
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
.:
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
resolve-from:
specifier: 4.0.0
version: 4.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
packages:

View File

@@ -4,15 +4,17 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
'@pnpm.e2e/pkg-with-good-optional':
specifier: '*'
version: 1.0.0
importers:
optionalDependencies:
is-positive:
specifier: 1.0.0
version: 1.0.0
.:
dependencies:
'@pnpm.e2e/pkg-with-good-optional':
specifier: '*'
version: 1.0.0
optionalDependencies:
is-positive:
specifier: 1.0.0
version: 1.0.0
packages:

View File

@@ -4,23 +4,24 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
importers:
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
.:
dependencies:
is-positive:
specifier: ^1.0.0
version: 1.0.0
rimraf:
specifier: ^2.6.2
version: 2.7.1
optionalDependencies:
colors:
specifier: 1.2.0
version: 1.2.0
devDependencies:
is-negative:
specifier: ^2.1.0
version: 2.1.0
packages:

View File

@@ -4,10 +4,13 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
rimraf:
specifier: 2.5.1
version: 2.5.1
importers:
.:
dependencies:
rimraf:
specifier: 2.5.1
version: 2.5.1
packages:

View File

@@ -52,7 +52,7 @@ test('recursive add --save-dev, --save-peer on workspace with multiple lockfiles
{ 'is-negative': '1.0.0' }
)
expect(
(projects['project-1'].readLockfile()).devDependencies
projects['project-1'].readLockfile().importers['.'].devDependencies
).toStrictEqual(
{
'is-positive': {
@@ -80,7 +80,7 @@ test('recursive add --save-dev, --save-peer on workspace with multiple lockfiles
{ 'is-negative': '1.0.0' }
)
expect(
(projects['project-2'].readLockfile()).devDependencies
projects['project-2'].readLockfile().importers['.'].devDependencies
).toStrictEqual(
{
'is-positive': {

View File

@@ -179,13 +179,13 @@ test('relative link', async () => {
linkedProject.isExecutable('.bin/cowsay')
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.dependencies['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
expect(wantedLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
specifier: '*', // specifier of linked dependency added to ${WANTED_LOCKFILE}
version: 'link:../hello-world-js-bin', // link added to wanted lockfile
})
const currentLockfile = project.readCurrentLockfile()
expect(currentLockfile.dependencies['@pnpm.e2e/hello-world-js-bin'].version).toBe('link:../hello-world-js-bin') // link added to wanted lockfile
expect(currentLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin'].version).toBe('link:../hello-world-js-bin') // link added to wanted lockfile
})
test('absolute link', async () => {
@@ -212,13 +212,13 @@ test('absolute link', async () => {
linkedProject.isExecutable('.bin/cowsay')
const wantedLockfile = project.readLockfile()
expect(wantedLockfile.dependencies['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
expect(wantedLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin']).toStrictEqual({
specifier: '*', // specifier of linked dependency added to ${WANTED_LOCKFILE}
version: 'link:../hello-world-js-bin', // link added to wanted lockfile
})
const currentLockfile = project.readCurrentLockfile()
expect(currentLockfile.dependencies['@pnpm.e2e/hello-world-js-bin'].version).toBe('link:../hello-world-js-bin') // link added to wanted lockfile
expect(currentLockfile.importers['.'].dependencies?.['@pnpm.e2e/hello-world-js-bin'].version).toBe('link:../hello-world-js-bin') // link added to wanted lockfile
})
test('link --production', async () => {

View File

@@ -43,7 +43,7 @@ test('recursive linking/unlinking', async () => {
{
const project1Lockfile = projects['project-1'].readLockfile()
expect(project1Lockfile.devDependencies['is-positive'].version).toBe('link:../is-positive')
expect(project1Lockfile.importers['.'].devDependencies?.['is-positive'].version).toBe('link:../is-positive')
}
await unlink.handler({
@@ -63,7 +63,7 @@ test('recursive linking/unlinking', async () => {
{
const project1Lockfile = projects['project-1'].readLockfile()
expect(project1Lockfile.lockfileVersion).toBe(LOCKFILE_VERSION)
expect(project1Lockfile.devDependencies['is-positive'].version).toBe('1.0.0')
expect(project1Lockfile.importers['.'].devDependencies?.['is-positive'].version).toBe('1.0.0')
expect(project1Lockfile.packages['/is-positive@1.0.0']).toBeTruthy()
}
@@ -108,7 +108,7 @@ test('recursive unlink specific package', async () => {
{
const project1Lockfile = projects['project-1'].readLockfile()
expect(project1Lockfile.devDependencies['is-positive'].version).toBe('link:../is-positive')
expect(project1Lockfile.importers['.'].devDependencies?.['is-positive'].version).toBe('link:../is-positive')
}
await unlink.handler({
@@ -128,7 +128,7 @@ test('recursive unlink specific package', async () => {
{
const project1Lockfile = projects['project-1'].readLockfile()
expect(project1Lockfile.lockfileVersion).toBe(LOCKFILE_VERSION)
expect(project1Lockfile.devDependencies['is-positive'].version).toBe('1.0.0')
expect(project1Lockfile.importers['.'].devDependencies?.['is-positive'].version).toBe('1.0.0')
expect(project1Lockfile.packages['/is-positive@1.0.0']).toBeTruthy()
}

View File

@@ -48,7 +48,7 @@ test('root dependency that has a peer is correctly updated after its version cha
{
const lockfile = project.readLockfile()
expect(lockfile.dependencies['ajv-keywords'].version).toBe('1.5.0(ajv@4.10.4)')
expect(lockfile.importers['.'].dependencies?.['ajv-keywords'].version).toBe('1.5.0(ajv@4.10.4)')
}
project.writePackageJson({
@@ -69,6 +69,6 @@ test('root dependency that has a peer is correctly updated after its version cha
{
const lockfile = project.readLockfile()
expect(lockfile.dependencies['ajv-keywords'].version).toBe('1.5.1(ajv@4.10.4)')
expect(lockfile.importers['.'].dependencies?.['ajv-keywords'].version).toBe('1.5.1(ajv@4.10.4)')
}
})

View File

@@ -173,7 +173,7 @@ test('update --no-save should not update package.json and pnpm-lock.yaml', async
expect(manifest.dependencies?.['@pnpm.e2e/peer-a']).toBe('^1.0.0')
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/peer-a'].specifier).toBe('^1.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/peer-a'].specifier).toBe('^1.0.0')
expect(lockfile.packages['/@pnpm.e2e/peer-a@1.0.0']).toBeTruthy()
}
@@ -191,7 +191,7 @@ test('update --no-save should not update package.json and pnpm-lock.yaml', async
expect(manifest.dependencies?.['@pnpm.e2e/peer-a']).toBe('^1.0.0')
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/peer-a'].specifier).toBe('^1.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/peer-a'].specifier).toBe('^1.0.0')
expect(lockfile.packages['/@pnpm.e2e/peer-a@1.0.1']).toBeTruthy()
}
})
@@ -227,9 +227,9 @@ test('update should work normal when set empty string version', async () => {
expect(lockfile.packages['/@pnpm.e2e/peer-a@1.0.1']).toBeTruthy()
expect(lockfile.packages['/@pnpm.e2e/peer-c@2.0.0']).toBeTruthy()
expect(lockfile.packages['/@pnpm.e2e/foo@2.0.0']).toBeTruthy()
expect(lockfile.dependencies['@pnpm.e2e/peer-a'].version).toEqual('1.0.1')
expect(lockfile.devDependencies['@pnpm.e2e/foo'].version).toEqual('2.0.0')
expect(lockfile.devDependencies['@pnpm.e2e/peer-c'].version).toEqual('2.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/peer-a'].version).toEqual('1.0.1')
expect(lockfile.importers['.'].devDependencies?.['@pnpm.e2e/foo'].version).toEqual('2.0.0')
expect(lockfile.importers['.'].devDependencies?.['@pnpm.e2e/peer-c'].version).toEqual('2.0.0')
})
test('ignore packages in package.json > updateConfig.ignoreDependencies fields in update command', async () => {

View File

@@ -82,7 +82,6 @@ export async function main (inputArgv: string[]) {
}
let config: Config & {
forceSharedLockfile: boolean
argv: { remain: string[], cooked: string[], original: string[] }
fallbackCommandUsed: boolean
}
@@ -100,7 +99,6 @@ export async function main (inputArgv: string[]) {
if (cmd === 'dlx') {
config.useStderr = true
}
config.forceSharedLockfile = typeof config.workspaceDir === 'string' && config.sharedWorkspaceLockfile === true
config.argv = argv
config.fallbackCommandUsed = fallbackCommandUsed
// Set 'npm_command' env variable to current command name

View File

@@ -265,9 +265,9 @@ save-workspace-protocol=false
{
const lockfile = projects['project-1'].readLockfile()
expect(lockfile.dependencies['project-2'].version).toBe('link:../project-2')
expect(lockfile.devDependencies['is-negative'].version).toBe('link:../is-negative')
expect(lockfile.optionalDependencies['is-positive'].version).toBe('link:../is-positive')
expect(lockfile.importers['.'].dependencies?.['project-2'].version).toBe('link:../project-2')
expect(lockfile.importers['.'].devDependencies?.['is-negative'].version).toBe('link:../is-negative')
expect(lockfile.importers['.'].optionalDependencies?.['is-positive'].version).toBe('link:../is-positive')
}
projects['is-positive'].writePackageJson({
@@ -279,14 +279,14 @@ save-workspace-protocol=false
{
const lockfile = projects['project-1'].readLockfile()
expect(lockfile.optionalDependencies['is-positive'].version).toBe('1.0.0') // is-positive is unlinked and installed from registry
expect(lockfile.importers['.'].optionalDependencies?.['is-positive'].version).toBe('1.0.0') // is-positive is unlinked and installed from registry
}
await execPnpm(['update', 'is-negative@2.0.0'])
{
const lockfile = projects['project-1'].readLockfile()
expect(lockfile.devDependencies['is-negative'].version).toBe('2.0.0')
expect(lockfile.importers['.'].devDependencies?.['is-negative'].version).toBe('2.0.0')
}
})
@@ -594,16 +594,16 @@ test('installation with --link-workspace-packages links packages even if they we
{
const lockfile = projects.project.readLockfile()
expect(lockfile.dependencies['is-positive'].version).toBe('2.0.0')
expect(lockfile.dependencies.negative.version).toBe('/is-negative@1.0.0')
expect(lockfile.importers['.'].dependencies?.['is-positive'].version).toBe('2.0.0')
expect(lockfile.importers['.'].dependencies?.negative.version).toBe('/is-negative@1.0.0')
}
await execPnpm(['recursive', 'install', '--link-workspace-packages'])
{
const lockfile = projects.project.readLockfile()
expect(lockfile.dependencies['is-positive'].version).toBe('link:../is-positive')
expect(lockfile.dependencies.negative.version).toBe('link:../is-negative')
expect(lockfile.importers['.'].dependencies?.['is-positive'].version).toBe('link:../is-positive')
expect(lockfile.importers['.'].dependencies?.negative.version).toBe('link:../is-negative')
}
})
@@ -892,7 +892,7 @@ test('local packages should be preferred when running "pnpm install" inside a wo
const lockfile = projects['project-1'].readLockfile()
expect(lockfile?.dependencies?.['is-positive'].version).toBe('link:../is-positive')
expect(lockfile?.importers['.'].dependencies?.['is-positive'].version).toBe('link:../is-positive')
})
// covers https://github.com/pnpm/pnpm/issues/1437

View File

@@ -22,7 +22,7 @@ test('update <dep>', async () => {
project.storeHas('@pnpm.e2e/dep-of-pkg-with-1-dep', '101.0.0')
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
const pkg = await readPackageJsonFromDir(process.cwd())
expect(pkg.dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toBe('^101.0.0')
@@ -153,9 +153,9 @@ test('update --latest', async function () {
project.storeHas('@pnpm.e2e/dep-of-pkg-with-1-dep', '101.0.0')
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile.dependencies['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.dependencies['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.importers['.'].dependencies?.['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
const pkg = await readPackageJsonFromDir(process.cwd())
expect(pkg.dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toBe('^101.0.0')
@@ -180,9 +180,9 @@ test('update --latest --save-exact', async function () {
project.storeHas('@pnpm.e2e/dep-of-pkg-with-1-dep', '101.0.0')
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile.dependencies['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.dependencies['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.importers['.'].dependencies?.['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
const pkg = await readPackageJsonFromDir(process.cwd())
expect(pkg.dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toBe('101.0.0')
@@ -206,10 +206,10 @@ test('update --latest specific dependency', async function () {
await execPnpm(['update', '-L', '@pnpm.e2e/bar', 'alias', 'is-negative'])
const lockfile = project.readLockfile()
expect(lockfile.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.dependencies['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.dependencies['@pnpm.e2e/foo'].version).toBe('100.0.0')
expect(lockfile.dependencies['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.0.0')
expect(lockfile.importers['.'].dependencies?.['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
const pkg = await readPackageJsonFromDir(process.cwd())
expect(pkg.dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toBe('100.0.0')
@@ -233,8 +233,8 @@ test('update --latest --prod', async function () {
await execPnpm(['update', '--latest', '--prod'])
const lockfile = project.readLockfile()
expect(lockfile.devDependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.dependencies['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile.importers['.'].devDependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.1.0')
const pkg = await readPackageJsonFromDir(process.cwd())
expect(pkg.devDependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep']).toBe('100.0.0')
@@ -282,8 +282,8 @@ test('recursive update --latest on projects that do not share a lockfile', async
})
const lockfile1 = projects['project-1'].readLockfile()
expect(lockfile1.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile1.dependencies['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile1.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile1.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.1.0')
const manifest2 = await readPackageJsonFromDir(path.resolve('project-2'))
expect(manifest2.dependencies).toStrictEqual({
@@ -292,8 +292,8 @@ test('recursive update --latest on projects that do not share a lockfile', async
})
const lockfile2 = projects['project-2'].readLockfile()
expect(lockfile2.dependencies['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile2.dependencies['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile2.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.1.0')
expect(lockfile2.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.1.0')
})
test('recursive update --latest --prod on projects that do not share a lockfile', async () => {
@@ -341,8 +341,8 @@ test('recursive update --latest --prod on projects that do not share a lockfile'
})
const lockfile1 = projects['project-1'].readLockfile()
expect(lockfile1.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile1.devDependencies['@pnpm.e2e/foo'].version).toBe('100.0.0')
expect(lockfile1.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('101.0.0')
expect(lockfile1.importers['.'].devDependencies?.['@pnpm.e2e/foo'].version).toBe('100.0.0')
projects['project-1'].has('@pnpm.e2e/dep-of-pkg-with-1-dep')
projects['project-1'].has('@pnpm.e2e/foo')
@@ -356,8 +356,8 @@ test('recursive update --latest --prod on projects that do not share a lockfile'
})
const lockfile2 = projects['project-2'].readLockfile()
expect(lockfile2.devDependencies['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile2.dependencies['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile2.importers['.'].devDependencies?.['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile2.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.1.0')
projects['project-2'].has('@pnpm.e2e/bar')
projects['project-2'].has('@pnpm.e2e/foo')
@@ -405,9 +405,9 @@ test('recursive update --latest specific dependency on projects that do not shar
})
const lockfile1 = projects['project-1'].readLockfile()
expect(lockfile1.dependencies['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile1.dependencies['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile1.dependencies['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
expect(lockfile1.importers['.'].dependencies?.['@pnpm.e2e/dep-of-pkg-with-1-dep'].version).toBe('100.0.0')
expect(lockfile1.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile1.importers['.'].dependencies?.['alias'].version).toBe('/@pnpm.e2e/qar@100.1.0')
const manifest2 = await readPackageJsonFromDir(path.resolve('project-2'))
expect(manifest2.dependencies).toStrictEqual({
@@ -416,8 +416,8 @@ test('recursive update --latest specific dependency on projects that do not shar
})
const lockfile2 = projects['project-2'].readLockfile()
expect(lockfile2.dependencies['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile2.dependencies['@pnpm.e2e/foo'].version).toBe('100.1.0')
expect(lockfile2.importers['.'].dependencies?.['@pnpm.e2e/bar'].version).toBe('100.0.0')
expect(lockfile2.importers['.'].dependencies?.['@pnpm.e2e/foo'].version).toBe('100.1.0')
})
test('recursive update --latest on projects with a shared a lockfile', async () => {

View File

@@ -10,7 +10,6 @@ export interface StrictStoreStatusOptions {
dir: string
storeDir: string
force: boolean
forceSharedLockfile: boolean
nodeLinker: 'isolated' | 'hoisted' | 'pnp'
useLockfile: boolean
registries: Registries
@@ -33,7 +32,6 @@ const defaults = async (opts: StoreStatusOptions) => {
binsDir: path.join(dir, 'node_modules', '.bin'),
dir,
force: false,
forceSharedLockfile: false,
lockfileDir,
nodeLinker: 'isolated',
registries: DEFAULT_REGISTRIES,