Files
pnpm/pnpm11/installing/commands/test/addRecursive.ts
T
Zoltan Kochan fc2f33912e refactor: move the TypeScript pnpm CLI into a pnpm11/ directory (#12537)
The TypeScript pnpm CLI freezes at v11; pnpm 12 will be the Rust pacquet
port. To make that split legible, all TypeScript source, test, and build
directories move under a new top-level pnpm11/ directory. The name states
the version boundary rather than implying a behavioral fork, since the two
stacks are meant to behave identically.

Scope is source-only: the shared workspace root stays at the repo root.
pnpm-workspace.yaml, package.json, pnpm-lock.yaml, .pnpmfile.cjs,
.meta-updater, __patches__, .changeset, .husky, and the lint/spell configs
remain in place, so one pnpm workspace and one Cargo workspace still span
all three products. pnpr/client and pacquet/tasks/registry-mock stay as
cross-product workspace members.

Rewiring the move required:
- pnpm-workspace.yaml globs prefixed with pnpm11/
- root package.json script paths, eslint.config.mjs, tsconfig.lint.json,
  .gitignore, and CODEOWNERS updated
- .meta-updater/src/index.ts literals repointed (pnpm11/pnpm/package.json,
  pnpm11/__utils__, pnpm11/__typings__, and the main package directory)
- regenerated every moved package's repository/homepage URL via meta-updater
- pnpm11/pnpm/bundle-deps.ts and __utils__/scripts/src/typecheck-only.ts
  climb one more level to reach the repo root

.meta-updater stays at the repo root because @pnpm/meta-updater resolves
its config at <cwd>/.meta-updater/main.mjs.

TS CI (.github/workflows/ci.yml) now only runs when pnpm11/-relevant paths
change, via a dorny/paths-filter changes job plus a TS CI / Success
aggregate gate; branch protection should require only that gate.
2026-06-20 14:36:25 +02:00

182 lines
4.3 KiB
TypeScript

import path from 'node:path'
import { expect, test } from '@jest/globals'
import { add } from '@pnpm/installing.commands'
import type { LockfileObject } from '@pnpm/lockfile.types'
import { preparePackages } from '@pnpm/prepare'
import type { ProjectId } from '@pnpm/types'
import { filterProjectsBySelectorObjectsFromDir } from '@pnpm/workspace.projects-filter'
import { readYamlFileSync } from 'read-yaml-file'
import { DEFAULT_OPTS } from './utils/index.js'
test('recursive add --save-dev, --save-peer on workspace with multiple lockfiles', async () => {
const projects = preparePackages([
{
name: 'project-1',
version: '1.0.0',
},
{
name: 'project-2',
version: '1.0.0',
},
])
const { allProjects, selectedProjectsGraph } = await filterProjectsBySelectorObjectsFromDir(process.cwd(), [])
await add.handler({
...DEFAULT_OPTS,
allProjects,
dir: process.cwd(),
recursive: true,
saveDev: true,
selectedProjectsGraph,
workspaceDir: process.cwd(),
}, ['is-positive@1.0.0'])
await add.handler({
...DEFAULT_OPTS,
allProjects,
dir: process.cwd(),
recursive: true,
savePeer: true,
selectedProjectsGraph,
workspaceDir: process.cwd(),
}, ['is-negative@1.0.0'])
{
const { default: manifest } = (await import(path.resolve('project-1/package.json')))
expect(
manifest.devDependencies
).toEqual(
{ 'is-positive': '1.0.0', 'is-negative': '1.0.0' }
)
expect(
manifest.peerDependencies
).toEqual(
{ 'is-negative': '1.0.0' }
)
expect(
projects['project-1'].readLockfile().importers['.'].devDependencies
).toEqual(
{
'is-positive': {
specifier: '1.0.0',
version: '1.0.0',
},
'is-negative': {
specifier: '1.0.0',
version: '1.0.0',
},
}
)
}
{
const { default: manifest } = (await import(path.resolve('project-2/package.json')))
expect(
manifest.devDependencies
).toEqual(
{ 'is-positive': '1.0.0', 'is-negative': '1.0.0' }
)
expect(
manifest.peerDependencies
).toEqual(
{ 'is-negative': '1.0.0' }
)
expect(
projects['project-2'].readLockfile().importers['.'].devDependencies
).toEqual(
{
'is-positive': {
specifier: '1.0.0',
version: '1.0.0',
},
'is-negative': {
specifier: '1.0.0',
version: '1.0.0',
},
}
)
}
})
test('recursive add --save-dev, --save-peer on workspace with single lockfile', async () => {
preparePackages([
{
name: 'project-1',
version: '1.0.0',
},
{
name: 'project-2',
version: '1.0.0',
},
])
const { allProjects, selectedProjectsGraph } = await filterProjectsBySelectorObjectsFromDir(process.cwd(), [])
await add.handler({
...DEFAULT_OPTS,
allProjects,
dir: process.cwd(),
lockfileDir: process.cwd(),
recursive: true,
saveDev: true,
selectedProjectsGraph,
workspaceDir: process.cwd(),
}, ['is-positive@1.0.0'])
await add.handler({
...DEFAULT_OPTS,
allProjects,
dir: process.cwd(),
lockfileDir: process.cwd(),
recursive: true,
savePeer: true,
selectedProjectsGraph,
workspaceDir: process.cwd(),
}, ['is-negative@1.0.0'])
{
const { default: manifest } = (await import(path.resolve('project-1/package.json')))
expect(
manifest.devDependencies
).toEqual(
{ 'is-positive': '1.0.0', 'is-negative': '1.0.0' }
)
expect(
manifest.peerDependencies
).toEqual(
{ 'is-negative': '1.0.0' }
)
}
{
const { default: manifest } = (await import(path.resolve('project-2/package.json')))
expect(
manifest.devDependencies
).toEqual(
{ 'is-positive': '1.0.0', 'is-negative': '1.0.0' }
)
expect(
manifest.peerDependencies
).toEqual(
{ 'is-negative': '1.0.0' }
)
}
const lockfile = readYamlFileSync<LockfileObject>('./pnpm-lock.yaml')
expect(
lockfile.importers['project-1' as ProjectId].devDependencies
).toEqual(
{
'is-positive': {
specifier: '1.0.0',
version: '1.0.0',
},
'is-negative': {
specifier: '1.0.0',
version: '1.0.0',
},
}
)
})