diff --git a/app/port/controller/PackageVersionFileController.ts b/app/port/controller/PackageVersionFileController.ts index 1fa55174..eb2f0997 100644 --- a/app/port/controller/PackageVersionFileController.ts +++ b/app/port/controller/PackageVersionFileController.ts @@ -109,7 +109,8 @@ export class PackageVersionFileController extends AbstractController { } const { manifest } = await this.packageManagerService.showPackageVersionManifest(scope, name, versionOrTag); // GET /foo/1.0.0/files => /foo/1.0.0/files/{main} - const indexFile = manifest?.main ?? 'index.js'; + // ignore empty entry exp: @types/node@20.2.5/ + const indexFile = manifest?.main || 'index.js'; ctx.redirect(join(ctx.path, indexFile)); } diff --git a/test/port/controller/PackageVersionFileController/listFiles.test.ts b/test/port/controller/PackageVersionFileController/listFiles.test.ts index c3a1cf52..d784c6ff 100644 --- a/test/port/controller/PackageVersionFileController/listFiles.test.ts +++ b/test/port/controller/PackageVersionFileController/listFiles.test.ts @@ -39,6 +39,35 @@ describe('test/port/controller/PackageVersionFileController/listFiles.test.ts', assert.equal(res.body.error, '[NOT_FOUND] Not Found'); }); + it('should 404 when empty entry', async () => { + mock(app.config.cnpmcore, 'allowPublishNonScopePackage', true); + mock(app.config.cnpmcore, 'enableUnpkg', true); + const pkg = await TestUtil.getFullPackage({ + name: 'foo', + version: '1.0.0', + versionObject: { + main: '', + description: 'empty main', + }, + }); + await app.httpRequest() + .put(`/${pkg.name}`) + .set('authorization', publisher.authorization) + .set('user-agent', publisher.ua) + .send(pkg) + .expect(201); + let res = await app.httpRequest() + .get('/foo/1.0.0/files') + .expect(302) + .expect('location', '/foo/1.0.0/files/index.js'); + + res = await app.httpRequest() + .get('/foo/1.0.0/files/index.js') + .expect(404) + .expect('content-type', 'application/json; charset=utf-8'); + assert.equal(res.body.error, '[NOT_FOUND] File foo@1.0.0/index.js not found'); + }); + it('should list one package version files', async () => { mock(app.config.cnpmcore, 'allowPublishNonScopePackage', true); const pkg = await TestUtil.getFullPackage({