Skip to content

Commit c0fe70d

Browse files
committed
feat(commands): Add reload command for http-protocol comms
1 parent db8673a commit c0fe70d

File tree

15 files changed

+132
-82
lines changed

15 files changed

+132
-82
lines changed

bin/browser-sync.js

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ var fs = require("fs");
66
var path = require("path");
77
var compile = require("eazy-logger").compile;
88
var utils = require("../lib/utils");
9-
var flags = require("../lib/cli/opts");
10-
var flagKeys = Object.keys(flags);
11-
9+
var logger = require("../lib/logger").logger;
1210
var cmdWhitelist = ["start", "init", "reload"];
1311

1412
var cli = meow({
@@ -29,20 +27,23 @@ if (!module.parent) {
2927
* @returns {String}
3028
*/
3129
function getHelpText(filepath) {
32-
return compile(
33-
fs.readFileSync(
34-
filepath,
35-
"utf8"
36-
).replace(
37-
"%flags%",
38-
listFlags(
39-
flags,
40-
longest(
41-
flagKeys
42-
).length
43-
)
44-
)
45-
);
30+
31+
/**
32+
* Help text template
33+
*/
34+
var template = fs.readFileSync(filepath, "utf8");
35+
36+
cmdWhitelist.forEach(function (command) {
37+
38+
var flags = require("../lib/cli/opts." + command + ".json");
39+
40+
template = template.replace(
41+
["%", command, "flags%"].join(""),
42+
listFlags(flags)
43+
);
44+
});
45+
46+
return compile(template);
4647
}
4748

4849
/**
@@ -54,7 +55,6 @@ function handleCli (opts) {
5455
opts.cb = opts.cb || utils.defaultCallback;
5556

5657
var input = opts.cli.input;
57-
var flags = opts.cli.flags;
5858

5959
if (!opts.whitelist) {
6060
opts.whitelist = cmdWhitelist;
@@ -64,24 +64,28 @@ function handleCli (opts) {
6464
return console.log(opts.cli.help);
6565
}
6666

67-
if (input[0] === "start") {
68-
require("../lib/cli/command.start")(opts);
69-
}
70-
71-
if (input[0] === "init") {
72-
require("../lib/cli/command.init")(opts);
67+
if (!require("../lib/cli/cli-utils").verifyOpts(input[0], opts.cli.flags)) {
68+
logger.info("For help, run: {cyan:browser-sync --help}");
69+
return opts.cb(new Error("Unknown flag given. Please refer to the documentation for help."));
7370
}
7471

72+
return require("../lib/cli/command." + input[0])(opts);
7573
}
7674

7775
/**
7876
* @param {Object} flags
79-
* @param {Number} longest
80-
* @returns {String}
8177
*/
82-
function listFlags (flags, longest) {
78+
function listFlags (flags) {
79+
80+
var flagKeys = Object.keys(flags);
81+
var longest = getLongest(Object.keys(flags));
82+
83+
if (!longest || !longest.length) {
84+
return;
85+
}
86+
8387
return flagKeys.reduce(function (all, item) {
84-
return all + " {bold:--" + item + "}" + getPadding(item.length, longest + 8) + flags[item] + "\n";
88+
return all + " {bold:--" + item + "}" + getPadding(item.length, longest.length + 8) + flags[item] + "\n";
8589
}, "");
8690
}
8791

@@ -98,7 +102,7 @@ function getPadding (len, max) {
98102
* @param {Array} arr
99103
* @returns {String}
100104
*/
101-
function longest (arr) {
105+
function getLongest (arr) {
102106
return arr.sort(function (a, b) { return b.length - a.length; })[0];
103107
}
104108

lib/async.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,16 +234,12 @@ module.exports = {
234234
*/
235235
addHttpProtocol: function (bs, done) {
236236

237-
if (!bs.options.get("httpProtocol")) {
238-
return done(null);
239-
}
240-
241237
/**
242238
* Add a middleware to listen to http
243239
* requests in the BrowserSync http protocol namespace
244240
*/
245241
bs.addMiddleware(
246-
bs.options.getIn(["httpProtocol", "path"]),
242+
require("./config").httpProtocol.path,
247243
require("./http-protocol").middleware(bs),
248244
{override: true}
249245
);

lib/cli/cli-utils.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
var utils = exports;
44
var logger = require("../logger").logger;
5-
var flags = require("./opts.json");
6-
var flagKeys = Object.keys(flags);
75
var _ = require("lodash");
86

9-
utils.verifyOpts = function (flagWhitelist, cliFlags) {
7+
utils.verifyOpts = function (optskey, cliFlags) {
8+
9+
var flags = require("./opts." + optskey + ".json");
10+
var flagKeys = Object.keys(flags);
11+
var flagWhitelist = flagKeys.map(dropPrefix).map(_.camelCase);
1012

1113
return Object.keys(cliFlags).every(function (key) {
1214

@@ -19,3 +21,11 @@ utils.verifyOpts = function (flagWhitelist, cliFlags) {
1921
return false;
2022
});
2123
};
24+
25+
/**
26+
* @param {String} item
27+
* @returns {String}
28+
*/
29+
function dropPrefix (item) {
30+
return item.replace("no-", "");
31+
}

lib/cli/command.reload.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"use strict";
2+
3+
var error = "Could not contact BrowserSync server.";
4+
5+
/**
6+
* $ browser-sync reload <options>
7+
*
8+
* This commands starts the BrowserSync servers
9+
* & Optionally UI.
10+
*
11+
* @param opts
12+
* @returns {Function}
13+
*/
14+
module.exports = function (opts) {
15+
16+
var flags = opts.cli.flags;
17+
var proto = require("../http-protocol");
18+
19+
var url = proto.getUrl({method: "reload", args: flags.files}, "http://localhost:" + (flags.port || 3000));
20+
21+
require("http").get(url, function (res) {
22+
if (res.statusCode !== 200) {
23+
require("logger").logger.error(error);
24+
return opts.cb(new Error(error));
25+
} else {
26+
opts.cb(null, res);
27+
}
28+
});
29+
};

lib/cli/command.start.js

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
"use strict";
22

3-
var logger = require("../logger").logger;
4-
var info = require("./cli-info");
5-
var flags = require("./opts.json");
6-
var _ = require("lodash");
7-
var flagKeys = Object.keys(flags);
8-
var flagWhitelist = flagKeys.map(dropPrefix).map(_.camelCase);
3+
var info = require("./cli-info");
94

105
/**
116
* $ browser-sync start <options>
@@ -20,20 +15,7 @@ module.exports = function (opts) {
2015

2116
var flags = opts.cli.flags;
2217

23-
if (!require("./cli-utils").verifyOpts(flagWhitelist, flags)) {
24-
logger.info("For help, run: {cyan:browser-sync --help}");
25-
return opts.cb(new Error("Unknown flag given. Please refer to the documentation for help."));
26-
}
27-
2818
return require("../../")
2919
.create("cli")
3020
.init(flags.config ? info.getConfigFile(flags.config) : flags, opts.cb);
3121
};
32-
33-
/**
34-
* @param {String} item
35-
* @returns {String}
36-
*/
37-
function dropPrefix (item) {
38-
return item.replace("no-", "");
39-
}

lib/cli/help.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@
88

99
{bold:init} Creates a default config file
1010
{bold:start} Start Browser Sync
11+
{bold:reload} Send a reload event over HTTP protocol
1112

12-
{bold:Options:}
13+
{bold:`start` Options:}
1314
{gray:--------}
1415

15-
%flags%
16+
%startflags%
17+
18+
{bold:`reload` Options:}
19+
{gray:--------}
20+
21+
%reloadflags%
1622

1723
{cyan:Server Example:}
1824
{gray:---------------}

lib/cli/opts.init.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

lib/cli/opts.reload.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"files": "File paths to reload",
3+
"port": "Target a running instance by port number"
4+
}
File renamed without changes.

lib/config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ module.exports = {
1717
configFile: "/default-config.js",
1818
userFile: "/bs-config.js",
1919
template: "/cli-template.js",
20+
httpProtocol: {
21+
path: "/__browser_sync__"
22+
},
2023
client: {
2124
shims: "/client/client-shims.js"
2225
},

0 commit comments

Comments
 (0)