docusaurus/packages/docusaurus-theme-classic/src/index.js
Sam Zhou 705f8f3c51
fix(v2): Consistently use require.resolve in official plugins to resolve modules (#2797)
* fix(v2): Use require.resolve to resolve loaders in official plugins

* Use require.resolve to resolve client modules
2020-05-23 11:26:50 +08:00

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),
},
],
};
},
};
};