diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2020-03-27 07:23:17 +0900 |
---|---|---|
committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2020-03-27 20:47:35 +0900 |
commit | a8d78f1286fb3fe456a786b2c0e534d212835560 (patch) | |
tree | d42a27548a7f3ad8b71336109dc5b48f95ec554f /src/background/completion/impl/BookmarkRepositoryImpl.ts | |
parent | b2a37b8fc3e273dd71e1e3558c58be8002aa3789 (diff) |
Separate repository's interface and its implementation
Diffstat (limited to 'src/background/completion/impl/BookmarkRepositoryImpl.ts')
-rw-r--r-- | src/background/completion/impl/BookmarkRepositoryImpl.ts | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/background/completion/impl/BookmarkRepositoryImpl.ts b/src/background/completion/impl/BookmarkRepositoryImpl.ts new file mode 100644 index 0000000..58df129 --- /dev/null +++ b/src/background/completion/impl/BookmarkRepositoryImpl.ts @@ -0,0 +1,28 @@ +import { injectable } from "tsyringe"; +import BookmarkRepository, {BookmarkItem} from "../BookmarkRepository"; + +const COMPLETION_ITEM_LIMIT = 10; + +@injectable() +export default class BookmarkRepositoryImpl implements BookmarkRepository { + async queryBookmarks(query: string): Promise<BookmarkItem[]> { + const items = await browser.bookmarks.search({query}); + return items + .filter(item => item.title && item.title.length > 0) + .filter(item => item.type === 'bookmark' && item.url) + .filter((item) => { + let url = undefined; + try { + url = new URL(item.url!!); + } catch (e) { + return false; + } + return url.protocol !== 'place:'; + }) + .slice(0, COMPLETION_ITEM_LIMIT) + .map(item => ({ + title: item.title!!, + url: item.url!!, + })); + } +} |