From c113a5cd8f1a0ede58145cabcd1db67c6af5d630 Mon Sep 17 00:00:00 2001 From: w3lld1 <42353747+w3lld1@users.noreply.github.com> Date: Sat, 11 Jul 2026 02:21:00 +0000 Subject: [PATCH] fix(web): hide search without Orama data Signed-off-by: w3lld1 <42353747+w3lld1@users.noreply.github.com> --- .changeset/lazy-tools-search.md | 5 +++++ src/generators.mjs | 4 +++- src/generators/types.d.ts | 3 ++- src/generators/web/README.md | 1 + src/generators/web/__tests__/generate.test.mjs | 17 +++++++++++++++++ src/generators/web/generate.mjs | 3 ++- src/generators/web/index.mjs | 1 + src/generators/web/types.d.ts | 1 + src/generators/web/ui/components/NavBar.jsx | 4 ++-- src/generators/web/utils/config.mjs | 4 +++- src/generators/web/utils/processing.mjs | 4 +++- 11 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 .changeset/lazy-tools-search.md diff --git a/.changeset/lazy-tools-search.md b/.changeset/lazy-tools-search.md new file mode 100644 index 00000000..9cf55df8 --- /dev/null +++ b/.changeset/lazy-tools-search.md @@ -0,0 +1,5 @@ +--- +'@node-core/doc-kit': patch +--- + +Hide the web documentation search control unless the Orama database generator is enabled. diff --git a/src/generators.mjs b/src/generators.mjs index 4f87ec29..80f62c60 100644 --- a/src/generators.mjs +++ b/src/generators.mjs @@ -73,7 +73,9 @@ const createGenerator = () => { ? createParallelWorker(generatorName, pool, configuration) : Promise.resolve(null); - const result = await generate(dependencyInput, await worker); + const result = await generate(dependencyInput, await worker, { + target: configuration.target, + }); // For streaming generators, "Completed" is logged when the cache // finishes collecting, not here when the generator returns diff --git a/src/generators/types.d.ts b/src/generators/types.d.ts index 6374d800..1eb482ea 100644 --- a/src/generators/types.d.ts +++ b/src/generators/types.d.ts @@ -40,7 +40,8 @@ declare global { */ export type Generate = ( input: I, - worker: ParallelWorker + worker: ParallelWorker, + context: { target: string[] } ) => O extends AsyncGenerator ? O : Promise; /** diff --git a/src/generators/web/README.md b/src/generators/web/README.md index 9b9d0243..682da06c 100644 --- a/src/generators/web/README.md +++ b/src/generators/web/README.md @@ -13,6 +13,7 @@ The `web` generator accepts the following configuration options: | `project` | `string` | `'Node.js'` | Project name used in page titles and the version selector | | `title` | `string` | `'{project} v{version} Documentation'` | Title template for HTML pages (supports `{project}`, `{version}`) | | `useAbsoluteURLs` | `boolean` | `false` | When `true`, all internal links use absolute URLs based on `baseURL` | +| `showSearchBar` | `boolean` | Whether `orama-db` is targeted | Overrides whether the navigation renders the search control | | `editURL` | `string` | `'${GITHUB_EDIT_URL}/doc/api{path}.md'` | URL template for "edit this page" links | | `pageURL` | `string` | `'{baseURL}/latest-{version}/api{path}.html'` | URL template for documentation page links | | `head` | `object` | See below | Configurable ``, ``, and raw markup for the document head | diff --git a/src/generators/web/__tests__/generate.test.mjs b/src/generators/web/__tests__/generate.test.mjs index e5f70c76..2cb87b66 100644 --- a/src/generators/web/__tests__/generate.test.mjs +++ b/src/generators/web/__tests__/generate.test.mjs @@ -45,6 +45,23 @@ const createEntry = (api, name) => { }; describe('web generate', () => { + it('only renders search when the Orama database is generated', async () => { + await setConfig({ target: ['web'] }); + const fs = createEntry('fs', 'File system'); + const input = [toCodeItem(await buildContent([fs], fs))]; + + const [withoutOrama] = await generate(input, undefined, { + target: ['web'], + }); + assert.doesNotMatch(withoutOrama.html, /Start typing/); + + await setConfig({ target: ['web', 'orama-db'] }); + const [withOrama] = await generate(input, undefined, { + target: ['web', 'orama-db'], + }); + assert.match(withOrama.html, /Start typing/); + }); + it('omits View As links for synthetic pages only', async () => { await setConfig({}); diff --git a/src/generators/web/generate.mjs b/src/generators/web/generate.mjs index d3526900..8513b694 100644 --- a/src/generators/web/generate.mjs +++ b/src/generators/web/generate.mjs @@ -18,7 +18,7 @@ import { writeFile } from '../../utils/file.mjs'; * * @type {import('./types').Generator['generate']} */ -export async function generate(input) { +export async function generate(input, _worker, { target = [] } = {}) { const config = getConfig('web'); const template = await readFile(config.templatePath, 'utf-8'); @@ -46,6 +46,7 @@ export async function generate(input) { datas, sidebarEntries, template, + searchEnabled: config.showSearchBar ?? target.includes('orama-db'), }); if (config.output) { diff --git a/src/generators/web/index.mjs b/src/generators/web/index.mjs index 080a88e9..52724706 100644 --- a/src/generators/web/index.mjs +++ b/src/generators/web/index.mjs @@ -38,6 +38,7 @@ export default createLazyGenerator({ editURL: `${GITHUB_EDIT_URL}/doc/api{path}.md`, pageURL: '{baseURL}/latest-{version}/api{path}.html', remoteConfigUrl: 'https://nodejs.org/site.json', + showSearchBar: undefined, // Project-specific document `` contents. `meta` and `links` are // arrays of attribute bags (boolean `true` renders a valueless attribute, diff --git a/src/generators/web/types.d.ts b/src/generators/web/types.d.ts index 68588e60..9562b9c4 100644 --- a/src/generators/web/types.d.ts +++ b/src/generators/web/types.d.ts @@ -31,6 +31,7 @@ export type Configuration = { templatePath: string; title: string; useAbsoluteURLs: boolean; + showSearchBar?: boolean; head: HeadConfig; // Options spread into LightningCSS while bundling CSS. `filename`, `code`, // `cssModules`, and `resolver` are managed by the generator and ignored here. diff --git a/src/generators/web/ui/components/NavBar.jsx b/src/generators/web/ui/components/NavBar.jsx index 15fa85dd..b89f9e5b 100644 --- a/src/generators/web/ui/components/NavBar.jsx +++ b/src/generators/web/ui/components/NavBar.jsx @@ -6,7 +6,7 @@ import GitHubIcon from '@node-core/ui-components/Icons/Social/GitHub'; import SearchBox from './SearchBox'; import { useTheme } from '../hooks/useTheme.mjs'; -import { repository } from '#theme/config'; +import { repository, searchEnabled } from '#theme/config'; import Logo from '#theme/Logo'; /** @@ -21,7 +21,7 @@ export default ({ metadata }) => { sidebarItemTogglerAriaLabel="Toggle navigation menu" navItems={[]} > - + {searchEnabled && } } input - JSX AST entries with .data metadata + * @param {boolean} searchEnabled - Whether the search control is enabled * @returns {string} JavaScript source code string with named exports */ -export default function createConfigSource(input) { +export default function createConfigSource(input, searchEnabled) { const { version: configVersion, ...config } = getConfig('web'); const editURL = populate(config.editURL, { @@ -97,6 +98,7 @@ export default function createConfigSource(input) { ] ), version: configVersion, + searchEnabled, versions: buildVersionEntries(config.changelog, pageURL), editURL, pages: buildPageList(input), diff --git a/src/generators/web/utils/processing.mjs b/src/generators/web/utils/processing.mjs index c4f23af7..87b014ab 100644 --- a/src/generators/web/utils/processing.mjs +++ b/src/generators/web/utils/processing.mjs @@ -157,6 +157,7 @@ async function executeServerCode(serverCodeMap, requireFn, virtualImports) { * @param {Array} params.datas - Per-page metadata, in render order. * @param {Array<{ data: import('../../metadata/types').MetadataEntry }>} params.sidebarEntries - Entries used to build the sidebar page list (real module pages only). * @param {string} params.template - The HTML template string for the output pages. + * @param {boolean} params.searchEnabled - Whether to render the search control. */ export async function processBundles({ serverCodeMap, @@ -164,11 +165,12 @@ export async function processBundles({ datas, sidebarEntries, template, + searchEnabled, }) { const config = getConfig('web'); const requireFn = createRequire(import.meta.url); const virtualImports = { - '#theme/config': createConfigSource(sidebarEntries), + '#theme/config': createConfigSource(sidebarEntries, searchEnabled), ...config.virtualImports, };