mirror of
https://github.com/nodejs/node.git
synced 2025-05-17 23:31:07 +00:00

PR-URL: https://github.com/nodejs/node/pull/38254 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
const { resolve } = require('path')
|
|
const mapWorkspaces = require('@npmcli/map-workspaces')
|
|
const minimatch = require('minimatch')
|
|
const rpj = require('read-package-json-fast')
|
|
|
|
// Returns an Map of paths to workspaces indexed by workspace name
|
|
// { foo => '/path/to/foo' }
|
|
const getWorkspaces = async (filters, { path }) => {
|
|
// TODO we need a better error to be bubbled up here if this rpj call fails
|
|
const pkg = await rpj(resolve(path, 'package.json'))
|
|
const workspaces = await mapWorkspaces({ cwd: path, pkg })
|
|
const res = filters.length ? new Map() : workspaces
|
|
|
|
for (const filterArg of filters) {
|
|
for (const [workspaceName, workspacePath] of workspaces.entries()) {
|
|
if (filterArg === workspaceName
|
|
|| resolve(path, filterArg) === workspacePath
|
|
|| minimatch(workspacePath, `${resolve(path, filterArg)}/*`))
|
|
res.set(workspaceName, workspacePath)
|
|
}
|
|
}
|
|
|
|
if (!res.size) {
|
|
let msg = '!'
|
|
if (filters.length) {
|
|
msg = `:\n ${filters.reduce(
|
|
(res, filterArg) => `${res} --workspace=${filterArg}`, '')}`
|
|
}
|
|
|
|
throw new Error(`No workspaces found${msg}`)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
module.exports = getWorkspaces
|