Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib/utils
diff options
context:
space:
mode:
authorGar <gar+gh@danger.computer>2021-02-25 02:54:50 +0300
committerRuy Adorno <ruyadorno@hotmail.com>2021-03-05 00:05:08 +0300
commit4a5dd3a5a200b3f4f7b47168497d8e03dca3a2ca (patch)
treed34a1ea229b719c3cfbdce85899ceaf67b43e7ab /lib/utils
parentb33c760cea7fe2696d35b5530abc1b455980fef1 (diff)
fix(npm) pass npm context everywhere
Instead of files randomly requiring the npm singleton, we pass it where it needs to go so that tests don't need to do so much require mocking everywhere PR-URL: https://github.com/npm/cli/pull/2772 Credit: @wraithgar Close: #2772 Reviewed-by: @ruyadorno
Diffstat (limited to 'lib/utils')
-rw-r--r--lib/utils/audit-error.js3
-rw-r--r--lib/utils/completion/installed-deep.js3
-rw-r--r--lib/utils/completion/installed-shallow.js6
-rw-r--r--lib/utils/get-identity.js3
-rw-r--r--lib/utils/lifecycle-cmd.js21
-rw-r--r--lib/utils/npm-usage.js10
-rw-r--r--lib/utils/open-url.js41
-rw-r--r--lib/utils/read-local-package.js4
-rw-r--r--lib/utils/reify-finish.js9
-rw-r--r--lib/utils/reify-output.js13
-rw-r--r--lib/utils/usage.js4
11 files changed, 59 insertions, 58 deletions
diff --git a/lib/utils/audit-error.js b/lib/utils/audit-error.js
index c7423c447..ae0749ff6 100644
--- a/lib/utils/audit-error.js
+++ b/lib/utils/audit-error.js
@@ -4,8 +4,7 @@
// returns 'true' if there was an error, false otherwise
const output = require('./output.js')
-const npm = require('../npm.js')
-const auditError = (report) => {
+const auditError = (npm, report) => {
if (!report || !report.error)
return false
diff --git a/lib/utils/completion/installed-deep.js b/lib/utils/completion/installed-deep.js
index f464bb9a9..b65c17e41 100644
--- a/lib/utils/completion/installed-deep.js
+++ b/lib/utils/completion/installed-deep.js
@@ -1,8 +1,7 @@
const { resolve } = require('path')
const Arborist = require('@npmcli/arborist')
-const npm = require('../../npm.js')
-const installedDeep = async () => {
+const installedDeep = async (npm) => {
const {
depth,
global,
diff --git a/lib/utils/completion/installed-shallow.js b/lib/utils/completion/installed-shallow.js
index c9c680e7d..1c9b8ef5a 100644
--- a/lib/utils/completion/installed-shallow.js
+++ b/lib/utils/completion/installed-shallow.js
@@ -1,10 +1,8 @@
-const npm = require('../../npm.js')
const { promisify } = require('util')
const readdir = promisify(require('readdir-scoped-modules'))
-const names = global => readdir(global ? npm.globalDir : npm.localDir)
-
-const installedShallow = async (opts) => {
+const installedShallow = async (npm, opts) => {
+ const names = global => readdir(global ? npm.globalDir : npm.localDir)
const { conf: { argv: { remain } } } = opts
if (remain.length > 3)
return null
diff --git a/lib/utils/get-identity.js b/lib/utils/get-identity.js
index d5c560161..e92a2c524 100644
--- a/lib/utils/get-identity.js
+++ b/lib/utils/get-identity.js
@@ -1,10 +1,9 @@
const npmFetch = require('npm-registry-fetch')
-const npm = require('../npm')
const needsAuthError = (msg) =>
Object.assign(new Error(msg), { code: 'ENEEDAUTH' })
-module.exports = async (opts = {}) => {
+module.exports = async (npm, opts = {}) => {
const { registry } = opts
if (!registry)
throw Object.assign(new Error('No registry specified.'), { code: 'ENOREGISTRY' })
diff --git a/lib/utils/lifecycle-cmd.js b/lib/utils/lifecycle-cmd.js
index 94b109942..8be9b5a12 100644
--- a/lib/utils/lifecycle-cmd.js
+++ b/lib/utils/lifecycle-cmd.js
@@ -1,10 +1,19 @@
// The implementation of commands that are just "run a script"
-// test, start, stop, restart
-
+// restart, start, stop, test
const usageUtil = require('./usage.js')
-module.exports = (npm, stage) => {
- const cmd = (args, cb) => npm.commands['run-script']([stage, ...args], cb)
- const usage = usageUtil(stage, `npm ${stage} [-- <args>]`)
- return Object.assign(cmd, { usage })
+class LifecycleCmd {
+ constructor (npm, stage) {
+ this.npm = npm
+ this.stage = stage
+ }
+
+ get usage () {
+ return usageUtil(this.stage, `npm ${this.stage} [-- <args>]`)
+ }
+
+ exec (args, cb) {
+ this.npm.commands['run-script']([this.stage, ...args], cb)
+ }
}
+module.exports = LifecycleCmd
diff --git a/lib/utils/npm-usage.js b/lib/utils/npm-usage.js
index d4261f79d..220f8037f 100644
--- a/lib/utils/npm-usage.js
+++ b/lib/utils/npm-usage.js
@@ -1,10 +1,9 @@
-const npm = require('../npm.js')
const didYouMean = require('./did-you-mean.js')
const { dirname } = require('path')
const output = require('./output.js')
const { cmdList } = require('./cmd-list')
-module.exports = (valid = true) => {
+module.exports = (npm, valid = true) => {
npm.config.set('loglevel', 'silent')
const usesBrowser = npm.config.get('viewer') === 'browser'
? ' (in a browser)' : ''
@@ -22,7 +21,7 @@ npm help <term> search for help on <term>${usesBrowser}
npm help npm more involved overview${usesBrowser}
All commands:
-${npm.config.get('long') ? usages() : ('\n ' + wrap(cmdList))}
+${npm.config.get('long') ? usages(npm) : ('\n ' + wrap(cmdList))}
Specify configs in the ini-formatted file:
${npm.config.get('userconfig')}
@@ -59,12 +58,11 @@ const wrap = (arr) => {
return out.join('\n ').substr(2)
}
-const usages = () => {
+const usages = (npm) => {
// return a string of <command>: <usage>
let maxLen = 0
return cmdList.reduce((set, c) => {
- set.push([c, require(`../${npm.deref(c)}.js`).usage ||
- /* istanbul ignore next - all commands should have usage */ ''])
+ set.push([c, npm.commands[c].usage])
maxLen = Math.max(maxLen, c.length)
return set
}, [])
diff --git a/lib/utils/open-url.js b/lib/utils/open-url.js
index 28c2d038a..1fe456bd0 100644
--- a/lib/utils/open-url.js
+++ b/lib/utils/open-url.js
@@ -1,19 +1,12 @@
-const npm = require('../npm.js')
const output = require('./output.js')
const opener = require('opener')
const { URL } = require('url')
-const isUrlValid = url => {
- try {
- return /^(https?|file):$/.test(new URL(url).protocol)
- } catch (_) {
- return false
- }
-}
-
// attempt to open URL in web-browser, print address otherwise:
-module.exports = function open (url, errMsg, cb, browser = npm.config.get('browser')) {
+const open = async (npm, url, errMsg) => {
+ const browser = npm.config.get('browser')
+
function printAlternateMsg () {
const json = npm.config.get('json')
const alternateMsg = json
@@ -28,18 +21,28 @@ module.exports = function open (url, errMsg, cb, browser = npm.config.get('brows
if (browser === false) {
printAlternateMsg()
- return cb()
+ return
}
- if (!isUrlValid(url))
- return cb(new Error('Invalid URL: ' + url))
+ try {
+ if (!/^(https?|file):$/.test(new URL(url).protocol))
+ throw new Error()
+ } catch (_) {
+ throw new Error('Invalid URL: ' + url)
+ }
const command = browser === true ? null : browser
- opener(url, { command }, (er) => {
- if (er && er.code === 'ENOENT') {
- printAlternateMsg()
- return cb()
- } else
- return cb(er)
+ await new Promise((resolve, reject) => {
+ opener(url, { command }, (err) => {
+ if (err) {
+ if (err.code === 'ENOENT')
+ printAlternateMsg()
+ else
+ return reject(err)
+ }
+ return resolve()
+ })
})
}
+
+module.exports = open
diff --git a/lib/utils/read-local-package.js b/lib/utils/read-local-package.js
index 7ab130c1f..c31bca994 100644
--- a/lib/utils/read-local-package.js
+++ b/lib/utils/read-local-package.js
@@ -1,8 +1,6 @@
const { resolve } = require('path')
const readJson = require('read-package-json-fast')
-const npm = require('../npm.js')
-
-async function readLocalPackageName (cb) {
+async function readLocalPackageName (npm) {
if (npm.flatOptions.global)
return
diff --git a/lib/utils/reify-finish.js b/lib/utils/reify-finish.js
index 9c95e9fcf..1c02b93a4 100644
--- a/lib/utils/reify-finish.js
+++ b/lib/utils/reify-finish.js
@@ -1,17 +1,16 @@
const reifyOutput = require('./reify-output.js')
-const npm = require('../npm.js')
const ini = require('ini')
const util = require('util')
const fs = require('fs')
const { writeFile } = fs.promises || { writeFile: util.promisify(fs.writeFile) }
const {resolve} = require('path')
-const reifyFinish = async arb => {
- await saveBuiltinConfig(arb)
- reifyOutput(arb)
+const reifyFinish = async (npm, arb) => {
+ await saveBuiltinConfig(npm, arb)
+ reifyOutput(npm, arb)
}
-const saveBuiltinConfig = async arb => {
+const saveBuiltinConfig = async (npm, arb) => {
const { options: { global }, actualTree } = arb
if (!global)
return
diff --git a/lib/utils/reify-output.js b/lib/utils/reify-output.js
index 4abaadc2e..216f0e902 100644
--- a/lib/utils/reify-output.js
+++ b/lib/utils/reify-output.js
@@ -9,7 +9,6 @@
// found 37 vulnerabilities (5 low, 7 moderate, 25 high)
// run `npm audit fix` to fix them, or `npm audit` for details
-const npm = require('../npm.js')
const log = require('npmlog')
const output = require('./output.js')
const { depth } = require('treeverse')
@@ -19,7 +18,7 @@ const { readTree: getFundingInfo } = require('libnpmfund')
const auditError = require('./audit-error.js')
// TODO: output JSON if flatOptions.json is true
-const reifyOutput = arb => {
+const reifyOutput = (npm, arb) => {
// don't print any info in --silent mode
if (log.levels[log.level] > log.levels.error)
return
@@ -29,7 +28,7 @@ const reifyOutput = arb => {
// note: fails and crashes if we're running audit fix and there was an error
// which is a good thing, because there's no point printing all this other
// stuff in that case!
- const auditReport = auditError(arb.auditReport) ? null : arb.auditReport
+ const auditReport = auditError(npm, arb.auditReport) ? null : arb.auditReport
const summary = {
added: 0,
@@ -75,9 +74,9 @@ const reifyOutput = arb => {
}
output(JSON.stringify(summary, 0, 2))
} else {
- packagesChangedMessage(summary)
+ packagesChangedMessage(npm, summary)
packagesFundingMessage(summary)
- printAuditReport(auditReport)
+ printAuditReport(npm, auditReport)
}
}
@@ -85,7 +84,7 @@ const reifyOutput = arb => {
// at the end if there's still stuff, because it's silly for `npm audit`
// to tell you to run `npm audit` for details. otherwise, use the summary
// report. if we get here, we know it's not quiet or json.
-const printAuditReport = report => {
+const printAuditReport = (npm, report) => {
if (!report)
return
@@ -102,7 +101,7 @@ const printAuditReport = report => {
output('\n' + res.report)
}
-const packagesChangedMessage = ({ added, removed, changed, audited }) => {
+const packagesChangedMessage = (npm, { added, removed, changed, audited }) => {
const msg = ['\n']
if (added === 0 && removed === 0 && changed === 0) {
msg.push('up to date')
diff --git a/lib/utils/usage.js b/lib/utils/usage.js
index ddcbd708b..5f4eca73e 100644
--- a/lib/utils/usage.js
+++ b/lib/utils/usage.js
@@ -1,7 +1,7 @@
-var aliases = require('../utils/cmd-list').aliases
+const aliases = require('../utils/cmd-list').aliases
module.exports = function usage (cmd, txt, opt) {
- var post = Object.keys(aliases).reduce(function (p, c) {
+ const post = Object.keys(aliases).reduce(function (p, c) {
var val = aliases[c]
if (val !== cmd)
return p