diff --git a/cli-options/opts.start.json b/cli-options/opts.start.json index f4a07a14d..3a54d3473 100644 --- a/cli-options/opts.start.json +++ b/cli-options/opts.start.json @@ -60,6 +60,10 @@ "type": "string", "desc": "Specify the start path for the opened browser" }, + "single": { + "type": "boolean", + "desc": "If true, the connect-history-api-fallback middleware will be added" + }, "https": { "desc": "Enable SSL for local development" }, diff --git a/lib/server/utils.js b/lib/server/utils.js index b6a979dd2..e3e983d66 100644 --- a/lib/server/utils.js +++ b/lib/server/utils.js @@ -181,6 +181,17 @@ var serverUtils = { }); } + /** + * Add connect-history-api-fallback if 'single' argument given + */ + if (bs.options.get("single")) { + defaultMiddlewares.unshift({ + id: "Browsersync SPA support", + route: "", + handle: require('connect-history-api-fallback')() + }); + } + /** * Add serve static middleware */ diff --git a/package.json b/package.json index 25edb4ed6..10a248c7a 100644 --- a/package.json +++ b/package.json @@ -35,11 +35,11 @@ "prepublish": "tsc" }, "dependencies": { - "@types/node": "^8.5.2", "browser-sync-ui": "v1.0.1", "bs-recipes": "1.3.4", "chokidar": "1.7.0", "connect": "3.5.0", + "connect-history-api-fallback": "^1.5.0", "dev-ip": "^1.0.1", "easy-extender": "2.3.2", "eazy-logger": "3.0.2", @@ -60,11 +60,11 @@ "serve-static": "1.12.2", "server-destroy": "1.0.1", "socket.io": "2.0.4", - "socket.io-client": "1.6.0", "ua-parser-js": "0.7.12", "yargs": "6.4.0" }, "devDependencies": { + "@types/node": "^8.5.2", "browser-sync-spa": "1.0.3", "bs-html-injector": "3.0.3", "bs-latency": "1.0.0", @@ -90,6 +90,7 @@ "requirejs": "^2.3.5", "rimraf": "2.5.4", "sinon": "1.17.5", + "socket.io-client": "^2.0.4", "source-map-support": "^0.5.0", "supertest": "2.0.0", "typescript": "^2.6.2", diff --git a/test/specs/e2e/e2e.options.single.js b/test/specs/e2e/e2e.options.single.js new file mode 100644 index 000000000..b06a36876 --- /dev/null +++ b/test/specs/e2e/e2e.options.single.js @@ -0,0 +1,54 @@ +var browserSync = require("../../../"); + +var assert = require("chai").assert; +var sinon = require("sinon"); +var fs = require("fs"); +var request = require("supertest"); + +describe("e2e options test (single)", function() { + it("returns index.html content for a non-existing path", function(done) { + browserSync.reset(); + var config = { + server: { + baseDir: "test/fixtures" + }, + open: false, + logLevel: "silent", + cors: true, + single: true + }; + browserSync(config, function(err, bs) { + request(bs.server) + .get("/a-path-that-deffo-doesnot-exist") + .set('accept', '*/*') + .expect(200) + .end(function(err, res) { + const expected = fs.readFileSync('test/fixtures/index.html', 'utf8'); + assert.equal(res.text, expected); + bs.cleanup(done); + }); + }); + }); + it("returns regular content for matching file path", function(done) { + browserSync.reset(); + var config = { + server: { + baseDir: "test/fixtures" + }, + open: false, + logLevel: "silent", + cors: true, + single: true + }; + browserSync(config, function(err, bs) { + request(bs.server) + .get("/assets/style.css") + .expect(200) + .end(function(err, res) { + const expected = fs.readFileSync('test/fixtures/assets/style.css', 'utf8'); + assert.equal(res.text, expected); + bs.cleanup(done); + }); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index a60cb08fc..b1ea8f32a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,10 +45,6 @@ add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" - after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -618,10 +614,6 @@ component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" - component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -663,7 +655,7 @@ connect-history-api-fallback@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-0.0.5.tgz#ef0509d0040bfbc486eab5f7f500bb1769cf354a" -connect-history-api-fallback@^1.1.0: +connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" @@ -901,12 +893,6 @@ debug@2.2.0, debug@~2.2.0: dependencies: ms "0.7.1" -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - dependencies: - ms "0.7.2" - debug@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" @@ -1095,23 +1081,6 @@ end-of-stream@~0.1.5: dependencies: once "~1.3.0" -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" - has-cors "1.1.0" - indexof "0.0.1" - parsejson "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" - yeast "0.1.2" - engine.io-client@~3.1.0: version "3.1.4" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.4.tgz#4fcf1370b47163bd2ce9be2733972430350d4ea1" @@ -1128,17 +1097,6 @@ engine.io-client@~3.1.0: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" - dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" - engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.1.tgz#e0fb3f0e0462f7f58bb77c1a52e9f5a7e26e4668" @@ -1195,10 +1153,6 @@ esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" @@ -1831,18 +1785,6 @@ has-binary2@~1.0.2: dependencies: isarray "2.0.1" -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - dependencies: - isarray "0.0.1" - has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" @@ -2294,7 +2236,7 @@ istanbul@0.4.5: which "^1.1.1" wordwrap "^1.0.0" -js-yaml@3.6.0: +js-yaml@3.6.0, js-yaml@3.x: version "3.6.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.0.tgz#3b7bf3256dd598f60f8b6f8ea75514a585a24dc6" dependencies: @@ -2308,13 +2250,6 @@ js-yaml@3.6.1: argparse "^1.0.7" esprima "^2.6.0" -js-yaml@3.x: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3090,18 +3025,12 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.3.3, once@~1.3.0: +once@1.3.3, once@1.x, once@^1.3.0, once@^1.3.3, once@~1.3.0: version "1.3.3" resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" dependencies: wrappy "1" -once@1.x, once@^1.3.0, once@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - once@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/once/-/once-1.2.0.tgz#de1905c636af874a8fba862d9aabddd1f920461c" @@ -3146,10 +3075,6 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - orchestrator@^0.3.0: version "0.3.8" resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" @@ -3218,12 +3143,6 @@ parse5@^1.4.2: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - dependencies: - better-assert "~1.0.0" - parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" @@ -3754,23 +3673,7 @@ socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.5" - socket.io-parser "2.3.1" - to-array "0.1.4" - -socket.io-client@2.0.4: +socket.io-client@2.0.4, socket.io-client@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e" dependencies: @@ -3788,15 +3691,6 @@ socket.io-client@2.0.4: socket.io-parser "~3.1.1" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" - dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" - socket.io-parser@~3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.2.tgz#dbc2282151fc4faebbe40aeedc0772eba619f7f2" @@ -4225,10 +4119,6 @@ uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -4427,13 +4317,6 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - dependencies: - options ">=0.0.5" - ultron "1.0.x" - ws@~3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -4442,10 +4325,6 @@ ws@~3.3.1: safe-buffer "~5.1.0" ultron "~1.1.0" -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" - "xml-name-validator@>= 2.0.1 < 3.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" @@ -4454,10 +4333,6 @@ xmldom@0.1.16: version "0.1.16" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.16.tgz#cf2602832b1ab5c3e6813fca08fe70196ba15e8c" -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" - xmlhttprequest-ssl@~1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.4.tgz#04f560915724b389088715cc0ed7813e9677bf57"