Skip to content

Commit 91480aa

Browse files
committed
feat: add 'single' flag to put Browsersync into SPA mode
1 parent b5cc56e commit 91480aa

File tree

5 files changed

+76
-131
lines changed

5 files changed

+76
-131
lines changed

cli-options/opts.start.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@
6060
"type": "string",
6161
"desc": "Specify the start path for the opened browser"
6262
},
63+
"single": {
64+
"type": "boolean",
65+
"desc": "If true, the connect-history-api-fallback middleware will be added"
66+
},
6367
"https": {
6468
"desc": "Enable SSL for local development"
6569
},

lib/server/utils.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,17 @@ var serverUtils = {
181181
});
182182
}
183183

184+
/**
185+
* Add connect-history-api-fallback if 'single' argument given
186+
*/
187+
if (bs.options.get("single")) {
188+
defaultMiddlewares.unshift({
189+
id: "Browsersync SPA support",
190+
route: "",
191+
handle: require('connect-history-api-fallback')()
192+
});
193+
}
194+
184195
/**
185196
* Add serve static middleware
186197
*/

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535
"prepublish": "tsc"
3636
},
3737
"dependencies": {
38-
"@types/node": "^8.5.2",
3938
"browser-sync-ui": "v1.0.1",
4039
"bs-recipes": "1.3.4",
4140
"chokidar": "1.7.0",
4241
"connect": "3.5.0",
42+
"connect-history-api-fallback": "^1.5.0",
4343
"dev-ip": "^1.0.1",
4444
"easy-extender": "2.3.2",
4545
"eazy-logger": "3.0.2",
@@ -60,11 +60,11 @@
6060
"serve-static": "1.12.2",
6161
"server-destroy": "1.0.1",
6262
"socket.io": "2.0.4",
63-
"socket.io-client": "1.6.0",
6463
"ua-parser-js": "0.7.12",
6564
"yargs": "6.4.0"
6665
},
6766
"devDependencies": {
67+
"@types/node": "^8.5.2",
6868
"browser-sync-spa": "1.0.3",
6969
"bs-html-injector": "3.0.3",
7070
"bs-latency": "1.0.0",
@@ -90,6 +90,7 @@
9090
"requirejs": "^2.3.5",
9191
"rimraf": "2.5.4",
9292
"sinon": "1.17.5",
93+
"socket.io-client": "^2.0.4",
9394
"source-map-support": "^0.5.0",
9495
"supertest": "2.0.0",
9596
"typescript": "^2.6.2",
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
var browserSync = require("../../../");
2+
3+
var assert = require("chai").assert;
4+
var sinon = require("sinon");
5+
var fs = require("fs");
6+
var request = require("supertest");
7+
8+
describe("e2e options test (single)", function() {
9+
it("returns index.html content for a non-existing path", function(done) {
10+
browserSync.reset();
11+
var config = {
12+
server: {
13+
baseDir: "test/fixtures"
14+
},
15+
open: false,
16+
logLevel: "silent",
17+
cors: true,
18+
single: true
19+
};
20+
browserSync(config, function(err, bs) {
21+
request(bs.server)
22+
.get("/a-path-that-deffo-doesnot-exist")
23+
.set('accept', '*/*')
24+
.expect(200)
25+
.end(function(err, res) {
26+
const expected = fs.readFileSync('test/fixtures/index.html', 'utf8');
27+
assert.equal(res.text, expected);
28+
bs.cleanup(done);
29+
});
30+
});
31+
});
32+
it("returns regular content for matching file path", function(done) {
33+
browserSync.reset();
34+
var config = {
35+
server: {
36+
baseDir: "test/fixtures"
37+
},
38+
open: false,
39+
logLevel: "silent",
40+
cors: true,
41+
single: true
42+
};
43+
browserSync(config, function(err, bs) {
44+
request(bs.server)
45+
.get("/assets/style.css")
46+
.expect(200)
47+
.end(function(err, res) {
48+
const expected = fs.readFileSync('test/fixtures/assets/style.css', 'utf8');
49+
assert.equal(res.text, expected);
50+
bs.cleanup(done);
51+
});
52+
});
53+
});
54+
});

yarn.lock

Lines changed: 4 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ add-stream@^1.0.0:
4545
version "1.0.0"
4646
resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
4747

48-
49-
version "0.8.1"
50-
resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627"
51-
5248
5349
version "0.8.2"
5450
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
@@ -618,10 +614,6 @@ [email protected]:
618614
version "1.0.0"
619615
resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
620616

621-
622-
version "1.1.2"
623-
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
624-
625617
[email protected], component-emitter@^1.2.0, component-emitter@^1.2.1:
626618
version "1.2.1"
627619
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
@@ -663,7 +655,7 @@ [email protected]:
663655
version "0.0.5"
664656
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-0.0.5.tgz#ef0509d0040bfbc486eab5f7f500bb1769cf354a"
665657

666-
connect-history-api-fallback@^1.1.0:
658+
connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.5.0:
667659
version "1.5.0"
668660
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
669661

@@ -901,12 +893,6 @@ [email protected], debug@~2.2.0:
901893
dependencies:
902894
ms "0.7.1"
903895

904-
905-
version "2.3.3"
906-
resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
907-
dependencies:
908-
ms "0.7.2"
909-
910896
911897
version "2.6.0"
912898
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
@@ -1095,23 +1081,6 @@ end-of-stream@~0.1.5:
10951081
dependencies:
10961082
once "~1.3.0"
10971083

1098-
1099-
version "1.8.0"
1100-
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c"
1101-
dependencies:
1102-
component-emitter "1.2.1"
1103-
component-inherit "0.0.3"
1104-
debug "2.3.3"
1105-
engine.io-parser "1.3.1"
1106-
has-cors "1.1.0"
1107-
indexof "0.0.1"
1108-
parsejson "0.0.3"
1109-
parseqs "0.0.5"
1110-
parseuri "0.0.5"
1111-
ws "1.1.1"
1112-
xmlhttprequest-ssl "1.5.3"
1113-
yeast "0.1.2"
1114-
11151084
engine.io-client@~3.1.0:
11161085
version "3.1.4"
11171086
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:
11281097
xmlhttprequest-ssl "~1.5.4"
11291098
yeast "0.1.2"
11301099

1131-
1132-
version "1.3.1"
1133-
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf"
1134-
dependencies:
1135-
after "0.8.1"
1136-
arraybuffer.slice "0.0.6"
1137-
base64-arraybuffer "0.1.5"
1138-
blob "0.0.4"
1139-
has-binary "0.1.6"
1140-
wtf-8 "1.0.0"
1141-
11421100
engine.io-parser@~2.1.0, engine.io-parser@~2.1.1:
11431101
version "2.1.1"
11441102
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.1.tgz#e0fb3f0e0462f7f58bb77c1a52e9f5a7e26e4668"
@@ -1195,10 +1153,6 @@ [email protected], esprima@^2.6.0, esprima@^2.7.1:
11951153
version "2.7.3"
11961154
resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
11971155

1198-
esprima@^4.0.0:
1199-
version "4.0.0"
1200-
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
1201-
12021156
estraverse@^1.9.1:
12031157
version "1.9.3"
12041158
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
@@ -1831,18 +1785,6 @@ has-binary2@~1.0.2:
18311785
dependencies:
18321786
isarray "2.0.1"
18331787

1834-
1835-
version "0.1.6"
1836-
resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10"
1837-
dependencies:
1838-
isarray "0.0.1"
1839-
1840-
1841-
version "0.1.7"
1842-
resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
1843-
dependencies:
1844-
isarray "0.0.1"
1845-
18461788
18471789
version "1.1.0"
18481790
resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
@@ -2294,7 +2236,7 @@ [email protected]:
22942236
which "^1.1.1"
22952237
wordwrap "^1.0.0"
22962238

2297-
2239+
22982240
version "3.6.0"
22992241
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.0.tgz#3b7bf3256dd598f60f8b6f8ea75514a585a24dc6"
23002242
dependencies:
@@ -2308,13 +2250,6 @@ [email protected]:
23082250
argparse "^1.0.7"
23092251
esprima "^2.6.0"
23102252

2311-
2312-
version "3.10.0"
2313-
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
2314-
dependencies:
2315-
argparse "^1.0.7"
2316-
esprima "^4.0.0"
2317-
23182253
jsbn@~0.1.0:
23192254
version "0.1.1"
23202255
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -3090,18 +3025,12 @@ on-headers@~1.0.1:
30903025
version "1.0.1"
30913026
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
30923027

3093-
[email protected], once@~1.3.0:
3028+
[email protected], once@1.x, once@^1.3.0, once@^1.3.3, once@~1.3.0:
30943029
version "1.3.3"
30953030
resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
30963031
dependencies:
30973032
wrappy "1"
30983033

3099-
[email protected], once@^1.3.0, once@^1.3.3:
3100-
version "1.4.0"
3101-
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
3102-
dependencies:
3103-
wrappy "1"
3104-
31053034
once@~1.2.0:
31063035
version "1.2.0"
31073036
resolved "https://registry.yarnpkg.com/once/-/once-1.2.0.tgz#de1905c636af874a8fba862d9aabddd1f920461c"
@@ -3146,10 +3075,6 @@ optionator@^0.8.1:
31463075
type-check "~0.3.2"
31473076
wordwrap "~1.0.0"
31483077

3149-
options@>=0.0.5:
3150-
version "0.0.6"
3151-
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
3152-
31533078
orchestrator@^0.3.0:
31543079
version "0.3.8"
31553080
resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
@@ -3218,12 +3143,6 @@ parse5@^1.4.2:
32183143
version "1.5.1"
32193144
resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
32203145

3221-
3222-
version "0.0.3"
3223-
resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
3224-
dependencies:
3225-
better-assert "~1.0.0"
3226-
32273146
32283147
version "0.0.5"
32293148
resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
@@ -3754,23 +3673,7 @@ socket.io-adapter@~1.1.0:
37543673
version "1.1.1"
37553674
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b"
37563675

3757-
3758-
version "1.6.0"
3759-
resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853"
3760-
dependencies:
3761-
backo2 "1.0.2"
3762-
component-bind "1.0.0"
3763-
component-emitter "1.2.1"
3764-
debug "2.3.3"
3765-
engine.io-client "1.8.0"
3766-
has-binary "0.1.7"
3767-
indexof "0.0.1"
3768-
object-component "0.0.3"
3769-
parseuri "0.0.5"
3770-
socket.io-parser "2.3.1"
3771-
to-array "0.1.4"
3772-
3773-
3676+
[email protected], socket.io-client@^2.0.4:
37743677
version "2.0.4"
37753678
resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e"
37763679
dependencies:
@@ -3788,15 +3691,6 @@ [email protected]:
37883691
socket.io-parser "~3.1.1"
37893692
to-array "0.1.4"
37903693

3791-
3792-
version "2.3.1"
3793-
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
3794-
dependencies:
3795-
component-emitter "1.1.2"
3796-
debug "2.2.0"
3797-
isarray "0.0.1"
3798-
json3 "3.3.2"
3799-
38003694
socket.io-parser@~3.1.1:
38013695
version "3.1.2"
38023696
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:
42254119
version "0.0.6"
42264120
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
42274121

4228-
4229-
version "1.0.2"
4230-
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
4231-
42324122
ultron@~1.1.0:
42334123
version "1.1.1"
42344124
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
@@ -4427,13 +4317,6 @@ wrappy@1:
44274317
version "1.0.2"
44284318
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
44294319

4430-
4431-
version "1.1.1"
4432-
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018"
4433-
dependencies:
4434-
options ">=0.0.5"
4435-
ultron "1.0.x"
4436-
44374320
ws@~3.3.1:
44384321
version "3.3.3"
44394322
resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
@@ -4442,10 +4325,6 @@ ws@~3.3.1:
44424325
safe-buffer "~5.1.0"
44434326
ultron "~1.1.0"
44444327

4445-
4446-
version "1.0.0"
4447-
resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
4448-
44494328
"xml-name-validator@>= 2.0.1 < 3.0.0":
44504329
version "2.0.1"
44514330
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
@@ -4454,10 +4333,6 @@ [email protected]:
44544333
version "0.1.16"
44554334
resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.16.tgz#cf2602832b1ab5c3e6813fca08fe70196ba15e8c"
44564335

4457-
4458-
version "1.5.3"
4459-
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
4460-
44614336
xmlhttprequest-ssl@~1.5.4:
44624337
version "1.5.4"
44634338
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.4.tgz#04f560915724b389088715cc0ed7813e9677bf57"

0 commit comments

Comments
 (0)