From 88a4213caa903d0300d651a5d9d8889e6d789397 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Thu, 1 Aug 2019 10:05:05 -0700 Subject: [PATCH] Fix ?meta listings Fixes ?meta listings (and other requests) for packages with a root "directory" entry. Fixes #210 --- modules/__tests__/serveMetadata-test.js | 32 +++++++++++++++++++++++ modules/actions/serveDirectoryBrowser.js | 2 +- modules/actions/serveDirectoryMetadata.js | 2 +- modules/actions/serveFileBrowser.js | 2 +- modules/actions/serveFileMetadata.js | 2 +- 5 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 modules/__tests__/serveMetadata-test.js diff --git a/modules/__tests__/serveMetadata-test.js b/modules/__tests__/serveMetadata-test.js new file mode 100644 index 0000000..58c60a0 --- /dev/null +++ b/modules/__tests__/serveMetadata-test.js @@ -0,0 +1,32 @@ +import request from 'supertest'; + +import createServer from '../createServer.js'; + +describe('A request for metadata', () => { + let server; + beforeEach(() => { + server = createServer(); + }); + + it('returns 200', done => { + request(server) + .get('/react@16.8.6/?meta') + .end((err, res) => { + expect(res.statusCode).toBe(200); + expect(res.headers['content-type']).toMatch(/\bapplication\/json\b/); + done(); + }); + }); + + describe('with a package that includes a root "directory" entry', () => { + it('returns 200', done => { + request(server) + .get('/sinuous@0.12.9/?meta') + .end((err, res) => { + expect(res.statusCode).toBe(200); + expect(res.headers['content-type']).toMatch(/\bapplication\/json\b/); + done(); + }); + }); + }); +}); diff --git a/modules/actions/serveDirectoryBrowser.js b/modules/actions/serveDirectoryBrowser.js index 2a830f7..b6a85f5 100644 --- a/modules/actions/serveDirectoryBrowser.js +++ b/modules/actions/serveDirectoryBrowser.js @@ -24,7 +24,7 @@ async function findMatchingEntries(stream, filename) { // so we shorten that to just `/index.js` here. A few packages use a // prefix other than `package/`. e.g. the firebase package uses the // `firebase_npm/` prefix. So we just strip the first dir name. - path: header.name.replace(/^[^/]+/, ''), + path: header.name.replace(/^[^/]+\/?/, '/'), type: header.type }; diff --git a/modules/actions/serveDirectoryMetadata.js b/modules/actions/serveDirectoryMetadata.js index dbe9fc3..1e92853 100644 --- a/modules/actions/serveDirectoryMetadata.js +++ b/modules/actions/serveDirectoryMetadata.js @@ -25,7 +25,7 @@ async function findMatchingEntries(stream, filename) { // so we shorten that to just `/index.js` here. A few packages use a // prefix other than `package/`. e.g. the firebase package uses the // `firebase_npm/` prefix. So we just strip the first dir name. - path: header.name.replace(/^[^/]+/, ''), + path: header.name.replace(/^[^/]+\/?/, '/'), type: header.type }; diff --git a/modules/actions/serveFileBrowser.js b/modules/actions/serveFileBrowser.js index ad021d1..d7916a9 100644 --- a/modules/actions/serveFileBrowser.js +++ b/modules/actions/serveFileBrowser.js @@ -27,7 +27,7 @@ async function findEntry(stream, filename) { // so we shorten that to just `/index.js` here. A few packages use a // prefix other than `package/`. e.g. the firebase package uses the // `firebase_npm/` prefix. So we just strip the first dir name. - path: header.name.replace(/^[^/]+/, ''), + path: header.name.replace(/^[^/]+\/?/, '/'), type: header.type }; diff --git a/modules/actions/serveFileMetadata.js b/modules/actions/serveFileMetadata.js index 4cf1f4b..d72e5b3 100644 --- a/modules/actions/serveFileMetadata.js +++ b/modules/actions/serveFileMetadata.js @@ -22,7 +22,7 @@ async function findEntry(stream, filename) { // so we shorten that to just `/index.js` here. A few packages use a // prefix other than `package/`. e.g. the firebase package uses the // `firebase_npm/` prefix. So we just strip the first dir name. - path: header.name.replace(/^[^/]+/, ''), + path: header.name.replace(/^[^/]+\/?/, '/'), type: header.type };