From 6f45fc799068db91e4d4bf09e7f2138363e8c827 Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Fri, 3 Sep 2021 16:00:00 +0200 Subject: [PATCH 1/7] Modify TechDocsCollator to be aware of new urls * Add boolean constructor param to define if to use legacy paths * Swap urls to match new pattern * Add few tests Signed-off-by: Jussi Hallila --- packages/backend/src/plugins/search.ts | 9 +++- plugins/techdocs-backend/api-report.md | 2 + .../search/DefaultTechDocsCollator.test.ts | 47 ++++++++++++++++++- .../src/search/DefaultTechDocsCollator.ts | 8 +++- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 2da108608e..219bb7e0c9 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -73,7 +73,14 @@ export default async function createPlugin({ indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultTechDocsCollator({ discovery, logger }), + collator: new DefaultTechDocsCollator({ + discovery, + logger, + legacyPathCasing: + config.getOptionalBoolean( + 'techdocs.legacyUseCaseSensitiveTripletPaths', + ) || false, + }), }); // The scheduler controls when documents are gathered from collators and sent diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 4190b3e67c..8c2de20405 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -31,12 +31,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { logger, catalogClient, parallelismLimit, + legacyPathCasing, }: { discovery: PluginEndpointDiscovery; logger: Logger_2; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; + legacyPathCasing?: boolean; }); // (undocumented) protected applyArgsToFormat( diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index 618bb54d60..49b2c46622 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -83,7 +83,7 @@ const expectedEntities: Entity[] = [ }, ]; -describe('DefaultTechDocsCollator', () => { +describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { let mockDiscoveryApi: jest.Mocked; let collator: DefaultTechDocsCollator; @@ -97,6 +97,7 @@ describe('DefaultTechDocsCollator', () => { collator = new DefaultTechDocsCollator({ discovery: mockDiscoveryApi, logger, + legacyPathCasing: true, }); worker.use( @@ -132,6 +133,50 @@ describe('DefaultTechDocsCollator', () => { }); }); }); +}); + +describe('DefaultTechDocsCollator', () => { + let mockDiscoveryApi: jest.Mocked; + let collator: DefaultTechDocsCollator; + + const worker = setupServer(); + msw.setupDefaultHandlers(worker); + beforeEach(() => { + mockDiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), + getExternalBaseUrl: jest.fn(), + }; + collator = new DefaultTechDocsCollator({ + discovery: mockDiscoveryApi, + logger, + }); + + worker.use( + rest.get( + 'http://test-backend/static/docs/default/component/test-entity-with-docs/search/search_index.json', + (_, res, ctx) => res(ctx.status(200), ctx.json(mockSearchDocIndex)), + ), + rest.get('http://test-backend/entities', (_, res, ctx) => + res(ctx.status(200), ctx.json(expectedEntities)), + ), + ); + }); + + it('should create documents for each tech docs search index', async () => { + const documents = await collator.execute(); + const entity = expectedEntities[0]; + documents.forEach((document, idx) => { + expect(document).toMatchObject({ + title: mockSearchDocIndex.docs[idx].title, + location: `/docs/default/component/${entity.metadata.name}/${mockSearchDocIndex.docs[idx].location}`, + text: mockSearchDocIndex.docs[idx].text, + namespace: 'default', + componentType: entity!.spec!.type, + lifecycle: entity!.spec!.lifecycle, + owner: '', + }); + }); + }); it('maps a returned entity with a custom locationTemplate', async () => { // Provide an alternate location template. diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 850be2823c..e83491448a 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -36,6 +36,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { private readonly logger: Logger; private readonly catalogClient: CatalogApi; private readonly parallelismLimit: number; + private readonly legacyPathCasing: boolean; public readonly type: string = 'techdocs'; constructor({ @@ -44,12 +45,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { logger, catalogClient, parallelismLimit = 10, + legacyPathCasing = false, }: { discovery: PluginEndpointDiscovery; logger: Logger; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; + legacyPathCasing?: boolean; }) { this.discovery = discovery; this.locationTemplate = @@ -58,6 +61,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { this.catalogClient = catalogClient || new CatalogClient({ discoveryApi: discovery }); this.parallelismLimit = parallelismLimit; + this.legacyPathCasing = legacyPathCasing; } async execute() { @@ -80,7 +84,9 @@ export class DefaultTechDocsCollator implements DocumentCollator { .map((entity: Entity) => limit(async (): Promise => { const entityInfo = { - kind: entity.kind, + kind: this.legacyPathCasing + ? entity.kind + : entity.kind.toLowerCase(), namespace: entity.metadata.namespace || 'default', name: entity.metadata.name, }; From 1d346ba903536481a05f12b2ad2609ed6714f0ea Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Fri, 3 Sep 2021 16:02:55 +0200 Subject: [PATCH 2/7] Add changeset Signed-off-by: Jussi Hallila --- .changeset/fluffy-peas-care.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fluffy-peas-care.md diff --git a/.changeset/fluffy-peas-care.md b/.changeset/fluffy-peas-care.md new file mode 100644 index 0000000000..6873551eb6 --- /dev/null +++ b/.changeset/fluffy-peas-care.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-backend': patch +--- + +Modify TechDocsCollator to be aware of new TechDocs URL pattern From 44aac03eb7b39b21f3f2f4ce665c19bcadb1088a Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Tue, 7 Sep 2021 15:55:02 +0200 Subject: [PATCH 3/7] Update tech docs search filters to be aware when to use legacy paths and when not. Signed-off-by: Jussi Hallila --- .../reader/components/TechDocsSearch.test.tsx | 26 +++++++++++++-- .../src/reader/components/TechDocsSearch.tsx | 32 +++++++++++++++---- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/plugins/techdocs/src/reader/components/TechDocsSearch.test.tsx b/plugins/techdocs/src/reader/components/TechDocsSearch.test.tsx index 564a8098a5..c6f017e92d 100644 --- a/plugins/techdocs/src/reader/components/TechDocsSearch.test.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsSearch.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import React from 'react'; -import { TechDocsSearch } from './TechDocsSearch'; +import { buildInitialFilters, TechDocsSearch } from './TechDocsSearch'; import { act, fireEvent, @@ -89,7 +89,7 @@ describe('', () => { await singleResult; expect(querySpy).toBeCalledWith({ filters: { - kind: 'Testable', + kind: 'testable', name: 'test', namespace: 'testspace', }, @@ -108,7 +108,7 @@ describe('', () => { await waitFor(() => expect(querySpy).toBeCalledWith({ filters: { - kind: 'Testable', + kind: 'testable', name: 'test', namespace: 'testspace', }, @@ -120,3 +120,23 @@ describe('', () => { }); }); }); + +describe('buildInitialFilters', () => { + const filterEnt = { + name: 'Test', + kind: 'TestKind', + namespace: 'TeStNaMeSpAcE', + }; + it('should use filters as is when legacy path', () => { + const filters = buildInitialFilters(true, filterEnt); + expect(filters).toStrictEqual(filterEnt); + }); + it('should lowercase all filters for new approach', () => { + const filters = buildInitialFilters(false, filterEnt); + expect(filters).toStrictEqual({ + name: 'test', + kind: 'testkind', + namespace: 'testnamespace', + }); + }); +}); diff --git a/plugins/techdocs/src/reader/components/TechDocsSearch.tsx b/plugins/techdocs/src/reader/components/TechDocsSearch.tsx index 6f2df2cc55..2ec5559bb9 100644 --- a/plugins/techdocs/src/reader/components/TechDocsSearch.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsSearch.tsx @@ -16,11 +16,11 @@ import React, { ChangeEvent, useEffect, useState } from 'react'; import { + CircularProgress, Grid, IconButton, InputAdornment, TextField, - CircularProgress, } from '@material-ui/core'; import Autocomplete from '@material-ui/lab/Autocomplete'; import { SearchContextProvider, useSearch } from '@backstage/plugin-search'; @@ -28,13 +28,15 @@ import { DocsResultListItem } from '../../components/DocsResultListItem'; import SearchIcon from '@material-ui/icons/Search'; import { useDebounce } from 'react-use'; import { useNavigate } from 'react-router'; +import { configApiRef, useApi } from '@backstage/core-plugin-api'; +type EntityId = { + name: string; + namespace: string; + kind: string; +}; type TechDocsSearchProps = { - entityId: { - name: string; - namespace: string; - kind: string; - }; + entityId: EntityId; debounceTime?: number; }; @@ -52,6 +54,17 @@ type TechDocsSearchResult = { document: TechDocsDoc; }; +export const buildInitialFilters = ( + legacyPaths: boolean, + entityId: EntityId, +) => { + return legacyPaths + ? entityId + : Object.entries(entityId).reduce((acc, [key, value]) => { + return { ...acc, [key]: value.toLowerCase() }; + }, {}); +}; + const TechDocsSearchBar = ({ entityId, debounceTime = 150, @@ -161,12 +174,17 @@ const TechDocsSearchBar = ({ ); }; + const TechDocsSearch = (props: TechDocsSearchProps) => { + const configApi = useApi(configApiRef); + const legacyPaths = configApi.getOptionalBoolean( + 'techdocs.legacyUseCaseSensitiveTripletPaths', + ); const initialState = { term: '', types: ['techdocs'], pageCursor: '', - filters: props.entityId, + filters: buildInitialFilters(legacyPaths || false, props.entityId), }; return ( From f7c06bcadd361bba45067039791fb99abb7ad10d Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Thu, 9 Sep 2021 11:57:14 +0200 Subject: [PATCH 4/7] Add some more casing changes. Modify DefaultTechDocsCollator to have a static constructor method. Signed-off-by: Jussi Hallila --- .changeset/fluffy-peas-care.md | 3 +- packages/backend/src/plugins/search.ts | 2 +- .../src/search/DefaultTechDocsCollator.ts | 58 ++++++++++++++----- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/.changeset/fluffy-peas-care.md b/.changeset/fluffy-peas-care.md index 6873551eb6..15c0b44ca5 100644 --- a/.changeset/fluffy-peas-care.md +++ b/.changeset/fluffy-peas-care.md @@ -1,5 +1,6 @@ --- '@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs': patch --- -Modify TechDocsCollator to be aware of new TechDocs URL pattern +Modify TechDocsCollator to be aware of new TechDocs URL pattern. Modify tech docs in context search to use correct casing when creating initial filter. diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 219bb7e0c9..68380935d9 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -73,7 +73,7 @@ export default async function createPlugin({ indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultTechDocsCollator({ + collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, legacyPathCasing: diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index e83491448a..283fdb0e1b 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -21,6 +21,7 @@ import fetch from 'cross-fetch'; import unescape from 'lodash/unescape'; import { Logger } from 'winston'; import pLimit from 'p-limit'; +import { Config } from '@backstage/config'; import { CatalogApi, CatalogClient } from '@backstage/catalog-client'; import { TechDocsDocument } from '@backstage/techdocs-common'; @@ -30,6 +31,21 @@ interface MkSearchIndexDoc { location: string; } +type TechDocsCollatorOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; + locationTemplate?: string; + catalogClient?: CatalogApi; + parallelismLimit?: number; + legacyPathCasing?: boolean; +}; + +type EntityInfo = { + name: string; + namespace: string; + kind: string; +}; + export class DefaultTechDocsCollator implements DocumentCollator { protected discovery: PluginEndpointDiscovery; protected locationTemplate: string; @@ -39,6 +55,9 @@ export class DefaultTechDocsCollator implements DocumentCollator { private readonly legacyPathCasing: boolean; public readonly type: string = 'techdocs'; + /** + * @deprecated use static fromConfig method instead. + */ constructor({ discovery, locationTemplate, @@ -46,14 +65,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { catalogClient, parallelismLimit = 10, legacyPathCasing = false, - }: { - discovery: PluginEndpointDiscovery; - logger: Logger; - locationTemplate?: string; - catalogClient?: CatalogApi; - parallelismLimit?: number; - legacyPathCasing?: boolean; - }) { + }: TechDocsCollatorOptions) { this.discovery = discovery; this.locationTemplate = locationTemplate || '/docs/:namespace/:kind/:name/:path'; @@ -64,6 +76,10 @@ export class DefaultTechDocsCollator implements DocumentCollator { this.legacyPathCasing = legacyPathCasing; } + static fromConfig(_config: Config, options: TechDocsCollatorOptions) { + return new DefaultTechDocsCollator(options); + } + async execute() { const limit = pLimit(this.parallelismLimit); const techDocsBaseUrl = await this.discovery.getBaseUrl('techdocs'); @@ -83,13 +99,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { .filter(it => it.metadata?.annotations?.['backstage.io/techdocs-ref']) .map((entity: Entity) => limit(async (): Promise => { - const entityInfo = { - kind: this.legacyPathCasing - ? entity.kind - : entity.kind.toLowerCase(), - namespace: entity.metadata.namespace || 'default', - name: entity.metadata.name, - }; + const entityInfo = DefaultTechDocsCollator.handleEntityInfoCasing( + this.legacyPathCasing, + { + kind: entity.kind, + namespace: entity.metadata.namespace || 'default', + name: entity.metadata.name, + }, + ); try { const searchIndexResponse = await fetch( @@ -144,4 +161,15 @@ export class DefaultTechDocsCollator implements DocumentCollator { ) { return `${techDocsBaseUrl}/static/docs/${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}/search/search_index.json`; } + + private static handleEntityInfoCasing( + legacyPaths: boolean, + entityInfo: EntityInfo, + ): EntityInfo { + return legacyPaths + ? entityInfo + : Object.entries(entityInfo).reduce((acc, [key, value]) => { + return { ...acc, [key]: value.toLowerCase() }; + }, {} as EntityInfo); + } } From feea75ad494d88933fc980cf4b5655bdb033592c Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Thu, 9 Sep 2021 12:03:22 +0200 Subject: [PATCH 5/7] Update api-rep Signed-off-by: Jussi Hallila --- plugins/techdocs-backend/api-report.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 8c2de20405..7d7cad261f 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -25,6 +25,9 @@ export function createRouter(options: RouterOptions): Promise; // // @public (undocumented) export class DefaultTechDocsCollator implements DocumentCollator { + // Warning: (ae-forgotten-export) The symbol "TechDocsCollatorOptions" needs to be exported by the entry point index.d.ts + // + // @deprecated constructor({ discovery, locationTemplate, @@ -32,14 +35,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { catalogClient, parallelismLimit, legacyPathCasing, - }: { - discovery: PluginEndpointDiscovery; - logger: Logger_2; - locationTemplate?: string; - catalogClient?: CatalogApi; - parallelismLimit?: number; - legacyPathCasing?: boolean; - }); + }: TechDocsCollatorOptions); // (undocumented) protected applyArgsToFormat( format: string, @@ -50,6 +46,11 @@ export class DefaultTechDocsCollator implements DocumentCollator { // (undocumented) execute(): Promise; // (undocumented) + static fromConfig( + _config: Config, + options: TechDocsCollatorOptions, + ): DefaultTechDocsCollator; + // (undocumented) protected locationTemplate: string; // (undocumented) readonly type: string; From 65a2d6773572600b646e9557e5e2a5fe27886e03 Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Mon, 13 Sep 2021 09:54:12 +0200 Subject: [PATCH 6/7] Modify fromConfig to actually use the config. Update api-reports. Signed-off-by: Jussi Hallila --- packages/backend/src/plugins/search.ts | 4 ---- plugins/techdocs-backend/api-report.md | 2 +- .../src/search/DefaultTechDocsCollator.test.ts | 10 ++++++++-- .../src/search/DefaultTechDocsCollator.ts | 8 ++++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 68380935d9..4cf9c10021 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -76,10 +76,6 @@ export default async function createPlugin({ collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, - legacyPathCasing: - config.getOptionalBoolean( - 'techdocs.legacyUseCaseSensitiveTripletPaths', - ) || false, }), }); diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 7d7cad261f..f955cea906 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -47,7 +47,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { execute(): Promise; // (undocumented) static fromConfig( - _config: Config, + config: Config, options: TechDocsCollatorOptions, ): DefaultTechDocsCollator; // (undocumented) diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index 49b2c46622..0df22bee53 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -23,6 +23,7 @@ import { DefaultTechDocsCollator } from './DefaultTechDocsCollator'; import { msw } from '@backstage/test-utils'; import { setupServer } from 'msw/node'; import { rest } from 'msw'; +import { ConfigReader } from '@backstage/config'; const logger = getVoidLogger(); @@ -94,7 +95,12 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), getExternalBaseUrl: jest.fn(), }; - collator = new DefaultTechDocsCollator({ + const mockConfig = new ConfigReader({ + techdocs: { + legacyUseCaseSensitiveTripletPaths: true, + }, + }); + collator = DefaultTechDocsCollator.fromConfig(mockConfig, { discovery: mockDiscoveryApi, logger, legacyPathCasing: true, @@ -146,7 +152,7 @@ describe('DefaultTechDocsCollator', () => { getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), getExternalBaseUrl: jest.fn(), }; - collator = new DefaultTechDocsCollator({ + collator = DefaultTechDocsCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, logger, }); diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 283fdb0e1b..5f0bc5f79e 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -76,8 +76,12 @@ export class DefaultTechDocsCollator implements DocumentCollator { this.legacyPathCasing = legacyPathCasing; } - static fromConfig(_config: Config, options: TechDocsCollatorOptions) { - return new DefaultTechDocsCollator(options); + static fromConfig(config: Config, options: TechDocsCollatorOptions) { + const legacyPathCasing = + config.getOptionalBoolean( + 'techdocs.legacyUseCaseSensitiveTripletPaths', + ) || false; + return new DefaultTechDocsCollator({ ...options, legacyPathCasing }); } async execute() { From 9fb0503c15264e4779a48f724a5861bfce11053e Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Wed, 15 Sep 2021 15:31:03 +0200 Subject: [PATCH 7/7] Tweak lowecasing, export Optios type Signed-off-by: Jussi Hallila --- plugins/techdocs-backend/api-report.md | 14 ++++++++++++-- .../src/search/DefaultTechDocsCollator.ts | 4 ++-- plugins/techdocs-backend/src/search/index.ts | 2 ++ .../src/reader/components/TechDocsSearch.tsx | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index f955cea906..466b02a307 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -25,8 +25,6 @@ export function createRouter(options: RouterOptions): Promise; // // @public (undocumented) export class DefaultTechDocsCollator implements DocumentCollator { - // Warning: (ae-forgotten-export) The symbol "TechDocsCollatorOptions" needs to be exported by the entry point index.d.ts - // // @deprecated constructor({ discovery, @@ -56,6 +54,18 @@ export class DefaultTechDocsCollator implements DocumentCollator { readonly type: string; } +// Warning: (ae-missing-release-tag) "TechDocsCollatorOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type TechDocsCollatorOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger_2; + locationTemplate?: string; + catalogClient?: CatalogApi; + parallelismLimit?: number; + legacyPathCasing?: boolean; +}; + export { TechDocsDocument }; export * from '@backstage/techdocs-common'; diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 5f0bc5f79e..cb7d40206b 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -31,7 +31,7 @@ interface MkSearchIndexDoc { location: string; } -type TechDocsCollatorOptions = { +export type TechDocsCollatorOptions = { discovery: PluginEndpointDiscovery; logger: Logger; locationTemplate?: string; @@ -173,7 +173,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { return legacyPaths ? entityInfo : Object.entries(entityInfo).reduce((acc, [key, value]) => { - return { ...acc, [key]: value.toLowerCase() }; + return { ...acc, [key]: value.toLocaleLowerCase('en-US') }; }, {} as EntityInfo); } } diff --git a/plugins/techdocs-backend/src/search/index.ts b/plugins/techdocs-backend/src/search/index.ts index fcb970bcee..53e0934789 100644 --- a/plugins/techdocs-backend/src/search/index.ts +++ b/plugins/techdocs-backend/src/search/index.ts @@ -15,6 +15,8 @@ */ export { DefaultTechDocsCollator } from './DefaultTechDocsCollator'; +export type { TechDocsCollatorOptions } from './DefaultTechDocsCollator'; + /** * @deprecated Use directly from @backstage/techdocs-common */ diff --git a/plugins/techdocs/src/reader/components/TechDocsSearch.tsx b/plugins/techdocs/src/reader/components/TechDocsSearch.tsx index 2ec5559bb9..5d330100ce 100644 --- a/plugins/techdocs/src/reader/components/TechDocsSearch.tsx +++ b/plugins/techdocs/src/reader/components/TechDocsSearch.tsx @@ -61,7 +61,7 @@ export const buildInitialFilters = ( return legacyPaths ? entityId : Object.entries(entityId).reduce((acc, [key, value]) => { - return { ...acc, [key]: value.toLowerCase() }; + return { ...acc, [key]: value.toLocaleLowerCase('en-US') }; }, {}); };