diff --git a/gridsome/lib/develop.js b/gridsome/lib/develop.js index 5b3cf414e..af2b96a49 100644 --- a/gridsome/lib/develop.js +++ b/gridsome/lib/develop.js @@ -22,8 +22,6 @@ module.exports = async (context, args) => { const urls = prepareUrls(hostname, port) const server = new Server(app, urls) - await app.plugins.configureServer(server) - await fs.emptyDir(app.config.cacheDir) const webpackConfig = await createWebpackConfig(app) diff --git a/gridsome/lib/serve.js b/gridsome/lib/serve.js index 7ab28f0cb..91345a850 100644 --- a/gridsome/lib/serve.js +++ b/gridsome/lib/serve.js @@ -22,7 +22,6 @@ module.exports = async (context, args) => { const { config } = app await app.plugins.run('beforeServe', { context, config }) - await app.plugins.configureServer(server) await fs.ensureDir(config.cacheDir) await fs.emptyDir(config.outDir) diff --git a/gridsome/lib/server/Server.js b/gridsome/lib/server/Server.js index 908661081..e4143832e 100644 --- a/gridsome/lib/server/Server.js +++ b/gridsome/lib/server/Server.js @@ -19,7 +19,7 @@ class Server { } } - createExpressApp() { + async createExpressApp() { const isDev = process.env.NODE_ENV === 'development' const app = express() @@ -79,7 +79,12 @@ class Server { const assetsPath = forwardSlash(path.join(this._app.config.pathPrefix, assetsDir)) const assetsRE = new RegExp(`${assetsPath}/(files|static)/(.*)`) - app.get(assetsRE, assetsMiddleware(this._app)) + if (!process.env.GRIDSOME_TEST) { + app.get(assetsRE, assetsMiddleware(this._app)) + } + + await this._app.plugins.configureServer(app) + app.use(historyApiFallback()) this.hooks.afterSetup.call(app) @@ -88,7 +93,7 @@ class Server { } async listen(port, hostname, callback) { - const app = this.createExpressApp() + const app = await this.createExpressApp() const server = http.createServer(app) if (process.env.NODE_ENV === 'development') { diff --git a/gridsome/lib/server/__tests__/Server.spec.js b/gridsome/lib/server/__tests__/Server.spec.js new file mode 100644 index 000000000..f503da7b6 --- /dev/null +++ b/gridsome/lib/server/__tests__/Server.spec.js @@ -0,0 +1,30 @@ +const Server = require('../Server') +const App = require('../../app/App') +const request = require('supertest') +const { prepareUrls } = require('../utils') +const { BOOTSTRAP_CONFIG } = require('../../utils/constants') + +test('api.configureServer()', async () => { + const urls = prepareUrls('localhost', 8080) + const callback = jest.fn((req, res) => res.send('Hello, world!')) + const gridsome = await createApp(function (api) { + api.configureServer(app => { + app.get('/my-endpoint', callback) + }) + }) + + const server = new Server(gridsome, urls) + const app = await server.createExpressApp() + const res = await request(app).get('/my-endpoint') + + expect(res.text).toEqual('Hello, world!') + expect(callback.mock.calls).toHaveLength(1) +}) + +async function createApp(plugin) { + const app = await new App(__dirname, { + localConfig: { plugins: plugin ? [plugin] : [] } + }) + + return app.bootstrap(BOOTSTRAP_CONFIG) +} diff --git a/package.json b/package.json index 0c53bcf43..1f91b8b4f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "lerna": "^3.4.0", "memfs": "^2.9.4", "minimist": "^1.2.0", - "puppeteer": "^1.12.2" + "puppeteer": "^1.12.2", + "supertest": "^4.0.2" }, "engines": { "node": ">=8.3", diff --git a/yarn.lock b/yarn.lock index a104304fa..8f83c2af8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4166,7 +4166,7 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookiejar@^2.1.2: +cookiejar@^2.1.0, cookiejar@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== @@ -6121,7 +6121,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.3.3: +form-data@^2.3.1, form-data@^2.3.3: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== @@ -9203,7 +9203,7 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.4.tgz#c9269589e6885a60cf80605d9522d4b67ca646e3" integrity sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A== -methods@^1.1.1, methods@~1.1.2: +methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= @@ -9252,7 +9252,7 @@ mime-types@^2.1.12, mime-types@^2.1.21, mime-types@^2.1.24, mime-types@~2.1.19, dependencies: mime-db "1.40.0" -mime@1.6.0: +mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -11307,7 +11307,7 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.5.2, qs@^6.6.0: +qs@^6.5.1, qs@^6.5.2, qs@^6.6.0: version "6.8.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.8.0.tgz#87b763f0d37ca54200334cd57bb2ef8f68a1d081" integrity sha512-tPSkj8y92PfZVbinY1n84i1Qdx75lZjMQYx9WZhnkofyxzw2r7Ho39G3/aEvSUdebxpnnM4LZJCtvE/Aq3+s9w== @@ -12813,6 +12813,22 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +superagent@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + superagent@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/superagent/-/superagent-4.1.0.tgz#c465c2de41df2b8d05c165cbe403e280790cdfd5" @@ -12828,6 +12844,14 @@ superagent@^4.0.0: qs "^6.6.0" readable-stream "^3.0.6" +supertest@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" + integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== + dependencies: + methods "^1.1.2" + superagent "^3.8.3" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"