refactor: improve type checking when finding workspace packages (#8214)

---------

Co-authored-by: Zoltan Kochan <z@kochan.io>
This commit is contained in:
Brandon Cheng
2024-06-17 11:34:54 -04:00
committed by GitHub
parent 7f4cea45e8
commit 75a98e12b3
58 changed files with 402 additions and 221 deletions

View File

@@ -37,6 +37,7 @@
"@pnpm/parse-cli-args": "workspace:^",
"@pnpm/tabtab": "^0.5.3",
"@pnpm/workspace.find-packages": "workspace:^",
"@pnpm/workspace.read-manifest": "workspace:^",
"ramda": "npm:@pnpm/ramda@0.28.1",
"render-help": "^1.0.3",
"split-cmd": "^1.1.0"

View File

@@ -2,6 +2,7 @@ import { type CompletionItem } from '@pnpm/tabtab'
import { type CompletionFunc } from '@pnpm/command'
import { findWorkspaceDir } from '@pnpm/find-workspace-dir'
import { findWorkspacePackages } from '@pnpm/workspace.find-packages'
import { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'
import { getOptionCompletions } from './getOptionType'
import { optionTypesToCompletions } from './optionTypesToCompletions'
@@ -32,7 +33,9 @@ export async function complete (
if (input.currentTypedWordType !== 'option') {
if (input.lastOption === '--filter') {
const workspaceDir = await findWorkspaceDir(process.cwd()) ?? process.cwd()
const workspaceManifest = await readWorkspaceManifest(workspaceDir)
const allProjects = await findWorkspacePackages(workspaceDir, {
patterns: workspaceManifest?.packages,
supportedArchitectures: {
os: ['current'],
cpu: ['current'],

View File

@@ -26,6 +26,9 @@
},
{
"path": "../../workspace/find-workspace-dir"
},
{
"path": "../../workspace/read-manifest"
}
]
}

View File

@@ -32,7 +32,7 @@
"devDependencies": {
"@pnpm/assert-project": "workspace:*",
"@pnpm/crypto.object-hasher": "workspace:*",
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@pnpm/plugin-commands-rebuild": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.31.0",

View File

@@ -1,6 +1,6 @@
import path from 'path'
import { assertProject } from '@pnpm/assert-project'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { rebuild } from '@pnpm/plugin-commands-rebuild'
import { preparePackages } from '@pnpm/prepare'
import { createTestIpcServer } from '@pnpm/test-ipc-server'
@@ -31,7 +31,7 @@ test('pnpm recursive rebuild', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa('node', [
pnpmBin,
'install',
@@ -101,7 +101,7 @@ test('pnpm recursive rebuild with hoisted node linker', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
writeYamlFile('pnpm-workspace.yaml', { packages: ['*'] })
await execa('node', [
pnpmBin,
@@ -193,7 +193,7 @@ test('rebuild multiple packages in correct order', async () => {
preparePackages(pkgs)
writeYamlFile('pnpm-workspace.yaml', { packages: pkgs.map(pkg => pkg.name) })
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa('node', [
pnpmBin,
'install',
@@ -240,7 +240,7 @@ test('never build neverBuiltDependencies', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(
process.cwd(),
[]
)
@@ -334,7 +334,7 @@ test('only build onlyBuiltDependencies', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(
process.cwd(),
[]
)

View File

@@ -88,7 +88,7 @@
"path": "../../worker"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../../workspace/find-packages"

View File

@@ -36,6 +36,7 @@
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.31.0",
"@pnpm/test-ipc-server": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@types/is-windows": "^1.0.2",
"@types/ramda": "0.29.12",
"@types/which": "^2.0.2",

View File

@@ -1,7 +1,7 @@
import fs from 'fs'
import path from 'path'
import { type PnpmError } from '@pnpm/error'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { exec, run } from '@pnpm/plugin-commands-script-runners'
import { prepare, prepareEmpty, preparePackages } from '@pnpm/prepare'
import { createTestIpcServer } from '@pnpm/test-ipc-server'
@@ -50,7 +50,7 @@ test('pnpm recursive exec', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -90,7 +90,7 @@ test('pnpm recursive exec finds bin files of workspace projects', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -175,7 +175,7 @@ test('pnpm recursive exec sets PNPM_PACKAGE_NAME env var', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await exec.handler({
...DEFAULT_OPTS,
dir: process.cwd(),
@@ -222,7 +222,7 @@ test('testing the bail config with "pnpm recursive exec"', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -293,7 +293,7 @@ test('pnpm recursive exec --no-sort', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -350,7 +350,7 @@ test('pnpm recursive exec --reverse', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -501,7 +501,7 @@ testOnPosixOnly('pnpm recursive exec works with PnP', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -566,7 +566,7 @@ test('pnpm recursive exec --resume-from should work', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -599,7 +599,7 @@ test('should throw error when the package specified by resume-from does not exis
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -634,7 +634,7 @@ test('pnpm exec in directory with path delimiter', async () => {
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -689,7 +689,7 @@ test('pnpm recursive exec report summary', async () => {
},
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let error
try {
await exec.handler({
@@ -747,7 +747,7 @@ test('pnpm recursive exec report summary with --bail', async () => {
},
},
])
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let error
try {
await exec.handler({
@@ -780,7 +780,7 @@ test('pnpm exec command not found (implicit fallback)', async () => {
},
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let error!: Error & { hint?: string }
try {
await exec.handler({
@@ -805,7 +805,7 @@ test('pnpm exec command not found (explicit call, without near name packages)',
},
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let error!: Error & { hint?: string }
try {
await exec.handler({
@@ -830,7 +830,7 @@ test('pnpm exec command not found (explicit call, with a near name package)', as
},
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',

View File

@@ -1,6 +1,6 @@
import fs from 'fs'
import path from 'path'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { logger } from '@pnpm/logger'
import { exec } from '@pnpm/plugin-commands-script-runners'
import { preparePackages } from '@pnpm/prepare'
@@ -37,7 +37,7 @@ test('pnpm exec --recursive --no-reporter-hide-prefix prints prefixes', async ()
packages: ['packages/*'],
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
const scriptFile = path.resolve('script.js')
fs.writeFileSync(scriptFile, `
@@ -100,7 +100,7 @@ test('pnpm exec --recursive --reporter-hide-prefix does not print prefixes', asy
packages: ['packages/*'],
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
const scriptFile = path.resolve('script.js')
fs.writeFileSync(scriptFile, `
@@ -137,7 +137,7 @@ test('pnpm exec --recursive does not print prefixes by default', async () => {
packages: ['packages/*'],
})
const { selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
const scriptFile = path.resolve('script.js')
fs.writeFileSync(scriptFile, `

View File

@@ -2,7 +2,7 @@
import fs from 'fs'
import path from 'path'
import { type PnpmError } from '@pnpm/error'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import {
restart,
run,
@@ -304,7 +304,7 @@ test('"pnpm run" prints the list of available commands, including commands of th
writeYamlFile('pnpm-workspace.yaml', {})
const workspaceDir = process.cwd()
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
{
process.chdir('foo')
@@ -393,7 +393,7 @@ test('if a script is not found but is present in the root, print an info message
'--store-dir',
path.resolve(DEFAULT_OPTS.storeDir),
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let err!: PnpmError
try {

View File

@@ -2,7 +2,8 @@ import fs from 'fs'
import path from 'path'
import { preparePackages } from '@pnpm/prepare'
import { run } from '@pnpm/plugin-commands-script-runners'
import { filterPkgsBySelectorObjects, readProjects } from '@pnpm/filter-workspace-packages'
import { filterPkgsBySelectorObjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type PnpmError } from '@pnpm/error'
import { createTestIpcServer } from '@pnpm/test-ipc-server'
import execa from 'execa'
@@ -56,7 +57,7 @@ test('pnpm recursive run', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -123,7 +124,7 @@ test('pnpm recursive run with enable-pre-post-scripts', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -191,7 +192,7 @@ test('pnpm recursive run reversed', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -237,7 +238,7 @@ test('pnpm recursive run concurrently', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -289,7 +290,7 @@ test('`pnpm recursive run` fails when run without filters and no package has the
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -357,7 +358,7 @@ test('`pnpm recursive run` fails when run with a filter that includes all packag
console.log('recursive run does not fail when if-present is true')
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
ifPresent: true,
recursive: true,
@@ -368,7 +369,7 @@ test('`pnpm recursive run` fails when run with a filter that includes all packag
try {
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
@@ -407,7 +408,7 @@ test('`pnpm recursive run` succeeds when run against a subset of packages and no
},
])
const { allProjects } = await readProjects(process.cwd(), [])
const { allProjects } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -464,7 +465,7 @@ test('"pnpm run --filter <pkg>" without specifying the script name', async () =>
},
])
const { allProjects } = await readProjects(process.cwd(), [])
const { allProjects } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -562,7 +563,7 @@ test('testing the bail config with "pnpm recursive run"', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa(pnpmBin, [
'install',
'-r',
@@ -634,7 +635,7 @@ test('pnpm recursive run with filtering', async () => {
},
])
const { allProjects } = await readProjects(process.cwd(), [])
const { allProjects } = await filterPackagesFromDir(process.cwd(), [])
const { selectedProjectsGraph } = await filterPkgsBySelectorObjects(
allProjects,
[{ namePattern: 'project-1' }],
@@ -688,7 +689,7 @@ test('`pnpm recursive run` should always trust the scripts', async () => {
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
}, ['build'])
delete process.env.npm_config_unsafe_perm
@@ -735,7 +736,7 @@ test('`pnpm run -r` should avoid infinite recursion', async () => {
'--store-dir',
path.resolve(DEFAULT_OPTS.storeDir),
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [{ namePattern: 'project-1' }])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [{ namePattern: 'project-1' }])
await run.handler({
...DEFAULT_OPTS,
allProjects,
@@ -777,7 +778,7 @@ test('`pnpm recursive run` should fail when no script in package with requiredSc
try {
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
rootProjectManifest: {
@@ -839,7 +840,7 @@ test('`pnpm -r --resume-from run` should executed from given package', async ()
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
resumeFrom: 'project-3',
@@ -905,7 +906,7 @@ test('pnpm run with RegExp script selector should work on recursive', async () =
])
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
rootProjectManifest: {
@@ -974,7 +975,7 @@ test('pnpm recursive run report summary', async () => {
try {
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
reportSummary: true,
@@ -1036,7 +1037,7 @@ test('pnpm recursive run report summary with --bail', async () => {
try {
await run.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [{ namePattern: '*' }]),
...await filterPackagesFromDir(process.cwd(), [{ namePattern: '*' }]),
dir: process.cwd(),
recursive: true,
reportSummary: true,

View File

@@ -1,5 +1,6 @@
import path from 'path'
import { filterPkgsBySelectorObjects, readProjects } from '@pnpm/filter-workspace-packages'
import { filterPkgsBySelectorObjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { test as testCommand } from '@pnpm/plugin-commands-script-runners'
import { preparePackages } from '@pnpm/prepare'
import { createTestIpcServer } from '@pnpm/test-ipc-server'
@@ -51,7 +52,7 @@ test('pnpm recursive test', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa('node', [
pnpmBin,
'install',
@@ -104,7 +105,7 @@ test('`pnpm recursive test` does not fail if none of the packages has a test com
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await execa('node', [
pnpmBin,
'install',
@@ -150,7 +151,7 @@ test('pnpm recursive test with filtering', async () => {
},
])
const { allProjects } = await readProjects(process.cwd(), [])
const { allProjects } = await filterPackagesFromDir(process.cwd(), [])
const { selectedProjectsGraph } = await filterPkgsBySelectorObjects(
allProjects,
[{ namePattern: 'project-1' }],

View File

@@ -54,6 +54,9 @@
{
"path": "../../store/store-path"
},
{
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../../workspace/filter-workspace-packages"
},

View File

@@ -31,11 +31,11 @@
},
"homepage": "https://github.com/pnpm/pnpm/blob/main/patching/plugin-commands-patching#readme",
"devDependencies": {
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/plugin-commands-patching": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.31.0",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@types/normalize-path": "^3.0.2",
"@types/ramda": "0.29.12",
"@types/semver": "7.5.3",

View File

@@ -3,7 +3,7 @@ import os from 'os'
import path from 'path'
import { prepare, preparePackages, tempDir } from '@pnpm/prepare'
import { install } from '@pnpm/plugin-commands-installation'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { sync as writeYamlFile } from 'write-yaml-file'
import tempy from 'tempy'
import { patch, patchCommit, patchRemove } from '@pnpm/plugin-commands-patching'
@@ -545,7 +545,7 @@ describe('patch and commit in workspaces', () => {
})
test('patch commit should work in workspaces', async () => {
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
cacheDir,
@@ -599,7 +599,7 @@ describe('patch and commit in workspaces', () => {
})
test('patch and patch-commit should work with shared-workspace-lockfile=false', async () => {
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
cacheDir,
@@ -661,7 +661,7 @@ describe('patch and commit in workspaces', () => {
})
test('reusing existing patch file should work with shared-workspace-lockfile=false', async () => {
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
cacheDir,
@@ -724,7 +724,7 @@ describe('patch and commit in workspaces', () => {
})
test('patch and patch-commit for git hosted dependency', async () => {
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
cacheDir,
@@ -810,7 +810,7 @@ describe('patch with custom modules-dir and virtual-store-dir', () => {
test('should work with custom modules-dir and virtual-store-dir', async () => {
const manifest = fs.readFileSync(path.join(customModulesDirFixture, 'package.json'), 'utf8')
const lockfileYaml = fs.readFileSync(path.join(customModulesDirFixture, 'pnpm-lock.yaml'), 'utf8')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(customModulesDirFixture, [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(customModulesDirFixture, [])
await install.handler({
...DEFAULT_OPTS,
cacheDir,

View File

@@ -61,7 +61,7 @@
"path": "../../store/store-connection-manager"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../apply-patch"

View File

@@ -37,6 +37,7 @@
"@pnpm/registry-mock": "3.31.0",
"@pnpm/test-fixtures": "workspace:*",
"@pnpm/test-ipc-server": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@types/proxyquire": "^1.3.31",
"@types/ramda": "0.29.12",
"@types/sinon": "^10.0.20",

View File

@@ -295,6 +295,7 @@ export type InstallCommandOptions = Pick<Config,
| 'virtualStoreDir'
| 'workspaceConcurrency'
| 'workspaceDir'
| 'workspacePackagePatterns'
| 'extraEnv'
| 'resolutionMode'
| 'ignoreWorkspaceCycles'

View File

@@ -1,5 +1,5 @@
import path from 'path'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type Lockfile } from '@pnpm/lockfile-types'
import { add } from '@pnpm/plugin-commands-installation'
import { preparePackages } from '@pnpm/prepare'
@@ -19,7 +19,7 @@ test('recursive add --save-dev, --save-peer on workspace with multiple lockfiles
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await add.handler({
...DEFAULT_OPTS,
@@ -109,7 +109,7 @@ test('recursive add --save-dev, --save-peer on workspace with single lockfile',
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await add.handler({
...DEFAULT_OPTS,

View File

@@ -1,7 +1,7 @@
import fs from 'fs'
import path from 'path'
import { DedupeCheckIssuesError } from '@pnpm/dedupe.check'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type Lockfile } from '@pnpm/lockfile-types'
import { dedupe, install } from '@pnpm/plugin-commands-installation'
import { prepare } from '@pnpm/prepare'
@@ -144,7 +144,7 @@ async function testFixture (fixtureName: string) {
const project = prepare(undefined)
f.copy(fixtureName, project.dir())
const { allProjects, selectedProjectsGraph } = await readProjects(project.dir(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(project.dir(), [])
const opts = {
...DEFAULT_OPTS,

View File

@@ -1,5 +1,5 @@
import { install } from '@pnpm/plugin-commands-installation'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { preparePackages } from '@pnpm/prepare'
import { DEFAULT_OPTS } from './utils'
import type { PnpmError } from '@pnpm/error'
@@ -18,7 +18,7 @@ test('should error if disallow-workspace-cycles is set', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let err!: PnpmError
try {
@@ -51,7 +51,7 @@ test('should not error if disallow-workspace-cycles is not set', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let err!: PnpmError
try {
@@ -82,7 +82,7 @@ test('should not error if there are no cyclic dependencies', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
let err!: PnpmError
try {

View File

@@ -3,7 +3,7 @@ import path from 'path'
import { assertProject } from '@pnpm/assert-project'
import { importCommand } from '@pnpm/plugin-commands-installation'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { fixtures } from '@pnpm/test-fixtures'
import tempy from 'tempy'
@@ -43,7 +43,7 @@ const DEFAULT_OPTS = {
test('import from shared yarn.lock of monorepo', async () => {
f.prepare('workspace-has-shared-yarn-lock')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await importCommand.handler({
...DEFAULT_OPTS,
allProjects: allProjects as any, // eslint-disable-line @typescript-eslint/no-explicit-any
@@ -67,7 +67,7 @@ test('import from shared yarn.lock of monorepo', async () => {
test('import from shared package-lock.json of monorepo', async () => {
f.prepare('workspace-has-shared-package-lock-json')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await importCommand.handler({
...DEFAULT_OPTS,
allProjects: allProjects as any, // eslint-disable-line @typescript-eslint/no-explicit-any
@@ -91,7 +91,7 @@ test('import from shared package-lock.json of monorepo', async () => {
test('import from shared npm-shrinkwrap.json of monorepo', async () => {
f.prepare('workspace-has-shared-npm-shrinkwrap-json')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await importCommand.handler({
...DEFAULT_OPTS,
allProjects: allProjects as any, // eslint-disable-line @typescript-eslint/no-explicit-any

View File

@@ -1,7 +1,7 @@
import fs from 'fs'
import path from 'path'
import { LOCKFILE_VERSION } from '@pnpm/constants'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { install, unlink } from '@pnpm/plugin-commands-installation'
import { preparePackages } from '@pnpm/prepare'
import { DEFAULT_OPTS } from './utils'
@@ -26,7 +26,7 @@ test('recursive linking/unlinking', async () => {
},
])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -91,7 +91,7 @@ test('recursive unlink specific package', async () => {
},
])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,

View File

@@ -1,7 +1,7 @@
import fs from 'fs'
import path from 'path'
import { type PnpmError } from '@pnpm/error'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type LockfileFile } from '@pnpm/lockfile-types'
import { add, install, remove, update } from '@pnpm/plugin-commands-installation'
import { preparePackages } from '@pnpm/prepare'
@@ -34,7 +34,7 @@ test('recursive add/remove', async () => {
},
])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -95,7 +95,7 @@ test('recursive add/remove in workspace with many lockfiles', async () => {
},
])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -185,7 +185,7 @@ test('recursive install with package that has link', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
@@ -220,7 +220,7 @@ test('running `pnpm recursive` on a subset of packages', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
@@ -272,7 +272,7 @@ test('running `pnpm recursive` only for packages in subdirectories of cwd', asyn
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
@@ -307,7 +307,7 @@ test('recursive installation fails when installation in one of the packages fail
try {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),
@@ -334,7 +334,7 @@ test('second run of `recursive install` after package.json has been edited manua
},
])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -405,7 +405,7 @@ test('recursive --filter ignore excluded packages', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [
...await filterPackagesFromDir(process.cwd(), [
{ includeDependencies: true, namePattern: 'project-1' },
]),
dir: process.cwd(),
@@ -449,7 +449,7 @@ test('recursive filter multiple times', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [
...await filterPackagesFromDir(process.cwd(), [
{ namePattern: 'project-1' },
{ namePattern: 'project-2' },
]),
@@ -487,7 +487,7 @@ test('recursive install --no-bail', async () => {
try {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
bail: false,
dir: process.cwd(),
recursive: true,
@@ -520,7 +520,7 @@ test('installing with "workspace=true" should work even if link-workspace-packag
await update.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
linkWorkspacePackages: false,
lockfileDir: process.cwd(),
@@ -561,7 +561,7 @@ test('installing with "workspace=true" should work even if link-workspace-packag
await update.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
linkWorkspacePackages: false,
lockfileDir: process.cwd(),
@@ -605,7 +605,7 @@ test('recursive install on workspace with custom lockfile-dir', async () => {
])
const lockfileDir = path.resolve('_')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -643,7 +643,7 @@ test('recursive install in a monorepo with different modules directories', async
fs.writeFileSync('project-1/.npmrc', 'modules-dir=modules_1', 'utf8')
fs.writeFileSync('project-2/.npmrc', 'modules-dir=modules_2', 'utf8')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -674,7 +674,7 @@ test('recursive install in a monorepo with parsing env variables', async () => {
// eslint-disable-next-line no-template-curly-in-string
fs.writeFileSync('project/.npmrc', 'modules-dir=${SOME_NAME}_modules', 'utf8')
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -714,7 +714,7 @@ test('prefer-workspace-package', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
linkWorkspacePackages: true,
preferWorkspacePackages: true,
@@ -742,7 +742,7 @@ test('installing in monorepo with shared lockfile should work on virtual drives'
const virtualPath = process.cwd() + '-virtual-disk'
// symlink simulates windows' subst
await symlinkDir(process.cwd(), virtualPath)
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await readProjects(virtualPath, [])
const { allProjects, allProjectsGraph, selectedProjectsGraph } = await filterPackagesFromDir(virtualPath, [])
await install.handler({
...DEFAULT_OPTS,
lockfileDir: virtualPath,
@@ -777,7 +777,7 @@ test('pass readPackage with shared lockfile', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
workspaceDir: process.cwd(),

View File

@@ -1,5 +1,5 @@
import path from 'path'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type Lockfile } from '@pnpm/lockfile-types'
import { add, install, update } from '@pnpm/plugin-commands-installation'
import { prepare, preparePackages } from '@pnpm/prepare'
@@ -223,7 +223,7 @@ test('interactive update of dev dependencies only', async () => {
],
})
const { allProjects, selectedProjectsGraph } = await readProjects(
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(
process.cwd(),
[]
)

View File

@@ -3,7 +3,7 @@ import { preparePackages } from '@pnpm/prepare'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { update, install } from '@pnpm/plugin-commands-installation'
import * as enquirer from 'enquirer'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
jest.mock('enquirer', () => ({ prompt: jest.fn() }))
@@ -67,7 +67,7 @@ test('interactive recursive should not error on git specifier override', async (
updateDependencies: [],
})
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
const sharedOptions = {
...DEFAULT_OPTIONS,
allProjects,

View File

@@ -1,5 +1,5 @@
import { type PnpmError } from '@pnpm/error'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { type Lockfile } from '@pnpm/lockfile-types'
import { readModulesManifest } from '@pnpm/modules-yaml'
import { install, update } from '@pnpm/plugin-commands-installation'
@@ -29,7 +29,7 @@ test('recursive update', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -75,7 +75,7 @@ test('recursive update prod dependencies only', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -144,7 +144,7 @@ test('recursive update with pattern', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -202,7 +202,7 @@ test('recursive update with pattern and name in project', async () => {
const lockfileDir = process.cwd()
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -289,7 +289,7 @@ test('recursive update --latest foo should only update projects that have foo',
const lockfileDir = process.cwd()
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -349,7 +349,7 @@ test('recursive update --latest foo should only update packages that have foo',
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -401,7 +401,7 @@ test('recursive update in workspace should not add new dependencies', async () =
try {
await update.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
depth: 0,
dir: process.cwd(),
recursive: true,
@@ -434,7 +434,7 @@ test('recursive update with aliased workspace dependency (#7975)', async () => {
await update.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
depth: 0,
dir: process.cwd(),
recursive: true,

View File

@@ -1,5 +1,5 @@
import { install } from '@pnpm/plugin-commands-installation'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { preparePackages } from '@pnpm/prepare'
import { logger } from '@pnpm/logger'
import { DEFAULT_OPTS } from './utils'
@@ -26,7 +26,7 @@ test('should warn about cyclic dependencies', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -57,7 +57,7 @@ test('should not warn about cyclic dependencies if ignore-workspace-cycles is se
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -84,7 +84,7 @@ test('should not warn about cyclic dependencies if there are not', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,

View File

@@ -81,6 +81,9 @@
{
"path": "../../store/store-connection-manager"
},
{
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../../workspace/filter-workspace-packages"
},

73
pnpm-lock.yaml generated
View File

@@ -576,6 +576,9 @@ importers:
'@pnpm/workspace.find-packages':
specifier: workspace:^
version: link:../../workspace/find-packages
'@pnpm/workspace.read-manifest':
specifier: workspace:^
version: link:../../workspace/read-manifest
ramda:
specifier: npm:@pnpm/ramda@0.28.1
version: '@pnpm/ramda@0.28.1'
@@ -1330,9 +1333,6 @@ importers:
'@pnpm/crypto.object-hasher':
specifier: workspace:*
version: link:../../crypto/object-hasher
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/plugin-commands-rebuild':
specifier: workspace:*
version: 'link:'
@@ -1348,6 +1348,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/ramda':
specifier: 0.29.12
version: 0.29.12
@@ -1475,6 +1478,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/is-windows':
specifier: ^1.0.2
version: 1.0.2
@@ -2996,9 +3002,6 @@ importers:
specifier: ^1.0.1
version: 1.0.1
devDependencies:
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/plugin-commands-patching':
specifier: workspace:*
version: 'link:'
@@ -3011,6 +3014,9 @@ importers:
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/normalize-path':
specifier: ^3.0.2
version: 3.0.2
@@ -4121,6 +4127,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/proxyquire':
specifier: ^1.3.31
version: 1.3.31
@@ -4935,9 +4944,6 @@ importers:
'@pnpm/assert-project':
specifier: workspace:*
version: link:../../__utils__/assert-project
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/lockfile-types':
specifier: workspace:*
version: link:../../lockfile/lockfile-types
@@ -4950,6 +4956,9 @@ importers:
'@pnpm/registry-mock':
specifier: 3.31.0
version: 3.31.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
releasing/plugin-commands-publishing:
dependencies:
@@ -5038,9 +5047,6 @@ importers:
specifier: ^4.3.0
version: 4.3.0
devDependencies:
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/plugin-commands-publishing':
specifier: workspace:*
version: 'link:'
@@ -5053,6 +5059,9 @@ importers:
'@pnpm/test-ipc-server':
specifier: workspace:*
version: link:../../__utils__/test-ipc-server
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/cross-spawn':
specifier: ^6.0.6
version: 6.0.6
@@ -5607,9 +5616,6 @@ importers:
specifier: ^7.6.2
version: 7.6.2
devDependencies:
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/plugin-commands-installation':
specifier: workspace:*
version: link:../../pkg-manager/plugin-commands-installation
@@ -5628,6 +5634,9 @@ importers:
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/ramda':
specifier: 0.29.12
version: 0.29.12
@@ -5689,6 +5698,9 @@ importers:
'@pnpm/registry-mock':
specifier: 3.31.0
version: 3.31.0(encoding@0.1.13)(typanion@3.14.0)
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/ramda':
specifier: 0.29.12
version: 0.29.12
@@ -5765,9 +5777,6 @@ importers:
'@pnpm/constants':
specifier: workspace:*
version: link:../../packages/constants
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../../workspace/filter-workspace-packages
'@pnpm/plugin-commands-installation':
specifier: workspace:*
version: link:../../pkg-manager/plugin-commands-installation
@@ -5783,6 +5792,9 @@ importers:
'@pnpm/test-fixtures':
specifier: workspace:*
version: link:../../__utils__/test-fixtures
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: link:../../workspace/filter-packages-from-dir
'@types/ramda':
specifier: 0.29.12
version: 0.29.12
@@ -6417,6 +6429,25 @@ importers:
specifier: workspace:*
version: 'link:'
workspace/filter-packages-from-dir:
dependencies:
'@pnpm/filter-workspace-packages':
specifier: workspace:*
version: link:../filter-workspace-packages
'@pnpm/workspace.find-packages':
specifier: workspace:*
version: link:../find-packages
'@pnpm/workspace.read-manifest':
specifier: workspace:*
version: link:../read-manifest
devDependencies:
'@pnpm/types':
specifier: workspace:*
version: link:../../packages/types
'@pnpm/workspace.filter-packages-from-dir':
specifier: workspace:*
version: 'link:'
workspace/filter-workspace-packages:
dependencies:
'@pnpm/error':
@@ -6495,13 +6526,13 @@ importers:
'@pnpm/util.lex-comparator':
specifier: 3.0.0
version: 3.0.0
'@pnpm/workspace.read-manifest':
specifier: workspace:*
version: link:../read-manifest
devDependencies:
'@pnpm/workspace.find-packages':
specifier: workspace:*
version: 'link:'
'@pnpm/workspace.read-manifest':
specifier: workspace:*
version: link:../read-manifest
workspace/find-workspace-dir:
dependencies:

View File

@@ -1397,8 +1397,9 @@ test('root package is included when not specified', async () => {
{ tempDir: `${tempDir}/project` }
)
)
writeYamlFile('pnpm-workspace.yaml', { packages: ['project-', '!store/**'] })
const workspacePackages = await findWorkspacePackages(tempDir, { engineStrict: false })
const workspacePackagePatterns = ['project-', '!store/**']
writeYamlFile('pnpm-workspace.yaml', { packages: workspacePackagePatterns })
const workspacePackages = await findWorkspacePackages(tempDir, { engineStrict: false, patterns: workspacePackagePatterns })
expect(workspacePackages.some(project => {
const relativePath = path.join('.', path.relative(tempDir, project.dir))
@@ -1434,8 +1435,9 @@ test("root package can't be ignored using '!.' (or any other such glob)", async
{ tempDir: `${tempDir}/project` }
)
)
writeYamlFile('pnpm-workspace.yaml', { packages: ['project-', '!.', '!./', '!store/**'] })
const workspacePackages = await findWorkspacePackages(tempDir, { engineStrict: false })
const workspacePackagePatterns = ['project-', '!.', '!./', '!store/**']
writeYamlFile('pnpm-workspace.yaml', { packages: workspacePackagePatterns })
const workspacePackages = await findWorkspacePackages(tempDir, { engineStrict: false, patterns: workspacePackagePatterns })
expect(workspacePackages.some(project => {
const relativePath = path.join('.', path.relative(tempDir, project.dir))

View File

@@ -35,7 +35,7 @@
"homepage": "https://github.com/pnpm/pnpm/blob/main/releasing/plugin-commands-deploy#readme",
"devDependencies": {
"@pnpm/assert-project": "workspace:*",
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@pnpm/lockfile-types": "workspace:*",
"@pnpm/plugin-commands-deploy": "workspace:*",
"@pnpm/prepare": "workspace:*",

View File

@@ -4,7 +4,7 @@ import { deploy } from '@pnpm/plugin-commands-deploy'
import { assertProject } from '@pnpm/assert-project'
import { preparePackages } from '@pnpm/prepare'
import { logger } from '@pnpm/logger'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { DEFAULT_OPTS } from './utils'
test('deploy', async () => {
@@ -47,7 +47,7 @@ test('deploy', async () => {
fs.writeFileSync(`${name}/index.js`, '', 'utf8')
})
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [{ namePattern: 'project-1' }])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [{ namePattern: 'project-1' }])
await deploy.handler({
...DEFAULT_OPTS,
@@ -92,7 +92,7 @@ test('deploy fails when the destination directory exists and is not empty', asyn
fs.writeFileSync(deployPath, 'aaa', 'utf8')
const deployFullPath = path.resolve(deployPath)
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [{ namePattern: 'project' }])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [{ namePattern: 'project' }])
await expect(() =>
deploy.handler({
@@ -134,7 +134,7 @@ test('forced deploy succeeds with a warning when destination directory exists an
fs.writeFileSync(deployPath, 'aaa', 'utf8')
const deployFullPath = path.resolve(deployPath)
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [{ namePattern: 'project' }])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [{ namePattern: 'project' }])
await deploy.handler({
...DEFAULT_OPTS,
@@ -193,7 +193,7 @@ test('deploy with dedupePeerDependents=true ignores the value of dedupePeerDepen
},
])
const { allProjects, selectedProjectsGraph, allProjectsGraph } = await readProjects(process.cwd(), [{ namePattern: 'project-1' }])
const { allProjects, selectedProjectsGraph, allProjectsGraph } = await filterPackagesFromDir(process.cwd(), [{ namePattern: 'project-1' }])
await deploy.handler({
...DEFAULT_OPTS,

View File

@@ -43,7 +43,7 @@
"path": "../../pkg-manager/plugin-commands-installation"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
}
]
}

View File

@@ -32,7 +32,7 @@
},
"homepage": "https://github.com/pnpm/pnpm/blob/main/releasing/plugin-commands-publishing#readme",
"devDependencies": {
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@pnpm/plugin-commands-publishing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.31.0",

View File

@@ -1,6 +1,6 @@
import fs from 'fs'
import path from 'path'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { streamParser } from '@pnpm/logger'
import { publish } from '@pnpm/plugin-commands-publishing'
import { preparePackages } from '@pnpm/prepare'
@@ -74,7 +74,7 @@ test('recursive publish', async () => {
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
dryRun: true,
recursive: true,
@@ -92,7 +92,7 @@ test('recursive publish', async () => {
process.env.npm_config_userconfig = path.join('.npmrc')
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
}, [])
@@ -110,7 +110,7 @@ test('recursive publish', async () => {
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
tag: 'next',
@@ -161,7 +161,7 @@ test('print info when no packages are published', async () => {
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
dryRun: true,
recursive: true,
@@ -193,7 +193,7 @@ test('packages are released even if their current version is published, when for
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
force: true,
dir: process.cwd(),
dryRun: true,
@@ -257,7 +257,7 @@ test('recursive publish writes publish summary', async () => {
process.env.npm_config_userconfig = path.join('.npmrc')
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
reportSummary: true,
@@ -271,7 +271,7 @@ test('recursive publish writes publish summary', async () => {
await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
reportSummary: true,
@@ -302,7 +302,7 @@ test('when publish some package throws an error, exit code should be non-zero',
const result = await publish.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
force: true,

View File

@@ -61,7 +61,7 @@
"path": "../../resolving/resolver-base"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../../workspace/sort-packages"

View File

@@ -31,7 +31,7 @@
"homepage": "https://github.com/pnpm/pnpm/blob/main/reviewing/plugin-commands-licenses#readme",
"devDependencies": {
"@pnpm/constants": "workspace:*",
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-licenses": "workspace:*",
"@pnpm/prepare": "workspace:*",

View File

@@ -7,7 +7,7 @@ import { tempDir } from '@pnpm/prepare'
import { fixtures } from '@pnpm/test-fixtures'
import stripAnsi from 'strip-ansi'
import { DEFAULT_OPTS } from './utils'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
const f = fixtures(__dirname)
@@ -123,7 +123,7 @@ test('pnpm licenses: path should be correct for workspaces', async () => {
f.copy('workspace-licenses', workspaceDir)
const { allProjects, allProjectsGraph, selectedProjectsGraph } =
await readProjects(workspaceDir, [])
await filterPackagesFromDir(workspaceDir, [])
const storeDir = path.join(workspaceDir, 'store')
await install.handler({
@@ -173,7 +173,7 @@ test('pnpm licenses: filter outputs', async () => {
f.copy('workspace-licenses', workspaceDir)
const { allProjects, allProjectsGraph, selectedProjectsGraph } =
await readProjects(workspaceDir, [])
await filterPackagesFromDir(workspaceDir, [])
const storeDir = path.join(workspaceDir, 'store')
await install.handler({

View File

@@ -46,7 +46,7 @@
"path": "../../store/store-path"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../license-scanner"

View File

@@ -35,6 +35,7 @@
"@pnpm/plugin-commands-listing": "workspace:*",
"@pnpm/prepare": "workspace:*",
"@pnpm/registry-mock": "3.31.0",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@types/ramda": "0.29.12",
"execa": "npm:safe-execa@0.1.2",
"strip-ansi": "^6.0.1",

View File

@@ -1,7 +1,7 @@
import fs from 'fs'
import path from 'path'
import { type PnpmError } from '@pnpm/error'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { install } from '@pnpm/plugin-commands-installation'
import { list, why } from '@pnpm/plugin-commands-listing'
import { prepare, preparePackages } from '@pnpm/prepare'
@@ -34,7 +34,7 @@ test('recursive list', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -96,7 +96,7 @@ test('recursive list with shared-workspace-lockfile', async () => {
writeYamlFile('pnpm-workspace.yaml', { packages: ['**', '!store/**'] })
fs.writeFileSync('.npmrc', 'shared-workspace-lockfile = true', 'utf8')
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -164,7 +164,7 @@ test('recursive list --filter', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
cacheDir: path.resolve('cache'),
dir: process.cwd(),
recursive: true,
@@ -175,7 +175,7 @@ test('recursive list --filter', async () => {
...DEFAULT_OPTS,
dir: process.cwd(),
recursive: true,
...await readProjects(process.cwd(), [
...await filterPackagesFromDir(process.cwd(), [
{ includeDependencies: true, namePattern: 'project-1' },
]),
}, [])
@@ -218,7 +218,7 @@ test('recursive list --filter link-workspace-packages=false', async () => {
await install.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), [], { linkWorkspacePackages: false }),
...await filterPackagesFromDir(process.cwd(), [], { linkWorkspacePackages: false }),
cacheDir: path.resolve('cache'),
dir: process.cwd(),
linkWorkspacePackages: false,
@@ -230,7 +230,7 @@ test('recursive list --filter link-workspace-packages=false', async () => {
...DEFAULT_OPTS,
dir: process.cwd(),
recursive: true,
...await readProjects(process.cwd(), [
...await filterPackagesFromDir(process.cwd(), [
{ includeDependencies: true, namePattern: 'project-1' },
], { linkWorkspacePackages: false }),
}, [])
@@ -251,7 +251,7 @@ test('`pnpm recursive why` should fail if no package name was provided', async (
try {
await why.handler({
...DEFAULT_OPTS,
...await readProjects(process.cwd(), []),
...await filterPackagesFromDir(process.cwd(), []),
dir: process.cwd(),
recursive: true,
}, [])

View File

@@ -33,6 +33,9 @@
{
"path": "../../pkg-manager/plugin-commands-installation"
},
{
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../../workspace/filter-workspace-packages"
},

View File

@@ -31,7 +31,7 @@
"homepage": "https://github.com/pnpm/pnpm/blob/main/reviewing/plugin-commands-outdated#readme",
"devDependencies": {
"@pnpm/constants": "workspace:*",
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*",
"@pnpm/plugin-commands-installation": "workspace:*",
"@pnpm/plugin-commands-outdated": "workspace:*",
"@pnpm/prepare": "workspace:*",

View File

@@ -1,5 +1,5 @@
import path from 'path'
import { readProjects } from '@pnpm/filter-workspace-packages'
import { filterPackagesFromDir } from '@pnpm/workspace.filter-packages-from-dir'
import { install } from '@pnpm/plugin-commands-installation'
import { outdated } from '@pnpm/plugin-commands-outdated'
import { preparePackages } from '@pnpm/prepare'
@@ -38,7 +38,7 @@ test('pnpm recursive outdated', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,
@@ -263,7 +263,7 @@ test('pnpm recursive outdated: format json when there are no outdated dependenci
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
const { output, exitCode } = await outdated.handler({
...DEFAULT_OPTS,
allProjects,
@@ -308,7 +308,7 @@ test('pnpm recursive outdated in workspace with shared lockfile', async () => {
},
])
const { allProjects, selectedProjectsGraph } = await readProjects(process.cwd(), [])
const { allProjects, selectedProjectsGraph } = await filterPackagesFromDir(process.cwd(), [])
await install.handler({
...DEFAULT_OPTS,
allProjects,

View File

@@ -55,7 +55,7 @@
"path": "../../store/store-path"
},
{
"path": "../../workspace/filter-workspace-packages"
"path": "../../workspace/filter-packages-from-dir"
},
{
"path": "../outdated"

View File

@@ -0,0 +1,15 @@
# @pnpm/workspace.filter-packages-from-dir
> Filters packages in a directory
[![npm version](https://img.shields.io/npm/v/@pnpm/workspace.filter-packages-from-dir.svg)](https://www.npmjs.com/package/@pnpm/workspace.filter-packages-from-dir)
## Installation
```sh
pnpm add @pnpm/workspace.filter-packages-from-dir
```
## License
MIT

View File

@@ -0,0 +1,43 @@
{
"name": "@pnpm/workspace.filter-packages-from-dir",
"version": "0.0.0",
"description": "Filters packages in a directory",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": [
"lib",
"!*.map"
],
"engines": {
"node": ">=18.12"
},
"scripts": {
"lint": "eslint \"src/**/*.ts\"",
"test": "pnpm run compile",
"prepublishOnly": "pnpm run compile",
"compile": "tsc --build && pnpm run lint --fix"
},
"repository": "https://github.com/pnpm/pnpm/blob/main/workspace/filter-packages-from-dir",
"keywords": [
"pnpm9",
"pnpm"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/pnpm/pnpm/issues"
},
"homepage": "https://github.com/pnpm/pnpm/blob/main/workspace/filter-packages-from-dir#readme",
"dependencies": {
"@pnpm/filter-workspace-packages": "workspace:*",
"@pnpm/workspace.find-packages": "workspace:*",
"@pnpm/workspace.read-manifest": "workspace:*"
},
"devDependencies": {
"@pnpm/types": "workspace:*",
"@pnpm/workspace.filter-packages-from-dir": "workspace:*"
},
"funding": "https://opencollective.com/pnpm",
"exports": {
".": "./lib/index.js"
}
}

View File

@@ -0,0 +1,36 @@
import { type SupportedArchitectures } from '@pnpm/types'
import { findWorkspacePackages } from '@pnpm/workspace.find-packages'
import { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'
import { filterPkgsBySelectorObjects, type PackageSelector, type ReadProjectsResult } from '@pnpm/filter-workspace-packages'
export async function filterPackagesFromDir (
workspaceDir: string,
pkgSelectors: PackageSelector[],
opts?: {
engineStrict?: boolean
linkWorkspacePackages?: boolean
changedFilesIgnorePattern?: string[]
supportedArchitectures?: SupportedArchitectures
}
): Promise<ReadProjectsResult> {
const workspaceManifest = await readWorkspaceManifest(workspaceDir)
const allProjects = await findWorkspacePackages(workspaceDir, {
patterns: workspaceManifest?.packages,
engineStrict: opts?.engineStrict,
supportedArchitectures: opts?.supportedArchitectures ?? {
os: ['current'],
cpu: ['current'],
libc: ['current'],
},
})
const { allProjectsGraph, selectedProjectsGraph } = await filterPkgsBySelectorObjects(
allProjects,
pkgSelectors,
{
linkWorkspacePackages: opts?.linkWorkspacePackages,
workspaceDir,
changedFilesIgnorePattern: opts?.changedFilesIgnorePattern,
}
)
return { allProjects, allProjectsGraph, selectedProjectsGraph }
}

View File

@@ -0,0 +1,25 @@
{
"extends": "@pnpm/tsconfig",
"compilerOptions": {
"outDir": "lib",
"rootDir": "src"
},
"include": [
"src/**/*.ts",
"../../__typings__/**/*.d.ts"
],
"references": [
{
"path": "../../packages/types"
},
{
"path": "../filter-workspace-packages"
},
{
"path": "../find-packages"
},
{
"path": "../read-manifest"
}
]
}

View File

@@ -0,0 +1,8 @@
{
"extends": "./tsconfig.json",
"include": [
"src/**/*.ts",
"test/**/*.ts",
"../../__typings__/**/*.d.ts"
]
}

View File

@@ -36,29 +36,6 @@ export interface ReadProjectsResult {
selectedProjectsGraph: PackageGraph<Project>
}
export async function readProjects (
workspaceDir: string,
pkgSelectors: PackageSelector[],
opts?: {
engineStrict?: boolean
linkWorkspacePackages?: boolean
changedFilesIgnorePattern?: string[]
supportedArchitectures?: SupportedArchitectures
}
): Promise<ReadProjectsResult> {
const allProjects = await findWorkspacePackages(workspaceDir, { engineStrict: opts?.engineStrict, supportedArchitectures: opts?.supportedArchitectures ?? { os: ['current'], cpu: ['current'], libc: ['current'] } })
const { allProjectsGraph, selectedProjectsGraph } = await filterPkgsBySelectorObjects(
allProjects,
pkgSelectors,
{
linkWorkspacePackages: opts?.linkWorkspacePackages,
workspaceDir,
changedFilesIgnorePattern: opts?.changedFilesIgnorePattern,
}
)
return { allProjects, allProjectsGraph, selectedProjectsGraph }
}
export interface FilterPackagesOptions {
linkWorkspacePackages?: boolean
prefix: string

View File

@@ -32,12 +32,12 @@
"@pnpm/cli-utils": "workspace:*",
"@pnpm/fs.find-packages": "workspace:*",
"@pnpm/types": "workspace:*",
"@pnpm/util.lex-comparator": "3.0.0",
"@pnpm/workspace.read-manifest": "workspace:*"
"@pnpm/util.lex-comparator": "3.0.0"
},
"funding": "https://opencollective.com/pnpm",
"devDependencies": {
"@pnpm/workspace.find-packages": "workspace:*"
"@pnpm/workspace.find-packages": "workspace:*",
"@pnpm/workspace.read-manifest": "workspace:*"
},
"peerDependencies": {
"@pnpm/logger": "^5.0.0"

View File

@@ -1,28 +1,39 @@
import { packageIsInstallable } from '@pnpm/cli-utils'
import { type ProjectManifest, type Project, type SupportedArchitectures } from '@pnpm/types'
import { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'
import { lexCompare } from '@pnpm/util.lex-comparator'
import { findPackages } from '@pnpm/fs.find-packages'
import { logger } from '@pnpm/logger'
export type { Project }
export type WorkspacePackagesPatterns = 'all-packages' | string[]
export interface FindWorkspacePackagesOpts {
/**
* An array of globs for the packages included in the workspace.
*
* In most cases, callers should read the pnpm-workspace.yml and pass the
* "packages" field.
*/
patterns?: string[]
engineStrict?: boolean
packageManagerStrict?: boolean
packageManagerStrictVersion?: boolean
nodeVersion?: string
sharedWorkspaceLockfile?: boolean
supportedArchitectures?: SupportedArchitectures
}
export async function findWorkspacePackages (
workspaceRoot: string,
opts?: {
engineStrict?: boolean
packageManagerStrict?: boolean
packageManagerStrictVersion?: boolean
nodeVersion?: string
patterns?: string[]
sharedWorkspaceLockfile?: boolean
supportedArchitectures?: SupportedArchitectures
}
opts?: FindWorkspacePackagesOpts
): Promise<Project[]> {
const pkgs = await findWorkspacePackagesNoCheck(workspaceRoot, opts)
for (const pkg of pkgs) {
packageIsInstallable(pkg.dir, pkg.manifest, opts ?? {
supportedArchitectures: {
packageIsInstallable(pkg.dir, pkg.manifest, {
...opts,
supportedArchitectures: opts?.supportedArchitectures ?? {
os: ['current'],
cpu: ['current'],
libc: ['current'],
@@ -38,18 +49,13 @@ export async function findWorkspacePackages (
}
export async function findWorkspacePackagesNoCheck (workspaceRoot: string, opts?: { patterns?: string[] }): Promise<Project[]> {
let patterns = opts?.patterns
if (patterns == null) {
const workspaceManifest = await readWorkspaceManifest(workspaceRoot)
patterns = workspaceManifest?.packages
}
const pkgs = await findPackages(workspaceRoot, {
ignore: [
'**/node_modules/**',
'**/bower_components/**',
],
includeRoot: true,
patterns,
patterns: opts?.patterns,
})
pkgs.sort((pkg1: { dir: string }, pkg2: { dir: string }) => lexCompare(pkg1.dir, pkg2.dir))
return pkgs

View File

@@ -4,6 +4,7 @@ import {
arrayOfWorkspacePackagesToMap,
findWorkspacePackages,
} from '@pnpm/workspace.find-packages'
import { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'
import { logger } from '@pnpm/logger'
beforeEach(() => {
@@ -30,7 +31,16 @@ test('arrayOfWorkspacePackagesToMap() treats private packages with no version as
})
test('findWorkspacePackagesNoCheck() skips engine checks', async () => {
const pkgs = await findWorkspacePackagesNoCheck(path.join(__dirname, '__fixtures__/bad-engine'))
const fixturePath = path.join(__dirname, '__fixtures__/bad-engine')
const workspaceManifest = await readWorkspaceManifest(fixturePath)
if (workspaceManifest?.packages == null) {
throw new Error(`Unexpected test setup failure. No pnpm-workspace.yaml packages were defined at ${fixturePath}`)
}
const pkgs = await findWorkspacePackagesNoCheck(fixturePath, {
patterns: workspaceManifest.packages,
})
expect(pkgs.length).toBe(1)
expect(pkgs[0].manifest.name).toBe('pkg')
})
@@ -38,7 +48,13 @@ test('findWorkspacePackagesNoCheck() skips engine checks', async () => {
test('findWorkspacePackages() output warnings for non-root workspace project', async () => {
const fixturePath = path.join(__dirname, '__fixtures__/warning-for-non-root-project')
const workspaceManifest = await readWorkspaceManifest(fixturePath)
if (workspaceManifest?.packages == null) {
throw new Error(`Unexpected test setup failure. No pnpm-workspace.yaml packages were defined at ${fixturePath}`)
}
const pkgs = await findWorkspacePackages(fixturePath, {
patterns: workspaceManifest.packages,
sharedWorkspaceLockfile: true,
})
expect(pkgs.length).toBe(3)