@callstack/rspress-theme
Version:
Callstack theme for Rspress docs
134 lines (133 loc) • 8.22 kB
JavaScript
import { createRequire } from "node:module";
import node_path from "node:path";
import { fileURLToPath } from "node:url";
const OUTLINE_TITLE = 'Contents';
const SEARCH_NO_RESULTS_TEXT = 'No results found, try something different than';
const SEARCH_SUGGESTED_QUERY_TEXT = ' ';
const OVERVIEW_FILTER_NAME_TEXT = ' ';
const OUTLINE_CTA_BUTTON_TEXT = "Let's talk";
const OUTLINE_CTA_DESCRIPTION = 'We support teams building scalable apps with React and React Native.';
const OUTLINE_CTA_HEADLINE = 'Need help with React or React Native projects?';
const OUTLINE_CTA_LINK = 'https://www.callstack.com/contact';
const DOC_FOOTER_CTA_BUTTON_TEXT = "Let's talk";
const DOC_FOOTER_CTA_HEADLINE = 'Need React or React Native\nexpertise you can count on?';
const DOC_FOOTER_CTA_LINK = 'https://www.callstack.com/contact';
const HOME_BANNER_HEADLINE = 'Need React or React Native\nexpertise you can count on?';
const HOME_BANNER_DESCRIPTION = "We've spent years building full-stack, cross-platform apps and solving tough technical challenges.";
const HOME_BANNER_BUTTON_TEXT = "Let's talk";
const HOME_BANNER_LINK = 'https://www.callstack.com/contact';
const HOME_FOOTER_LINK = 'https://callstack.com';
const EDIT_LINK_TEXT = 'Edit this page on GitHub';
const dirname = node_path.dirname(fileURLToPath(import.meta.url));
function excludeFalse(value) {
return false !== value;
}
function getThemeAliases(existingThemeAlias) {
const ckThemeExportsPath = node_path.join(dirname, 'theme');
const { resolve } = createRequire(import.meta.url);
const rspressCoreThemePath = resolve('@rspress/core/theme', {
paths: [
resolve('@rspress/core/package.json')
]
});
const aliases = {};
if (Array.isArray(existingThemeAlias)) {
const index = existingThemeAlias.indexOf(rspressCoreThemePath);
if (-1 !== index) {
aliases['@theme'] = existingThemeAlias.filter(excludeFalse).slice();
aliases['@theme'].splice(index, 0, ckThemeExportsPath);
} else aliases['@theme'] = existingThemeAlias.filter(excludeFalse).concat(ckThemeExportsPath);
} else aliases['@theme'] = ckThemeExportsPath;
aliases['@default-theme'] = rspressCoreThemePath;
aliases['@rspress/core/theme'] = ckThemeExportsPath;
aliases['@theme-original'] = ckThemeExportsPath;
aliases['@rspress/core/theme-original'] = ckThemeExportsPath;
return aliases;
}
function getBuilderConfig(options) {
var _options_content, _options_content1, _options_links, _options_links1, _options_content2, _options_content3, _options_content4, _options_links2, _options_content5, _options_content6, _options_content7, _options_links3;
return {
source: {
define: {
DOC_FOOTER_CTA_BUTTON_TEXT: JSON.stringify(null == (_options_content = options.content) ? void 0 : _options_content.docFooterCTAButtonText),
DOC_FOOTER_CTA_HEADLINE: JSON.stringify(null == (_options_content1 = options.content) ? void 0 : _options_content1.docFooterCTAHeadline),
DOC_FOOTER_CTA_LINK: JSON.stringify(null == (_options_links = options.links) ? void 0 : _options_links.docFooterCTA),
HOME_BANNER_LINK: JSON.stringify(null == (_options_links1 = options.links) ? void 0 : _options_links1.homeBanner),
HOME_BANNER_BUTTON_TEXT: JSON.stringify(null == (_options_content2 = options.content) ? void 0 : _options_content2.homeBannerButtonText),
HOME_BANNER_DESCRIPTION: JSON.stringify(null == (_options_content3 = options.content) ? void 0 : _options_content3.homeBannerDescription),
HOME_BANNER_HEADLINE: JSON.stringify(null == (_options_content4 = options.content) ? void 0 : _options_content4.homeBannerHeadline),
HOME_FOOTER_LINK: JSON.stringify(null == (_options_links2 = options.links) ? void 0 : _options_links2.homeFooter),
OUTLINE_CTA_BUTTON_TEXT: JSON.stringify(null == (_options_content5 = options.content) ? void 0 : _options_content5.outlineCTAButtonText),
OUTLINE_CTA_DESCRIPTION: JSON.stringify(null == (_options_content6 = options.content) ? void 0 : _options_content6.outlineCTADescription),
OUTLINE_CTA_HEADLINE: JSON.stringify(null == (_options_content7 = options.content) ? void 0 : _options_content7.outlineCTAHeadline),
OUTLINE_CTA_LINK: JSON.stringify(null == (_options_links3 = options.links) ? void 0 : _options_links3.outlineCTA)
}
},
resolve: {
alias: (alias)=>{
const themeAliases = getThemeAliases(alias['@theme']);
Object.assign(alias, themeAliases);
}
}
};
}
function getI18nSourceOverrides(existingI18nSource = {}) {
const i18nSource = {
...existingI18nSource
};
if (!i18nSource['overview.filterNameText']) i18nSource['overview.filterNameText'] = {
en: OVERVIEW_FILTER_NAME_TEXT,
zh: OVERVIEW_FILTER_NAME_TEXT
};
if (!i18nSource.outlineTitle) i18nSource.outlineTitle = {
en: OUTLINE_TITLE,
zh: OUTLINE_TITLE
};
if (!i18nSource.searchNoResultsText) i18nSource.searchNoResultsText = {
en: SEARCH_NO_RESULTS_TEXT,
zh: SEARCH_NO_RESULTS_TEXT
};
if (!i18nSource.searchSuggestedQueryText) i18nSource.searchSuggestedQueryText = {
en: SEARCH_SUGGESTED_QUERY_TEXT,
zh: SEARCH_SUGGESTED_QUERY_TEXT
};
if (!i18nSource.editLinkText) i18nSource.editLinkText = {
en: EDIT_LINK_TEXT,
zh: EDIT_LINK_TEXT
};
return i18nSource;
}
function normalizeOptions(options) {
var _options_content, _options_content1, _options_content2, _options_content3, _options_content4, _options_content5, _options_content6, _options_content7, _options_links, _options_links1, _options_links2, _options_links3;
return {
content: {
docFooterCTAButtonText: (null == (_options_content = options.content) ? void 0 : _options_content.docFooterCTAButtonText) ?? DOC_FOOTER_CTA_BUTTON_TEXT,
docFooterCTAHeadline: (null == (_options_content1 = options.content) ? void 0 : _options_content1.docFooterCTAHeadline) ?? DOC_FOOTER_CTA_HEADLINE,
homeBannerButtonText: (null == (_options_content2 = options.content) ? void 0 : _options_content2.homeBannerButtonText) ?? HOME_BANNER_BUTTON_TEXT,
homeBannerDescription: (null == (_options_content3 = options.content) ? void 0 : _options_content3.homeBannerDescription) ?? HOME_BANNER_DESCRIPTION,
homeBannerHeadline: (null == (_options_content4 = options.content) ? void 0 : _options_content4.homeBannerHeadline) ?? HOME_BANNER_HEADLINE,
outlineCTAButtonText: (null == (_options_content5 = options.content) ? void 0 : _options_content5.outlineCTAButtonText) ?? OUTLINE_CTA_BUTTON_TEXT,
outlineCTADescription: (null == (_options_content6 = options.content) ? void 0 : _options_content6.outlineCTADescription) ?? OUTLINE_CTA_DESCRIPTION,
outlineCTAHeadline: (null == (_options_content7 = options.content) ? void 0 : _options_content7.outlineCTAHeadline) ?? OUTLINE_CTA_HEADLINE
},
links: {
docFooterCTA: (null == (_options_links = options.links) ? void 0 : _options_links.docFooterCTA) ?? DOC_FOOTER_CTA_LINK,
homeBanner: (null == (_options_links1 = options.links) ? void 0 : _options_links1.homeBanner) ?? HOME_BANNER_LINK,
homeFooter: (null == (_options_links2 = options.links) ? void 0 : _options_links2.homeFooter) ?? HOME_FOOTER_LINK,
outlineCTA: (null == (_options_links3 = options.links) ? void 0 : _options_links3.outlineCTA) ?? OUTLINE_CTA_LINK
}
};
}
function pluginCallstackTheme(options = {}) {
const normalizedOptions = normalizeOptions(options);
return {
name: 'plugin-callstack-theme',
builderConfig: getBuilderConfig(normalizedOptions),
config: (config)=>{
config.i18nSource = getI18nSourceOverrides(config.i18nSource);
return config;
},
globalStyles: node_path.join(node_path.dirname(dirname), 'styles/styles.css')
};
}
export { pluginCallstackTheme };