From 2ad7413dd718c9d5620f4847a40fa788a8f193b6 Mon Sep 17 00:00:00 2001 From: Endilie Yacop Sucipto Date: Thu, 7 Mar 2019 02:51:16 +0800 Subject: [PATCH] refactor(v2): determine all available routes/url (#1264) * refactor(v2): determine all available routes/url * nits * test(v2): routes snapshot * sort for consistent snapshot test due to async ordering --- v2/lib/core/sitemap.js | 15 ++----- v2/lib/load/index.js | 20 +++++---- v2/lib/load/routes.js | 18 ++++++-- v2/lib/webpack/server.js | 14 +----- v2/test/load/routes.test.js | 88 ++++++++++++++++++++++++++++++++++--- 5 files changed, 114 insertions(+), 41 deletions(-) diff --git a/v2/lib/core/sitemap.js b/v2/lib/core/sitemap.js index af5226d8f2..9fc441beeb 100644 --- a/v2/lib/core/sitemap.js +++ b/v2/lib/core/sitemap.js @@ -10,17 +10,8 @@ const loadConfig = require('../load/config'); module.exports = async function createSitemap({ siteConfig = {}, - docsMetadatas = {}, - pagesMetadatas = [], - // TODO: Generalize for blog plugin. - blogMetadatas = [], + routesPaths = [], }) { - const allMetadatas = [ - ...blogMetadatas, - ...Object.values(docsMetadatas), - ...pagesMetadatas, - ]; - const {url: siteUrl} = siteConfig; if (!siteUrl) { @@ -29,8 +20,8 @@ module.exports = async function createSitemap({ ); } - const urls = allMetadatas.map(metadata => ({ - url: metadata.permalink, + const urls = routesPaths.map(routesPath => ({ + url: routesPath, changefreq: 'weekly', priority: 0.5, })); diff --git a/v2/lib/load/index.js b/v2/lib/load/index.js index edd8203a6f..b22a28ced4 100644 --- a/v2/lib/load/index.js +++ b/v2/lib/load/index.js @@ -13,7 +13,7 @@ const loadEnv = require('./env'); const loadPages = require('./pages'); const loadTheme = require('./theme'); const {generate} = require('./utils'); -const genRoutesConfig = require('./routes'); +const loadRoutes = require('./routes'); const constants = require('../constants'); module.exports = async function load(siteDir) { @@ -96,6 +96,7 @@ module.exports = async function load(siteDir) { }); // Plugin lifecycle - loadContents(). + // TODO: consider whether we still need contentsStore since it is not being used elsewhere now const contentsStore = {}; // Currently plugins run lifecycle in parallel and are not order-dependent. We could change // this in future if there are plugins which need to run in certain order or depend on @@ -153,6 +154,15 @@ module.exports = async function load(siteDir) { const versionedDir = path.join(siteDir, 'versioned_docs'); const translatedDir = path.join(siteDir, 'translated_docs'); + // Generate React Router Config. + const {routesConfig, routesPaths} = await loadRoutes({ + siteConfig, + docsMetadatas, + pagesMetadatas, + pluginRouteConfigs, + }); + await generate(generatedFilesDir, 'routes.js', routesConfig); + const props = { siteConfig, siteDir, @@ -170,14 +180,8 @@ module.exports = async function load(siteDir) { translatedDir, generatedFilesDir, contentsStore, + routesPaths, }; - // Generate React Router Config. - const routesConfig = await genRoutesConfig({ - ...props, - pluginRouteConfigs, - }); - await generate(generatedFilesDir, 'routes.js', routesConfig); - return props; }; diff --git a/v2/lib/load/routes.js b/v2/lib/load/routes.js index 310e870faf..7f1e42ecbf 100644 --- a/v2/lib/load/routes.js +++ b/v2/lib/load/routes.js @@ -7,7 +7,7 @@ const {normalizeUrl} = require('./utils'); -async function genRoutesConfig({ +async function loadRoutes({ siteConfig = {}, docsMetadatas = {}, pagesMetadatas = [], @@ -23,10 +23,18 @@ async function genRoutesConfig({ `import NotFound from '@theme/NotFound';`, ]; + const routesPaths = []; + const addRoutesPath = permalink => { + if (permalink && !/:|\*/.test(permalink)) { + routesPaths.push(permalink); + } + }; + // Docs. const {docsUrl, baseUrl} = siteConfig; function genDocsRoute(metadata) { const {permalink, source} = metadata; + addRoutesPath(permalink); return ` { path: '${permalink}', @@ -59,6 +67,7 @@ async function genRoutesConfig({ // Pages. function genPagesRoute(metadata) { const {permalink, source} = metadata; + addRoutesPath(permalink); return ` { path: '${permalink}', @@ -86,6 +95,7 @@ async function genRoutesConfig({ const routes = pluginRouteConfigs.map(pluginRouteConfig => { const {path, component, metadata, modules} = pluginRouteConfig; + addRoutesPath(path); return ` { path: '${path}', @@ -117,7 +127,7 @@ ${modules }`; }); - return ` + const routesConfig = ` ${imports.join('\n')} const routes = [ @@ -131,6 +141,8 @@ const routes = [ ]; export default routes;\n`; + + return {routesConfig, routesPaths}; } -module.exports = genRoutesConfig; +module.exports = loadRoutes; diff --git a/v2/lib/webpack/server.js b/v2/lib/webpack/server.js index 72c62e0a2f..816b1effd3 100644 --- a/v2/lib/webpack/server.js +++ b/v2/lib/webpack/server.js @@ -5,7 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -const _ = require('lodash'); const path = require('path'); const StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin'); const webpackNiceLog = require('webpack-nicelog'); @@ -22,25 +21,16 @@ module.exports = function createServerConfig(props) { // Workaround for Webpack 4 Bug (https://github.com/webpack/webpack/issues/6522) config.output.globalObject('this'); - const {siteConfig, docsMetadatas, pagesMetadatas, contentsStore} = props; + const {siteConfig, routesPaths} = props; // Static site generator webpack plugin. - const docsFlatMetadatas = Object.values(docsMetadatas); - - // TODO: Generalize for blog plugin. - const blogPermalinks = _.get(contentsStore, ['blog', 'contents'], []); - const paths = [ - ...blogPermalinks, - ...docsFlatMetadatas, - ...pagesMetadatas, - ].map(data => data.permalink); config.plugin('siteGenerator').use(StaticSiteGeneratorPlugin, [ { entry: 'main', locals: { baseUrl: siteConfig.baseUrl, }, - paths, + paths: routesPaths, }, ]); diff --git a/v2/test/load/routes.test.js b/v2/test/load/routes.test.js index 385f9f949f..cfc967a140 100644 --- a/v2/test/load/routes.test.js +++ b/v2/test/load/routes.test.js @@ -5,27 +5,103 @@ * LICENSE file in the root directory of this source tree. */ -import genRoutesConfig from '@lib/load/routes'; +import loadRoutes from '@lib/load/routes'; import loadSetup from '../loadSetup'; -describe('genRoutesConfig', () => { +describe('loadRoutes', () => { test('simple website', async () => { const props = await loadSetup('simple'); - await genRoutesConfig(props); + const {routesPaths} = await loadRoutes(props); + expect(routesPaths.length).toBeGreaterThan(0); + expect(routesPaths.sort()).toMatchInlineSnapshot(` +Array [ + "/", + "/docs/endiliey/permalink", + "/docs/foo/bar", + "/docs/foo/baz", + "/docs/hello", + "/hello/world", +] +`); }); test('versioned website', async () => { const props = await loadSetup('versioned'); - await genRoutesConfig(props); + const {routesPaths} = await loadRoutes(props); + expect(routesPaths.length).toBeGreaterThan(0); + expect(routesPaths.sort()).toMatchInlineSnapshot(` +Array [ + "/", + "/docs/1.0.0/foo/bar", + "/docs/1.0.0/foo/baz", + "/docs/1.0.0/hello", + "/docs/foo/bar", + "/docs/foo/baz", + "/docs/hello", + "/docs/next/endiliey/permalink", + "/docs/next/foo/bar", + "/docs/next/foo/baz", + "/docs/next/hello", + "/hello/world", +] +`); }); test('versioned & translated website', async () => { const props = await loadSetup('transversioned'); - await genRoutesConfig(props); + const {routesPaths} = await loadRoutes(props); + expect(routesPaths.length).toBeGreaterThan(0); + expect(routesPaths.sort()).toMatchInlineSnapshot(` +Array [ + "/", + "/docs/en/1.0.0/foo/bar", + "/docs/en/1.0.0/foo/baz", + "/docs/en/1.0.0/hello", + "/docs/en/foo/bar", + "/docs/en/foo/baz", + "/docs/en/hello", + "/docs/en/next/endiliey/permalink", + "/docs/en/next/foo/bar", + "/docs/en/next/foo/baz", + "/docs/en/next/hello", + "/docs/ko/1.0.0/foo/bar", + "/docs/ko/1.0.0/foo/baz", + "/docs/ko/1.0.0/hello", + "/docs/ko/foo/bar", + "/docs/ko/foo/baz", + "/docs/ko/hello", + "/docs/ko/next/foo/bar", + "/docs/ko/next/foo/baz", + "/docs/ko/next/hello", + "/en/", + "/en/hello/world", + "/hello/world", + "/ko/", + "/ko/hello/world", +] +`); }); test('translated website', async () => { const props = await loadSetup('translated'); - await genRoutesConfig(props); + const {routesPaths} = await loadRoutes(props); + expect(routesPaths.length).toBeGreaterThan(0); + expect(routesPaths.sort()).toMatchInlineSnapshot(` +Array [ + "/", + "/docs/en/endiliey/permalink", + "/docs/en/foo/bar", + "/docs/en/foo/baz", + "/docs/en/hello", + "/docs/ko/foo/bar", + "/docs/ko/foo/baz", + "/docs/ko/hello", + "/en/", + "/en/hello/world", + "/hello/world", + "/ko/", + "/ko/hello/world", +] +`); }); });