From c26429f9b2cfcbc7038e3fcba899a0b0639c83b4 Mon Sep 17 00:00:00 2001 From: Yangshun Tay Date: Sat, 13 Apr 2019 21:13:49 -0700 Subject: [PATCH 1/7] v2(feat): convert blog to view-driven content queries --- .../src/index.js | 22 +++++++- packages/docusaurus-utils/src/index.js | 4 +- .../lib/client/exports/ContentRenderer.js | 37 ++++++++++++++ .../lib/default-theme/BlogPost/index.js | 51 +++++++++++-------- packages/docusaurus/lib/server/load/index.js | 19 +++++-- .../docusaurus/lib/server/load/plugins.js | 7 +++ packages/docusaurus/lib/server/load/routes.js | 42 +++++++++------ 7 files changed, 138 insertions(+), 44 deletions(-) create mode 100644 packages/docusaurus/lib/client/exports/ContentRenderer.js diff --git a/packages/docusaurus-plugin-content-blog/src/index.js b/packages/docusaurus-plugin-content-blog/src/index.js index 3227379059e3..620ad3faf375 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.js +++ b/packages/docusaurus-plugin-content-blog/src/index.js @@ -121,7 +121,7 @@ class DocusaurusPluginContentBlog { async contentLoaded({content, actions}) { const {blogPageComponent, blogPostComponent} = this.options; - const {addRoute} = actions; + const {addContent, addRoute} = actions; content.forEach(metadataItem => { const {isBlogPage, permalink} = metadataItem; if (isBlogPage) { @@ -136,6 +136,18 @@ class DocusaurusPluginContentBlog { }, })), }); + + addContent(permalink, { + metadata: metadataItem, + posts: metadataItem.posts.map(item => ({ + id: item.source, + query: { + truncated: true, + }, + __async: true, + })), + }); + return; } @@ -145,6 +157,14 @@ class DocusaurusPluginContentBlog { metadata: metadataItem, modules: [metadataItem.source], }); + + addContent(permalink, { + metadata: metadataItem, + contents: { + id: metadataItem.source, + __async: true, + }, + }); }); } diff --git a/packages/docusaurus-utils/src/index.js b/packages/docusaurus-utils/src/index.js index df9025de2689..d933ccae1f1e 100644 --- a/packages/docusaurus-utils/src/index.js +++ b/packages/docusaurus-utils/src/index.js @@ -47,7 +47,7 @@ function encodePath(userpath) { */ function docuHash(str) { if (str === '/') { - return 'Index'; + return 'index'; } const shortHash = createHash('md5') .update(str) @@ -63,7 +63,7 @@ function docuHash(str) { */ function genComponentName(pagePath) { if (pagePath === '/') { - return 'Index'; + return 'index'; } const pageHash = docuHash(pagePath); const pascalCase = _.flow( diff --git a/packages/docusaurus/lib/client/exports/ContentRenderer.js b/packages/docusaurus/lib/client/exports/ContentRenderer.js new file mode 100644 index 000000000000..5f6b17c982e4 --- /dev/null +++ b/packages/docusaurus/lib/client/exports/ContentRenderer.js @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import routesAsyncModules from '@generated/routesAsyncModules'; +import Loadable from 'react-loadable'; +import Loading from '@theme/Loading'; +import registry from '@generated/registry'; + +function ContentRenderer(props) { + const {query, render} = props; + const {id} = query; + const modules = routesAsyncModules[id]; + const mappedModules = {}; + Object.keys(modules).map(key => { + mappedModules[key] = registry[modules[key]]; + }); + + const LoadableComponent = Loadable.Map({ + loading: Loading, + loader: mappedModules, + render: loaded => { + Object.keys(loaded).map(key => { + loaded[key] = loaded[key].default; + }); + return render(loaded, props); + }, + }); + + return ; +} + +export default ContentRenderer; diff --git a/packages/docusaurus/lib/default-theme/BlogPost/index.js b/packages/docusaurus/lib/default-theme/BlogPost/index.js index 7079073d63ed..ac0ac26182ef 100644 --- a/packages/docusaurus/lib/default-theme/BlogPost/index.js +++ b/packages/docusaurus/lib/default-theme/BlogPost/index.js @@ -8,6 +8,7 @@ import React, {useContext} from 'react'; import Head from '@docusaurus/Head'; +import ContentRenderer from '@docusaurus/ContentRenderer'; import Layout from '@theme/Layout'; // eslint-disable-line import Footer from '@theme/Footer'; // eslint-disable-line import DocusaurusContext from '@docusaurus/context'; @@ -19,29 +20,37 @@ function BlogPost(props) { ); const {baseUrl, favicon} = siteConfig; const {language, title} = contextMetadata; - const {modules, metadata} = props; - const BlogPostContents = modules[0]; return ( - - - {title && {title}} - {favicon && } - {language && } - - {BlogPostContents && ( -
-
-
- - - -
-
-
- )} -