Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(usage): tie usage to config by wraithgar · Pull Request #2908 · npm/cli · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions docs/content/using-npm/config.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -96,6 +96,8 @@ The following shorthands are parsed on the command-line:
* `-H`: `--usage`
* `--help`: `--usage`
* `-v`: `--version`
* `-w`: `--workspace`
* `--ws`: `--workspaces`
* `-y`: `--yes`

<!-- AUTOGENERATED CONFIG SHORTHANDS END -->
Expand DownExpand Up@@ -1311,6 +1313,34 @@ The program to use to view help content.

Set to `"browser"` to view html help content in the default web browser.

#### `which`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which was not defined yet, and I re-ran the make to generate this file. We should think about automating this make command

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's included in the make docs that's part of the release process as a final safety net, but some easier way to run it ahead of time would be nice, too, I agree.


* Default: null
* Type: null or Number

If there are multiple funding sources, which 1-indexed source URL to open.

#### `workspace`

* Default:
* Type: String (can be set multiple times)

Enable running a command in the context of the configured workspaces of the
current project while filtering by running only the workspaces defined by
this configuration option.

Valid values for the `workspace` config are either: - Workspace names - Path
to a workspace directory - Path to a parent workspace directory (will result
to selecting all of the nested workspaces)

#### `workspaces`

* Default: false
* Type: Boolean

Enable running a command in the context of **all** the configured
workspaces.

#### `yes`

* Default: false
Expand Down
8 changes: 6 additions & 2 deletions lib/adduser.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,8 +17,12 @@ class AddUser extends BaseCommand {
return 'adduser'
}

static get usage () {
return ['[--registry=url] [--scope=@orgname] [--always-auth]']
static get params () {
return [
'registry',
'scope',
'always-auth',
]
}

exec (args, cb) {
Expand Down
14 changes: 11 additions & 3 deletions lib/audit.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,13 +16,21 @@ class Audit extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
static get params () {
return [
'[--json] [--production]',
'fix [--force|--package-lock-only|--dry-run|--production|--only=(dev|prod)]',
'dry-run',
'force',
'json',
'package-lock-only',
'production',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[fix]']
}

async completion (opts) {
const argv = opts.conf.argv.remain

Expand Down
4 changes: 4 additions & 0 deletions lib/base-command.js
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// Base class for npm.commands[cmd]
const usageUtil = require('./utils/usage.js')
const ConfigDefinitions = require('./utils/config/definitions.js')

class BaseCommand {
constructor (npm) {
Expand All@@ -25,6 +26,9 @@ class BaseCommand {
else
usage = `${usage}${this.constructor.usage.map(u => `npm ${this.constructor.name} ${u}`).join('\n')}`

if (this.constructor.params)
usage = `${usage}\n\nOptions:\n[${this.constructor.params.map(p => ConfigDefinitions[p].usage).join('] [')}]`

// Mostly this just appends aliases, this could be more clear
usage = usageUtil(this.constructor.name, usage)
usage = `${usage}\n\nRun "npm help ${this.constructor.name}" for more info`
Expand Down
4 changes: 2 additions & 2 deletions lib/bin.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,8 +10,8 @@ class Bin extends BaseCommand {
return 'bin'
}

static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/fund.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,9 +32,19 @@ class Fund extends BaseCommand {
return 'fund'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'json',
'browser',
'unicode',
'which',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--json] [--browser] [--unicode] [[<@scope>/]<pkg> [--which=<fundingSourceNumber>]']
return ['[[<@scope>/]<pkg>]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
10 changes: 9 additions & 1 deletion lib/install.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,14 @@ class Install extends BaseCommand {
return 'install'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'save',
'save-exact',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
Expand All@@ -33,7 +41,7 @@ class Install extends BaseCommand {
'<tarball file>',
'<tarball url>',
'<git:// url>',
'<github username>/<github project> [--save-prod|--save-dev|--save-optional|--save-peer] [--save-exact] [--no-save]',
'<github username>/<github project>',
]
}

Expand Down
7 changes: 5 additions & 2 deletions lib/logout.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,11 @@ class Logout extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[--registry=<url>] [--scope=<@scope>]']
static get params () {
return [
'registry',
'scope',
]
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/pack.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,9 +21,14 @@ class Pack extends BaseCommand {
return 'pack'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--dry-run]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
5 changes: 5 additions & 0 deletions lib/ping.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ class Ping extends BaseCommand {
return 'Ping npm registry'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['registry']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name () {
return 'ping'
Expand Down
7 changes: 6 additions & 1 deletion lib/prune.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,9 +14,14 @@ class Prune extends BaseCommand {
return 'prune'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['production']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[[<@scope>/]<pkg>...] [--production]']
return ['[[<@scope>/]<pkg>...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/publish.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,10 +28,15 @@ class Publish extends BaseCommand {
return 'publish'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['tag', 'access', 'dry-run']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return [
'[<folder>] [--tag <tag>] [--access <public|restricted>] [--dry-run]',
'[<folder>]',
]
}

Expand Down
4 changes: 2 additions & 2 deletions lib/root.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,8 +11,8 @@ class Root extends BaseCommand {
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g]']
static get params () {
return ['global']
}

exec (args, cb) {
Expand Down
12 changes: 11 additions & 1 deletion lib/search.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,19 @@ class Search extends BaseCommand {
return 'search'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return [
'long',
'json',
'parseable',
'description',
]
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-l|--long] [--json] [--parseable] [--no-description] [search terms ...]']
return ['[search terms ...]']
}

exec (args, cb) {
Expand Down
7 changes: 6 additions & 1 deletion lib/uninstall.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,9 +16,14 @@ class Uninstall extends BaseCommand {
return 'uninstall'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['save']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]']
return ['[<@scope>/]<pkg>...']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
7 changes: 6 additions & 1 deletion lib/update.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,9 +18,14 @@ class Update extends BaseCommand {
return 'update'
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get params () {
return ['global']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage () {
return ['[-g] [<pkg>...]']
return ['[<pkg>...]']
}

/* istanbul ignore next - see test/lib/load-all-commands.js */
Expand Down
36 changes: 32 additions & 4 deletions lib/utils/config/definition.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,14 +15,16 @@ const required = [

const allowed = [
'default',
'type',
'defaultDescription',
'deprecated',
'description',
'flatten',
'hint',
'key',
'short',
'type',
'typeDescription',
'defaultDescription',
'deprecated',
'key',
'usage',
]

const {
Expand All@@ -43,6 +45,10 @@ class Definition {
this.defaultDescription = describeValue(this.default)
if (!this.typeDescription)
this.typeDescription = describeType(this.type)
if (!this.hint)
this.hint = `<${this.key}>`
if (!this.usage)
this.usage = describeUsage(this)
}

validate () {
Expand DownExpand Up@@ -73,6 +79,28 @@ ${description}
}
}

// Usage for a single param, abstracted because we have arrays of types in
// config definition
const paramUsage = (type, def) => {
let key = `--${def.key}`
if (def.short && typeof def.short === 'string')
key = `-${def.short}|${key}`
if (type === Boolean)
return `${key}`
else
return `${key} ${def.hint}`
}

const describeUsage = (def) => {
if (Array.isArray(def.type)) {
if (!def.type.some(d => d !== null && typeof d !== 'string'))
return `--${def.key} <${def.type.filter(d => d).join('|')}>`
else
return def.type.filter(d => d).map((t) => paramUsage(t, def)).join('|')
}
return paramUsage(def.type, def)
}

const describeType = type => {
if (Array.isArray(type)) {
const descriptions = type
Expand Down
Loading