Installing dependencies.
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
||||
const { resolve, relative } = require('path')
|
||||
const mapWorkspaces = require('@npmcli/map-workspaces')
|
||||
const minimatch = require('minimatch')
|
||||
const rpj = require('read-package-json-fast')
|
||||
|
||||
// minimatch wants forward slashes only for glob patterns
|
||||
const globify = pattern => pattern.split('\\').join('/')
|
||||
|
||||
// Returns an Map of paths to workspaces indexed by workspace name
|
||||
// { foo => '/path/to/foo' }
|
||||
const getWorkspaces = async (filters, { path, includeWorkspaceRoot, relativeFrom }) => {
|
||||
// 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 })
|
||||
let res = new Map()
|
||||
if (includeWorkspaceRoot) {
|
||||
res.set(pkg.name, path)
|
||||
}
|
||||
|
||||
if (!filters.length) {
|
||||
res = new Map([...res, ...workspaces])
|
||||
}
|
||||
|
||||
for (const filterArg of filters) {
|
||||
for (const [workspaceName, workspacePath] of workspaces.entries()) {
|
||||
let relativePath = relative(relativeFrom, workspacePath)
|
||||
if (filterArg.startsWith('./')) {
|
||||
relativePath = `./${relativePath}`
|
||||
}
|
||||
const relativeFilter = relative(path, filterArg)
|
||||
if (filterArg === workspaceName
|
||||
|| resolve(relativeFrom, filterArg) === workspacePath
|
||||
|| minimatch(relativePath, `${globify(relativeFilter)}/*`)
|
||||
|| minimatch(relativePath, `${globify(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
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
'use strict'
|
||||
|
||||
const Arborist = require('@npmcli/arborist')
|
||||
const reifyFinish = require('../utils/reify-finish.js')
|
||||
|
||||
async function updateWorkspaces ({
|
||||
config,
|
||||
flatOptions,
|
||||
localPrefix,
|
||||
npm,
|
||||
workspaces,
|
||||
}) {
|
||||
if (!flatOptions.workspacesUpdate || !workspaces.length) {
|
||||
return
|
||||
}
|
||||
|
||||
// default behavior is to not save by default in order to avoid
|
||||
// race condition problems when publishing multiple workspaces
|
||||
// that have dependencies on one another, it might still be useful
|
||||
// in some cases, which then need to set --save
|
||||
const save = config.isDefault('save')
|
||||
? false
|
||||
: config.get('save')
|
||||
|
||||
// runs a minimalistic reify update, targetting only the workspaces
|
||||
// that had version updates and skipping fund/audit/save
|
||||
const opts = {
|
||||
...flatOptions,
|
||||
audit: false,
|
||||
fund: false,
|
||||
path: localPrefix,
|
||||
save,
|
||||
}
|
||||
const arb = new Arborist(opts)
|
||||
|
||||
await arb.reify({ ...opts, update: workspaces })
|
||||
await reifyFinish(npm, arb)
|
||||
}
|
||||
|
||||
module.exports = updateWorkspaces
|
||||
Reference in New Issue
Block a user