diff --git a/docusaurus.config.js b/docusaurus.config.js index f3a2f8e84e..925f8ce8a1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -244,6 +244,11 @@ const config = { appId: 'IYIBF1DKO0', apiKey: 'bd5089d395bb02b42c90304ead050cdf', indexName: 'docs', + // The former version prefix has redirect HTML but no client-side route. + replaceSearchResultPathname: { + from: /^\/docs\/2\.0\//, + to: '/docs/', + }, }, }), }; diff --git a/package.json b/package.json index 97fe2fd5f3..d1b3723d9c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "postinstall": "patch-package", "prestart": "node scripts/check-dependency-security.js", "start": "docusaurus start", - "build": "npm run check:dependency-security && npm run check:node-toolchain && docusaurus build && node scripts/generate-llms.js && node scripts/generate-llms-full.js", + "build": "npm run check:dependency-security && npm run check:node-toolchain && node scripts/search-navigation.test.js && docusaurus build && node scripts/generate-llms.js && node scripts/generate-llms-full.js", "check:node-toolchain": "node scripts/check-node-toolchain.js && node scripts/check-node-toolchain.test.js", "check:dependency-security": "node scripts/check-dependency-security.js && node scripts/check-dependency-security.test.js", "check:platform-protocol-specs": "node scripts/check-platform-protocol-specs.js", diff --git a/scripts/search-navigation.test.js b/scripts/search-navigation.test.js new file mode 100644 index 0000000000..d4166da526 --- /dev/null +++ b/scripts/search-navigation.test.js @@ -0,0 +1,29 @@ +const assert = require('node:assert/strict'); +const {validateThemeConfig} = require('@docusaurus/theme-search-algolia'); +const {themeConfig} = require('../docusaurus.config'); + +// Exercise Docusaurus's normalization, which treats string matchers as literals. +const value = validateThemeConfig({ + themeConfig: {algolia: themeConfig.algolia}, + validate(schema, input) { + const result = schema.validate(input); + assert.ifError(result.error); + return result.value; + }, +}); +const replacement = value.algolia.replaceSearchResultPathname; +assert.ok(replacement, 'Search must resolve the former 2.0 route prefix'); + +for (const [input, expected] of [ + ['/docs/2.0/monitoring/', '/docs/monitoring/'], + ['/docs/2.0/waterline-operator-api/#operator-actions', '/docs/waterline-operator-api/#operator-actions'], + ['/docs/2.0/features/cancel-and-terminate/?q=test#waterline', '/docs/features/cancel-and-terminate/?q=test#waterline'], + ['/docs/1.x/monitoring/', '/docs/1.x/monitoring/'], + ['/docs/monitoring/', '/docs/monitoring/'], + ['/docs/2x0/monitoring/', '/docs/2x0/monitoring/'], + ['/search/?q=/docs/2.0/monitoring/', '/search/?q=/docs/2.0/monitoring/'], +]) { + assert.equal(input.replaceAll(new RegExp(replacement.from, 'g'), replacement.to), expected); +} + +console.log('Search navigation preserves canonical, archived, query and anchor routes.');