utils.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var devIp = require("dev-ip");
  4. exports.devIp = devIp;
  5. var portScanner = require("portscanner");
  6. var path = require("path");
  7. var UAParser = require("ua-parser-js");
  8. exports.UAParser = UAParser;
  9. var Immutable = require("immutable");
  10. var immutable_1 = require("immutable");
  11. var _ = require("./lodash.custom");
  12. var parser = new UAParser();
  13. /**
  14. * @param {Object} options
  15. * @returns {String|boolean} - the IP address
  16. * @param devIp
  17. */
  18. function getHostIp(options, devIp) {
  19. if (options) {
  20. var host = options.get("host");
  21. if (host && host !== "localhost") {
  22. return host;
  23. }
  24. if (options.get("detect") === false || !devIp.length) {
  25. return false;
  26. }
  27. }
  28. return devIp.length ? devIp[0] : false;
  29. }
  30. exports.getHostIp = getHostIp;
  31. /**
  32. * Set URL Options
  33. */
  34. function getUrlOptions(options) {
  35. var scheme = options.get("scheme");
  36. var port = options.get("port");
  37. var urls = {};
  38. var listen = options.get("listen");
  39. if (options.get("online") === false || listen) {
  40. var host = listen || "localhost";
  41. urls.local = getUrl(scheme + "://" + host + ":" + port, options);
  42. return Immutable.fromJS(urls);
  43. }
  44. var fn = exports.getHostIp;
  45. var external = xip(fn(options, devIp()), options);
  46. var localhost = "localhost";
  47. if (options.get("xip")) {
  48. localhost = "127.0.0.1";
  49. }
  50. localhost = xip(localhost, options);
  51. return Immutable.fromJS(getUrls(external, localhost, scheme, options));
  52. }
  53. exports.getUrlOptions = getUrlOptions;
  54. /**
  55. * Append a start path if given in options
  56. * @param {String} url
  57. * @param {Object} options
  58. * @returns {String}
  59. */
  60. function getUrl(url, options) {
  61. var prefix = "/";
  62. var startPath = options.get("startPath");
  63. if (startPath) {
  64. if (startPath.charAt(0) === "/") {
  65. prefix = "";
  66. }
  67. url = url + prefix + startPath;
  68. }
  69. return url;
  70. }
  71. exports.getUrl = getUrl;
  72. /**
  73. * @param {String} external
  74. * @param {String} local
  75. * @param {String} scheme
  76. * @param {Object} options
  77. * @returns {{local: string, external: string}}
  78. */
  79. function getUrls(external, local, scheme, options) {
  80. var urls = {
  81. local: getUrl(_makeUrl(scheme, local, options.get("port")), options)
  82. };
  83. if (external !== local) {
  84. urls.external = getUrl(_makeUrl(scheme, external, options.get("port")), options);
  85. }
  86. return urls;
  87. }
  88. exports.getUrls = getUrls;
  89. /**
  90. * @param {String} scheme
  91. * @param {String} host
  92. * @param {Number} port
  93. * @returns {String}
  94. * @private
  95. */
  96. function _makeUrl(scheme, host, port) {
  97. return scheme + "://" + host + ":" + port;
  98. }
  99. exports._makeUrl = _makeUrl;
  100. /**
  101. * Get ports
  102. * @param {Object} options
  103. * @param {Function} cb
  104. */
  105. function getPorts(options, cb) {
  106. var port = options.get("port");
  107. var ports = options.get("ports"); // backwards compatibility
  108. var host = options.get("listen", "localhost"); // backwards compatibility
  109. var max;
  110. if (ports) {
  111. port = ports.get("min");
  112. max = ports.get("max") || null;
  113. }
  114. var fn = exports.getPort;
  115. fn(host, port, max, cb);
  116. }
  117. exports.getPorts = getPorts;
  118. function getPort(host, port, max, cb) {
  119. portScanner.findAPortNotInUse(port, max, {
  120. host: host,
  121. timeout: 1000
  122. }, cb);
  123. }
  124. exports.getPort = getPort;
  125. /**
  126. * @param {String} ua
  127. * @returns {Object}
  128. */
  129. function getUaString(ua) {
  130. return parser.setUA(ua).getBrowser();
  131. }
  132. exports.getUaString = getUaString;
  133. /**
  134. * Open the page in browser
  135. * @param {String} url
  136. * @param {Object} options
  137. * @param {BrowserSync} bs
  138. */
  139. function openBrowser(url, options, bs) {
  140. var open = options.get("open");
  141. var browser = options.get("browser");
  142. if (_.isString(open)) {
  143. if (options.getIn(["urls", open])) {
  144. url = options.getIn(["urls", open]);
  145. }
  146. }
  147. var fn = exports.opnWrapper;
  148. if (open) {
  149. if (browser !== "default") {
  150. if (exports.isList(browser)) {
  151. browser.forEach(function (browser) {
  152. fn(url, browser, bs);
  153. });
  154. }
  155. else {
  156. fn(url, browser, bs); // single
  157. }
  158. }
  159. else {
  160. fn(url, null, bs);
  161. }
  162. }
  163. }
  164. exports.openBrowser = openBrowser;
  165. /**
  166. * Wrapper for opn module
  167. * @param url
  168. * @param name
  169. * @param bs
  170. */
  171. function opnWrapper(url, name, bs) {
  172. var options = (function () {
  173. if (_.isString(name)) {
  174. return { app: name };
  175. }
  176. if (Immutable.Map.isMap(name)) {
  177. return name.toJS();
  178. }
  179. return {};
  180. })();
  181. var opn = require("opn");
  182. opn(url, options).catch(function () {
  183. bs.events.emit("browser:error");
  184. });
  185. }
  186. exports.opnWrapper = opnWrapper;
  187. /**
  188. * @param {Boolean} kill
  189. * @param {String|Error} [errMessage]
  190. * @param {Function} [cb]
  191. */
  192. function fail(kill, errMessage, cb) {
  193. if (kill) {
  194. if (_.isFunction(cb)) {
  195. if (errMessage.message) {
  196. // Is this an error object?
  197. cb(errMessage);
  198. }
  199. else {
  200. cb(new Error(errMessage));
  201. }
  202. }
  203. process.exit(1);
  204. }
  205. }
  206. exports.fail = fail;
  207. /**
  208. * Add support for xip.io urls
  209. * @param {String} host
  210. * @param {Object} options
  211. * @returns {String}
  212. */
  213. function xip(host, options) {
  214. var suffix = options.get("hostnameSuffix");
  215. if (options.get("xip")) {
  216. return host + ".xip.io";
  217. }
  218. if (suffix) {
  219. return host + suffix;
  220. }
  221. return host;
  222. }
  223. exports.xip = xip;
  224. /**
  225. * Determine if an array of file paths will cause a full page reload.
  226. * @param {Array} needles - filepath such as ["core.css", "index.html"]
  227. * @param {Array} haystack
  228. * @returns {Boolean}
  229. */
  230. function willCauseReload(needles, haystack) {
  231. return needles.some(function (needle) {
  232. return !_.includes(haystack, path.extname(needle).replace(".", ""));
  233. });
  234. }
  235. exports.willCauseReload = willCauseReload;
  236. exports.isList = Immutable.List.isList;
  237. exports.isMap = Immutable.Map.isMap;
  238. /**
  239. * @param {Map} options
  240. * @returns {Array}
  241. */
  242. function getConfigErrors(options) {
  243. var messages = require("./config").errors;
  244. var errors = [];
  245. if (options.get("server") && options.get("proxy")) {
  246. errors.push(messages["server+proxy"]);
  247. }
  248. return errors;
  249. }
  250. exports.getConfigErrors = getConfigErrors;
  251. /**
  252. * @param {Map} options
  253. * @param {Function} [cb]
  254. */
  255. function verifyConfig(options, cb) {
  256. var errors = getConfigErrors(options);
  257. if (errors.length) {
  258. fail(true, errors.join("\n"), cb);
  259. return false;
  260. }
  261. return true;
  262. }
  263. exports.verifyConfig = verifyConfig;
  264. function eachSeries(arr, iterator, callback) {
  265. callback = callback || function () {
  266. };
  267. var completed = 0;
  268. var iterate = function () {
  269. iterator(arr[completed], function (err) {
  270. if (err) {
  271. callback(err);
  272. callback = function () {
  273. };
  274. }
  275. else {
  276. ++completed;
  277. if (completed >= arr.length) {
  278. callback();
  279. }
  280. else {
  281. iterate();
  282. }
  283. }
  284. });
  285. };
  286. iterate();
  287. }
  288. exports.eachSeries = eachSeries;
  289. /**
  290. * @param {Immutable.List|Array|String} incoming
  291. * @returns {Array}
  292. */
  293. function arrayify(incoming) {
  294. if (immutable_1.List.isList(incoming)) {
  295. return incoming.toArray();
  296. }
  297. return [].concat(incoming).filter(Boolean);
  298. }
  299. exports.arrayify = arrayify;
  300. function defaultCallback(err) {
  301. if (err && err.message) {
  302. console.error(err.message);
  303. }
  304. }
  305. exports.defaultCallback = defaultCallback;
  306. exports.portscanner = portScanner;
  307. exports.connect = require("connect");
  308. exports.serveStatic = require("./server/serve-static-wrapper").default();
  309. exports.easyExtender = require("easy-extender");
  310. //# sourceMappingURL=utils.js.map