{"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 { stemmer } from '@orama/stemmers/english';\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. See https://www.npmjs.com/package/@orama/stemmers for available languages\n   */\n  stemmer?: typeof 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,IAAA,CAAA,OAAO,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;IAC1B;AAEA;;;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;gBACZ,CAAC,EACD,EAAS,CACyD;aACrE;QACH,CAAC,CAAC,CACH,CACF;IACH;AAEQ,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;IAChG;AACD;;ACrID;;AAEG;;;;"}