From f5817803ee7cd6e39c688872c8b272351e33b9a4 Mon Sep 17 00:00:00 2001 From: Luke Sheard Date: Mon, 1 Aug 2016 16:57:10 -0400 Subject: [PATCH 1/3] Ask user for new port if in use --- lib/utils/develop.js | 60 ++++++++++++++++++++++++++++------------ lib/utils/serve-build.js | 54 ++++++++++++++++++++++++++---------- package.json | 2 ++ 3 files changed, 84 insertions(+), 32 deletions(-) diff --git a/lib/utils/develop.js b/lib/utils/develop.js index daa6e7c307c9e..103f34c6a9f1e 100644 --- a/lib/utils/develop.js +++ b/lib/utils/develop.js @@ -1,5 +1,6 @@ /* @flow weak */ require('node-cjsx').transform() +import detect from 'detect-port' import Hapi from 'hapi' import Boom from 'boom' import React from 'react' @@ -13,13 +14,20 @@ import WebpackPlugin from 'hapi-webpack-plugin' import opn from 'opn' import fs from 'fs' import glob from 'glob' +import rl from 'readline' + +const rlInterface = rl.createInterface({ + input: process.stdin, + output: process.stdout, +}) import globPages from './glob-pages' import webpackConfig from './webpack.config' const debug = require('debug')('gatsby:application') -module.exports = (program) => { +function startServer (program, launchPort) { const directory = program.directory + const serverPort = launchPort || program.port // Load pages for the site. return globPages(directory, (err, pages) => { @@ -46,11 +54,11 @@ module.exports = (program) => { const HTML = factory() debug('Configuring develop server') - // Setup and start Hapi to serve html + static files + webpack-hot-middleware. const server = new Hapi.Server() + server.connection({ host: program.host, - port: program.port, + port: serverPort, }) server.route({ @@ -82,7 +90,7 @@ module.exports = (program) => { path: '/{path*}', handler: { directory: { - path: `${directory}/pages`, + path: `${program.directory}/pages`, listing: false, index: false, }, @@ -96,7 +104,7 @@ module.exports = (program) => { const parsed = parsePath(request.path) const page = _.find(pages, (p) => p.path === (`${parsed.dirname}/`)) - let absolutePath = `${directory}/pages` + let absolutePath = `${program.directory}/pages` let path if (page) { path = `/${parsePath(page.requirePath).dirname}/${parsed.basename}` @@ -145,7 +153,7 @@ module.exports = (program) => { }, } - server.register({ + return server.register({ register: WebpackPlugin, options: { compiler, @@ -161,20 +169,13 @@ module.exports = (program) => { server.start((e) => { if (e) { if (e.code === 'EADDRINUSE') { - const finder = require('process-finder') - finder.find({ elevate: false, port: program.port }, (startErr, pids) => { - const msg = -`We were unable to start Gatsby on port ${program.port} as there's already a process -listening on that port (PID: ${pids[0]}). You can either use a different port -(e.g. gatsby develop --port ${parseInt(program.port, 10) + 1}) or stop the process already listening -on your desired port.` - console.log(msg) - process.exit() - }) + // eslint-disable-next-line max-len + console.log(`Unable to start Gatsby on port ${serverPort} as there's already a process listing on that port.`) } else { console.log(e) - process.exit() } + + process.exit() } else { if (program.open) { opn(server.info.uri) @@ -186,3 +187,28 @@ on your desired port.` }) }) } + +module.exports = (program) => { + detect(program.port, (err, _port) => { + if (err) { + console.error(err) + process.exit() + } + + if (program.port !== _port) { + // eslint-disable-next-line max-len + const question = `Something is already running at port ${program.port} \nWould you like to run the app at another port instead? [Y/n] ` + + return rlInterface.question(question, (answer) => { + let launchPort = program.port + if (answer.length === 0 || answer.match(/^yes|y$/i)) { + launchPort = _port + } + + return startServer(program, launchPort) + }) + } + + return startServer(program) + }) +} diff --git a/lib/utils/serve-build.js b/lib/utils/serve-build.js index 57fa03808c2c1..5caa02611149e 100644 --- a/lib/utils/serve-build.js +++ b/lib/utils/serve-build.js @@ -1,21 +1,26 @@ /* @flow weak */ +import detect from 'detect-port' import Hapi from 'hapi' import opn from 'opn' +import rl from 'readline' + +const rlInterface = rl.createInterface({ + input: process.stdin, + output: process.stdout, +}) const debug = require('debug')('gatsby:application') -module.exports = (program) => { +function startServer (program, launchPort) { const directory = program.directory + const serverPort = launchPort || program.port debug('Serving /public') - - // Setup and start Hapi to static files. - const server = new Hapi.Server() server.connection({ host: program.host, - port: program.port, + port: serverPort, }) server.route({ @@ -34,19 +39,13 @@ module.exports = (program) => { server.start((e) => { if (e) { if (e.code === 'EADDRINUSE') { - const finder = require('process-finder') - finder.find({ elevate: false, port: program.port }, (startErr, pids) => { - const msg = -`We were unable to start Gatsby on port ${program.port} as there's already a process -listening on that port (PID: ${pids[0]}). You can either use a different port -(e.g. gatsby serve-build --port ${parseInt(program.port, 10) + 1}) or stop the process -already listening on your desired port.` - console.log(msg) - process.exit() - }) + // eslint-disable-next-line max-len + console.log(`Unable to start Gatsby on port ${serverPort} as there's already a process listing on that port.`) } else { console.log(e) } + + process.exit() } else { if (program.open) { opn(server.info.uri) @@ -55,3 +54,28 @@ already listening on your desired port.` } }) } + +module.exports = (program) => { + detect(program.port, (err, _port) => { + if (err) { + console.error(err) + process.exit() + } + + if (program.port !== _port) { + // eslint-disable-next-line max-len + const question = `Something is already running at port ${program.port} \nWould you like to run the app at another port instead? [Y/n] ` + + return rlInterface.question(question, (answer) => { + let launchPort = program.port + if (answer.length === 0 || answer.match(/^yes|y$/i)) { + launchPort = _port + } + + return startServer(program, launchPort) + }) + } + + return startServer(program) + }) +} diff --git a/package.json b/package.json index 3e556351ce706..036d64da9ae02 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,14 @@ "babel-preset-react-hmre": "^1.1.1", "babel-preset-stage-0": "^6.5.0", "boom": "^2.7.2", + "chalk": "^1.1.3", "cjsx-loader": "^3.0.0", "coffee-loader": "^0.7.2", "coffee-script": "^1.9.3", "commander": "^2.9.0", "css-loader": "^0.23.1", "debug": "^2.2.0", + "detect-port": "^1.0.0", "extract-text-webpack-plugin": "^1.0.1", "file-loader": "^0.9.0", "front-matter": "^2.1.0", From d3c478f83e41ed04a69f893da895387d1c1a406f Mon Sep 17 00:00:00 2001 From: Luke Sheard Date: Mon, 1 Aug 2016 16:59:48 -0400 Subject: [PATCH 2/3] Remove dependencies --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 036d64da9ae02..0c32e81708454 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "babel-preset-react-hmre": "^1.1.1", "babel-preset-stage-0": "^6.5.0", "boom": "^2.7.2", - "chalk": "^1.1.3", "cjsx-loader": "^3.0.0", "coffee-loader": "^0.7.2", "coffee-script": "^1.9.3", @@ -60,7 +59,6 @@ "postcss-import": "^8.1.2", "postcss-loader": "^0.9.1", "postcss-reporter": "^1.4.1", - "process-finder": "^1.0.0", "raw-loader": "^0.5.1", "react": "^15.3.0", "react-document-title": "^2.0.1", From 52f414138d7b590b0b63ead31e79f6c6f72b1716 Mon Sep 17 00:00:00 2001 From: Luke Sheard Date: Sat, 6 Aug 2016 00:31:04 -0400 Subject: [PATCH 3/3] Add outcomes.com to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d5dbc269e48e5..ff399ddf4a534 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ it'll be converted to `/docs/index.html`. * [twnsnd.co](http://twnsnd.co/) * [Beau Han Xu](http://www.beauhanxu.com/) * [HalfAtheist](https://halfatheist.com/) ([source](https://github.com/halfatheist/halfatheist.github.io)) +* [Outcomes.com](https://www.outcomes.com/) * [Edit this file to add yours!](https://github.com/gatsbyjs/gatsby/blob/master/README.md) *Note, for the sites that have made their source available, you can