Cycles are handled using the property of node's module system that it walks up the directories looking for node_modules
folders. So, at every stage, if a package is already installed in an ancestor node_modules
folder, then it is not installed at the current location.
Consider the case above, where foo -> bar -> baz
. Imagine if, in addition to that, baz depended on bar, so you'd have: foo -> bar -> baz -> bar -> baz ...
. However, since the folder structure is: foo/node_modules/bar/node_modules/baz
, there's no need to put another copy of bar into .../baz/node_modules
, since when it calls require("bar"), it will get the copy that is installed in foo/node_modules/bar
.
This shortcut is only used if the exact same version would be installed in multiple nested node_modules
folders. It is still possible to have a/node_modules/b/node_modules/a
if the two "a" packages are different versions. However, without repeating the exact same package multiple times, an infinite regress will always be pr