From 80f49daf0297ee15470e5b390e36c0c86319cfd3 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 8 Feb 2019 16:33:29 -0800 Subject: [PATCH 1/8] Support symlinks Some systems (e.g. rush, pnpm) use symlinks to create a recursive dependency graph instead of relying on the hoisting aspect of the node module resolution algorithm (like npm and yarn do) in these cases, we want to resolve to the real path of a module, so that the tree structure below only ever tries to run the `x` module once (rather than once on each module that depends on it) - node_modules - a - node_modules - symlink to x - b - node_modules - symlink to x --- index.js | 16 +++++++++++++++- test/fixtures/linked/index.js | 1 + test/fixtures/node_modules/linker/index.js | 1 + test/modules.js | 22 ++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/linked/index.js create mode 100644 test/fixtures/node_modules/linker/index.js diff --git a/index.js b/index.js index 8a1908a..875af11 100644 --- a/index.js +++ b/index.js @@ -206,7 +206,7 @@ function build_resolve_opts(opts, base) { return opts; } -function resolve(id, opts, cb) { +function resolve(id, opts, callback) { // opts.filename // opts.paths @@ -216,6 +216,20 @@ function resolve(id, opts, cb) { opts = opts || {}; opts.filename = opts.filename || ''; + var cb = function(err, path, pkg) { + fs.stat(path, function(notPath) { + if (notPath) callback(err, path, pkg); + else { + fs.realpath(path, function(notReal, real) { + if (notReal) callback(err, path, pkg); + else { + callback(err, real, pkg); + } + }); + } + }); + } + var base = path.dirname(opts.filename); if (opts.basedir) { diff --git a/test/fixtures/linked/index.js b/test/fixtures/linked/index.js new file mode 100644 index 0000000..4563851 --- /dev/null +++ b/test/fixtures/linked/index.js @@ -0,0 +1 @@ +// dummy \ No newline at end of file diff --git a/test/fixtures/node_modules/linker/index.js b/test/fixtures/node_modules/linker/index.js new file mode 100644 index 0000000..8f95cb5 --- /dev/null +++ b/test/fixtures/node_modules/linker/index.js @@ -0,0 +1 @@ +require('linked'); \ No newline at end of file diff --git a/test/modules.js b/test/modules.js index cb2bf7a..488b6e3 100644 --- a/test/modules.js +++ b/test/modules.js @@ -319,3 +319,25 @@ test('not fail on accessing path name defined in Object.prototype', function (do done(); }); }); + +test('respect symlinks', function (done) { + // some systems (e.g. rush, pnpm) use symlinks to create a recursive dependency graph + // instead of relying on the hoisting aspect of the node module resolution algorithm (like npm and yarn do) + // in these cases, we want to resolve to the real path of a module, so that the tree structure below + // only ever tries to run the `x` module once (rather than once on each module that depends on it) + // + // - node_modules + // - a + // - node_modules + // - symlink to x + // - b + // - node_modules + // - symlink to x + // + resolve('linked', { paths: [ fixtures_dir + '/linker/node_modules' ], package: { main: 'fixtures' } }, function(err, path, pkg) { + assert.ifError(err); + assert.equal(path, require.resolve('./fixtures/linked/index')); + assert.strictEqual(pkg, undefined); + done(); + }); +}); \ No newline at end of file From 3969cb4876355678af0aa8343542ce00115022d5 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 8 Feb 2019 16:33:29 -0800 Subject: [PATCH 2/8] Support symlinks Some systems (e.g. rush, pnpm) use symlinks to create a recursive dependency graph instead of relying on the hoisting aspect of the node module resolution algorithm (like npm and yarn do) in these cases, we want to resolve to the real path of a module, so that the tree structure below only ever tries to run the `x` module once (rather than once on each module that depends on it) - node_modules - a - node_modules - symlink to x - b - node_modules - symlink to x --- index.js | 16 ++- package.json | 3 +- scripts/setup-symlinks.js | 5 + test/fixtures/linked/index.js | 1 + test/fixtures/node_modules/linker/index.js | 1 + test/modules.js | 22 +++++ yarn.lock | 108 +++++++++++++++++++++ 7 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 scripts/setup-symlinks.js create mode 100644 test/fixtures/linked/index.js create mode 100644 test/fixtures/node_modules/linker/index.js create mode 100644 yarn.lock diff --git a/index.js b/index.js index 8a1908a..875af11 100644 --- a/index.js +++ b/index.js @@ -206,7 +206,7 @@ function build_resolve_opts(opts, base) { return opts; } -function resolve(id, opts, cb) { +function resolve(id, opts, callback) { // opts.filename // opts.paths @@ -216,6 +216,20 @@ function resolve(id, opts, cb) { opts = opts || {}; opts.filename = opts.filename || ''; + var cb = function(err, path, pkg) { + fs.stat(path, function(notPath) { + if (notPath) callback(err, path, pkg); + else { + fs.realpath(path, function(notReal, real) { + if (notReal) callback(err, path, pkg); + else { + callback(err, real, pkg); + } + }); + } + }); + } + var base = path.dirname(opts.filename); if (opts.basedir) { diff --git a/package.json b/package.json index ccd529c..fc12a16 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "empty.js" ], "scripts": { - "test": "mocha --reporter list test/*.js" + "test": "mocha --reporter list test/*.js", + "postinstall": "node scripts/setup-symlinks.js" }, "repository": { "type": "git", diff --git a/scripts/setup-symlinks.js b/scripts/setup-symlinks.js new file mode 100644 index 0000000..d326bbd --- /dev/null +++ b/scripts/setup-symlinks.js @@ -0,0 +1,5 @@ +var fs = require('fs'); + +process.chdir(__dirname + '/../test/fixtures/node_modules/linker/node_modules'); +fs.unlinkSync('linked'); +fs.symlinkSync('../../../linked', 'linked', 'dir'); \ No newline at end of file diff --git a/test/fixtures/linked/index.js b/test/fixtures/linked/index.js new file mode 100644 index 0000000..4563851 --- /dev/null +++ b/test/fixtures/linked/index.js @@ -0,0 +1 @@ +// dummy \ No newline at end of file diff --git a/test/fixtures/node_modules/linker/index.js b/test/fixtures/node_modules/linker/index.js new file mode 100644 index 0000000..8f95cb5 --- /dev/null +++ b/test/fixtures/node_modules/linker/index.js @@ -0,0 +1 @@ +require('linked'); \ No newline at end of file diff --git a/test/modules.js b/test/modules.js index cb2bf7a..488b6e3 100644 --- a/test/modules.js +++ b/test/modules.js @@ -319,3 +319,25 @@ test('not fail on accessing path name defined in Object.prototype', function (do done(); }); }); + +test('respect symlinks', function (done) { + // some systems (e.g. rush, pnpm) use symlinks to create a recursive dependency graph + // instead of relying on the hoisting aspect of the node module resolution algorithm (like npm and yarn do) + // in these cases, we want to resolve to the real path of a module, so that the tree structure below + // only ever tries to run the `x` module once (rather than once on each module that depends on it) + // + // - node_modules + // - a + // - node_modules + // - symlink to x + // - b + // - node_modules + // - symlink to x + // + resolve('linked', { paths: [ fixtures_dir + '/linker/node_modules' ], package: { main: 'fixtures' } }, function(err, path, pkg) { + assert.ifError(err); + assert.equal(path, require.resolve('./fixtures/linked/index')); + assert.strictEqual(pkg, undefined); + done(); + }); +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..9199d5d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,108 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +commander@0.6.1: + version "0.6.1" + resolved "https://unpm.uberinternal.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= + +commander@2.0.0: + version "2.0.0" + resolved "https://unpm.uberinternal.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" + integrity sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg= + +debug@*: + version "4.1.1" + resolved "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +diff@1.0.7: + version "1.0.7" + resolved "https://unpm.uberinternal.com/diff/-/diff-1.0.7.tgz#24bbb001c4a7d5522169e7cabdb2c2814ed91cf4" + integrity sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ= + +glob@3.2.3: + version "3.2.3" + resolved "https://unpm.uberinternal.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" + integrity sha1-4xPusknHr/qlxHUoaw4RW1mDlGc= + dependencies: + graceful-fs "~2.0.0" + inherits "2" + minimatch "~0.2.11" + +graceful-fs@~2.0.0: + version "2.0.3" + resolved "https://unpm.uberinternal.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" + integrity sha1-fNLNsiiko/Nule+mzBQt59GhNtA= + +growl@1.7.x: + version "1.7.0" + resolved "https://unpm.uberinternal.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" + integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto= + +inherits@2: + version "2.0.3" + resolved "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +jade@0.26.3: + version "0.26.3" + resolved "https://unpm.uberinternal.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw= + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +lru-cache@2: + version "2.7.3" + resolved "https://unpm.uberinternal.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://unpm.uberinternal.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= + +mkdirp@0.3.5: + version "0.3.5" + resolved "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= + +mocha@1.14.0: + version "1.14.0" + resolved "https://unpm.uberinternal.com/mocha/-/mocha-1.14.0.tgz#713db6dc5000191a9d0358195d0908790ecb6157" + integrity sha1-cT223FAAGRqdA1gZXQkIeQ7LYVc= + dependencies: + commander "2.0.0" + debug "*" + diff "1.0.7" + glob "3.2.3" + growl "1.7.x" + jade "0.26.3" + mkdirp "0.3.5" + +ms@^2.1.1: + version "2.1.1" + resolved "https://unpm.uberinternal.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +resolve@1.1.7: + version "1.1.7" + resolved "https://unpm.uberinternal.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://unpm.uberinternal.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= From cae50e350e7cf62664c5c6bf885dcf41ff1a8d9b Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Mon, 11 Feb 2019 09:39:05 -0800 Subject: [PATCH 3/8] remove lock file --- yarn.lock | 108 ------------------------------------------------------ 1 file changed, 108 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 9199d5d..0000000 --- a/yarn.lock +++ /dev/null @@ -1,108 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -commander@0.6.1: - version "0.6.1" - resolved "https://unpm.uberinternal.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" - integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= - -commander@2.0.0: - version "2.0.0" - resolved "https://unpm.uberinternal.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" - integrity sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg= - -debug@*: - version "4.1.1" - resolved "https://unpm.uberinternal.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -diff@1.0.7: - version "1.0.7" - resolved "https://unpm.uberinternal.com/diff/-/diff-1.0.7.tgz#24bbb001c4a7d5522169e7cabdb2c2814ed91cf4" - integrity sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ= - -glob@3.2.3: - version "3.2.3" - resolved "https://unpm.uberinternal.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" - integrity sha1-4xPusknHr/qlxHUoaw4RW1mDlGc= - dependencies: - graceful-fs "~2.0.0" - inherits "2" - minimatch "~0.2.11" - -graceful-fs@~2.0.0: - version "2.0.3" - resolved "https://unpm.uberinternal.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" - integrity sha1-fNLNsiiko/Nule+mzBQt59GhNtA= - -growl@1.7.x: - version "1.7.0" - resolved "https://unpm.uberinternal.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" - integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto= - -inherits@2: - version "2.0.3" - resolved "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -jade@0.26.3: - version "0.26.3" - resolved "https://unpm.uberinternal.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" - integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw= - dependencies: - commander "0.6.1" - mkdirp "0.3.0" - -lru-cache@2: - version "2.7.3" - resolved "https://unpm.uberinternal.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://unpm.uberinternal.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -mkdirp@0.3.0: - version "0.3.0" - resolved "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= - -mkdirp@0.3.5: - version "0.3.5" - resolved "https://unpm.uberinternal.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= - -mocha@1.14.0: - version "1.14.0" - resolved "https://unpm.uberinternal.com/mocha/-/mocha-1.14.0.tgz#713db6dc5000191a9d0358195d0908790ecb6157" - integrity sha1-cT223FAAGRqdA1gZXQkIeQ7LYVc= - dependencies: - commander "2.0.0" - debug "*" - diff "1.0.7" - glob "3.2.3" - growl "1.7.x" - jade "0.26.3" - mkdirp "0.3.5" - -ms@^2.1.1: - version "2.1.1" - resolved "https://unpm.uberinternal.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -resolve@1.1.7: - version "1.1.7" - resolved "https://unpm.uberinternal.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://unpm.uberinternal.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= From dd08cbf23dbac3a6f1a733b54e303c3bd7eaa68a Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Mon, 11 Feb 2019 10:05:22 -0800 Subject: [PATCH 4/8] create dir if it doesn't exist in ci --- scripts/setup-symlinks.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/setup-symlinks.js b/scripts/setup-symlinks.js index d326bbd..36a886e 100644 --- a/scripts/setup-symlinks.js +++ b/scripts/setup-symlinks.js @@ -1,5 +1,8 @@ var fs = require('fs'); +try { + fs.mkdirSync(__dirname + '/../test/fixtures/node_modules/linker/node_modules'); +} catch (e) {} process.chdir(__dirname + '/../test/fixtures/node_modules/linker/node_modules'); fs.unlinkSync('linked'); fs.symlinkSync('../../../linked', 'linked', 'dir'); \ No newline at end of file From e6fa5084e9ee48f9fb8557dfc6a5b45452dee2c7 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Mon, 11 Feb 2019 10:10:15 -0800 Subject: [PATCH 5/8] don't throw if symlink isn't already there --- scripts/setup-symlinks.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/setup-symlinks.js b/scripts/setup-symlinks.js index 36a886e..416c620 100644 --- a/scripts/setup-symlinks.js +++ b/scripts/setup-symlinks.js @@ -4,5 +4,7 @@ try { fs.mkdirSync(__dirname + '/../test/fixtures/node_modules/linker/node_modules'); } catch (e) {} process.chdir(__dirname + '/../test/fixtures/node_modules/linker/node_modules'); -fs.unlinkSync('linked'); +try { + fs.unlinkSync('linked'); +} catch (e) {} fs.symlinkSync('../../../linked', 'linked', 'dir'); \ No newline at end of file From c0f34a6b5dc0a8bb6bbfee51f815efa57394539a Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 12 Apr 2019 09:32:22 -0700 Subject: [PATCH 6/8] address code review feedback - run test setup in test command - follow code style --- index.js | 8 ++++++-- package.json | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 875af11..53334b2 100644 --- a/index.js +++ b/index.js @@ -218,10 +218,14 @@ function resolve(id, opts, callback) { var cb = function(err, path, pkg) { fs.stat(path, function(notPath) { - if (notPath) callback(err, path, pkg); + if (notPath) { + callback(err, path, pkg); + } else { fs.realpath(path, function(notReal, real) { - if (notReal) callback(err, path, pkg); + if (notReal) { + callback(err, path, pkg); + } else { callback(err, real, pkg); } diff --git a/package.json b/package.json index fc12a16..da13328 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,7 @@ "empty.js" ], "scripts": { - "test": "mocha --reporter list test/*.js", - "postinstall": "node scripts/setup-symlinks.js" + "test": "node scripts/setup-symlinks.js && mocha --reporter list test/*.js" }, "repository": { "type": "git", From 75f41c2e1489e427cead776c83593d219d077762 Mon Sep 17 00:00:00 2001 From: Ryan Tsao Date: Mon, 3 Feb 2020 15:53:55 -0800 Subject: [PATCH 7/8] Test against maintained versions of node --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a943bf0..7789109 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,5 @@ language: node_js node_js: - - "0.8" - - "0.10" - - "4" - - "5" - - "6" + - "8" + - "10" + - "12" From 77a2650adbabb960d542ef58328f04d5ee6733f0 Mon Sep 17 00:00:00 2001 From: Ryan Tsao Date: Mon, 3 Feb 2020 15:54:07 -0800 Subject: [PATCH 8/8] Add npm lockfile --- package-lock.json | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6eb9a75 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,136 @@ +{ + "name": "browser-resolve", + "version": "1.11.3", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "commander": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", + "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz", + "integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ=", + "dev": true + }, + "glob": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", + "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "dev": true, + "requires": { + "graceful-fs": "~2.0.0", + "inherits": "2", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", + "dev": true + }, + "growl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", + "integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto=", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "dev": true + }, + "mocha": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.14.0.tgz", + "integrity": "sha1-cT223FAAGRqdA1gZXQkIeQ7LYVc=", + "dev": true, + "requires": { + "commander": "2.0.0", + "debug": "*", + "diff": "1.0.7", + "glob": "3.2.3", + "growl": "1.7.x", + "jade": "0.26.3", + "mkdirp": "0.3.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + } + } +}