ReactFlow前端拖拽模型与参数配置功能MVP

This commit is contained in:
ljz committed 2026-07-11 10:49:11 +08:00
1 parent 70c91ed019
commit d3b99304fb
2001 files changed
+349044 -548

No files matched your search

@@ -0,0 +1,331 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>Folders</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----folders----11160">
<span>Folders</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">Folder structures used by npm</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><ul><li><a href="#tldr">tl;dr</a></li><li><a href="#prefix-configuration">prefix Configuration</a></li><li><a href="#node-modules">Node Modules</a></li><li><a href="#executables">Executables</a></li><li><a href="#man-pages">Man Pages</a></li><li><a href="#cache">Cache</a></li></ul><li><a href="#more-information">More Information</a></li><ul><li><a href="#global-installation">Global Installation</a></li><li><a href="#cycles-conflicts-and-folder-parsimony">Cycles, Conflicts, and Folder Parsimony</a></li><li><a href="#example">Example</a></li><li><a href="#publishing">Publishing</a></li></ul><li><a href="#see-also">See also</a></li></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p>npm puts various things on your computer.
That's its job.</p>
<p>This document will tell you what it puts where.</p>
<h4 id="tldr">tl;dr</h4>
<ul>
<li>Local install (default): puts stuff in <code>./node_modules</code> of the current package root.</li>
<li>Global install (with <code>-g</code>): puts stuff in /usr/local or wherever node is installed.</li>
<li>Install it <strong>locally</strong> if you're going to <code>require()</code> it.</li>
<li>Install it <strong>globally</strong> if you're going to run it on the command line.</li>
<li>If you need both, then install it in both places, or use <code>npm link</code>.</li>
</ul>
<h4 id="prefix-configuration">prefix Configuration</h4>
<p>The <a href="../using-npm/config#prefix.html"><code>prefix</code> config</a> defaults to the location where node is installed.
On most systems, this is <code>/usr/local</code>.
On Windows, it's <code>%AppData%\npm</code>.
On Unix systems, it's one level up, since node is typically installed at <code>{prefix}/bin/node</code> rather than <code>{prefix}/node.exe</code>.</p>
<p>When the <code>global</code> flag is set, npm installs things into this prefix.
When it is not set, it uses the root of the current package, or the current working directory if not in a package already.</p>
<h4 id="node-modules">Node Modules</h4>
<p>Packages are dropped into the <code>node_modules</code> folder under the <code>prefix</code>.
When installing locally, this means that you can <code>require("packagename")</code> to load its main module, or <code>require("packagename/lib/path/to/sub/module")</code> to load other modules.</p>
<p>Global installs on Unix systems go to <code>{prefix}/lib/node_modules</code>.
Global installs on Windows go to <code>{prefix}/node_modules</code> (that is, no <code>lib</code> folder.)</p>
<p>Scoped packages are installed the same way, except they are grouped together in a sub-folder of the relevant <code>node_modules</code> folder with the name of that scope prefix by the @ symbol, e.g. <code>npm install @myorg/package</code> would place the package in <code>{prefix}/node_modules/@myorg/package</code>.
See <a href="../using-npm/scope.html"><code>scope</code></a> for more details.</p>
<p>If you wish to <code>require()</code> a package, then install it locally.</p>
<h4 id="executables">Executables</h4>
<p>When in global mode, executables are linked into <code>{prefix}/bin</code> on Unix, or directly into <code>{prefix}</code> on Windows.
Ensure that path is in your terminal's <code>PATH</code> environment to run them.</p>
<p>When in local mode, executables are linked into <code>./node_modules/.bin</code> so that they can be made available to scripts run through npm.
(For example, so that a test runner will be in the path when you run <code>npm test</code>.)</p>
<h4 id="man-pages">Man Pages</h4>
<p>When in global mode, man pages are linked into <code>{prefix}/share/man</code>.</p>
<p>When in local mode, man pages are not installed.</p>
<p>Man pages are not installed on Windows systems.</p>
<h4 id="cache">Cache</h4>
<p>See <a href="../commands/npm-cache.html"><code>npm cache</code></a>.
Cache files are stored in <code>~/.npm</code> on Posix, or <code>%LocalAppData%/npm-cache</code> on Windows.</p>
<p>This is controlled by the <a href="../using-npm/config#cache.html"><code>cache</code> config</a> param.</p>
<h3 id="more-information">More Information</h3>
<p>When installing locally, npm first tries to find an appropriate <code>prefix</code> folder.
This is so that <code>npm install foo@1.2.3</code> will install to the sensible root of your package, even if you happen to have <code>cd</code>ed into some other folder.</p>
<p>Starting at the $PWD, npm will walk up the folder tree checking for a folder that contains either a <code>package.json</code> file, or a <code>node_modules</code> folder.
If such a thing is found, then that is treated as the effective "current directory" for the purpose of running npm commands.
(This behavior is inspired by and similar to git's .git-folder seeking logic when running git commands in a working dir.)</p>
<p>If no package root is found, then the current folder is used.</p>
<p>When you run <code>npm install foo@1.2.3</code>, then the package is loaded into the cache, and then unpacked into <code>./node_modules/foo</code>.
Then, any of foo's dependencies are similarly unpacked into <code>./node_modules/foo/node_modules/...</code>.</p>
<p>Any bin files are symlinked to <code>./node_modules/.bin/</code>, so that they may be found by npm scripts when necessary.</p>
<h4 id="global-installation">Global Installation</h4>
<p>If the <a href="../using-npm/config#global.html"><code>global</code> config</a> is set to true, then npm will install packages "globally".</p>
<p>For global installation, packages are installed roughly the same way, but using the folders described above.</p>
<h4 id="cycles-conflicts-and-folder-parsimony">Cycles, Conflicts, and Folder Parsimony</h4>
<p>Cycles are handled using the property of node's module system that it walks up the directories looking for <code>node_modules</code> folders.
So, at every stage, if a package is already installed in an ancestor <code>node_modules</code> folder, then it is not installed at the current location.</p>
<p>Consider the case above, where <code>foo -&gt; bar -&gt; baz</code>.
Imagine if, in addition to that, baz depended on bar, so you'd have:
<code>foo -&gt; bar -&gt; baz -&gt; bar -&gt; baz ...</code>.
However, since the folder structure is: <code>foo/node_modules/bar/node_modules/baz</code>, there's no need to put another copy of bar into <code>.../baz/node_modules</code>, since when baz calls <code>require("bar")</code>, it will get the copy that is installed in <code>foo/node_modules/bar</code>.</p>
<p>This shortcut is only used if the exact same version would be installed in multiple nested <code>node_modules</code> folders.
It is still possible to have <code>a/node_modules/b/node_modules/a</code> if the two "a" packages are different versions.
However, without repeating the exact same package multiple times, an infinite regress will always be prevented.</p>
<p>Another optimization can be made by installing dependencies at the highest level possible, below the localized "target" folder (hoisting).
Since version 3, npm hoists dependencies by default.</p>
<h4 id="example">Example</h4>
<p>Consider this dependency graph:</p>
<pre><code class="language-bash">foo
+-- blerg@1.2.5
+-- bar@1.2.3
| +-- blerg@1.x (latest=1.3.7)
| +-- baz@2.x
| | `-- quux@3.x
| | `-- bar@1.2.3 (cycle)
| `-- asdf@*
`-- baz@1.2.3
`-- quux@3.x
`-- bar
</code></pre>
<p>In this case, we might expect a folder structure like this (with all dependencies hoisted to the highest level possible):</p>
<pre><code class="language-bash">foo
+-- node_modules
+-- blerg (1.2.5) &lt;---[A]
+-- bar (1.2.3) &lt;---[B]
| +-- node_modules
| +-- baz (2.0.2) &lt;---[C]
+-- asdf (2.3.4)
+-- baz (1.2.3) &lt;---[D]
+-- quux (3.2.0) &lt;---[E]
</code></pre>
<p>Since foo depends directly on <code>bar@1.2.3</code> and <code>baz@1.2.3</code>, those are installed in foo's <code>node_modules</code> folder.</p>
<p>Even though the latest copy of blerg is 1.3.7, foo has a specific dependency on version 1.2.5.
So, that gets installed at [A].
Since the parent installation of blerg satisfies bar's dependency on <code>blerg@1.x</code>, it does not install another copy under [B].</p>
<p>Bar [B] also has dependencies on baz and asdf.
Because it depends on <code>baz@2.x</code>, it cannot re-use the <code>baz@1.2.3</code> installed in the parent <code>node_modules</code> folder [D], and must install its own copy [C].
In order to minimize duplication, npm hoists dependencies to the top level by default, so asdf is installed under [A].</p>
<p>Underneath bar, the <code>baz -&gt; quux -&gt; bar</code> dependency creates a cycle.
However, because bar is already in quux's ancestry [B], it does not unpack another copy of bar into that folder.
Likewise, quux's [E] folder tree is empty, because its dependency on bar is satisfied by the parent folder copy installed at [B].</p>
<p>For a graphical breakdown of what is installed where, use <code>npm ls</code>.</p>
<h4 id="publishing">Publishing</h4>
<p>Upon publishing, npm will look in the <code>node_modules</code> folder.
If any of the items there are not in the <code>bundleDependencies</code> array, then they will not be included in the package tarball.</p>
<p>This allows a package maintainer to install all of their dependencies (and dev dependencies) locally, but only re-publish those items that cannot be found elsewhere.
See <a href="../configuring-npm/package-json.html"><code>package.json</code></a> for more information.</p>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="../configuring-npm/package-json.html">package.json</a></li>
<li><a href="../commands/npm-install.html">npm install</a></li>
<li><a href="../commands/npm-pack.html">npm pack</a></li>
<li><a href="../commands/npm-cache.html">npm cache</a></li>
<li><a href="../commands/npm-config.html">npm config</a></li>
<li><a href="../configuring-npm/npmrc.html">npmrc</a></li>
<li><a href="../using-npm/config.html">config</a></li>
<li><a href="../commands/npm-publish.html">npm publish</a></li>
</ul></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/folders.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>
@@ -0,0 +1,249 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>Install</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----install----11160">
<span>Install</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">Download and install node and npm</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#overview">Overview</a></li><li><a href="#checking-your-version-of-npm-and-nodejs">Checking your version of npm and Node.js</a></li><li><a href="#using-a-node-version-manager-to-install-nodejs-and-npm">Using a Node version manager to install Node.js and npm</a></li><li><a href="#using-a-node-installer-to-install-nodejs-and-npm">Using a Node installer to install Node.js and npm</a></li><ul><li><a href="#macos-or-windows-node-installers">macOS or Windows Node installers</a></li><li><a href="#linux-or-other-operating-systems-node-installers">Linux or other operating systems Node installers</a></li></ul></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p>To publish and install packages to and from the public npm registry, you must install Node.js and the npm command line interface using either a Node version manager or a Node installer.
<strong>We strongly recommend using a Node version manager to install Node.js and npm.</strong> We do not recommend using a
Node installer, since the Node installation process installs npm in a directory with local permissions and can cause permissions errors when you run npm packages globally.</p>
<h3 id="overview">Overview</h3>
<ul>
<li><a href="#checking-your-version-of-npm-and-nodejs">Checking your version of npm and Node.js</a></li>
<li><a href="#using-a-node-version-manager-to-install-nodejs-and-npm">Using a Node version manager to install Node.js and npm</a></li>
<li><a href="#using-a-node-installer-to-install-nodejs-and-npm">Using a Node installer to install Node.js and npm</a></li>
</ul>
<h3 id="checking-your-version-of-npm-and-nodejs">Checking your version of npm and Node.js</h3>
<p>To see if you already have Node.js and npm installed and check the installed version, run the following commands:</p>
<pre><code>node -v
npm -v
</code></pre>
<h3 id="using-a-node-version-manager-to-install-nodejs-and-npm">Using a Node version manager to install Node.js and npm</h3>
<p>Node version managers allow you to install and switch between multiple versions of Node.js and npm on your system so you can test your applications on multiple versions of npm to ensure they work for users on different versions.
You can <a href="https://github.com/search?q=node+version+manager+archived%3Afalse&amp;type=repositories&amp;ref=advsearch">search for them on GitHub</a>.</p>
<h3 id="using-a-node-installer-to-install-nodejs-and-npm">Using a Node installer to install Node.js and npm</h3>
<p>If you are unable to use a Node version manager, you can use a Node installer to install both Node.js and npm on your system.</p>
<ul>
<li><a href="https://nodejs.org/en/download/">Node.js installer</a></li>
<li><a href="https://github.com/nodesource/distributions">NodeSource installer</a>.
If you use Linux, we recommend that you use a NodeSource installer.</li>
</ul>
<h4 id="macos-or-windows-node-installers">macOS or Windows Node installers</h4>
<p>If you're using macOS or Windows, use one of the installers from the <a href="https://nodejs.org/en/download/">Node.js download page</a>.
Be sure to install the version labeled <strong>LTS</strong>. Other versions have not yet been tested with npm.</p>
<h4 id="linux-or-other-operating-systems-node-installers">Linux or other operating systems Node installers</h4>
<p>If you're using Linux or another operating system, use one of the following installers:</p>
<ul>
<li><a href="https://github.com/nodesource/distributions">NodeSource installer</a> (recommended)</li>
<li>One of the installers on the <a href="https://nodejs.org/en/download/">Node.js download page</a></li>
</ul>
<p>Or see <a href="https://nodejs.org/en/download/package-manager/">this page</a> to install npm for Linux in the way many Linux developers prefer.</p></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/install.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>
@@ -0,0 +1,331 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>Folders</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----folders----11160">
<span>Folders</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">Folder structures used by npm</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><ul><li><a href="#tldr">tl;dr</a></li><li><a href="#prefix-configuration">prefix Configuration</a></li><li><a href="#node-modules">Node Modules</a></li><li><a href="#executables">Executables</a></li><li><a href="#man-pages">Man Pages</a></li><li><a href="#cache">Cache</a></li></ul><li><a href="#more-information">More Information</a></li><ul><li><a href="#global-installation">Global Installation</a></li><li><a href="#cycles-conflicts-and-folder-parsimony">Cycles, Conflicts, and Folder Parsimony</a></li><li><a href="#example">Example</a></li><li><a href="#publishing">Publishing</a></li></ul><li><a href="#see-also">See also</a></li></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p>npm puts various things on your computer.
That's its job.</p>
<p>This document will tell you what it puts where.</p>
<h4 id="tldr">tl;dr</h4>
<ul>
<li>Local install (default): puts stuff in <code>./node_modules</code> of the current package root.</li>
<li>Global install (with <code>-g</code>): puts stuff in /usr/local or wherever node is installed.</li>
<li>Install it <strong>locally</strong> if you're going to <code>require()</code> it.</li>
<li>Install it <strong>globally</strong> if you're going to run it on the command line.</li>
<li>If you need both, then install it in both places, or use <code>npm link</code>.</li>
</ul>
<h4 id="prefix-configuration">prefix Configuration</h4>
<p>The <a href="../using-npm/config#prefix.html"><code>prefix</code> config</a> defaults to the location where node is installed.
On most systems, this is <code>/usr/local</code>.
On Windows, it's <code>%AppData%\npm</code>.
On Unix systems, it's one level up, since node is typically installed at <code>{prefix}/bin/node</code> rather than <code>{prefix}/node.exe</code>.</p>
<p>When the <code>global</code> flag is set, npm installs things into this prefix.
When it is not set, it uses the root of the current package, or the current working directory if not in a package already.</p>
<h4 id="node-modules">Node Modules</h4>
<p>Packages are dropped into the <code>node_modules</code> folder under the <code>prefix</code>.
When installing locally, this means that you can <code>require("packagename")</code> to load its main module, or <code>require("packagename/lib/path/to/sub/module")</code> to load other modules.</p>
<p>Global installs on Unix systems go to <code>{prefix}/lib/node_modules</code>.
Global installs on Windows go to <code>{prefix}/node_modules</code> (that is, no <code>lib</code> folder.)</p>
<p>Scoped packages are installed the same way, except they are grouped together in a sub-folder of the relevant <code>node_modules</code> folder with the name of that scope prefix by the @ symbol, e.g. <code>npm install @myorg/package</code> would place the package in <code>{prefix}/node_modules/@myorg/package</code>.
See <a href="../using-npm/scope.html"><code>scope</code></a> for more details.</p>
<p>If you wish to <code>require()</code> a package, then install it locally.</p>
<h4 id="executables">Executables</h4>
<p>When in global mode, executables are linked into <code>{prefix}/bin</code> on Unix, or directly into <code>{prefix}</code> on Windows.
Ensure that path is in your terminal's <code>PATH</code> environment to run them.</p>
<p>When in local mode, executables are linked into <code>./node_modules/.bin</code> so that they can be made available to scripts run through npm.
(For example, so that a test runner will be in the path when you run <code>npm test</code>.)</p>
<h4 id="man-pages">Man Pages</h4>
<p>When in global mode, man pages are linked into <code>{prefix}/share/man</code>.</p>
<p>When in local mode, man pages are not installed.</p>
<p>Man pages are not installed on Windows systems.</p>
<h4 id="cache">Cache</h4>
<p>See <a href="../commands/npm-cache.html"><code>npm cache</code></a>.
Cache files are stored in <code>~/.npm</code> on Posix, or <code>%LocalAppData%/npm-cache</code> on Windows.</p>
<p>This is controlled by the <a href="../using-npm/config#cache.html"><code>cache</code> config</a> param.</p>
<h3 id="more-information">More Information</h3>
<p>When installing locally, npm first tries to find an appropriate <code>prefix</code> folder.
This is so that <code>npm install foo@1.2.3</code> will install to the sensible root of your package, even if you happen to have <code>cd</code>ed into some other folder.</p>
<p>Starting at the $PWD, npm will walk up the folder tree checking for a folder that contains either a <code>package.json</code> file, or a <code>node_modules</code> folder.
If such a thing is found, then that is treated as the effective "current directory" for the purpose of running npm commands.
(This behavior is inspired by and similar to git's .git-folder seeking logic when running git commands in a working dir.)</p>
<p>If no package root is found, then the current folder is used.</p>
<p>When you run <code>npm install foo@1.2.3</code>, then the package is loaded into the cache, and then unpacked into <code>./node_modules/foo</code>.
Then, any of foo's dependencies are similarly unpacked into <code>./node_modules/foo/node_modules/...</code>.</p>
<p>Any bin files are symlinked to <code>./node_modules/.bin/</code>, so that they may be found by npm scripts when necessary.</p>
<h4 id="global-installation">Global Installation</h4>
<p>If the <a href="../using-npm/config#global.html"><code>global</code> config</a> is set to true, then npm will install packages "globally".</p>
<p>For global installation, packages are installed roughly the same way, but using the folders described above.</p>
<h4 id="cycles-conflicts-and-folder-parsimony">Cycles, Conflicts, and Folder Parsimony</h4>
<p>Cycles are handled using the property of node's module system that it walks up the directories looking for <code>node_modules</code> folders.
So, at every stage, if a package is already installed in an ancestor <code>node_modules</code> folder, then it is not installed at the current location.</p>
<p>Consider the case above, where <code>foo -&gt; bar -&gt; baz</code>.
Imagine if, in addition to that, baz depended on bar, so you'd have:
<code>foo -&gt; bar -&gt; baz -&gt; bar -&gt; baz ...</code>.
However, since the folder structure is: <code>foo/node_modules/bar/node_modules/baz</code>, there's no need to put another copy of bar into <code>.../baz/node_modules</code>, since when baz calls <code>require("bar")</code>, it will get the copy that is installed in <code>foo/node_modules/bar</code>.</p>
<p>This shortcut is only used if the exact same version would be installed in multiple nested <code>node_modules</code> folders.
It is still possible to have <code>a/node_modules/b/node_modules/a</code> if the two "a" packages are different versions.
However, without repeating the exact same package multiple times, an infinite regress will always be prevented.</p>
<p>Another optimization can be made by installing dependencies at the highest level possible, below the localized "target" folder (hoisting).
Since version 3, npm hoists dependencies by default.</p>
<h4 id="example">Example</h4>
<p>Consider this dependency graph:</p>
<pre><code class="language-bash">foo
+-- blerg@1.2.5
+-- bar@1.2.3
| +-- blerg@1.x (latest=1.3.7)
| +-- baz@2.x
| | `-- quux@3.x
| | `-- bar@1.2.3 (cycle)
| `-- asdf@*
`-- baz@1.2.3
`-- quux@3.x
`-- bar
</code></pre>
<p>In this case, we might expect a folder structure like this (with all dependencies hoisted to the highest level possible):</p>
<pre><code class="language-bash">foo
+-- node_modules
+-- blerg (1.2.5) &lt;---[A]
+-- bar (1.2.3) &lt;---[B]
| +-- node_modules
| +-- baz (2.0.2) &lt;---[C]
+-- asdf (2.3.4)
+-- baz (1.2.3) &lt;---[D]
+-- quux (3.2.0) &lt;---[E]
</code></pre>
<p>Since foo depends directly on <code>bar@1.2.3</code> and <code>baz@1.2.3</code>, those are installed in foo's <code>node_modules</code> folder.</p>
<p>Even though the latest copy of blerg is 1.3.7, foo has a specific dependency on version 1.2.5.
So, that gets installed at [A].
Since the parent installation of blerg satisfies bar's dependency on <code>blerg@1.x</code>, it does not install another copy under [B].</p>
<p>Bar [B] also has dependencies on baz and asdf.
Because it depends on <code>baz@2.x</code>, it cannot re-use the <code>baz@1.2.3</code> installed in the parent <code>node_modules</code> folder [D], and must install its own copy [C].
In order to minimize duplication, npm hoists dependencies to the top level by default, so asdf is installed under [A].</p>
<p>Underneath bar, the <code>baz -&gt; quux -&gt; bar</code> dependency creates a cycle.
However, because bar is already in quux's ancestry [B], it does not unpack another copy of bar into that folder.
Likewise, quux's [E] folder tree is empty, because its dependency on bar is satisfied by the parent folder copy installed at [B].</p>
<p>For a graphical breakdown of what is installed where, use <code>npm ls</code>.</p>
<h4 id="publishing">Publishing</h4>
<p>Upon publishing, npm will look in the <code>node_modules</code> folder.
If any of the items there are not in the <code>bundleDependencies</code> array, then they will not be included in the package tarball.</p>
<p>This allows a package maintainer to install all of their dependencies (and dev dependencies) locally, but only re-publish those items that cannot be found elsewhere.
See <a href="../configuring-npm/package-json.html"><code>package.json</code></a> for more information.</p>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="../configuring-npm/package-json.html">package.json</a></li>
<li><a href="../commands/npm-install.html">npm install</a></li>
<li><a href="../commands/npm-pack.html">npm pack</a></li>
<li><a href="../commands/npm-cache.html">npm cache</a></li>
<li><a href="../commands/npm-config.html">npm config</a></li>
<li><a href="../configuring-npm/npmrc.html">npmrc</a></li>
<li><a href="../using-npm/config.html">config</a></li>
<li><a href="../commands/npm-publish.html">npm publish</a></li>
</ul></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/folders.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,229 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>npm-shrinkwrap.json</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----npm-shrinkwrapjson----11160">
<span>npm-shrinkwrap.json</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">A publishable lockfile</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#see-also">See also</a></li></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p><code>npm-shrinkwrap.json</code> is a file created by <a href="../commands/npm-shrinkwrap.html"><code>npm shrinkwrap</code></a>.
It is identical to <code>package-lock.json</code>, with one major caveat: Unlike <code>package-lock.json</code>,
<code>npm-shrinkwrap.json</code> may be included when publishing a package.</p>
<p>The recommended use-case for <code>npm-shrinkwrap.json</code> is applications deployed through the publishing process on the registry: for example, daemons and command-line tools intended as global installs or <code>devDependencies</code>.
It's strongly discouraged for library authors to publish this file, since that would prevent end users from having control over transitive dependency updates.</p>
<p>If both <code>package-lock.json</code> and <code>npm-shrinkwrap.json</code> are present in a package root, <code>npm-shrinkwrap.json</code> will be preferred over the <code>package-lock.json</code> file.</p>
<p>For full details and description of the <code>npm-shrinkwrap.json</code> file format, refer to the manual page for <a href="../configuring-npm/package-lock-json.html">package-lock.json</a>.</p>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="../commands/npm-shrinkwrap.html">npm shrinkwrap</a></li>
<li><a href="../configuring-npm/package-lock-json.html">package-lock.json</a></li>
<li><a href="../configuring-npm/package-json.html">package.json</a></li>
<li><a href="../commands/npm-install.html">npm install</a></li>
</ul></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/npm-shrinkwrap-json.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>
@@ -0,0 +1,347 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>.npmrc</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----npmrc----11160">
<span>.npmrc</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">The npm config files</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#files">Files</a></li><ul><li><a href="#comments">Comments</a></li><li><a href="#per-project-config-file">Per-project config file</a></li><li><a href="#per-user-config-file">Per-user config file</a></li><li><a href="#global-config-file">Global config file</a></li><li><a href="#built-in-config-file">Built-in config file</a></li></ul><li><a href="#auth-related-configuration">Auth related configuration</a></li><li><a href="#unsupported-custom-configuration-keys">Unsupported Custom Configuration Keys</a></li><li><a href="#custom--third-party-config-keys">Custom / third-party config keys</a></li><li><a href="#see-also">See also</a></li></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p>npm gets its config settings from the command line, environment variables, and <code>npmrc</code> files.</p>
<p>The <code>npm config</code> command can be used to update and edit the contents of the user and global npmrc files.</p>
<p>For a list of available configuration options, see <a href="../using-npm/config.html">config</a>.</p>
<h3 id="files">Files</h3>
<p>The four relevant files are:</p>
<ul>
<li>per-project config file (<code>/path/to/my/project/.npmrc</code>)</li>
<li>per-user config file (<code>~/.npmrc</code>)</li>
<li>global config file (<code>$PREFIX/etc/npmrc</code>)</li>
<li>npm builtin config file (<code>/path/to/npm/npmrc</code>)</li>
</ul>
<p>All npm config files are an ini-formatted list of <code>key = value</code> parameters.
Environment variables can be replaced using <code>${VARIABLE_NAME}</code>.
By default if the variable is not defined, it is left unreplaced.
By adding <code>?</code> after variable name they can be forced to evaluate to an empty string instead.
For example:</p>
<pre><code class="language-bash">cache = ${HOME}/.npm-packages
node-options = "${NODE_OPTIONS?} --use-system-ca"
</code></pre>
<p>Each of these files is loaded, and config options are resolved in priority order.
For example, a setting in the userconfig file would override the setting in the globalconfig file.</p>
<p>Array values are specified by adding "[]" after the key name.
For example:</p>
<pre><code class="language-bash">key[] = "first value"
key[] = "second value"
</code></pre>
<h4 id="comments">Comments</h4>
<p>Lines in <code>.npmrc</code> files are interpreted as comments when they begin with a
<code>;</code> or <code>#</code> character.
<code>.npmrc</code> files are parsed by
<a href="https://github.com/npm/ini">npm/ini</a>, which specifies this comment syntax.</p>
<p>For example:</p>
<pre><code class="language-bash"># last modified: 01 Jan 2016
; Set a new registry for a scoped package
@myscope:registry=https://mycustomregistry.example.org
</code></pre>
<h4 id="per-project-config-file">Per-project config file</h4>
<p>When working locally in a project, a <code>.npmrc</code> file in the root of the project (ie, a sibling of <code>node_modules</code> and <code>package.json</code>) will set config values specific to this project.</p>
<p>Note that this only applies to the root of the project that you're running npm in.
It has no effect when your module is published.
For example, you can't publish a module that forces itself to install globally, or in a different location.</p>
<p>Additionally, this file is not read in global mode, such as when running <code>npm install -g</code>.</p>
<h4 id="per-user-config-file">Per-user config file</h4>
<p><code>$HOME/.npmrc</code> (or the <code>userconfig</code> param, if set in the environment or on the command line)</p>
<h4 id="global-config-file">Global config file</h4>
<p><code>$PREFIX/etc/npmrc</code> (or the <code>globalconfig</code> param, if set above): This file is an ini-file formatted list of <code>key = value</code> parameters.
Environment variables can be replaced as above.</p>
<h4 id="built-in-config-file">Built-in config file</h4>
<p><code>path/to/npm/itself/npmrc</code></p>
<p>This is an unchangeable "builtin" configuration file that npm keeps consistent across updates.
Set fields in here using the <code>./configure</code> script that comes with npm.
This is primarily for distribution maintainers to override default configs in a standard and consistent manner.</p>
<h3 id="auth-related-configuration">Auth related configuration</h3>
<p>The settings <code>_auth</code>, <code>_authToken</code>, <code>username</code>, <code>_password</code>, <code>certfile</code>, and <code>keyfile</code> must all be scoped to a specific registry.
This ensures that <code>npm</code> will never send credentials to the wrong host.</p>
<p>The full list is:</p>
<ul>
<li><code>_auth</code> (base64 authentication string)</li>
<li><code>_authToken</code> (authentication token)</li>
<li><code>username</code></li>
<li><code>_password</code></li>
<li><code>email</code></li>
<li><code>cafile</code> (path to certificate authority file)</li>
<li><code>certfile</code> (path to certificate file)</li>
<li><code>keyfile</code> (path to key file)</li>
</ul>
<p>In order to scope these values, they must be prefixed by a URI fragment.
If the credential is meant for any request to a registry on a single host, the scope may look like <code>//registry.npmjs.org/:</code>.
If it must be scoped to a specific path on the host that path may also be provided, such as
<code>//my-custom-registry.org/unique/path:</code>.</p>
<h3 id="unsupported-custom-configuration-keys">Unsupported Custom Configuration Keys</h3>
<p>Starting in npm v11.2.0, npm warns when unknown configuration keys are defined in <code>.npmrc</code>. In a future major version of npm, these unknown keys may no longer be accepted.</p>
<p>Only configuration keys that npm officially supports are recognized. Custom keys intended for third-party tools (for example, <code>electron-builder</code>) should not be placed in <code>.npmrc</code>.</p>
<p>If you need package-level configuration for use in scripts, use the <code>config</code> field in your <code>package.json</code> instead:</p>
<pre><code class="language-json">{
"name": "my-package",
"config": {
"mirror": "https://example.com/"
}
}
</code></pre>
<p>Values defined in <code>package.json#config</code> are exposed to scripts as environment variables prefixed with <code>npm_package_config_</code>. For example:</p>
<pre><code>npm_package_config_mirror
</code></pre>
<p>If you need to pass arguments to a script command, use <code>--</code> to separate npm arguments from script arguments:</p>
<pre><code>npm run build -- --customFlag
</code></pre>
<p>Using environment variables is also recommended for cross-platform configuration instead of defining unsupported keys in <code>.npmrc</code>.</p>
<pre><code>; bad config
_authToken=MYTOKEN
; good config
@myorg:registry=https://somewhere-else.com/myorg
@another:registry=https://somewhere-else.com/another
//registry.npmjs.org/:_authToken=MYTOKEN
; would apply to both @myorg and @another
//somewhere-else.com/:_authToken=MYTOKEN
; would apply only to @myorg
//somewhere-else.com/myorg/:_authToken=MYTOKEN1
; would apply only to @another
//somewhere-else.com/another/:_authToken=MYTOKEN2
</code></pre>
<h3 id="custom--third-party-config-keys">Custom / third-party config keys</h3>
<p>npm only recognizes its own <a href="../using-npm/config.html">configuration options</a>.
If your <code>.npmrc</code> contains keys that are not part of npm's config definitions
(for example, <code>electron_mirror</code> or <code>sass_binary_site</code>), npm will emit a
warning:</p>
<pre><code>warn Unknown user config "electron_mirror".
This will stop working in the next major version of npm.
</code></pre>
<p>These keys were historically tolerated but are not officially supported.
A future major version of npm will treat unknown top-level keys as errors.</p>
<p>Some tools (such as <code>@electron/get</code> or <code>node-sass</code>) read their own
configuration from environment variables or from <code>.npmrc</code> by convention.
You can set these values as environment variables instead:</p>
<pre><code class="language-bash">export ELECTRON_MIRROR="https://mirrorexample.npmjs.org/mirrors/electron/"
export ELECTRON_CUSTOM_DIR="{{ version }}"
</code></pre>
<p>Environment variables are the most portable approach and work regardless
of <code>.npmrc</code> format.</p>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="../configuring-npm/folders.html">npm folders</a></li>
<li><a href="../commands/npm-config.html">npm config</a></li>
<li><a href="../using-npm/config.html">config</a></li>
<li><a href="../configuring-npm/package-json.html">package.json</a></li>
<li><a href="../commands/npm.html">npm</a></li>
</ul></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/npmrc.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,391 @@
<!DOCTYPE html><html><head>
<meta charset="utf-8">
<title>package-lock.json</title>
<style>
body {
background-color: #ffffff;
color: #24292e;
margin: 0;
line-height: 1.5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
}
#rainbar {
height: 10px;
background-image: linear-gradient(139deg, #fb8817, #ff4b01, #c12127, #e02aff);
}
a {
text-decoration: none;
color: #0366d6;
}
a:hover {
text-decoration: underline;
}
pre {
margin: 1em 0px;
padding: 1em;
border: solid 1px #e1e4e8;
border-radius: 6px;
display: block;
overflow: auto;
white-space: pre;
background-color: #f6f8fa;
color: #393a34;
}
code {
font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 85%;
padding: 0.2em 0.4em;
background-color: #f6f8fa;
color: #393a34;
}
pre > code {
padding: 0;
background-color: inherit;
color: inherit;
}
h1, h2, h3 {
font-weight: 600;
}
#logobar {
background-color: #333333;
margin: 0 auto;
padding: 1em 4em;
}
#logobar .logo {
float: left;
}
#logobar .title {
font-weight: 600;
color: #dddddd;
float: left;
margin: 5px 0 0 1em;
}
#logobar:after {
content: "";
display: block;
clear: both;
}
#content {
margin: 0 auto;
padding: 0 4em;
}
#table_of_contents > h2 {
font-size: 1.17em;
}
#table_of_contents ul:first-child {
border: solid 1px #e1e4e8;
border-radius: 6px;
padding: 1em;
background-color: #f6f8fa;
color: #393a34;
}
#table_of_contents ul {
list-style-type: none;
padding-left: 1.5em;
}
#table_of_contents li {
font-size: 0.9em;
}
#table_of_contents li a {
color: #000000;
}
header.title {
border-bottom: solid 1px #e1e4e8;
}
header.title > h1 {
margin-bottom: 0.25em;
}
header.title > .description {
display: block;
margin-bottom: 0.5em;
line-height: 1;
}
header.title .version {
font-size: 0.8em;
color: #666666;
}
footer#edit {
border-top: solid 1px #e1e4e8;
margin: 3em 0 4em 0;
padding-top: 2em;
}
table {
width: 100%;
margin: 1em 0;
border-radius: 6px;
border: 1px solid #e1e4e8;
overflow: hidden;
border-collapse: separate;
border-spacing: 0;
}
table thead {
background-color: #f6f8fa;
}
table tbody {
background-color: #ffffff;
}
table th,
table td {
padding: 0.75em;
text-align: left;
border-right: 1px solid #e1e4e8;
border-bottom: 1px solid #e1e4e8;
}
table th:last-child,
table td:last-child {
border-right: none;
}
table tbody tr:last-child td {
border-bottom: none;
}
table th {
font-weight: 600;
background-color: #f6f8fa;
}
table code {
white-space: nowrap;
}
</style>
</head>
<body>
<div id="banner">
<div id="rainbar"></div>
<div id="logobar">
<svg class="logo" role="img" height="32" width="32" viewBox="0 0 700 700">
<polygon fill="#cb0000" points="0,700 700,700 700,0 0,0"></polygon>
<polygon fill="#ffffff" points="150,550 350,550 350,250 450,250 450,550 550,550 550,150 150,150"></polygon>
</svg>
<div class="title">
npm command-line interface
</div>
</div>
</div>
<section id="content">
<header class="title">
<h1 id="----package-lockjson----11160">
<span>package-lock.json</span>
<span class="version">@11.16.0</span>
</h1>
<span class="description">A manifestation of the manifest</span>
</header>
<section id="table_of_contents">
<h2 id="table-of-contents">Table of contents</h2>
<div id="_table_of_contents"><ul><li><a href="#description">Description</a></li><li><a href="#package-lockjson-vs-npm-shrinkwrapjson"><code>package-lock.json</code> vs <code>npm-shrinkwrap.json</code></a></li><li><a href="#hidden-lockfiles">Hidden Lockfiles</a></li><li><a href="#handling-old-lockfiles">Handling Old Lockfiles</a></li><li><a href="#file-format">File Format</a></li><ul><li><a href="#name"><code>name</code></a></li><li><a href="#version"><code>version</code></a></li><li><a href="#lockfileversion"><code>lockfileVersion</code></a></li><li><a href="#packages"><code>packages</code></a></li><li><a href="#dependencies">dependencies</a></li></ul><li><a href="#see-also">See also</a></li></ul></div>
</section>
<div id="_content"><h3 id="description">Description</h3>
<p><code>package-lock.json</code> is automatically generated for any operations where npm modifies either the <code>node_modules</code> tree, or <code>package.json</code>.
It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.</p>
<p>This file is intended to be committed into source repositories, and serves various purposes:</p>
<ul>
<li>
<p>Describe a single representation of a dependency tree such that teammates, deployments, and continuous integration are guaranteed to install exactly the same dependencies.</p>
</li>
<li>
<p>Provide a facility for users to "time-travel" to previous states of <code>node_modules</code> without having to commit the directory itself.</p>
</li>
<li>
<p>Facilitate greater visibility of tree changes through readable source control diffs.</p>
</li>
<li>
<p>Optimize the installation process by allowing npm to skip repeated metadata resolutions for previously-installed packages.</p>
</li>
<li>
<p>As of npm v7, lockfiles include enough information to gain a complete picture of the package tree, reducing the need to read <code>package.json</code> files, and allowing for significant performance improvements.</p>
</li>
</ul>
<p>When <code>npm</code> creates or updates <code>package-lock.json</code>, it will infer line endings and indentation from <code>package.json</code> so that the formatting of both files matches.</p>
<h3 id="package-lockjson-vs-npm-shrinkwrapjson"><code>package-lock.json</code> vs <code>npm-shrinkwrap.json</code></h3>
<p>Both of these files have the same format, and perform similar functions in the root of a project.</p>
<p>The difference is that <code>package-lock.json</code> cannot be published, and it will be ignored if found in any place other than the root project.</p>
<p>In contrast, <a href="../configuring-npm/npm-shrinkwrap-json.html">npm-shrinkwrap.json</a> allows publication, and defines the dependency tree from the point encountered.
This is not recommended unless deploying a CLI tool or otherwise using the publication process for producing production packages.</p>
<p>If both <code>package-lock.json</code> and <code>npm-shrinkwrap.json</code> are present in the root of a project, <code>npm-shrinkwrap.json</code> will take precedence and <code>package-lock.json</code> will be ignored.</p>
<h3 id="hidden-lockfiles">Hidden Lockfiles</h3>
<p>In order to avoid processing the <code>node_modules</code> folder repeatedly, npm as of v7 uses a "hidden" lockfile present in <code>node_modules/.package-lock.json</code>.
This contains information about the tree, and is used in lieu of reading the entire <code>node_modules</code> hierarchy provided that the following conditions are met:</p>
<ul>
<li>All package folders it references exist in the <code>node_modules</code> hierarchy.</li>
<li>No package folders exist in the <code>node_modules</code> hierarchy that are not listed in the lockfile.</li>
<li>The modified time of the file is at least as recent as all of the package folders it references.</li>
</ul>
<p>That is, the hidden lockfile will only be relevant if it was created as part of the most recent update to the package tree.
If another CLI mutates the tree in any way, this will be detected, and the hidden lockfile will be ignored.</p>
<p>Note that it <em>is</em> possible to manually change the <em>contents</em> of a package in such a way that the modified time of the package folder is unaffected.
For example, if you add a file to <code>node_modules/foo/lib/bar.js</code>, then the modified time on <code>node_modules/foo</code> will not reflect this change.
If you are manually editing files in <code>node_modules</code>, it is generally best to delete the file at <code>node_modules/.package-lock.json</code>.</p>
<p>As the hidden lockfile is ignored by older npm versions, it does not contain the backwards compatibility affordances present in "normal" lockfiles.
That is, it is <code>lockfileVersion: 3</code>, rather than <code>lockfileVersion: 2</code>.</p>
<h3 id="handling-old-lockfiles">Handling Old Lockfiles</h3>
<p>When npm detects a lockfile from npm v6 or before during the package installation process, it is automatically updated to fetch missing information from either the <code>node_modules</code> tree or (in the case of empty <code>node_modules</code> trees or very old lockfile formats) the npm registry.</p>
<h3 id="file-format">File Format</h3>
<h4 id="name"><code>name</code></h4>
<p>The name of the package this is a package-lock for.
This will match what's in <code>package.json</code>.</p>
<h4 id="version"><code>version</code></h4>
<p>The version of the package this is a package-lock for.
This will match what's in <code>package.json</code>.</p>
<h4 id="lockfileversion"><code>lockfileVersion</code></h4>
<p>An integer version, starting at <code>1</code> with the version number of this document whose semantics were used when generating this <code>package-lock.json</code>.</p>
<p>Note that the file format changed significantly in npm v7 to track information that would have otherwise required looking in <code>node_modules</code> or the npm registry.
Lockfiles generated by npm v7 will contain <code>lockfileVersion: 2</code>.</p>
<ul>
<li>No version provided: an "ancient" shrinkwrap file from a version of npm prior to npm v5.</li>
<li><code>1</code>: The lockfile version used by npm v5 and v6.</li>
<li><code>2</code>: The lockfile version used by npm v7 and v8. Backwards compatible to v1 lockfiles.</li>
<li><code>3</code>: The lockfile version used by npm v9 and above.
Backwards compatible to npm v7.</li>
</ul>
<p>npm will always attempt to get whatever data it can out of a lockfile, even if it is not a version that it was designed to support.</p>
<h4 id="packages"><code>packages</code></h4>
<p>This is an object that maps package locations to an object containing the information about that package.</p>
<p>The root project is typically listed with a key of <code>""</code>, and all other packages are listed with their relative paths from the root project folder.</p>
<p>Package descriptors have the following fields:</p>
<ul>
<li>
<p>version: The version found in <code>package.json</code></p>
</li>
<li>
<p>resolved: The place where the package was actually resolved from.
In the case of packages fetched from the registry, this will be a url to a tarball.
In the case of git dependencies, this will be the full git url with commit sha.
In the case of link dependencies, this will be the location of the link target.
<code>registry.npmjs.org</code> is a magic value meaning "the currently configured registry".</p>
</li>
<li>
<p>integrity: A <code>sha512</code> or <code>sha1</code> <a href="https://w3c.github.io/webappsec/specs/subresourceintegrity/">Standard Subresource Integrity</a> string for the artifact that was unpacked in this location.</p>
</li>
<li>
<p>link: A flag to indicate that this is a symbolic link.
If this is present, no other fields are specified, since the link target will also be included in the lockfile.</p>
</li>
<li>
<p>dev, optional, devOptional: If the package is strictly part of the
<code>devDependencies</code> tree, then <code>dev</code> will be true.
If it is strictly part of the <code>optionalDependencies</code> tree, then <code>optional</code> will be set.
If it is both a <code>dev</code> dependency <em>and</em> an <code>optional</code> dependency of a non-dev dependency, then <code>devOptional</code> will be set.
(An <code>optional</code> dependency of a <code>dev</code> dependency will have both <code>dev</code> and <code>optional</code> set.)</p>
</li>
<li>
<p>inBundle: A flag to indicate that the package is a bundled dependency.</p>
</li>
<li>
<p>hasInstallScript: A flag to indicate that the package has a <code>preinstall</code>, <code>install</code>, or <code>postinstall</code> script.</p>
</li>
<li>
<p>hasShrinkwrap: A flag to indicate that the package has an <code>npm-shrinkwrap.json</code> file.</p>
</li>
<li>
<p>bin, license, engines, dependencies, optionalDependencies: fields from <code>package.json</code></p>
</li>
<li>
<p>os: An array of operating systems this package is compatible with, as specified in <code>package.json</code>. This field is included when the package specifies OS restrictions.</p>
</li>
<li>
<p>cpu: An array of CPU architectures this package is compatible with, as specified in <code>package.json</code>. This field is included when the package specifies CPU restrictions.</p>
</li>
<li>
<p>funding: Funding information for the package, as specified in <code>package.json</code>. This field contains details about how to support the package maintainers.</p>
</li>
</ul>
<h4 id="dependencies">dependencies</h4>
<p>Legacy data for supporting versions of npm that use <code>lockfileVersion: 1</code>.
This is a mapping of package names to dependency objects.
Because the object structure is strictly hierarchical, symbolic link dependencies are somewhat challenging to represent in some cases.</p>
<p>npm v7 ignores this section entirely if a <code>packages</code> section is present, but does keep it up to date in order to support switching between npm v6 and npm v7.</p>
<p>Dependency objects have the following fields:</p>
<ul>
<li>
<p>version: a specifier that varies depending on the nature of the package, and is usable in fetching a new copy of it.
Note that for peer dependencies that are not installed, or optional dependencies that are not installed, this field may be omitted.</p>
<ul>
<li>bundled dependencies: Regardless of source, this is a version number that is purely for informational purposes.</li>
<li>registry sources: This is a version number.
(eg, <code>1.2.3</code>)</li>
<li>git sources: This is a git specifier with resolved committish.
(eg, <code>git+https://example.com/foo/bar#115311855adb0789a0466714ed48a1499ffea97e</code>)</li>
<li>http tarball sources: This is the URL of the tarball.
(eg, <code>https://example.com/example-1.3.0.tgz</code>)</li>
<li>local tarball sources: This is the file URL of the tarball.
(eg <code>file:///opt/storage/example-1.3.0.tgz</code>)</li>
<li>local link sources: This is the file URL of the link.
(eg <code>file:libs/our-module</code>)</li>
</ul>
<p><strong>Note:</strong> The <code>version</code> field may be omitted for certain types of dependencies, such as optional peer dependencies that are not installed. In these cases, only metadata fields like <code>dev</code>, <code>optional</code>, and <code>peer</code> will be present.</p>
</li>
<li>
<p>integrity: A <code>sha512</code> or <code>sha1</code> <a href="https://w3c.github.io/webappsec/specs/subresourceintegrity/">Standard Subresource Integrity</a> string for the artifact that was unpacked in this location.
For git dependencies, this is the commit sha.</p>
</li>
<li>
<p>resolved: For registry sources this is path of the tarball relative to the registry URL.
If the tarball URL isn't on the same server as the registry URL then this is a complete URL.
<code>registry.npmjs.org</code> is a magic value meaning "the currently configured registry".</p>
</li>
<li>
<p>bundled: If true, this is the bundled dependency and will be installed by the parent module.
When installing, this module will be extracted from the parent module during the extract phase, not installed as a separate dependency.</p>
</li>
<li>
<p>dev: If true then this dependency is either a development dependency ONLY of the top level module or a transitive dependency of one.
This is false for dependencies that are both a development dependency of the top level and a transitive dependency of a non-development dependency of the top level.</p>
</li>
<li>
<p>optional: If true then this dependency is either an optional dependency ONLY of the top level module or a transitive dependency of one.
This is false for dependencies that are both an optional dependency of the top level and a transitive dependency of a non-optional dependency of the top level.</p>
</li>
<li>
<p>requires: This is a mapping of module name to version.
This is a list of everything this module requires, regardless of where it will be installed.
The version should match via normal matching rules a dependency either in our <code>dependencies</code> or in a level higher than us.</p>
</li>
<li>
<p>dependencies: The dependencies of this dependency, exactly as at the top level.</p>
</li>
</ul>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="../commands/npm-shrinkwrap.html">npm shrinkwrap</a></li>
<li><a href="../configuring-npm/npm-shrinkwrap-json.html">npm-shrinkwrap.json</a></li>
<li><a href="../configuring-npm/package-json.html">package.json</a></li>
<li><a href="../commands/npm-install.html">npm install</a></li>
</ul></div>
<footer id="edit">
<a href="https://github.com/npm/cli/edit/latest/docs/lib/content/configuring-npm/package-lock-json.md">
<svg role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentcolor" style="vertical-align: text-bottom; margin-right: 0.3em;">
<path fill-rule="evenodd" d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z"></path>
</svg>
Edit this page on GitHub
</a>
</footer>
</section>
</body></html>