From d5d60cbe43eada6d81eb8975415eb4ceb3f87f03 Mon Sep 17 00:00:00 2001 From: Eslam El-Hakmey Date: Fri, 5 Apr 2019 13:55:33 +0200 Subject: [PATCH] feat: add option "serveIndex" to enable/disable serveIndex middleware (#1752) --- bin/options.js | 5 ++ lib/Server.js | 10 ++- lib/options.json | 3 + test/ContentBase.test.js | 82 +++++++++++++++++++ .../contentbase-config/public/bar/index.html | 1 + 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/contentbase-config/public/bar/index.html diff --git a/bin/options.js b/bin/options.js index 3670ffe15d..0e284ce5c6 100644 --- a/bin/options.js +++ b/bin/options.js @@ -21,6 +21,11 @@ const options = { type: 'boolean', describe: 'Lazy', }, + serveIndex: { + type: 'boolean', + describe: 'Enables/Disables serveIndex middleware', + default: true, + }, inline: { type: 'boolean', default: true, diff --git a/lib/Server.js b/lib/Server.js index 7134d10b87..170b1fb7e6 100644 --- a/lib/Server.js +++ b/lib/Server.js @@ -106,6 +106,8 @@ class Server { this.headers = options.headers; this.progress = options.progress; + this.serveIndex = options.serveIndex; + this.clientOverlay = options.overlay; this.clientLogLevel = options.clientLogLevel; @@ -557,9 +559,15 @@ class Server { defaultFeatures.push('magicHtml'); - if (contentBase !== false) { + // checking if it's set to true or not set (Default : undefined => true) + this.serveIndex = this.serveIndex || this.serveIndex === undefined; + + const shouldHandleServeIndex = contentBase && this.serveIndex; + + if (shouldHandleServeIndex) { defaultFeatures.push('contentBaseIndex'); } + // compress is placed last and uses unshift so that it will be the first middleware used if (options.compress) { defaultFeatures.unshift('compress'); diff --git a/lib/options.json b/lib/options.json index f4941cc655..703e2b5657 100644 --- a/lib/options.json +++ b/lib/options.json @@ -1,6 +1,9 @@ { "type": "object", "properties": { + "serveIndex": { + "type": "boolean" + }, "hot": { "type": "boolean" }, diff --git a/test/ContentBase.test.js b/test/ContentBase.test.js index 06cf5b789b..0854fbd3d4 100644 --- a/test/ContentBase.test.js +++ b/test/ContentBase.test.js @@ -64,7 +64,89 @@ describe('ContentBase', () => { }, 1000); }); }); + describe('test listing files in folders without index.html using the option serveIndex:false', () => { + beforeAll((done) => { + server = helper.start( + config, + { + contentBase: contentBasePublic, + watchContentBase: true, + serveIndex: false, + }, + done + ); + req = request(server.app); + }); + + afterAll((done) => { + helper.close(() => { + done(); + }); + }); + + it("shouldn't list the files inside the assets folder (404)", (done) => { + req.get('/assets/').expect(404, done); + }); + + it('should show Heyo. because bar has index.html inside it (200)', (done) => { + req.get('/bar/').expect(200, /Heyo/, done); + }); + }); + describe('test listing files in folders without index.html using the option serveIndex:true', () => { + beforeAll((done) => { + server = helper.start( + config, + { + contentBase: contentBasePublic, + watchContentBase: true, + serveIndex: true, + }, + done + ); + req = request(server.app); + }); + afterAll((done) => { + helper.close(() => { + done(); + }); + }); + + it('should list the files inside the assets folder (200)', (done) => { + req.get('/assets/').expect(200, done); + }); + + it('should show Heyo. because bar has index.html inside it (200)', (done) => { + req.get('/bar/').expect(200, /Heyo/, done); + }); + }); + describe('test listing files in folders without index.html using the option serveIndex default (true)', () => { + beforeAll((done) => { + server = helper.start( + config, + { + contentBase: contentBasePublic, + watchContentBase: true, + }, + done + ); + req = request(server.app); + }); + + afterAll((done) => { + helper.close(() => { + done(); + }); + }); + + it('should list the files inside the assets folder (200)', (done) => { + req.get('/assets/').expect(200, done); + }); + + it('should show Heyo. because bar has index.html inside it (200)', (done) => { + req.get('/bar/').expect(200, /Heyo/, done); + }); + }); describe('to directories', () => { beforeAll((done) => { server = helper.start( diff --git a/test/fixtures/contentbase-config/public/bar/index.html b/test/fixtures/contentbase-config/public/bar/index.html new file mode 100644 index 0000000000..17654db5a1 --- /dev/null +++ b/test/fixtures/contentbase-config/public/bar/index.html @@ -0,0 +1 @@ +Heyo