summaryrefslogtreecommitdiff
path: root/deps/npm/lib/workspaces/get-workspaces.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/workspaces/get-workspaces.js')
-rw-r--r--deps/npm/lib/workspaces/get-workspaces.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/deps/npm/lib/workspaces/get-workspaces.js b/deps/npm/lib/workspaces/get-workspaces.js
new file mode 100644
index 0000000000..64812d5403
--- /dev/null
+++ b/deps/npm/lib/workspaces/get-workspaces.js
@@ -0,0 +1,33 @@
+const { resolve } = require('path')
+const mapWorkspaces = require('@npmcli/map-workspaces')
+const minimatch = require('minimatch')
+const rpj = require('read-package-json-fast')
+
+const getWorkspaces = async (filters, { path }) => {
+ 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