Skip to content

Commit 900bbe6

Browse files
committed
feat(recipes): Allow easy install of curated Browsersync recipes
1 parent 5e3bc5a commit 900bbe6

4 files changed

Lines changed: 66 additions & 1 deletion

File tree

bin/browser-sync.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ var compile = require("eazy-logger").compile;
88
var longest = require("longest");
99
var utils = require("../lib/utils");
1010
var logger = require("../lib/logger").logger;
11-
var cmdWhitelist = ["start", "init", "reload"];
11+
var cmdWhitelist = ["start", "init", "reload", "recipe"];
1212

1313
var cli = meow({
1414
pkg: "../package.json",

lib/cli/command.recipe.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
"use strict";
2+
var logger = require('../logger').logger;
3+
4+
/**
5+
* $ browser-sync recipe <name> <options>
6+
*
7+
* This command will copy a recipe into either the current directory
8+
* or one given with the --output flag
9+
*
10+
* @param opts
11+
* @returns {Function}
12+
*/
13+
module.exports = function (opts) {
14+
15+
var path = require('path');
16+
var fs = require('fs-extra');
17+
var input = opts.cli.input.slice(1);
18+
var resolved = require.resolve('bs-recipes');
19+
var dir = path.dirname(resolved);
20+
21+
var logRecipes = function (cb) {
22+
fs.readdir(path.join(dir, 'recipes'), function (err, output) {
23+
logger.info('Install one of the following with {cyan:browser-sync recipe <name>\n');
24+
output.forEach(function (name) {
25+
console.log(' ', name);
26+
});
27+
cb();
28+
});
29+
}
30+
31+
if (!input.length) {
32+
logger.info('No recipe name provided!');
33+
return logRecipes(opts.cb);
34+
}
35+
36+
input = input[0];
37+
var flags = opts.cli.flags;
38+
var output = flags.output ? path.resolve(flags.output) : path.join(process.cwd(), input);
39+
var targetDir = path.join(dir, 'recipes', input);
40+
41+
42+
if (fs.existsSync(output)) {
43+
return opts.cb(new Error("Target folder exists remove it first and then try again"));
44+
}
45+
46+
if (fs.existsSync(targetDir)) {
47+
fs.copy(targetDir, output, function (err) {
48+
if (err) {
49+
opts.cb(err);
50+
} else {
51+
logger.info('Recipe copied into {cyan:%s}', output);
52+
logger.info('Next, inside that folder, run {cyan:npm i && npm start}');
53+
opts.cb(null);
54+
}
55+
});
56+
} else {
57+
logger.info('Recipe {cyan:%s} not found. The following are available though', input);
58+
logRecipes();
59+
}
60+
};

lib/cli/opts.recipe.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"output": "Specify an output directory"
3+
}

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@
3434
"async-each-series": "^0.1.1",
3535
"browser-sync-client": "^2.3.3",
3636
"browser-sync-ui": "^0.5.16",
37+
"bs-recipes": "^1.0.5",
3738
"chokidar": "^1.0.5",
3839
"connect": "^3.4.0",
3940
"dev-ip": "^1.0.1",
4041
"easy-extender": "^2.3.1",
4142
"eazy-logger": "^2.1.2",
4243
"emitter-steward": "^1.0.0",
4344
"foxy": "^11.1.2",
45+
"fs-extra": "^0.26.2",
4446
"immutable": "^3.7.4",
4547
"localtunnel": "^1.7.0",
4648
"lodash": "^3.9.3",

0 commit comments

Comments
 (0)