mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-31 18:07:00 +02:00
feat(v2): presets (#1401)
* feat(v2): presets * misc: add newline * misc: add tests * misc: fix path
This commit is contained in:
parent
7ebcf10478
commit
361986515c
28 changed files with 394 additions and 89 deletions
|
@ -4,6 +4,7 @@
|
||||||
* This source code is licensed under the MIT license found in the
|
* This source code is licensed under the MIT license found in the
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const {getOptions} = require('loader-utils');
|
const {getOptions} = require('loader-utils');
|
||||||
const mdx = require('@mdx-js/mdx');
|
const mdx = require('@mdx-js/mdx');
|
||||||
const rehypePrism = require('@mapbox/rehype-prism');
|
const rehypePrism = require('@mapbox/rehype-prism');
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* This source code is licensed under the MIT license found in the
|
* This source code is licensed under the MIT license found in the
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import '@babel/polyfill';
|
import '@babel/polyfill';
|
||||||
import {join} from 'path';
|
import {join} from 'path';
|
||||||
import remark from 'remark';
|
import remark from 'remark';
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* This source code is licensed under the MIT license found in the
|
* This source code is licensed under the MIT license found in the
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const {parse} = require('@babel/parser');
|
const {parse} = require('@babel/parser');
|
||||||
const traverse = require('@babel/traverse').default;
|
const traverse = require('@babel/traverse').default;
|
||||||
const stringifyObject = require('stringify-object');
|
const stringifyObject = require('stringify-object');
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* This source code is licensed under the MIT license found in the
|
* This source code is licensed under the MIT license found in the
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const toString = require('mdast-util-to-string');
|
const toString = require('mdast-util-to-string');
|
||||||
const visit = require('unist-util-visit');
|
const visit = require('unist-util-visit');
|
||||||
const slugs = require('github-slugger')();
|
const slugs = require('github-slugger')();
|
||||||
|
|
|
@ -29,7 +29,7 @@ const DEFAULT_OPTIONS = {
|
||||||
};
|
};
|
||||||
|
|
||||||
class DocusaurusPluginContentBlog {
|
class DocusaurusPluginContentBlog {
|
||||||
constructor(opts, context) {
|
constructor(context, opts) {
|
||||||
this.options = {...DEFAULT_OPTIONS, ...opts};
|
this.options = {...DEFAULT_OPTIONS, ...opts};
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
||||||
|
|
|
@ -15,15 +15,15 @@ describe('loadDocs', () => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup('simple');
|
const {env, siteDir, siteConfig} = await loadSetup('simple');
|
||||||
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
||||||
const plugin = new DocusaurusPluginContentDocs(
|
const plugin = new DocusaurusPluginContentDocs(
|
||||||
{
|
|
||||||
path: '../docs',
|
|
||||||
sidebarPath,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '../docs',
|
||||||
|
sidebarPath,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const {docs: docsMetadata} = await plugin.loadContent();
|
const {docs: docsMetadata} = await plugin.loadContent();
|
||||||
const docsDir = plugin.contentPath;
|
const docsDir = plugin.contentPath;
|
||||||
|
@ -62,15 +62,15 @@ describe('loadDocs', () => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup('versioned');
|
const {env, siteDir, siteConfig} = await loadSetup('versioned');
|
||||||
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
||||||
const plugin = new DocusaurusPluginContentDocs(
|
const plugin = new DocusaurusPluginContentDocs(
|
||||||
{
|
|
||||||
path: '../docs',
|
|
||||||
sidebarPath,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '../docs',
|
||||||
|
sidebarPath,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const {docs: docsMetadata, versionedDir} = await plugin.loadContent();
|
const {docs: docsMetadata, versionedDir} = await plugin.loadContent();
|
||||||
const docsDir = plugin.contentPath;
|
const docsDir = plugin.contentPath;
|
||||||
|
@ -109,15 +109,15 @@ describe('loadDocs', () => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup('transversioned');
|
const {env, siteDir, siteConfig} = await loadSetup('transversioned');
|
||||||
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
||||||
const plugin = new DocusaurusPluginContentDocs(
|
const plugin = new DocusaurusPluginContentDocs(
|
||||||
{
|
|
||||||
path: '../docs',
|
|
||||||
sidebarPath,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '../docs',
|
||||||
|
sidebarPath,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const {
|
const {
|
||||||
docs: docsMetadata,
|
docs: docsMetadata,
|
||||||
|
@ -177,15 +177,15 @@ describe('loadDocs', () => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup('translated');
|
const {env, siteDir, siteConfig} = await loadSetup('translated');
|
||||||
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
||||||
const plugin = new DocusaurusPluginContentDocs(
|
const plugin = new DocusaurusPluginContentDocs(
|
||||||
{
|
|
||||||
path: '../docs',
|
|
||||||
sidebarPath,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '../docs',
|
||||||
|
sidebarPath,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const {docs: docsMetadata, translatedDir} = await plugin.loadContent();
|
const {docs: docsMetadata, translatedDir} = await plugin.loadContent();
|
||||||
const docsDir = plugin.contentPath;
|
const docsDir = plugin.contentPath;
|
||||||
|
@ -227,16 +227,16 @@ describe('loadDocs', () => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup('versioned');
|
const {env, siteDir, siteConfig} = await loadSetup('versioned');
|
||||||
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
const sidebarPath = path.join(siteDir, 'sidebars.json');
|
||||||
const plugin = new DocusaurusPluginContentDocs(
|
const plugin = new DocusaurusPluginContentDocs(
|
||||||
{
|
|
||||||
path: '../docs',
|
|
||||||
sidebarPath,
|
|
||||||
skipNextRelease: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '../docs',
|
||||||
|
sidebarPath,
|
||||||
|
skipNextRelease: true,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const {docs: docsMetadata, versionedDir} = await plugin.loadContent();
|
const {docs: docsMetadata, versionedDir} = await plugin.loadContent();
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ const DEFAULT_OPTIONS = {
|
||||||
};
|
};
|
||||||
|
|
||||||
class DocusaurusPluginContentDocs {
|
class DocusaurusPluginContentDocs {
|
||||||
constructor(opts, context) {
|
constructor(context, opts) {
|
||||||
this.options = {...DEFAULT_OPTIONS, ...opts};
|
this.options = {...DEFAULT_OPTIONS, ...opts};
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
||||||
|
|
|
@ -111,7 +111,7 @@ describe('docusaurus-plugin-content-pages', () => {
|
||||||
],
|
],
|
||||||
])('%s website', async (type, expected) => {
|
])('%s website', async (type, expected) => {
|
||||||
const {env, siteDir, siteConfig} = await loadSetup(type);
|
const {env, siteDir, siteConfig} = await loadSetup(type);
|
||||||
const plugin = new DocusaurusPluginContentPages(null, {
|
const plugin = new DocusaurusPluginContentPages({
|
||||||
env,
|
env,
|
||||||
siteDir,
|
siteDir,
|
||||||
siteConfig,
|
siteConfig,
|
||||||
|
|
|
@ -17,7 +17,7 @@ const DEFAULT_OPTIONS = {
|
||||||
};
|
};
|
||||||
|
|
||||||
class DocusaurusPluginContentPages {
|
class DocusaurusPluginContentPages {
|
||||||
constructor(opts, context) {
|
constructor(context, opts) {
|
||||||
this.options = {...DEFAULT_OPTIONS, ...opts};
|
this.options = {...DEFAULT_OPTIONS, ...opts};
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
this.contentPath = path.resolve(this.context.siteDir, this.options.path);
|
||||||
|
|
|
@ -13,9 +13,9 @@ describe('docusaurus-plugin-sitemap', () => {
|
||||||
test.each(['simple', 'versioned', 'translated', 'transversioned'])(
|
test.each(['simple', 'versioned', 'translated', 'transversioned'])(
|
||||||
'%s website',
|
'%s website',
|
||||||
async type => {
|
async type => {
|
||||||
const props = await loadSetup(type);
|
const context = await loadSetup(type);
|
||||||
const plugin = new DocusaurusPluginSitemap(null, props);
|
const plugin = new DocusaurusPluginSitemap(context, null);
|
||||||
const sitemap = await plugin.createSitemap(props);
|
const sitemap = await plugin.createSitemap(context);
|
||||||
expect(sitemap).toContain(
|
expect(sitemap).toContain(
|
||||||
`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">`,
|
`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">`,
|
||||||
);
|
);
|
||||||
|
@ -23,10 +23,10 @@ describe('docusaurus-plugin-sitemap', () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
test('empty site', async () => {
|
test('empty site', async () => {
|
||||||
const props = await loadSetup('empty');
|
const context = await loadSetup('empty');
|
||||||
const plugin = new DocusaurusPluginSitemap(null, props);
|
const plugin = new DocusaurusPluginSitemap(context, null);
|
||||||
expect(
|
expect(
|
||||||
plugin.createSitemap(props),
|
plugin.createSitemap(context),
|
||||||
).rejects.toThrowErrorMatchingInlineSnapshot(
|
).rejects.toThrowErrorMatchingInlineSnapshot(
|
||||||
`"Url in docusaurus.config.js cannot be empty/undefined"`,
|
`"Url in docusaurus.config.js cannot be empty/undefined"`,
|
||||||
);
|
);
|
||||||
|
|
|
@ -16,7 +16,7 @@ const DEFAULT_OPTIONS = {
|
||||||
};
|
};
|
||||||
|
|
||||||
class DocusaurusPluginSitemap {
|
class DocusaurusPluginSitemap {
|
||||||
constructor(opts, context) {
|
constructor(context, opts) {
|
||||||
this.options = {...DEFAULT_OPTIONS, ...opts};
|
this.options = {...DEFAULT_OPTIONS, ...opts};
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
19
packages/docusaurus-preset-classic/package.json
Normal file
19
packages/docusaurus-preset-classic/package.json
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"name": "@docusaurus/preset-classic",
|
||||||
|
"version": "2.0.0-alpha.11",
|
||||||
|
"description": "Preset for classic Docusaurus",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@docusaurus/plugin-content-blog": "^2.0.0-alpha.11",
|
||||||
|
"@docusaurus/plugin-content-docs": "^2.0.0-alpha.11",
|
||||||
|
"@docusaurus/plugin-content-pages": "^2.0.0-alpha.11",
|
||||||
|
"@docusaurus/plugin-sitemap": "^2.0.0-alpha.11"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@docusaurus/core": "^2.0.0"
|
||||||
|
}
|
||||||
|
}
|
29
packages/docusaurus-preset-classic/src/index.js
Normal file
29
packages/docusaurus-preset-classic/src/index.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = function preset(context, opts = {}) {
|
||||||
|
return {
|
||||||
|
plugins: [
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-docs',
|
||||||
|
options: opts.docs,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-blog',
|
||||||
|
options: opts.blog,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-pages',
|
||||||
|
options: opts.pages,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-sitemap',
|
||||||
|
options: opts.sitemap,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
|
@ -9,7 +9,7 @@
|
||||||
- `sidebars.json` now has to be explicitly loaded by users and passed into the the plugin option on `docusaurus-plugin-content-docs`.
|
- `sidebars.json` now has to be explicitly loaded by users and passed into the the plugin option on `docusaurus-plugin-content-docs`.
|
||||||
- `headerLinks` doc, page, blog is deprecated. The syntax is now:
|
- `headerLinks` doc, page, blog is deprecated. The syntax is now:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
headerLinks: [
|
headerLinks: [
|
||||||
// Link to internal page (without baseUrl)
|
// Link to internal page (without baseUrl)
|
||||||
{ url: "help", label: "Help" },
|
{ url: "help", label: "Help" },
|
||||||
|
@ -20,4 +20,10 @@ headerLinks: [
|
||||||
// Determines language drop down position among links
|
// Determines language drop down position among links
|
||||||
{ languages: true }
|
{ languages: true }
|
||||||
],
|
],
|
||||||
```js
|
```
|
||||||
|
|
||||||
|
# Additions
|
||||||
|
|
||||||
|
### Presets
|
||||||
|
|
||||||
|
- Added presets for plugins that follow the [Babel preset convention](https://babeljs.io/docs/en/presets).
|
||||||
|
|
|
@ -6,12 +6,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const support = function(feature) {
|
const support = function(feature) {
|
||||||
if (typeof document === `undefined`) {
|
if (typeof document === 'undefined') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const fakeLink = document.createElement(`link`);
|
const fakeLink = document.createElement('link');
|
||||||
try {
|
try {
|
||||||
if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {
|
if (fakeLink.relList && typeof fakeLink.relList.supports === 'function') {
|
||||||
return fakeLink.relList.supports(feature);
|
return fakeLink.relList.supports(feature);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -22,21 +22,21 @@ const support = function(feature) {
|
||||||
|
|
||||||
const linkPrefetchStrategy = function(url) {
|
const linkPrefetchStrategy = function(url) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (typeof document === `undefined`) {
|
if (typeof document === 'undefined') {
|
||||||
reject();
|
reject();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const link = document.createElement(`link`);
|
const link = document.createElement('link');
|
||||||
link.setAttribute(`rel`, `prefetch`);
|
link.setAttribute('rel', 'prefetch');
|
||||||
link.setAttribute(`href`, url);
|
link.setAttribute('href', url);
|
||||||
|
|
||||||
link.onload = resolve;
|
link.onload = resolve;
|
||||||
link.onerror = reject;
|
link.onerror = reject;
|
||||||
|
|
||||||
const parentElement =
|
const parentElement =
|
||||||
document.getElementsByTagName(`head`)[0] ||
|
document.getElementsByTagName('head')[0] ||
|
||||||
document.getElementsByName(`script`)[0].parentNode;
|
document.getElementsByName('script')[0].parentNode;
|
||||||
parentElement.appendChild(link);
|
parentElement.appendChild(link);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -44,7 +44,7 @@ const linkPrefetchStrategy = function(url) {
|
||||||
const xhrPrefetchStrategy = function(url) {
|
const xhrPrefetchStrategy = function(url) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const req = new XMLHttpRequest();
|
const req = new XMLHttpRequest();
|
||||||
req.open(`GET`, url, true);
|
req.open('GET', url, true);
|
||||||
req.withCredentials = true;
|
req.withCredentials = true;
|
||||||
|
|
||||||
req.onload = () => {
|
req.onload = () => {
|
||||||
|
@ -59,7 +59,7 @@ const xhrPrefetchStrategy = function(url) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const supportedPrefetchStrategy = support(`prefetch`)
|
const supportedPrefetchStrategy = support('prefetch')
|
||||||
? linkPrefetchStrategy
|
? linkPrefetchStrategy
|
||||||
: xhrPrefetchStrategy;
|
: xhrPrefetchStrategy;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ const path = require('path');
|
||||||
const chalk = require('chalk');
|
const chalk = require('chalk');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const globby = require('globby');
|
const globby = require('globby');
|
||||||
const load = require('../server/load');
|
const load = require('../server');
|
||||||
const createServerConfig = require('../webpack/server');
|
const createServerConfig = require('../webpack/server');
|
||||||
const createClientConfig = require('../webpack/client');
|
const createClientConfig = require('../webpack/client');
|
||||||
const {applyConfigureWebpack} = require('../webpack/utils');
|
const {applyConfigureWebpack} = require('../webpack/utils');
|
||||||
|
|
|
@ -19,7 +19,7 @@ const HotModuleReplacementPlugin = require('webpack/lib/HotModuleReplacementPlug
|
||||||
const WebpackDevServer = require('webpack-dev-server');
|
const WebpackDevServer = require('webpack-dev-server');
|
||||||
const merge = require('webpack-merge');
|
const merge = require('webpack-merge');
|
||||||
const {normalizeUrl} = require('@docusaurus/utils');
|
const {normalizeUrl} = require('@docusaurus/utils');
|
||||||
const load = require('../server/load');
|
const load = require('../server');
|
||||||
const {CONFIG_FILE_NAME} = require('../constants');
|
const {CONFIG_FILE_NAME} = require('../constants');
|
||||||
const createClientConfig = require('../webpack/client');
|
const createClientConfig = require('../webpack/client');
|
||||||
const {applyConfigureWebpack} = require('../webpack/utils');
|
const {applyConfigureWebpack} = require('../webpack/utils');
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
const {generate} = require('@docusaurus/utils');
|
const {generate} = require('@docusaurus/utils');
|
||||||
const loadConfig = require('./config');
|
const loadConfig = require('./load/config');
|
||||||
const loadEnv = require('./env');
|
const loadEnv = require('./load/env');
|
||||||
const loadTheme = require('./theme');
|
const loadTheme = require('./load/theme');
|
||||||
const loadRoutes = require('./routes');
|
const loadRoutes = require('./load/routes');
|
||||||
const loadPlugins = require('./plugins');
|
const loadPlugins = require('./load/plugins');
|
||||||
const constants = require('../../constants');
|
const loadPresets = require('./load/presets');
|
||||||
|
const constants = require('../constants');
|
||||||
|
|
||||||
module.exports = async function load(siteDir, cliOptions = {}) {
|
module.exports = async function load(siteDir, cliOptions = {}) {
|
||||||
const generatedFilesDir = path.resolve(
|
const generatedFilesDir = path.resolve(
|
||||||
|
@ -35,9 +36,13 @@ module.exports = async function load(siteDir, cliOptions = {}) {
|
||||||
`export default ${JSON.stringify(env, null, 2)};`,
|
`export default ${JSON.stringify(env, null, 2)};`,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Process plugins.
|
|
||||||
const pluginConfigs = siteConfig.plugins || [];
|
|
||||||
const context = {env, siteDir, generatedFilesDir, siteConfig, cliOptions};
|
const context = {env, siteDir, generatedFilesDir, siteConfig, cliOptions};
|
||||||
|
|
||||||
|
// Process presets.
|
||||||
|
const presetPlugins = loadPresets(context);
|
||||||
|
|
||||||
|
// Process plugins.
|
||||||
|
const pluginConfigs = [...presetPlugins, ...siteConfig.plugins];
|
||||||
const {plugins, pluginsRouteConfigs} = await loadPlugins({
|
const {plugins, pluginsRouteConfigs} = await loadPlugins({
|
||||||
pluginConfigs,
|
pluginConfigs,
|
||||||
context,
|
context,
|
|
@ -0,0 +1,14 @@
|
||||||
|
module.exports = function preset(context, opts = {}) {
|
||||||
|
return {
|
||||||
|
plugins: [
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-docs',
|
||||||
|
options: opts.docs,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-blog',
|
||||||
|
options: opts.blog,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,14 @@
|
||||||
|
module.exports = function preset(context, opts = {}) {
|
||||||
|
return {
|
||||||
|
plugins: [
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-content-pages',
|
||||||
|
options: opts.pages,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '@docusaurus/plugin-sitemap',
|
||||||
|
options: opts.sitemap,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
193
packages/docusaurus/lib/server/load/__tests__/presets.test.js
Normal file
193
packages/docusaurus/lib/server/load/__tests__/presets.test.js
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
/**
|
||||||
|
* 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 '@babel/polyfill';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
import loadPresets from '../presets';
|
||||||
|
|
||||||
|
describe('loadPresets', () => {
|
||||||
|
test('no presets', () => {
|
||||||
|
const presets = loadPresets({siteConfig: {presets: []}});
|
||||||
|
expect(presets).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('string form', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [path.join(__dirname, '__fixtures__/preset-bar.js')],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('string form composite', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [
|
||||||
|
path.join(__dirname, '__fixtures__/preset-bar.js'),
|
||||||
|
path.join(__dirname, '__fixtures__/preset-foo.js'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-pages",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-sitemap",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('array form', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [[path.join(__dirname, '__fixtures__/preset-bar.js')]],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('array form with options', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
path.join(__dirname, '__fixtures__/preset-bar.js'),
|
||||||
|
{docs: {path: '../'}},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": Object {
|
||||||
|
"path": "../",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('array form composite', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
path.join(__dirname, '__fixtures__/preset-bar.js'),
|
||||||
|
{docs: {path: '../'}},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
path.join(__dirname, '__fixtures__/preset-foo.js'),
|
||||||
|
{pages: {path: '../'}},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": Object {
|
||||||
|
"path": "../",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-pages",
|
||||||
|
"options": Object {
|
||||||
|
"path": "../",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-sitemap",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('mixed form', () => {
|
||||||
|
const presets = loadPresets({
|
||||||
|
siteConfig: {
|
||||||
|
presets: [
|
||||||
|
[
|
||||||
|
path.join(__dirname, '__fixtures__/preset-bar.js'),
|
||||||
|
{docs: {path: '../'}},
|
||||||
|
],
|
||||||
|
path.join(__dirname, '__fixtures__/preset-foo.js'),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(presets).toMatchInlineSnapshot(`
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-docs",
|
||||||
|
"options": Object {
|
||||||
|
"path": "../",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-blog",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-content-pages",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"name": "@docusaurus/plugin-sitemap",
|
||||||
|
"options": undefined,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
|
@ -31,6 +31,7 @@ const OPTIONAL_FIELDS = [
|
||||||
'highlight',
|
'highlight',
|
||||||
'markdownPlugins',
|
'markdownPlugins',
|
||||||
'plugins',
|
'plugins',
|
||||||
|
'presets',
|
||||||
];
|
];
|
||||||
|
|
||||||
const DEFAULT_CONFIG = {
|
const DEFAULT_CONFIG = {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
const importFresh = require('import-fresh');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const {generate} = require('@docusaurus/utils');
|
const {generate} = require('@docusaurus/utils');
|
||||||
|
|
||||||
|
@ -14,17 +15,11 @@ module.exports = async function loadPlugins({pluginConfigs = [], context}) {
|
||||||
const plugins = pluginConfigs.map(({name, path: pluginPath, options}) => {
|
const plugins = pluginConfigs.map(({name, path: pluginPath, options}) => {
|
||||||
let Plugin;
|
let Plugin;
|
||||||
if (pluginPath && fs.existsSync(pluginPath)) {
|
if (pluginPath && fs.existsSync(pluginPath)) {
|
||||||
// eslint-disable-next-line
|
Plugin = importFresh(pluginPath);
|
||||||
Plugin = require(pluginPath);
|
|
||||||
} else {
|
} else {
|
||||||
try {
|
Plugin = importFresh(name);
|
||||||
// eslint-disable-next-line
|
|
||||||
Plugin = require(name);
|
|
||||||
} catch (ex) {
|
|
||||||
throw new Error(`Error loading '${name}' plugin.`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return new Plugin(options, context);
|
return new Plugin(context, options);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 2. Plugin lifecycle - loadContent
|
// 2. Plugin lifecycle - loadContent
|
||||||
|
@ -72,6 +67,5 @@ module.exports = async function loadPlugins({pluginConfigs = [], context}) {
|
||||||
return {
|
return {
|
||||||
plugins,
|
plugins,
|
||||||
pluginsRouteConfigs,
|
pluginsRouteConfigs,
|
||||||
pluginsLoadedContent,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
35
packages/docusaurus/lib/server/load/presets.js
Normal file
35
packages/docusaurus/lib/server/load/presets.js
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/**
|
||||||
|
* 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 importFresh = require('import-fresh');
|
||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
|
module.exports = function loadPresets(context) {
|
||||||
|
const presets = context.siteConfig.presets || [];
|
||||||
|
return _.flatten(
|
||||||
|
presets.map(presetItem => {
|
||||||
|
let presetModule;
|
||||||
|
let presetOptions = {};
|
||||||
|
if (typeof presetItem === 'string') {
|
||||||
|
presetModule = presetItem;
|
||||||
|
} else if (Array.isArray(presetItem)) {
|
||||||
|
[presetModule, presetOptions] = presetItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
let preset;
|
||||||
|
if (presetModule && fs.existsSync(presetModule)) {
|
||||||
|
// Local preset.
|
||||||
|
preset = importFresh(presetModule);
|
||||||
|
} else {
|
||||||
|
// From npm.
|
||||||
|
preset = importFresh(presetModule);
|
||||||
|
}
|
||||||
|
return preset(context, presetOptions).plugins;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
};
|
|
@ -52,6 +52,7 @@
|
||||||
"fs-extra": "^7.0.0",
|
"fs-extra": "^7.0.0",
|
||||||
"globby": "^9.1.0",
|
"globby": "^9.1.0",
|
||||||
"html-webpack-plugin": "^4.0.0-beta.5",
|
"html-webpack-plugin": "^4.0.0-beta.5",
|
||||||
|
"import-fresh": "^3.0.0",
|
||||||
"is-wsl": "^1.1.0",
|
"is-wsl": "^1.1.0",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.11",
|
||||||
"mini-css-extract-plugin": "^0.4.1",
|
"mini-css-extract-plugin": "^0.4.1",
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import '@babel/polyfill';
|
import '@babel/polyfill';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import load from '@lib/server/load';
|
import load from '@lib/server';
|
||||||
|
|
||||||
// Helper methods to setup dummy/fake projects
|
// Helper methods to setup dummy/fake projects
|
||||||
const loadSetup = async name => {
|
const loadSetup = async name => {
|
||||||
|
|
|
@ -24,25 +24,18 @@ module.exports = {
|
||||||
indexName: 'docusaurus-2',
|
indexName: 'docusaurus-2',
|
||||||
algoliaOptions: {},
|
algoliaOptions: {},
|
||||||
},
|
},
|
||||||
plugins: [
|
presets: [
|
||||||
{
|
[
|
||||||
name: '@docusaurus/plugin-content-docs',
|
'@docusaurus/preset-classic',
|
||||||
options: {
|
{
|
||||||
path: '../docs',
|
docs: {
|
||||||
sidebarPath: require.resolve('./sidebars.json'),
|
path: '../docs',
|
||||||
|
sidebarPath: require.resolve('./sidebars.json'),
|
||||||
|
},
|
||||||
|
blog: {
|
||||||
|
path: '../website-1.x/blog',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
],
|
||||||
{
|
|
||||||
name: '@docusaurus/plugin-content-blog',
|
|
||||||
options: {
|
|
||||||
path: '../website-1.x/blog',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '@docusaurus/plugin-content-pages',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '@docusaurus/plugin-sitemap',
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,10 +10,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@docusaurus/core": "^2.0.0-alpha.11",
|
"@docusaurus/core": "^2.0.0-alpha.11",
|
||||||
"@docusaurus/plugin-content-blog": "^2.0.0-alpha.11",
|
"@docusaurus/preset-classic": "^2.0.0-alpha.11",
|
||||||
"@docusaurus/plugin-content-docs": "^2.0.0-alpha.11",
|
|
||||||
"@docusaurus/plugin-content-pages": "^2.0.0-alpha.11",
|
|
||||||
"@docusaurus/plugin-sitemap": "^2.0.0-alpha.11",
|
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
"react": "^16.8.4",
|
"react": "^16.8.4",
|
||||||
"react-dom": "^16.8.4"
|
"react-dom": "^16.8.4"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue