mirror of
https://github.com/Redocly/redoc.git
synced 2025-03-10 21:05:47 +03:00
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import { IS_BROWSER } from '../utils/';
|
|
import type { IMenuItem } from './types';
|
|
import type { OperationModel } from './models';
|
|
|
|
import Worker from './SearchWorker.worker';
|
|
|
|
function getWorker() {
|
|
let worker: new () => Worker;
|
|
if (IS_BROWSER) {
|
|
try {
|
|
// tslint:disable-next-line
|
|
worker = require('workerize-loader?inline&fallback=false!./SearchWorker.worker');
|
|
} catch (e) {
|
|
worker = require('./SearchWorker.worker').default;
|
|
}
|
|
} else {
|
|
worker = require('./SearchWorker.worker').default;
|
|
}
|
|
return new worker();
|
|
}
|
|
|
|
export class SearchStore<T> {
|
|
searchWorker = getWorker();
|
|
|
|
indexItems(groups: Array<IMenuItem | OperationModel>) {
|
|
const recurse = items => {
|
|
items.forEach(group => {
|
|
if (group.type !== 'group') {
|
|
this.add(group.name, group.description || '', group.id);
|
|
}
|
|
recurse(group.items);
|
|
});
|
|
};
|
|
|
|
recurse(groups);
|
|
this.searchWorker.done();
|
|
}
|
|
|
|
add(title: string, body: string, meta?: T) {
|
|
this.searchWorker.add(title, body, meta);
|
|
}
|
|
|
|
dispose() {
|
|
(this.searchWorker as any).terminate();
|
|
(this.searchWorker as any).dispose();
|
|
}
|
|
|
|
search(q: string) {
|
|
return this.searchWorker.search<T>(q);
|
|
}
|
|
|
|
async toJS() {
|
|
return this.searchWorker.toJS();
|
|
}
|
|
|
|
load(state: any) {
|
|
this.searchWorker.load(state);
|
|
}
|
|
|
|
fromExternalJS(path?: string, exportName?: string) {
|
|
if (path && exportName) {
|
|
this.searchWorker.fromExternalJS(path, exportName);
|
|
}
|
|
}
|
|
}
|