UNPKG

@ng-doc/app

Version:

<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>

1 lines 6.33 kB
{"version":3,"file":"ng-doc-app-classes-default-search-engine.mjs","sources":["../../../../libs/app/classes/default-search-engine/default-search-engine.ts","../../../../libs/app/classes/default-search-engine/ng-doc-app-classes-default-search-engine.ts"],"sourcesContent":["import { NgDocSearchEngine } from '@ng-doc/app/classes/search-engine';\nimport { NgDocSearchResult } from '@ng-doc/app/interfaces';\nimport { asArray } from '@ng-doc/core/helpers/as-array';\nimport { objectKeys } from '@ng-doc/core/helpers/object-keys';\nimport { NgDocPageIndex } from '@ng-doc/core/interfaces';\nimport { NgDocHighlightPosition } from '@ng-doc/ui-kit';\nimport { create, insertMultiple, Orama } from '@orama/orama';\nimport {\n afterInsert,\n OramaWithHighlight,\n searchWithHighlight,\n} from '@orama/plugin-match-highlight';\nimport * as stemmer from '@orama/stemmers';\nimport { from, Observable } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\n\ntype OramaDb = OramaWithHighlight<\n Orama<{\n title: 'string';\n section: 'string';\n content: 'string';\n }>\n>;\n\n/**\n * Options for the `NgDocDefaultSearchEngine`.\n */\nexport interface NgDocDefaultSearchEngineOptions {\n /**\n * The language to use for the search engine.\n */\n stemmer?: typeof stemmer.stemmer;\n /**\n * Specifies the maximum distance (following the Levenshtein algorithm) between the term and the searchable property.\n * (doesn't work with `exact` option)\n */\n tolerance?: number;\n /**\n * If `true`, finds all the document with an exact match of the term property.\n */\n exact?: boolean;\n /**\n * Number of results to return (default: 10).\n */\n limit?: number;\n}\n\n/**\n * Search engine for the documentation, it loads the index and provides a search method.\n */\nexport class NgDocDefaultSearchEngine extends NgDocSearchEngine {\n private db$: Observable<OramaDb>;\n\n constructor(private options?: NgDocDefaultSearchEngineOptions) {\n super();\n\n this.db$ = from(\n create({\n schema: {\n title: 'string',\n section: 'string',\n content: 'string',\n },\n plugins: [\n {\n name: 'highlight',\n afterInsert,\n },\n ],\n components: {\n tokenizer: {\n stemmer: options?.stemmer,\n },\n },\n }),\n ).pipe(\n switchMap((db) =>\n this.request<NgDocPageIndex[]>(`assets/ng-doc/indexes.json`).pipe(\n switchMap((pages: NgDocPageIndex[]) => insertMultiple(db, pages as any)),\n map(() => db as unknown as OramaDb),\n ),\n ),\n shareReplay(1),\n ) as Observable<OramaDb>;\n }\n\n /**\n * Search the documentation for the given query.\n * @param query The query to search for.\n */\n search(query: string): Observable<NgDocSearchResult[]> {\n return this.db$.pipe(\n switchMap((db) =>\n searchWithHighlight(db, {\n term: query,\n boost: { title: 4, section: 2 },\n threshold: 0.3,\n properties: ['title', 'section', 'content'],\n tolerance: this.options?.tolerance,\n exact: this.options?.exact,\n limit: this.options?.limit ?? 10,\n }),\n ),\n map((result) =>\n result.hits.map((hit) => {\n const keys: Array<keyof NgDocPageIndex> = objectKeys(hit.positions) as unknown as Array<\n keyof NgDocPageIndex\n >;\n\n return {\n index: hit.document as unknown as NgDocPageIndex,\n positions: keys.reduce(\n (\n acc: Record<keyof NgDocPageIndex, NgDocHighlightPosition[]>,\n key: keyof NgDocPageIndex,\n ) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n acc[key] = [...asArray(acc[key]), ...Object.values(hit.positions[key]).flat()];\n\n return acc;\n },\n {} as any,\n ) as Partial<Record<keyof NgDocPageIndex, NgDocHighlightPosition[]>>,\n };\n }),\n ),\n );\n }\n\n private request<T>(url: string): Observable<T> {\n return from(fetch(url)).pipe(switchMap((response: Response) => response.json() as Promise<T>));\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AA+CA;;AAEG;AACG,MAAO,wBAAyB,SAAQ,iBAAiB,CAAA;AAG7D,IAAA,WAAA,CAAoB,OAAyC,EAAA;AAC3D,QAAA,KAAK,EAAE;QADW,IAAO,CAAA,OAAA,GAAP,OAAO;AAGzB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CACb,MAAM,CAAC;AACL,YAAA,MAAM,EAAE;AACN,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,OAAO,EAAE,QAAQ;AAClB,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,WAAW;oBACjB,WAAW;AACZ,iBAAA;AACF,aAAA;AACD,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE;oBACT,OAAO,EAAE,OAAO,EAAE,OAAO;AAC1B,iBAAA;AACF,aAAA;SACF,CAAC,CACH,CAAC,IAAI,CACJ,SAAS,CAAC,CAAC,EAAE,KACX,IAAI,CAAC,OAAO,CAAmB,CAAA,0BAAA,CAA4B,CAAC,CAAC,IAAI,CAC/D,SAAS,CAAC,CAAC,KAAuB,KAAK,cAAc,CAAC,EAAE,EAAE,KAAY,CAAC,CAAC,EACxE,GAAG,CAAC,MAAM,EAAwB,CAAC,CACpC,CACF,EACD,WAAW,CAAC,CAAC,CAAC,CACQ;;AAG1B;;;AAGG;AACH,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAClB,SAAS,CAAC,CAAC,EAAE,KACX,mBAAmB,CAAC,EAAE,EAAE;AACtB,YAAA,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;AAC/B,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;AAC3C,YAAA,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS;AAClC,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK;AAC1B,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;AACjC,SAAA,CAAC,CACH,EACD,GAAG,CAAC,CAAC,MAAM,KACT,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACtB,MAAM,IAAI,GAAgC,UAAU,CAAC,GAAG,CAAC,SAAS,CAEjE;YAED,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,QAAqC;gBAChD,SAAS,EAAE,IAAI,CAAC,MAAM,CACpB,CACE,GAA2D,EAC3D,GAAyB,KACvB;;;AAGF,oBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAE9E,oBAAA,OAAO,GAAG;iBACX,EACD,EAAS,CACyD;aACrE;SACF,CAAC,CACH,CACF;;AAGK,IAAA,OAAO,CAAI,GAAW,EAAA;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAkB,KAAK,QAAQ,CAAC,IAAI,EAAgB,CAAC,CAAC;;AAEjG;;ACrID;;AAEG;;;;"}