diff --git a/README.md b/README.md index be010a0..0737430 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,20 @@ To make the pre-render browser visible and you would be available to debug. To see all the options available see this [documentation](https://github.com/Tribex/prerenderer#prerendererrenderer-puppeteer-options) +### Renderer server configuration + +By default Prerender server start at first free port after 8000 as noted in [documentation](https://github.com/JoshTheDerf/prerenderer#server-options), but if your API require frontend to be run at specific port, you can pass server configuration as follows, + +```json +{ + "serverConfig": { + "port": 8100 + } +} +``` + +This might be helpful, for example, when API allows CORS headers only for requests from specific origins and not `http://localhost:8000` as in default configuration. + ## What is Prerendering? To quote [prerender-spa-plugin](https://github.com/chrisvfritz/prerender-spa-plugin/blob/master/README.md): @@ -84,5 +98,5 @@ To quote [prerender-spa-plugin](https://github.com/chrisvfritz/prerender-spa-plu ## Available Renderers -Currently only `@prerenderer/renderer-puppeteer` is supported, although `@prerenderer/renderer-jsdom` +Currently only `@prerenderer/renderer-puppeteer` is supported, although `@prerenderer/renderer-jsdom` will probably be supported in the future diff --git a/index.js b/index.js index 84e9cdf..bfa515c 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,7 @@ module.exports = function prerender(bundler) { const spinner = ora(chalk.grey('Prerendering')).start(); let routes = ['/']; // the default route let rendererConfig = {}; + let serverConfig = {}; const found = await cosmiconfig('prerender').search(); if (found) { const { config } = found; @@ -23,12 +24,14 @@ module.exports = function prerender(bundler) { routes = config; } else { if (config.rendererConfig) ({ rendererConfig } = config); + if (config.serverConfig) ({ serverConfig } = config); if (config.routes) ({ routes } = config); } } const { outDir } = bundler.options; const prerenderer = new Prerenderer({ staticDir: outDir, + server: serverConfig, renderer: new Puppeteer(rendererConfig), }); try { diff --git a/tests/index.test.js b/tests/index.test.js index 440d7b2..add9d26 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -3,6 +3,7 @@ const childProcess = require('child_process'); const { promisify } = require('util'); const { promises: fs } = require('fs'); const del = require('del'); +const detect = require('detect-port'); const exec = promisify(childProcess.exec); function runBuild(filename) { @@ -58,3 +59,11 @@ it('should run with an api call', async function () { expect(htmlFile).toEqual(expect.stringContaining('date of publication')); expect(htmlFile).toEqual(expect.stringContaining('Sample Slide Show')); }); + +it('should work with custom server port', async function () { + const config = { serverConfig: { port: await detect(8110) } }; + await fs.writeFile('.prerenderrc', JSON.stringify(config)); + await runBuild('basic.html'); + const htmlFile = await fs.readFile(pathJoin('dist', 'index.html'), 'utf-8'); + expect(htmlFile).toEqual(expect.stringContaining(`${baseRoute}/`)); +}) diff --git a/tests/package-lock.json b/tests/package-lock.json index 5998c94..f4e2a25 100644 --- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -1431,6 +1431,12 @@ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, "agent-base": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", @@ -3231,6 +3237,16 @@ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dev": true, + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, "diff-sequences": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", diff --git a/tests/package.json b/tests/package.json index fca1f12..d341457 100644 --- a/tests/package.json +++ b/tests/package.json @@ -7,6 +7,7 @@ "@abide-community/parcel-plugin-clean-out-dir": "^1.0.0", "cross-env": "^5.2.0", "del": "^5.0.0", + "detect-port": "^1.3.0", "jest": "^24.8.0", "parcel-bundler": "^1.12.3", "parcel-plugin-prerender": "file:../"