From 98be1a602a95140d798398917b9a9782017b03ca Mon Sep 17 00:00:00 2001 From: Alex Eftimie Date: Wed, 4 Sep 2024 17:45:01 +0200 Subject: [PATCH] refactor to use partials Signed-off-by: Alex Eftimie --- docs/features/search/how-to-guides.md | 12 ++++- .../DefaultTechDocsCollatorFactory.test.ts | 44 ++++++++++++++++++- .../DefaultTechDocsCollatorFactory.ts | 14 +++--- .../TechDocsCollatorDocumentTransformer.ts | 20 +++++---- .../TechDocsCollatorEntityTransformer.ts | 2 +- .../src/collators/index.ts | 2 - 6 files changed, 73 insertions(+), 21 deletions(-) diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index b0df9440f3..2c51e6ded5 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -86,17 +86,27 @@ const techDocsEntityTransformer: TechDocsCollatorEntityTransformer = ( ) => { return { // add more fields to the index - ...defaultTechDocsCollatorEntityTransformer(entity), tags: entity.metadata.tags, }; }; +const techDocsDocumentTransformer: TechDocsCollatorDocumentTransformer = ( + doc: MkSearchIndexDoc, +) => { + return { + // add more fields to the index + bost: doc.boost, + }; +}; + indexBuilder.addCollator({ collator: DefaultTechDocsCollatorFactory.fromConfig(env.config, { discovery: env.discovery, tokenManager: env.tokenManager, /* highlight-add-next-line */ entityTransformer: techDocsEntityTransformer, + /* highlight-add-next-line */ + documentTransformer: techDocsDocumentTransformer, }), }); ``` diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts index 1fc23b915e..4adb42cf1e 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts @@ -24,9 +24,12 @@ import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { Readable } from 'stream'; import { DefaultTechDocsCollatorFactory } from './DefaultTechDocsCollatorFactory'; -import { defaultTechDocsCollatorEntityTransformer } from './defaultTechDocsCollatorEntityTransformer'; import { TechDocsCollatorEntityTransformer } from './TechDocsCollatorEntityTransformer'; import { DiscoveryService } from '@backstage/backend-plugin-api'; +import { + MkSearchIndexDoc, + TechDocsCollatorDocumentTransformer, +} from './TechDocsCollatorDocumentTransformer'; const logger = mockServices.logger.mock(); @@ -254,11 +257,11 @@ describe('DefaultTechDocsCollatorFactory', () => { }); it('should transform the entity using the entityTransformer function', async () => { + // @ts-ignore const entityTransformer: TechDocsCollatorEntityTransformer = ( entity: Entity, ) => { return { - ...defaultTechDocsCollatorEntityTransformer(entity), tags: entity.metadata.tags, }; }; @@ -289,5 +292,42 @@ describe('DefaultTechDocsCollatorFactory', () => { }); }); }); + + it('should transform the doc using the documentTransformer function', async () => { + // @ts-ignore + const documentTransformer: TechDocsCollatorDocumentTransformer = ( + _: MkSearchIndexDoc, + ) => { + return { + tags: ['static-tag'], + }; + }; + + factory = DefaultTechDocsCollatorFactory.fromConfig(config, { + ...options, + documentTransformer, + }); + + collator = await factory.getCollator(); + + const pipeline = TestPipeline.fromCollator(collator); + const { documents } = await pipeline.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', + entityTitle: entity!.metadata.title, + componentType: entity!.spec!.type, + lifecycle: entity!.spec!.lifecycle, + owner: '', + kind: entity.kind.toLocaleLowerCase('en-US'), + name: entity.metadata.name, + tags: ['static-tag'], + }); + }); + }); }); }); diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts index 6b0eb6255b..4e4b1417cd 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts @@ -109,10 +109,10 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { new CatalogClient({ discoveryApi: options.discovery }); this.parallelismLimit = options.parallelismLimit ?? 10; this.legacyPathCasing = options.legacyPathCasing ?? false; - this.entityTransformer = - options.entityTransformer ?? defaultTechDocsCollatorEntityTransformer; - this.documentTransformer = - options.documentTransformer ?? defaultTechDocsCollatorDocumentTransformer; + // @ts-ignore + this.entityTransformer = options.entityTransformer ?? (() => {}); + // @ts-ignore + this.documentTransformer = options.documentTransformer ?? (() => {}); this.auth = createLegacyAuthAdapters({ auth: options.auth, @@ -226,8 +226,10 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { ]); return searchIndex.docs.map((doc: MkSearchIndexDoc) => ({ - ...this.entityTransformer(entity), - ...this.documentTransformer(doc), + ...defaultTechDocsCollatorEntityTransformer(entity), + ...defaultTechDocsCollatorDocumentTransformer(doc), + ...(this.entityTransformer(entity) ?? {}), + ...(this.documentTransformer(doc) ?? {}), location: this.applyArgsToFormat( this.locationTemplate || '/docs/:namespace/:kind/:name/:path', { diff --git a/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorDocumentTransformer.ts b/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorDocumentTransformer.ts index b95187bde4..5c21c6085f 100644 --- a/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorDocumentTransformer.ts +++ b/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorDocumentTransformer.ts @@ -26,13 +26,15 @@ export interface MkSearchIndexDoc { /** @public */ export type TechDocsCollatorDocumentTransformer = ( doc: MkSearchIndexDoc, -) => Omit< - TechDocsDocument, - | 'location' - | 'authorization' - | 'kind' - | 'namespace' - | 'name' - | 'lifecycle' - | 'owner' +) => Partial< + Omit< + TechDocsDocument, + | 'location' + | 'authorization' + | 'kind' + | 'namespace' + | 'name' + | 'lifecycle' + | 'owner' + > >; diff --git a/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorEntityTransformer.ts b/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorEntityTransformer.ts index 142199e3dc..ff1c543c1e 100644 --- a/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorEntityTransformer.ts +++ b/plugins/search-backend-module-techdocs/src/collators/TechDocsCollatorEntityTransformer.ts @@ -20,4 +20,4 @@ import { TechDocsDocument } from '@backstage/plugin-techdocs-node'; /** @public */ export type TechDocsCollatorEntityTransformer = ( entity: Entity, -) => Omit; +) => Partial>; diff --git a/plugins/search-backend-module-techdocs/src/collators/index.ts b/plugins/search-backend-module-techdocs/src/collators/index.ts index 1f0795368f..289ea39c83 100644 --- a/plugins/search-backend-module-techdocs/src/collators/index.ts +++ b/plugins/search-backend-module-techdocs/src/collators/index.ts @@ -22,8 +22,6 @@ export { defaultTechDocsCollatorEntityTransformer } from './defaultTechDocsColla export type { TechDocsCollatorEntityTransformer } from './TechDocsCollatorEntityTransformer'; -export { defaultTechDocsCollatorDocumentTransformer } from './defaultTechDocsCollatorDocumentTransformer'; - export type { TechDocsCollatorDocumentTransformer, MkSearchIndexDoc,