![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/.nvm/versions/node/v16.19.0/lib/node_modules/npm/man/man7/ |
.TH "DEPENDENCY" "" "November 2022" "" "" .SH "NAME" \fBDependency\fR .SS Description .P The npm help query commmand exposes a new dependency selector syntax (informed by & respecting many aspects of the CSS Selectors 4 Spec \fIhttps://dev\.w3\.org/csswg/selectors4/#relational)\fR which: .RS 0 .IP \(bu 2 Standardizes the shape of, & querying of, dependency graphs with a robust object model, metadata & selector syntax .IP \(bu 2 Leverages existing, known language syntax & operators from CSS to make disparate package information broadly accessible .IP \(bu 2 Unlocks the ability to answer complex, multi\-faceted questions about dependencies, their relationships & associative metadata .IP \(bu 2 Consolidates redundant logic of similar query commands in \fBnpm\fP (ex\. \fBnpm fund\fP, \fBnpm ls\fP, \fBnpm outdated\fP, \fBnpm audit\fP \.\.\.) .RE .SS Dependency Selector Syntax \fBv1\.0\.0\fP .SS Overview: .RS 0 .IP \(bu 2 there is no "type" or "tag" selectors (ex\. \fBdiv, h1, a\fP) as a dependency/target is the only type of \fBNode\fP that can be queried .IP \(bu 2 the term "dependencies" is in reference to any \fBNode\fP found in a \fBtree\fP returned by \fBArborist\fP .RE .SS Combinators .RS 0 .IP \(bu 2 \fB>\fP direct descendant/child .IP \(bu 2 \fB \fP any descendant/child .IP \(bu 2 \fB~\fP sibling .RE .SS Selectors .RS 0 .IP \(bu 2 \fB*\fP universal selector .IP \(bu 2 \fB#<name>\fP dependency selector (equivalent to \fB[name="\.\.\."]\fP) .IP \(bu 2 \fB#<name>@<version>\fP (equivalent to \fB[name=<name>]:semver(<version>)\fP) .IP \(bu 2 \fB,\fP selector list delimiter .IP \(bu 2 \fB\|\.\fP dependency type selector .IP \(bu 2 \fB:\fP pseudo selector .RE .SS Dependency Type Selectors .RS 0 .IP \(bu 2 \fB\|\.prod\fP dependency found in the \fBdependencies\fP section of \fBpackage\.json\fP, or is a child of said dependency .IP \(bu 2 \fB\|\.dev\fP dependency found in the \fBdevDependencies\fP section of \fBpackage\.json\fP, or is a child of said dependency .IP \(bu 2 \fB\|\.optional\fP dependency found in the \fBoptionalDependencies\fP section of \fBpackage\.json\fP, or has \fB"optional": true\fP set in its entry in the \fBpeerDependenciesMeta\fP section of \fBpackage\.json\fP, or a child of said dependency .IP \(bu 2 \fB\|\.peer\fP dependency found in the \fBpeerDependencies\fP section of \fBpackage\.json\fP .IP \(bu 2 \fB\|\.workspace\fP dependency found in the \fBworkspaces\fP \fIhttps://docs\.npmjs\.com/cli/v8/using\-npm/workspaces\fR section of \fBpackage\.json\fP .IP \(bu 2 \fB\|\.bundled\fP dependency found in the \fBbundleDependencies\fP section of \fBpackage\.json\fP, or is a child of said dependency .RE .SS Pseudo Selectors .RS 0 .IP \(bu 2 \fB:not(<selector>)\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:not\fR .IP \(bu 2 \fB:has(<selector>)\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:has\fR .IP \(bu 2 \fB:is(<selector list>)\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:is\fR .IP \(bu 2 \fB:root\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:root\fR matches the root node/dependency .IP \(bu 2 \fB:scope\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:scope\fR matches node/dependency it was queried against .IP \(bu 2 \fB:empty\fP \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/:empty\fR when a dependency has no dependencies .IP \(bu 2 \fB:private\fP \fIhttps://docs\.npmjs\.com/cli/v8/configuring\-npm/package\-json#private\fR when a dependency is private .IP \(bu 2 \fB:link\fP when a dependency is linked (for instance, workspaces or packages manually \fBlinked\fP \fIhttps://docs\.npmjs\.com/cli/v8/commands/npm\-link\fR .IP \(bu 2 \fB:deduped\fP when a dependency has been deduped (note that this does \fInot\fR always mean the dependency has been hoisted to the root of node_modules) .IP \(bu 2 \fB:overridden\fP when a dependency has been overridden .IP \(bu 2 \fB:extraneous\fP when a dependency exists but is not defined as a dependency of any node .IP \(bu 2 \fB:invalid\fP when a dependency version is out of its ancestors specified range .IP \(bu 2 \fB:missing\fP when a dependency is not found on disk .IP \(bu 2 \fB:semver(<spec>)\fP matching a valid \fBnode\-semver\fP \fIhttps://github\.com/npm/node\-semver\fR spec .IP \(bu 2 \fB:path(<path>)\fP glob \fIhttps://www\.npmjs\.com/package/glob\fR matching based on dependencies path relative to the project .IP \(bu 2 \fB:type(<type>)\fP based on currently recognized types \fIhttps://github\.com/npm/npm\-package\-arg#result\-object\fR .RE .SS Attribute Selectors \fIhttps://developer\.mozilla\.org/en\-US/docs/Web/CSS/Attribute_selectors\fR .P The attribute selector evaluates the key/value pairs in \fBpackage\.json\fP if they are \fBString\fPs\. .RS 0 .IP \(bu 2 \fB[]\fP attribute selector (ie\. existence of attribute) .IP \(bu 2 \fB[attribute=value]\fP attribute value is equivalant\.\.\. .IP \(bu 2 \fB[attribute~=value]\fP attribute value contains word\.\.\. .IP \(bu 2 \fB[attribute*=value]\fP attribute value contains string\.\.\. .IP \(bu 2 \fB[attribute|=value]\fP attribute value is equal to or starts with\.\.\. .IP \(bu 2 \fB[attribute^=value]\fP attribute value starts with\.\.\. .IP \(bu 2 \fB[attribute$=value]\fP attribute value ends with\.\.\. .RE .SS \fBArray\fP & \fBObject\fP Attribute Selectors .P The generic \fB:attr()\fP pseudo selector standardizes a pattern which can be used for attribute selection of \fBObject\fPs, \fBArray\fPs or \fBArrays\fP of \fBObject\fPs accessible via \fBArborist\fP\|'s \fBNode\.package\fP metadata\. This allows for iterative attribute selection beyond top\-level \fBString\fP evaluation\. The last argument passed to \fB:attr()\fP must be an \fBattribute\fP selector or a nested \fB:attr()\fP\|\. See examples below: .SS \fBObjects\fP .P .RS 2 .nf /* return dependencies that have a `scripts\.test` containing `"tap"` */ *:attr(scripts, [test~=tap]) .fi .RE .SS Nested \fBObjects\fP .P Nested objects are expressed as sequential arguments to \fB:attr()\fP\|\. .P .RS 2 .nf /* return dependencies that have a testling config for opera browsers */ *:attr(testling, browsers, [~=opera]) .fi .RE .SS \fBArrays\fP .P \fBArray\fPs specifically uses a special/reserved \fB\|\.\fP character in place of a typical attribute name\. \fBArrays\fP also support exact \fBvalue\fP matching when a \fBString\fP is passed to the selector\. .SS Example of an \fBArray\fP Attribute Selection: .P .RS 2 .nf /* removes the distinction between properties & arrays */ /* ie\. we'd have to check the property & iterate to match selection */ *:attr([keywords^=react]) *:attr(contributors, :attr([name~=Jordan])) .fi .RE .SS Example of an \fBArray\fP matching directly to a value: .P .RS 2 .nf /* return dependencies that have the exact keyword "react" */ /* this is equivalent to `*:keywords([value="react"])` */ *:attr([keywords=react]) .fi .RE .SS Example of an \fBArray\fP of \fBObject\fPs: .P .RS 2 .nf /* returns */ *:attr(contributors, [email=ruyadorno@github\.com]) .fi .RE .SS Groups .P Dependency groups are defined by the package relationships to their ancestors (ie\. the dependency types that are defined in \fBpackage\.json\fP)\. This approach is user\-centric as the ecosystem has been taught to think about dependencies in these groups first\-and\-foremost\. Dependencies are allowed to be included in multiple groups (ex\. a \fBprod\fP dependency may also be a \fBdev\fP dependency (in that it's also required by another \fBdev\fP dependency) & may also be \fBbundled\fP \- a selector for that type of dependency would look like: \fB*\.prod\.dev\.bundled\fP)\. .RS 0 .IP \(bu 2 \fB\|\.prod\fP .IP \(bu 2 \fB\|\.dev\fP .IP \(bu 2 \fB\|\.optional\fP .IP \(bu 2 \fB\|\.peer\fP .IP \(bu 2 \fB\|\.bundled\fP .IP \(bu 2 \fB\|\.workspace\fP .RE .P Please note that currently \fBworkspace\fP deps are always \fBprod\fP dependencies\. Additionally the \fB\|\.root\fP dependency is also considered a \fBprod\fP dependency\. .SS Programmatic Usage .RS 0 .IP \(bu 2 \fBArborist\fP\|'s \fBNode\fP Class has a \fB\|\.querySelectorAll()\fP method .RS .IP \(bu 2 this method will return a filtered, flattened dependency Arborist \fBNode\fP list based on a valid query selector .RE .RE .P .RS 2 .nf const Arborist = require('@npmcli/arborist') const arb = new Arborist({}) .fi .RE .P .RS 2 .nf // root\-level arb\.loadActual()\.then(async (tree) => { // query all production dependencies const results = await tree\.querySelectorAll('\.prod') console\.log(results) }) .fi .RE .P .RS 2 .nf // iterative arb\.loadActual()\.then(async (tree) => { // query for the deduped version of react const results = await tree\.querySelectorAll('#react:not(:deduped)') // query the deduped react for git deps const deps = await results[0]\.querySelectorAll(':type(git)') console\.log(deps) }) .fi .RE .SH See Also .RS 0 .IP \(bu 2 npm help query .IP \(bu 2 @npmcli/arborist \fIhttps://npm\.im/@npmcli/arborist\fR .RE