From 44071be4de34948df7cf8998a6aa2731471e5685 Mon Sep 17 00:00:00 2001 From: "tianding.wk" Date: Fri, 9 Jun 2023 18:50:06 +0800 Subject: [PATCH] fix: parse tarball url error --- packages/cli/lib/util.js | 18 ++++++++++++++---- packages/cli/test/util.test.js | 12 ++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/cli/lib/util.js b/packages/cli/lib/util.js index adf5a6d..5f36f50 100644 --- a/packages/cli/lib/util.js +++ b/packages/cli/lib/util.js @@ -104,10 +104,20 @@ async function shouldFuseSupport() { } function getPkgNameFromTarballUrl(tarballUrl) { - // /@scope/a/download/@scope/a-1.0.0.tgz -> [ '@scope/a', '/download/', '@scope/a-1.0.0.tgz' ] - // /@scope/a/-/a-1.0.0.tgz -> [ '@scope/a', '/-/', 'a-1.0.0.tgz' ] - const matches = new url.URL(tarballUrl).pathname.substring(1).split(/(\/\-\/|\/download\/)/); - return matches[0]; + const pathname = new url.URL(tarballUrl).pathname.substring(1); + if (pathname.includes('@')) { + if (pathname.includes('/-/')) { // @scope/download/-/download-1.0.0.tgz + return pathname.substring(0, pathname.indexOf('/-/')); + } + // @scope/download/download/@scope/download-1.0.0.tgz + return pathname.substring(0, pathname.lastIndexOf('/download/@')); + } + + if (pathname.includes('/-/')) { // download/-/download-1.0.0.tgz + return pathname.substring(0, pathname.indexOf('/-/')); + } + // download/download/download-1.0.0.tgz + return pathname.substring(0, pathname.lastIndexOf('/download/')); } function generatePackageId(name, version) { diff --git a/packages/cli/test/util.test.js b/packages/cli/test/util.test.js index 51d2863..714e1b8 100644 --- a/packages/cli/test/util.test.js +++ b/packages/cli/test/util.test.js @@ -262,10 +262,18 @@ describe('test/cache/util.test.js', () => { const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/egg/download/egg-2.15.1.tgz'); assert.strictEqual(name, 'egg'); }); + it('should parse successfully with old non-scoped tarball url including download', () => { + const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/download/download/download-2.15.1.tgz'); + assert.strictEqual(name, 'download'); + }); it('should parse successfully with old scoped tarball url', () => { const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/@cnpmjs/errors/download/@cnpmjs/errors-2.15.1.tgz'); assert.strictEqual(name, '@cnpmjs/errors'); }); + it('should parse successfully with old scoped tarball url including download', () => { + const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/@cnpmjs/download/download/@cnpmjs/download-2.15.1.tgz'); + assert.strictEqual(name, '@cnpmjs/download'); + }); it('should parse successfully with new non-scoped tarball url', () => { const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/egg/-/egg-2.15.1.tgz'); assert.strictEqual(name, 'egg'); @@ -274,6 +282,10 @@ describe('test/cache/util.test.js', () => { const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/@cnpmjs/errors/-/errors-2.15.1.tgz'); assert.strictEqual(name, '@cnpmjs/errors'); }); + it('should parse successfully with new scoped tarball url including download', () => { + const name = getPkgNameFromTarballUrl('https://registry.npmjs.org/@cnpmjs/download/-/download-2.15.1.tgz'); + assert.strictEqual(name, '@cnpmjs/download'); + }); }); });