mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-29 02:08:36 +02:00
* fix(v2): Use require.resolve to resolve loaders in official plugins * Use require.resolve to resolve client modules
111 lines
2.7 KiB
JavaScript
111 lines
2.7 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* 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 Module = require('module');
|
|
|
|
const createRequire = Module.createRequire || Module.createRequireFromPath;
|
|
const requireFromDocusaurusCore = createRequire(
|
|
require.resolve('@docusaurus/core/package.json'),
|
|
);
|
|
const ContextReplacementPlugin = requireFromDocusaurusCore(
|
|
'webpack/lib/ContextReplacementPlugin',
|
|
);
|
|
|
|
// Need to be inlined to prevent dark mode FOUC
|
|
// Make sure that the 'storageKey' is the same as the one in `/theme/hooks/useTheme.js`
|
|
const storageKey = 'theme';
|
|
const noFlash = (defaultDarkMode) => `(function() {
|
|
var defaultDarkMode = ${defaultDarkMode};
|
|
|
|
function setDataThemeAttribute(theme) {
|
|
document.documentElement.setAttribute('data-theme', theme);
|
|
}
|
|
|
|
function getPreferredTheme() {
|
|
var theme = null;
|
|
try {
|
|
theme = localStorage.getItem('${storageKey}');
|
|
} catch (err) {}
|
|
|
|
return theme;
|
|
}
|
|
|
|
var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
|
|
var preferredTheme = getPreferredTheme();
|
|
if (preferredTheme !== null) {
|
|
setDataThemeAttribute(preferredTheme);
|
|
} else if (darkQuery.matches || defaultDarkMode) {
|
|
setDataThemeAttribute('dark');
|
|
}
|
|
})();`;
|
|
|
|
module.exports = function (context, options) {
|
|
const {
|
|
siteConfig: {themeConfig},
|
|
} = context;
|
|
const {
|
|
disableDarkMode = false,
|
|
defaultDarkMode = false,
|
|
prism: {additionalLanguages = []} = {},
|
|
} = themeConfig || {};
|
|
const {customCss} = options || {};
|
|
|
|
return {
|
|
name: 'docusaurus-theme-classic',
|
|
|
|
getThemePath() {
|
|
return path.resolve(__dirname, './theme');
|
|
},
|
|
|
|
getClientModules() {
|
|
const modules = [
|
|
require.resolve('infima/dist/css/default/default.css'),
|
|
path.resolve(__dirname, './prism-include-languages'),
|
|
];
|
|
|
|
if (customCss) {
|
|
modules.push(customCss);
|
|
}
|
|
|
|
return modules;
|
|
},
|
|
|
|
configureWebpack() {
|
|
const prismLanguages = additionalLanguages
|
|
.map((lang) => `prism-${lang}`)
|
|
.join('|');
|
|
|
|
return {
|
|
plugins: [
|
|
new ContextReplacementPlugin(
|
|
/prismjs[\\/]components$/,
|
|
new RegExp(`^./(${prismLanguages})$`),
|
|
),
|
|
],
|
|
};
|
|
},
|
|
|
|
injectHtmlTags() {
|
|
if (disableDarkMode) {
|
|
return {};
|
|
}
|
|
return {
|
|
preBodyTags: [
|
|
{
|
|
tagName: 'script',
|
|
attributes: {
|
|
type: 'text/javascript',
|
|
},
|
|
innerHTML: noFlash(defaultDarkMode),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
};
|
|
};
|