docusaurus/packages/docusaurus-theme-search-algolia/src/index.js

92 lines
2.3 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 fs = require('fs');
const eta = require('eta');
const {normalizeUrl, getSwizzledComponent} = require('@docusaurus/utils');
const openSearchTemplate = require('./templates/opensearch');
const {validateThemeConfig} = require('./validateThemeConfig');
const {memoize} = require('lodash');
const getCompiledOpenSearchTemplate = memoize(() => {
return eta.compile(openSearchTemplate.trim());
});
function renderOpenSearchTemplate(data) {
const compiled = getCompiledOpenSearchTemplate();
return compiled(data, eta.defaultConfig);
}
const OPEN_SEARCH_FILENAME = 'opensearch.xml';
function theme(context) {
const {
baseUrl,
siteConfig: {title, url, favicon},
} = context;
const pageComponent = './theme/SearchPage/index.js';
const pagePath =
getSwizzledComponent(pageComponent) ||
path.resolve(__dirname, pageComponent);
return {
name: 'docusaurus-theme-search-algolia',
getThemePath() {
return path.resolve(__dirname, './theme');
},
getPathsToWatch() {
return [pagePath];
},
async contentLoaded({actions: {addRoute}}) {
addRoute({
path: normalizeUrl([baseUrl, 'search']),
component: pagePath,
exact: true,
});
},
async postBuild({outDir}) {
try {
fs.writeFileSync(
path.join(outDir, OPEN_SEARCH_FILENAME),
renderOpenSearchTemplate({
title,
url: url + baseUrl,
favicon: favicon ? normalizeUrl([url, baseUrl, favicon]) : null,
}),
);
} catch (err) {
console.error(err);
throw new Error(`Generating OpenSearch file failed: ${err}`);
}
},
injectHtmlTags() {
return {
headTags: [
{
tagName: 'link',
attributes: {
rel: 'search',
type: 'application/opensearchdescription+xml',
title,
href: normalizeUrl([baseUrl, OPEN_SEARCH_FILENAME]),
},
},
],
};
},
};
}
module.exports = theme;
theme.validateThemeConfig = validateThemeConfig;