diff --git a/packages/docusaurus-preset-classic/src/index.js b/packages/docusaurus-preset-classic/src/index.js index 6aba831a2a..a3f7ef8f56 100644 --- a/packages/docusaurus-preset-classic/src/index.js +++ b/packages/docusaurus-preset-classic/src/index.js @@ -11,6 +11,9 @@ module.exports = function preset(context, opts = {}) { { name: '@docusaurus/theme-classic', }, + { + name: '@docusaurus/theme-search-algolia', + }, ], plugins: [ { diff --git a/packages/docusaurus-theme-classic/src/index.js b/packages/docusaurus-theme-classic/src/index.js index 9fafacab35..f47388e6c2 100644 --- a/packages/docusaurus-theme-classic/src/index.js +++ b/packages/docusaurus-theme-classic/src/index.js @@ -9,7 +9,7 @@ const path = require('path'); const DEFAULT_OPTIONS = {}; -class DocusaurusThemeDefault { +class DocusaurusThemeClassic { constructor(context, opts) { this.options = {...DEFAULT_OPTIONS, ...opts}; this.context = context; @@ -24,4 +24,4 @@ class DocusaurusThemeDefault { } } -module.exports = DocusaurusThemeDefault; +module.exports = DocusaurusThemeClassic; diff --git a/packages/docusaurus-theme-classic/src/theme/Navbar/index.js b/packages/docusaurus-theme-classic/src/theme/Navbar/index.js index c194addf04..82cc870ae0 100644 --- a/packages/docusaurus-theme-classic/src/theme/Navbar/index.js +++ b/packages/docusaurus-theme-classic/src/theme/Navbar/index.js @@ -10,9 +10,9 @@ import React from 'react'; import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Search from '@theme/Search'; +import SearchBar from '@theme/SearchBar'; -function Navbar(props) { +function Navbar() { const context = useDocusaurusContext(); const {siteConfig = {}} = context; // TODO: navbar headerlinks should depends on theme, not siteConfig; @@ -20,7 +20,7 @@ function Navbar(props) { baseUrl, headerLinks, headerIcon, - algolia, + themeConfig: {algolia}, title, disableHeaderTitle, } = siteConfig; @@ -41,8 +41,9 @@ function Navbar(props) { ); } + if (link.href) { - // set link to specified href + // Set link to specified href. return (
@@ -51,6 +52,7 @@ function Navbar(props) {
); } + return null; }; @@ -73,7 +75,7 @@ function Navbar(props) {
{algolia && (
- +
)}
diff --git a/packages/docusaurus-theme-classic/src/theme/SearchBar.js b/packages/docusaurus-theme-classic/src/theme/SearchBar.js new file mode 100644 index 0000000000..b2c2e8a7e2 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/SearchBar.js @@ -0,0 +1,8 @@ +/** + * 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. + */ + +export {default} from '@docusaurus/Noop'; diff --git a/packages/docusaurus-theme-search-algolia/package.json b/packages/docusaurus-theme-search-algolia/package.json new file mode 100644 index 0000000000..868570e1d4 --- /dev/null +++ b/packages/docusaurus-theme-search-algolia/package.json @@ -0,0 +1,21 @@ +{ + "name": "@docusaurus/theme-search-algolia", + "version": "2.0.0-alpha.13", + "description": "Algolia search component for Docusaurus", + "main": "src/index.js", + "publishConfig": { + "access": "public" + }, + "license": "MIT", + "dependencies": { + "docsearch.js": "^2.5.2" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0", + "react": "^16.8.4", + "react-dom": "^16.8.4" + }, + "engines": { + "node": ">=8" + } +} diff --git a/packages/docusaurus-theme-search-algolia/src/index.js b/packages/docusaurus-theme-search-algolia/src/index.js new file mode 100644 index 0000000000..d7f3838ed0 --- /dev/null +++ b/packages/docusaurus-theme-search-algolia/src/index.js @@ -0,0 +1,27 @@ +/** + * 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. + */ + +const path = require('path'); + +const DEFAULT_OPTIONS = {}; + +class DocusaurusThemeSearchAlgolia { + constructor(context, opts) { + this.options = {...DEFAULT_OPTIONS, ...opts}; + this.context = context; + } + + getName() { + return 'docusaurus-theme-search-algolia'; + } + + getThemePath() { + return path.resolve(__dirname, './theme'); + } +} + +module.exports = DocusaurusThemeSearchAlgolia; diff --git a/packages/docusaurus-theme-classic/src/theme/Search/index.js b/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js similarity index 96% rename from packages/docusaurus-theme-classic/src/theme/Search/index.js rename to packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js index 196378cf63..903dd696e8 100644 --- a/packages/docusaurus-theme-classic/src/theme/Search/index.js +++ b/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js @@ -22,7 +22,9 @@ class Search extends React.Component { componentDidMount() { const {siteConfig = {}, metadata = {}} = this.context; const {version: thisVersion, language: thisLanguage} = metadata; - const {algolia} = siteConfig; + const { + themeConfig: {algolia}, + } = siteConfig; // https://github.com/algolia/docsearch/issues/352 const isClient = typeof window !== 'undefined'; diff --git a/packages/docusaurus-theme-classic/src/theme/Search/styles.css b/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/styles.css similarity index 100% rename from packages/docusaurus-theme-classic/src/theme/Search/styles.css rename to packages/docusaurus-theme-search-algolia/src/theme/SearchBar/styles.css diff --git a/packages/docusaurus/CHANGES.md b/packages/docusaurus/CHANGES.md index 00c4d45bcc..4fb5fc1714 100644 --- a/packages/docusaurus/CHANGES.md +++ b/packages/docusaurus/CHANGES.md @@ -15,10 +15,6 @@ headerLinks: [ { url: "help", label: "Help" }, // Links to href destination/ external page { href: "https://github.com/", label: "GitHub" }, - // Determines search bar position among links - { search: true }, - // Determines language drop down position among links - { languages: true } ], ``` diff --git a/packages/docusaurus/lib/client/exports/Noop.js b/packages/docusaurus/lib/client/exports/Noop.js new file mode 100644 index 0000000000..5ab81b41d6 --- /dev/null +++ b/packages/docusaurus/lib/client/exports/Noop.js @@ -0,0 +1,8 @@ +/** + * 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. + */ + +export default () => null; diff --git a/packages/docusaurus/lib/server/index.js b/packages/docusaurus/lib/server/index.js index 244e4b958c..4e87106316 100644 --- a/packages/docusaurus/lib/server/index.js +++ b/packages/docusaurus/lib/server/index.js @@ -55,35 +55,39 @@ module.exports = async function load(siteDir, cliOptions = {}) { // These can be overriden in plugins/ through component swizzling. // However, we alias it here first as a fallback. const themeFallback = path.resolve(__dirname, '../client/theme-fallback'); - let themeAliases = await loadTheme(themeFallback); + const fallbackAliases = await loadTheme(themeFallback); - // create theme alias from plugins - await Promise.all( + // Create theme alias from plugins. + const pluginThemeAliases = await Promise.all( plugins.map(async plugin => { if (!plugin.getThemePath) { - return; + return null; } - const aliases = await loadTheme(plugin.getThemePath()); - themeAliases = { - ...themeAliases, - ...aliases, - }; + return loadTheme(plugin.getThemePath()); }), ); - // user's own theme alias override. Highest priority + // User's own theme alias override. Highest priority. const themePath = path.resolve(siteDir, 'theme'); - const aliases = await loadTheme(themePath); - themeAliases = { - ...themeAliases, - ...aliases, - }; + const userAliases = await loadTheme(themePath); - // Make a fake plugin to resolve alias theme. + const combinedAliases = [ + fallbackAliases, + ...pluginThemeAliases, + userAliases, + ].reduce( + (acc, curr) => ({ + ...acc, + ...curr, + }), + {}, + ); + + // Make a fake plugin to resolve aliased theme components. plugins.push({ configureWebpack: () => ({ resolve: { - alias: themeAliases, + alias: combinedAliases, }, }), }); diff --git a/packages/docusaurus/lib/server/load/config.js b/packages/docusaurus/lib/server/load/config.js index 8c9e6ff742..e72c96a5f9 100644 --- a/packages/docusaurus/lib/server/load/config.js +++ b/packages/docusaurus/lib/server/load/config.js @@ -23,7 +23,6 @@ const REQUIRED_FIELDS = [ ]; const OPTIONAL_FIELDS = [ - 'algolia', 'customFields', 'defaultLanguage', 'disableHeaderTitle', @@ -32,6 +31,7 @@ const OPTIONAL_FIELDS = [ 'markdownPlugins', 'plugins', 'presets', + 'themeConfig', ]; const DEFAULT_CONFIG = { diff --git a/packages/docusaurus/lib/server/load/theme.js b/packages/docusaurus/lib/server/load/theme.js index 426dcd9d0b..8e25515676 100644 --- a/packages/docusaurus/lib/server/load/theme.js +++ b/packages/docusaurus/lib/server/load/theme.js @@ -20,16 +20,15 @@ module.exports = async function loadTheme(themePath) { }); const alias = {}; - await Promise.all( - themeComponentFiles.map(async relativeSource => { - const filePath = path.join(themePath, relativeSource); - const fileName = fileToPath(relativeSource); - const aliasName = posixPath( - normalizeUrl(['@theme', fileName]).replace(/\/$/, ''), - ); - alias[aliasName] = filePath; - }), - ); + + themeComponentFiles.forEach(relativeSource => { + const filePath = path.join(themePath, relativeSource); + const fileName = fileToPath(relativeSource); + const aliasName = posixPath( + normalizeUrl(['@theme', fileName]).replace(/\/$/, ''), + ); + alias[aliasName] = filePath; + }); return alias; }; diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index edcff5aac1..bb867abe89 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -19,10 +19,12 @@ module.exports = { ], headerIcon: 'img/docusaurus.svg', favicon: 'img/docusaurus.ico', - algolia: { - apiKey: '47ecd3b21be71c5822571b9f59e52544', - indexName: 'docusaurus-2', - algoliaOptions: {}, + themeConfig: { + algolia: { + apiKey: '47ecd3b21be71c5822571b9f59e52544', + indexName: 'docusaurus-2', + algoliaOptions: {}, + }, }, presets: [ [