diff --git a/packages/outdated/src/index.ts b/packages/outdated/src/index.ts index cadb3e4eab9..3bdd0881011 100644 --- a/packages/outdated/src/index.ts +++ b/packages/outdated/src/index.ts @@ -156,15 +156,20 @@ async function _outdated ( throw new Error(`Invalid shrinkwrap.yaml file. ${relativeDepPath} not found in packages field`) } + const currentRef = currentShrinkwrap.importers[importerId][depType][packageName] + const currentRelative = currentRef && dp.refToRelative(currentRef, packageName) + const current = currentRelative && dp.parse(currentRelative).version || currentRef + const wanted = dp.parse(relativeDepPath).version || ref + // It might be not the best solution to check for pkgSnapshot.name // TODO: add some other field to distinct packages not from the registry if (pkgSnapshot.resolution && (pkgSnapshot.resolution['type'] || pkgSnapshot.name)) { // tslint:disable-line:no-string-literal - if (currentShrinkwrap.importers[importerId][depType][packageName] !== wantedShrinkwrap.importers[importerId][depType]![packageName]) { + if (current !== wanted) { outdated.push({ - current: currentShrinkwrap.importers[importerId][depType]![packageName], + current, latest: undefined, packageName, - wanted: wantedShrinkwrap.importers[importerId][depType]![packageName], + wanted, }) } return @@ -180,22 +185,21 @@ async function _outdated ( const latest = resolution.latest - if (!currentShrinkwrap.importers[importerId][depType][packageName]) { + if (!current) { outdated.push({ latest, packageName, - wanted: wantedShrinkwrap.importers[importerId][depType]![packageName], + wanted, }) return } - if (currentShrinkwrap.importers[importerId][depType][packageName] !== wantedShrinkwrap.importers[importerId][depType]![packageName] || - latest !== currentShrinkwrap.importers[importerId][depType][packageName]) { + if (current !== wanted || latest !== current) { outdated.push({ - current: currentShrinkwrap.importers[importerId][depType][packageName], + current, latest, packageName, - wanted: wantedShrinkwrap.importers[importerId][depType]![packageName], + wanted, }) } }), diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/.gitignore b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/.gitignore new file mode 100644 index 00000000000..cf4bab9ddde --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/.gitignore @@ -0,0 +1 @@ +!node_modules diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/node_modules/.shrinkwrap.yaml b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/node_modules/.shrinkwrap.yaml new file mode 100644 index 00000000000..4d738dc85f3 --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/node_modules/.shrinkwrap.yaml @@ -0,0 +1,52 @@ +importers: + package: + dependencies: + ajv: 6.5.4 + ajv-keywords: /ajv-keywords/3.2.0/ajv@6.5.4 + specifiers: + ajv: 6.5.4 + ajv-keywords: 3.2.0 +packages: + /ajv-keywords/3.2.0/ajv@6.5.4: + dependencies: + ajv: 6.5.4 + dev: false + id: registry.npmjs.org/ajv-keywords/3.2.0 + peerDependencies: + ajv: ^6.0.0 + resolution: + integrity: sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= + /ajv/6.5.4: + dependencies: + fast-deep-equal: 2.0.1 + fast-json-stable-stringify: 2.0.0 + json-schema-traverse: 0.4.1 + uri-js: 4.2.2 + dev: false + resolution: + integrity: sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== + /fast-deep-equal/2.0.1: + dev: false + resolution: + integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + /fast-json-stable-stringify/2.0.0: + dev: false + resolution: + integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + /json-schema-traverse/0.4.1: + dev: false + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /uri-js/4.2.2: + dependencies: + punycode: 2.1.1 + dev: false + resolution: + integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== +shrinkwrapVersion: 4 diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.gitignore b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.gitignore new file mode 100644 index 00000000000..3c3629e647f --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.npmrc b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.npmrc new file mode 100644 index 00000000000..04cd68600dd --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/.npmrc @@ -0,0 +1 @@ +shrinkwrap-directory=.. diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/package.json b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/package.json new file mode 100644 index 00000000000..0127812e447 --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/package/package.json @@ -0,0 +1,8 @@ +{ + "name": "package", + "version": "0.0.0", + "dependencies": { + "ajv-keywords": "3.2.0", + "ajv": "6.5.4" + } +} diff --git a/packages/outdated/test/fixtures/package-with-external-shrinkwrap/shrinkwrap.yaml b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/shrinkwrap.yaml new file mode 100644 index 00000000000..4d738dc85f3 --- /dev/null +++ b/packages/outdated/test/fixtures/package-with-external-shrinkwrap/shrinkwrap.yaml @@ -0,0 +1,52 @@ +importers: + package: + dependencies: + ajv: 6.5.4 + ajv-keywords: /ajv-keywords/3.2.0/ajv@6.5.4 + specifiers: + ajv: 6.5.4 + ajv-keywords: 3.2.0 +packages: + /ajv-keywords/3.2.0/ajv@6.5.4: + dependencies: + ajv: 6.5.4 + dev: false + id: registry.npmjs.org/ajv-keywords/3.2.0 + peerDependencies: + ajv: ^6.0.0 + resolution: + integrity: sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= + /ajv/6.5.4: + dependencies: + fast-deep-equal: 2.0.1 + fast-json-stable-stringify: 2.0.0 + json-schema-traverse: 0.4.1 + uri-js: 4.2.2 + dev: false + resolution: + integrity: sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== + /fast-deep-equal/2.0.1: + dev: false + resolution: + integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + /fast-json-stable-stringify/2.0.0: + dev: false + resolution: + integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + /json-schema-traverse/0.4.1: + dev: false + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /uri-js/4.2.2: + dependencies: + punycode: 2.1.1 + dev: false + resolution: + integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== +shrinkwrapVersion: 4 diff --git a/packages/outdated/test/index.ts b/packages/outdated/test/index.ts index 8cf2f3d472b..41f834d0a78 100644 --- a/packages/outdated/test/index.ts +++ b/packages/outdated/test/index.ts @@ -140,3 +140,13 @@ test('outdated() on package that has one outdated dev dependency', async (t) => ]) t.end() }) + +// NOTE: this test is unstable. It will fail if a new version of ajv will be released! +test('outdated() on a package that has external shrinkwrap file and direct dependencies with resolved peers', async (t) => { + const outdatedPkgs = await outdated('package-with-external-shrinkwrap/package', { + ...outdatedOpts, + shrinkwrapDirectory: path.resolve('package-with-external-shrinkwrap'), + }) + t.deepEqual(outdatedPkgs, []) + t.end() +}) diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml index d6256a2c347..e8008d81039 100644 --- a/shrinkwrap.yaml +++ b/shrinkwrap.yaml @@ -1657,8 +1657,8 @@ packages: integrity: sha512-RxNNNvEO8Ogl6VGOx1t9ET5MgewcRSPCUriRMnIMgUguynG1hbc4uBkJ5WqCPCuwk2glvPvMShy6RySuYj5GHw== /@pnpm/exec/1.1.5: dependencies: - '@pnpm/self-installer': 2.0.5 - '@types/got': 8.3.4 + '@pnpm/self-installer': 2.0.7 + '@types/got': 8.3.5 '@types/node': 10.12.0 command-exists: 1.2.8 cross-spawn: 6.0.5 @@ -1686,7 +1686,7 @@ packages: integrity: sha512-ASULw2KzrapsjQVSMYdDc3f6+wYOs9cPt0M5Ip9VUkTfYfPrfxd0UYXcOPoUHkk7L12HUj0vwUYK0DE1da2gww== /@pnpm/git-fetcher/1.0.1: dependencies: - '@types/node': 10.12.0 + '@types/node': 10.12.1 dint: 3.0.2 execa: 1.0.0 path-temp: 1.0.0 @@ -1699,7 +1699,7 @@ packages: /@pnpm/git-resolver/1.0.1: dependencies: '@pnpm/resolver-base': 2.0.0 - '@types/node': 10.12.0 + '@types/node': 10.12.1 '@types/semver': 5.5.0 got: 8.3.2 graceful-git: 2.0.0 @@ -1752,7 +1752,7 @@ packages: '@pnpm/resolver-base': 2.0.0 '@pnpm/types': 2.0.0 '@types/graceful-fs': 4.1.2 - '@types/node': 10.12.0 + '@types/node': 10.12.1 graceful-fs: 4.1.11 normalize-path: 3.0.0 osenv: 0.1.5 @@ -1765,7 +1765,7 @@ packages: integrity: sha512-/6KP7OXtwlE1tgepR5vB1FyL64F4+RZP8IIdvkwkHWL1rnLPprRvZ1Lwd1vecIlwjY1MrXmY7awL2H7MQqBg5Q== /@pnpm/logger/2.1.0: dependencies: - '@types/node': 10.12.0 + '@types/node': 10.12.1 bole: 3.0.2 ndjson: 1.5.0 engines: @@ -1779,7 +1779,7 @@ packages: '@pnpm/types': 2.0.0 '@types/load-json-file': 2.0.7 '@types/mem': 1.1.2 - '@types/node': 10.12.0 + '@types/node': 10.12.1 '@types/semver': 5.5.0 credentials-by-uri: 1.0.0 encode-registry: 1.1.0 @@ -1835,12 +1835,12 @@ packages: node: '>=6' resolution: integrity: sha512-+pYMLgBlp242xn0qEK3JsU2fNgMSejTflzu1NLXV8J9QTIxTILmxz5ayFcudtimKP0o49dnMysoWihQ/ven7wA== - /@pnpm/self-installer/2.0.5: + /@pnpm/self-installer/2.0.7: dev: true engines: node: '>=4' resolution: - integrity: sha512-NnkmxKFQJMkHL2TcLAl2sof7mVu8dgode4zGzwtvEaZ/xjOHm3CfUJomincmZcpWoXrjHkvbPxjczEPP41Wmqg== + integrity: sha512-FGKMmjqP0S+E1n9M6BcsVVkOVB0NfhBzXGZK6bLmerRT3EOvQ09KY++hBXoq0+/TqCvbsth6ER+EO0i46uJttQ== /@pnpm/store-path/1.0.3: dependencies: '@types/node': 9.6.35 @@ -1863,7 +1863,7 @@ packages: '@pnpm/logger': 2.1.0 '@types/mem': 1.1.2 '@types/mz': 0.0.32 - '@types/node': 10.12.0 + '@types/node': 10.12.1 '@types/retry': 0.10.2 '@types/rimraf': 2.0.2 credentials-by-uri: 1.0.0 @@ -1904,12 +1904,12 @@ packages: node: '>=4' resolution: integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== - /@sinonjs/commons/1.0.2: + /@sinonjs/commons/1.3.0: dependencies: type-detect: 4.0.8 dev: true resolution: - integrity: sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw== + integrity: sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA== /@sinonjs/formatio/3.0.0: dependencies: '@sinonjs/samsam': 2.1.0 @@ -1973,11 +1973,18 @@ packages: /@types/got/8.3.4: dependencies: '@types/node': 10.12.0 + dev: false resolution: integrity: sha512-0AbIQzpqQafYPFg26nwg5PfNgPLYwHeTP6z5F1u+5oypLIdpx34o5r8wYTTj3X3YYF2yPHtZPO/KYwlI8Nu/hQ== - /@types/graceful-fs/4.1.2: + /@types/got/8.3.5: dependencies: '@types/node': 10.12.0 + dev: true + resolution: + integrity: sha512-AaXSrIF99SjjtPVNmCmYb388HML+PKEJb/xmj4SbL2ZO0hHuETZZzyDIKfOqaEoAHZEuX4sC+FRFrHYJoIby6A== + /@types/graceful-fs/4.1.2: + dependencies: + '@types/node': 10.12.1 resolution: integrity: sha512-epDhsJAVxJsWfeqpzEDFhLnhHMbHie/VMFY+2Hvt5p7FemeW5ELM+6gcVYL/ZsUwdu3zrWpDE3VUTddXW+EMYg== /@types/is-windows/0.2.0: @@ -2026,6 +2033,9 @@ packages: /@types/node/10.12.0: resolution: integrity: sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== + /@types/node/10.12.1: + resolution: + integrity: sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ== /@types/node/8.10.36: dev: false resolution: @@ -4365,7 +4375,7 @@ packages: integrity: sha1-oB6c2cnkkXFcmKdaQtXwu9EH/3Y= /fetch-from-npm-registry/1.0.0: dependencies: - '@types/node': 10.12.0 + '@types/node': 10.12.1 make-fetch-happen: 4.0.1 engines: node: '>=6' @@ -5119,7 +5129,7 @@ packages: dependencies: assert-plus: 1.0.0 jsprim: 1.4.1 - sshpk: 1.15.1 + sshpk: 1.15.2 engines: node: '>=0.8' npm: '>=1.3.7' @@ -7546,11 +7556,6 @@ packages: node: '>=4' resolution: integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - /pify/4.0.0: - engines: - node: '>=6' - resolution: - integrity: sha512-zrSP/KDf9DH3K3VePONoCstgPiYJy9z0SCatZuTpOc7YdnWIqwkWdXOuwlr4uDc7em8QZRsFWsT/685x5InjYg== /pify/4.0.1: engines: node: '>=6' @@ -8573,7 +8578,7 @@ packages: integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= /sinon/7.1.0: dependencies: - '@sinonjs/commons': 1.0.2 + '@sinonjs/commons': 1.3.0 '@sinonjs/formatio': 3.0.0 '@sinonjs/samsam': 2.1.2 diff: 3.5.0 @@ -8789,7 +8794,7 @@ packages: /sprintf-js/1.0.3: resolution: integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - /sshpk/1.15.1: + /sshpk/1.15.2: dependencies: asn1: 0.2.4 assert-plus: 1.0.0 @@ -8804,7 +8809,7 @@ packages: node: '>=0.10.0' hasBin: true resolution: - integrity: sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA== + integrity: sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== /ssri/5.3.0: dependencies: safe-buffer: 5.1.2 @@ -9397,7 +9402,7 @@ packages: doctrine: 0.7.2 tslib: 1.9.0 tslint: /tslint/5.11.0/typescript@3.1.3 - tsutils: /tsutils/3.1.0/typescript@3.1.3 + tsutils: /tsutils/3.2.0/typescript@3.1.3 typescript: 3.1.3 dev: true id: registry.npmjs.org/tslint-eslint-rules/5.4.0 @@ -9440,18 +9445,18 @@ packages: typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' resolution: integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - /tsutils/3.1.0/typescript@3.1.3: + /tsutils/3.2.0/typescript@3.1.3: dependencies: tslib: 1.9.3 typescript: 3.1.3 dev: true engines: node: '>= 6' - id: registry.npmjs.org/tsutils/3.1.0 + id: registry.npmjs.org/tsutils/3.2.0 peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev' + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev' resolution: - integrity: sha512-rmGhespW+nZMtdkc4JJefYSjux2uCDZxCTLU+nu8gvm+gM+YT0W5XAygHxaeOwRAHZ+SoPdrovZmAlZ2a0KSlw== + integrity: sha512-CvWEadl8VwlxOq6F3hfNbGrrRVSAjN2EPCEBgcbCUVDUxmwkV5254OGKsITNxDz8IGDQPAw7YJMtBHniHu2tbA== /tunnel-agent/0.6.0: dependencies: safe-buffer: 5.1.2 @@ -9614,7 +9619,7 @@ packages: integrity: sha512-h3Ii7ThTL7P5LlX1RuMPsuW4V5EZnLyjPwStIMQ4V0F6rblgmXIS+IkpAOu9THHDZYUO/D8TTJddVc6HIY4S5g== /unpack-stream/4.0.0: dependencies: - '@types/node': 10.12.0 + '@types/node': 10.12.1 decompress-maybe: 1.0.0 ssri: 6.0.1 tar-fs: 1.16.3 @@ -9961,7 +9966,7 @@ packages: detect-indent: 5.0.0 graceful-fs: 4.1.11 make-dir: 1.3.0 - pify: 4.0.0 + pify: 4.0.1 sort-keys: 2.0.0 write-file-atomic: 2.3.0 engines: