From 781b2aa1ca6385719ccba602b0797afae7079aff Mon Sep 17 00:00:00 2001 From: wanxp <977741432@qq.com> Date: Mon, 24 Oct 2022 19:39:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A7=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- douban/Douban.ts | 124 - douban/DoubanSettingTab.ts | 291 -- douban/ResponseHandle.ts | 13 - douban/handler/DoubanAbstractLoadHandler.ts | 93 - douban/handler/DoubanBookLoadHandler.ts | 117 - douban/handler/DoubanMovieLoadHandler.ts | 78 - douban/handler/DoubanMusicLoadHandler.ts | 103 - douban/handler/DoubanNoteLoadHandler.ts | 69 - douban/handler/DoubanOtherLoadHandler.ts | 29 - .../handler/DoubanSearchChooseItemHandler.ts | 69 - douban/handler/DoubanSubjectLoadHandler.ts | 14 - douban/handler/DoubanTeleplayLoadHandler.ts | 80 - douban/model/DoubanBookSubject.ts | 22 - douban/model/DoubanMovieSubject.ts | 15 - douban/model/DoubanMusicSubject.ts | 16 - douban/model/DoubanNoteSubject.ts | 11 - douban/model/DoubanSearchResultSubject.ts | 6 - douban/model/DoubanSubject.ts | 7 - douban/model/DoubanTeleplaySubject.ts | 14 - .../search/DoubanSearchFuzzySuggestModal.ts | 53 - douban/search/DoubanSearchModal.ts | 65 - douban/search/Search.ts | 24 - douban/search/SearchParser.ts | 28 - jest.config.js | 24 + lang/helper.ts | 23 - lang/locale/en.ts | 77 - lang/locale/zh-cn.ts | 83 - package-lock.json | 2539 +++++++++++++++++ package.json | 8 +- tsconfig.json | 4 +- typings/tiny-network.d.ts | 6 - utils/HttpUtil.ts | 34 - utils/Logutil.ts | 35 - utils/SchemaOrg.ts | 25 - 34 files changed, 2572 insertions(+), 1627 deletions(-) delete mode 100644 douban/Douban.ts delete mode 100644 douban/DoubanSettingTab.ts delete mode 100644 douban/ResponseHandle.ts delete mode 100644 douban/handler/DoubanAbstractLoadHandler.ts delete mode 100644 douban/handler/DoubanBookLoadHandler.ts delete mode 100644 douban/handler/DoubanMovieLoadHandler.ts delete mode 100644 douban/handler/DoubanMusicLoadHandler.ts delete mode 100644 douban/handler/DoubanNoteLoadHandler.ts delete mode 100644 douban/handler/DoubanOtherLoadHandler.ts delete mode 100644 douban/handler/DoubanSearchChooseItemHandler.ts delete mode 100644 douban/handler/DoubanSubjectLoadHandler.ts delete mode 100644 douban/handler/DoubanTeleplayLoadHandler.ts delete mode 100644 douban/model/DoubanBookSubject.ts delete mode 100644 douban/model/DoubanMovieSubject.ts delete mode 100644 douban/model/DoubanMusicSubject.ts delete mode 100644 douban/model/DoubanNoteSubject.ts delete mode 100644 douban/model/DoubanSearchResultSubject.ts delete mode 100644 douban/model/DoubanSubject.ts delete mode 100644 douban/model/DoubanTeleplaySubject.ts delete mode 100644 douban/search/DoubanSearchFuzzySuggestModal.ts delete mode 100644 douban/search/DoubanSearchModal.ts delete mode 100644 douban/search/Search.ts delete mode 100644 douban/search/SearchParser.ts create mode 100644 jest.config.js delete mode 100644 lang/helper.ts delete mode 100644 lang/locale/en.ts delete mode 100644 lang/locale/zh-cn.ts delete mode 100644 typings/tiny-network.d.ts delete mode 100644 utils/HttpUtil.ts delete mode 100644 utils/Logutil.ts delete mode 100644 utils/SchemaOrg.ts diff --git a/douban/Douban.ts b/douban/Douban.ts deleted file mode 100644 index d239afa..0000000 --- a/douban/Douban.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { i18nHelper } from "lang/helper"; -import { type } from "os"; - -export interface DoubanPluginSettings { - movieTemplate:string, - bookTemplate:string, - musicTemplate:string, - noteTemplate:string - dateFormat:string, - dateTimeFormat:string, - searchUrl:string, - arraySpilt:string, - searchHeaders?:string, - personNameMode:PersonNameMode, -} - -export enum PersonNameMode { - CH_NAME = "CH", - EN_NAME = "EN", - CH_EN_NAME = "CH_EN", -} - - -export const doubanHeadrs = { - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7", - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", -}; - -export const DEFAULT_SETTINGS:DoubanPluginSettings = { - movieTemplate: -`--- -doubanId: {{id}} -title: {{title}} -originalTitle: {{originalTitle}} -type: {{type}} -score: {{score}} -genre: {{genre}} -datePublished: {{datePublished}} -director: {{director}} -actor: {{actor}} -author: {{author}} -url: {{url}} -desc: {{desc}} ---- - -![image]({{image}}) -`, - bookTemplate: -`--- -doubanId: {{id}} -title: {{title}} -subTitle: {{subTitle}} -originalTitle: {{originalTitle}} -type: {{type}} -author: {{author}} -score: {{score}} -datePublished: {{datePublished}} -translator: {{translator}} -publish: {{publish}} -isbn: {{isbn}} -url: {{url}} -totalPage: {{totalPage}} -price: {{price}} -tags: Book -desc: {{desc}} ---- - -![image|150]({{image}}) -`, - musicTemplate: -`--- -doubanId: {{id}} -title: {{title}} -type: {{type}} -actor: {{actor}} -score: {{score}} -genre: {{genre}} -medium: {{medium}} -albumType: {{albumType}} -datePublished: {{datePublished}} -publish: {{publish}} -barcode: {{barcode}} -url: {{url}} -numberOfRecords: {{numberOfRecords}} -tags: Music -desc: {{desc}} ---- - -![image|150]({{image}}) -`, -noteTemplate: -`--- -doubanId: {{id}} -title: {{title}} -type: {{type}} -author: [{{author}}]({{authorUrl}}) -timePublished: {{timePublished}} -url: {{url}} -tags: Article -desc: {{desc}} ---- - -- content -{{content}} -`, -// totalWord: {{totalWord}} - - searchUrl: 'https://www.douban.com/search?q=', - searchHeaders: JSON.stringify(doubanHeadrs), - dateFormat: "yyyy-MM-DD", - dateTimeFormat: "yyyy-MM-DD HH:mm:ss", - arraySpilt: ", ", - personNameMode: PersonNameMode.CH_NAME - -} - -export const personNameModeRecords: {[key in PersonNameMode]: string} = { - [PersonNameMode.CH_NAME]: i18nHelper.getMessage("Chinese Name"), - [PersonNameMode.EN_NAME]: i18nHelper.getMessage("English Name"), - [PersonNameMode.CH_EN_NAME]: i18nHelper.getMessage("Chinese And English Name"), - } - - diff --git a/douban/DoubanSettingTab.ts b/douban/DoubanSettingTab.ts deleted file mode 100644 index 856d4da..0000000 --- a/douban/DoubanSettingTab.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { App, PluginSettingTab, Setting } from "obsidian"; -import { DEFAULT_SETTINGS, PersonNameMode, personNameModeRecords } from "./Douban"; - -import DoubanPlugin from "main"; -import { i18nHelper } from "lang/helper"; -import { log } from "utils/Logutil"; - -export class DoubanSettingTab extends PluginSettingTab { - plugin: DoubanPlugin; - - constructor(app: App, plugin: DoubanPlugin) { - super(app, plugin); - this.plugin = plugin; - } - - display(): void { - let { containerEl } = this; - - containerEl.empty(); - - containerEl.createEl("h2", { text: "Obsidian Douban" }); - - new Setting(containerEl).setName(i18nHelper.getMessage('douban search url')) - .then((setting) => { - setting.addText((textField) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('douban search url desc 1')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 2')); - frag.createEl( - 'a', - { - text: i18nHelper.getMessage('Douban'), - href: 'https://www.douban.com', - }, - (a) => { - a.setAttr('target', '_blank'); - } - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 3')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 4')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('douban search url desc 5')); - frag.createEl('br'); - }) - ); - textField.inputEl.addClass("settings_textField"); - textField - .setPlaceholder(DEFAULT_SETTINGS.searchUrl) - .setValue(this.plugin.settings.searchUrl) - .onChange(async (value) => { - this.plugin.settings.searchUrl = value; - await this.plugin.saveSettings(); - }); - - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage("movie content template")).then((setting) => { - setting.addTextArea((textarea) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('movie content template desc 1')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 2')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 3')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 4')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 5')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('movie content template desc 6')); - frag.createEl('br'); - }) - ); - textarea.inputEl.addClass("settings_area"); - textarea.inputEl.setAttr("rows", 10); - textarea.setPlaceholder(DEFAULT_SETTINGS.movieTemplate) - .setValue(this.plugin.settings.movieTemplate) - .onChange(async (value) => { - this.plugin.settings.movieTemplate = value; - await this.plugin.saveSettings(); - }); - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage("book content template")).then((setting) => { - setting.addTextArea((textarea) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('book content template desc 1')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 2')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 3')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 4')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 5')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('book content template desc 6')); - frag.createEl('br'); - }) - ); - textarea.inputEl.addClass("settings_area"); - textarea.inputEl.setAttr("rows", 10); - textarea.setPlaceholder(DEFAULT_SETTINGS.bookTemplate) - .setValue(this.plugin.settings.bookTemplate) - .onChange(async (value) => { - this.plugin.settings.bookTemplate = value; - await this.plugin.saveSettings(); - }); - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage("music content template")).then((setting) => { - setting.addTextArea((textarea) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('music content template desc 1')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 2')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 3')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 4')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 5')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('music content template desc 6')); - frag.createEl('br'); - }) - ); - textarea.inputEl.addClass("settings_area"); - textarea.inputEl.setAttr("rows", 10); - textarea.setPlaceholder(DEFAULT_SETTINGS.musicTemplate) - .setValue(this.plugin.settings.musicTemplate) - .onChange(async (value) => { - this.plugin.settings.musicTemplate = value; - await this.plugin.saveSettings(); - }); - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage("note content template")).then((setting) => { - setting.addTextArea((textarea) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('note content template desc 1')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 2')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 3')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 4')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('note content template desc 5')); - frag.createEl('br'); - - }) - ); - textarea.inputEl.addClass("settings_area"); - textarea.inputEl.setAttr("rows", 10); - textarea.setPlaceholder(DEFAULT_SETTINGS.noteTemplate) - .setValue(this.plugin.settings.noteTemplate) - .onChange(async (value) => { - this.plugin.settings.noteTemplate = value; - await this.plugin.saveSettings(); - }); - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage("Person Name Language Mode")).then((setting) => { - setting.addDropdown((dropdwon) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText(i18nHelper.getMessage('options:')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Chinese Name mode, only show Chinese name')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('English Name mode, only show English name')); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Chinese English Name mode, show Chinese English name both')); - frag.createEl('br'); - }) - ); - // dropdwon.inputEl.addClass("settings_area"); - // dropdwon.inputEl.setAttr("rows", 10); - dropdwon.addOption(PersonNameMode.CH_NAME, personNameModeRecords.CH) - dropdwon.addOption(PersonNameMode.EN_NAME, personNameModeRecords.EN) - dropdwon.addOption(PersonNameMode.CH_EN_NAME, personNameModeRecords.CH_EN) - dropdwon.setValue(this.plugin.settings.personNameMode) - .onChange(async (value:string) => { - this.plugin.settings.personNameMode = value as PersonNameMode; - await this.plugin.saveSettings(); - }); - }); - }); - - - - - new Setting(containerEl).setName(i18nHelper.getMessage('Date format')).then((setting) => { - setting.addMomentFormat((mf) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText( - i18nHelper.getMessage('This format will be used when available template variables contain date.') - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('For more syntax, refer to') + ' '); - frag.createEl( - 'a', - { - text: i18nHelper.getMessage('format reference'), - href: 'https://momentjs.com/docs/#/displaying/format/', - }, - (a) => { - a.setAttr('target', '_blank'); - } - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Your current syntax looks like this') + ': '); - mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' })); - frag.createEl('br'); - }) - ); - mf.setPlaceholder(DEFAULT_SETTINGS.dateFormat); - mf.setValue(this.plugin.settings.dateFormat) - mf.onChange(async (value) => { - this.plugin.settings.dateFormat = value; - await this.plugin.saveSettings(); - }); - - }); - }); - - new Setting(containerEl).setName(i18nHelper.getMessage('DateTime format')).then((setting) => { - setting.addMomentFormat((mf) => { - setting.descEl.appendChild( - createFragment((frag) => { - frag.appendText( - i18nHelper.getMessage('This format will be used when available template variables contain dateTime.') - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('For more syntax, refer to') + ' '); - frag.createEl( - 'a', - { - text: i18nHelper.getMessage('format reference'), - href: 'https://momentjs.com/docs/#/displaying/format/', - }, - (a) => { - a.setAttr('target', '_blank'); - } - ); - frag.createEl('br'); - frag.appendText(i18nHelper.getMessage('Your current syntax looks like this') + ': '); - mf.setSampleEl(frag.createEl('b', { cls: 'u-pop' })); - frag.createEl('br'); - }) - ); - mf.setPlaceholder(DEFAULT_SETTINGS.dateTimeFormat); - mf.setValue(this.plugin.settings.dateTimeFormat) - mf.onChange(async (value) => { - this.plugin.settings.dateTimeFormat = value; - await this.plugin.saveSettings(); - }); - - }); - }); - - - new Setting(containerEl) - .setName(i18nHelper.getMessage("Array Spilt String")) - .setDesc(i18nHelper.getMessage(`string to join between array type, such as author, actor`)) - .addText((textField) => { - textField.setPlaceholder(DEFAULT_SETTINGS.arraySpilt) - .setValue(this.plugin.settings.arraySpilt) - .onChange(async (value) => { - this.plugin.settings.arraySpilt = value; - await this.plugin.saveSettings(); - }); - }); - - } - } \ No newline at end of file diff --git a/douban/ResponseHandle.ts b/douban/ResponseHandle.ts deleted file mode 100644 index cbef1d2..0000000 --- a/douban/ResponseHandle.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Notice } from "obsidian"; - -export const ensureStatusCode = (expected:any) => { - if (!Array.isArray(expected)) - expected = [expected]; - return (res:any) => { - const { statusCode } = res; - if(!expected.includes(statusCode)) { - new Notice(`Request Douban failed, Status code must be "${expected}" but actually "${statusCode}"`) - } - return res; - }; - }; \ No newline at end of file diff --git a/douban/handler/DoubanAbstractLoadHandler.ts b/douban/handler/DoubanAbstractLoadHandler.ts deleted file mode 100644 index 7e0ff49..0000000 --- a/douban/handler/DoubanAbstractLoadHandler.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { CheerioAPI, load } from 'cheerio'; -import { DoubanPluginSettings, PersonNameMode } from "douban/Douban"; -import { get, readStream } from "tiny-network"; - -import DoubanPlugin from "main"; -import DoubanSubject from "douban/model/DoubanSubject"; -import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; -import { Editor } from "obsidian"; -import { i18nHelper } from 'lang/helper'; -import { log } from "utils/Logutil"; - -export default abstract class DoubanAbstractLoadHandler implements DoubanSubjectLoadHandler { - - - public doubanPlugin:DoubanPlugin; - - constructor(doubanPlugin:DoubanPlugin) { - this.doubanPlugin = doubanPlugin; - } - - abstract parseText(extract: T, settings:DoubanPluginSettings): string; - - abstract support(extract: DoubanSubject): boolean; - - handle(url:string, editor:Editor):void { - Promise.resolve().then(() => get(log.traceN("GET URL", url + "/"), log.traceN("GET HEAD", JSON.parse(this.doubanPlugin.settings.searchHeaders)))) - .then(readStream) - .then(a => {log.trace(a.toString()); return a;}) - .then(load) - .then(this.parseSubjectFromHtml) - .then(content => this.toEditor(editor, content)) - // .then(content => content ? editor.replaceSelection(content) : content) - .catch(e => log.error(i18nHelper.getMessage("Fetch Data Error"))) - ; - - } - - abstract parseSubjectFromHtml(data:CheerioAPI):T | undefined; - - toEditor(editor:Editor, extract: T):T { - this.doubanPlugin.putToEditor(editor, extract); - return extract; - } - - getPersonName(name:string, settings:DoubanPluginSettings):string { - if(!name || !settings || !settings.personNameMode) { - return ""; - } - var resultName = ""; - switch(settings.personNameMode) { - case PersonNameMode.CH_NAME: - var regValue = /[\u4e00-\u9fa5]{2,20}/g.exec(name); - resultName = regValue?regValue[0]:name; - break; - case PersonNameMode.EN_NAME: - var regValue = /[a-zA-Z.\s\-]{2,50}/g.exec(name); - resultName = regValue?regValue[0]:name; - break; - default: - resultName = name; - } - return resultName; - } - - html_encode(str:string):string - { - var s = ""; - if (str.length == 0) return ""; - s = str.replace(/&/g, "&"); - s = s.replace(//g, ">"); - s = s.replace(/ /g, " "); - s = s.replace(/\'/g, "'"); - s = s.replace(/\"/g, """); - s = s.replace(/\n/g, "
"); - return s; - } - - html_decode(str:string):string - { - var s = ""; - if (str.length == 0) return ""; - s = str.replace(/&/g, "&"); - s = s.replace(/</g, "<"); - s = s.replace(/>/g, ">"); - s = s.replace(/ /g, " "); - s = s.replace(/'/g, "\'"); - s = s.replace(/"/g, "\""); - s = s.replace(//g, "\n"); - return s; - } - -} \ No newline at end of file diff --git a/douban/handler/DoubanBookLoadHandler.ts b/douban/handler/DoubanBookLoadHandler.ts deleted file mode 100644 index b68d8b7..0000000 --- a/douban/handler/DoubanBookLoadHandler.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Editor, moment, renderResults } from "obsidian"; - -import { CheerioAPI } from 'cheerio'; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanBookSubject from "douban/model/DoubanBookSubject"; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; - -export default class DoubanBookLoadHandler extends DoubanAbstractLoadHandler { - - parseText(extract: DoubanBookSubject, settings:DoubanPluginSettings): string { - return settings.bookTemplate ? settings.bookTemplate.replaceAll("{{id}}", extract.id) - .replaceAll("{{type}}", extract.type ? extract.type : "") - .replaceAll("{{title}}", extract.title ? extract.title : "") - .replaceAll("{{desc}}", extract.desc ? extract.desc : "") - .replaceAll("{{image}}", extract.image ? extract.image : "") - .replaceAll("{{author}}", extract.author ? extract.author.join(settings.arraySpilt) : "") - .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{score}}", extract.score && extract.score ? extract.score + "" : "") - .replaceAll("{{translator}}", extract.translator ? extract.translator.join(settings.arraySpilt) : "") - .replaceAll("{{totalWord}}", extract.totalWord ? extract.totalWord+"" : "") - .replaceAll("{{isbn}}", extract.isbn ? extract.isbn : "") - .replaceAll("{{publish}}", extract.publish ? extract.publish : "") - .replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "") - .replaceAll("{{subTitle}}", extract.subTitle ? extract.subTitle : "") - .replaceAll("{{totalPage}}", extract.totalPage ? extract.totalPage + "" : "") - .replaceAll("{{menu}}", extract.menu ? extract.menu.join(settings.arraySpilt) : "") - .replaceAll("{{price}}", extract.price ? extract.price + "" : "") - .replaceAll("{{labels}}", extract.labels ? extract.labels.join(settings.arraySpilt) : "") - - : undefined; - } - support(extract: DoubanSubject): boolean { - return extract && extract.type && (extract.type.contains("书籍") || extract.type.contains("Book") || extract.type.contains("book")); - } - - - - - - constructor(doubanPlugin:DoubanPlugin) { - super(doubanPlugin); - } - - parseSubjectFromHtml(html: CheerioAPI): DoubanBookSubject { - var title = html(html("head > meta[property= 'og:title']").get(0)).attr("content"); - var desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content"); - var url = html(html("head > meta[property= 'og:url']").get(0)).attr("content"); - var image = html(html("head > meta[property= 'og:image']").get(0)).attr("content"); - var type = html(html("head > meta[property= 'og:type']").get(0)).attr("content"); - var author = html(html("head > meta[property= 'book:author']").get(0)).attr("content"); - var isbn = html(html("head > meta[property= 'book:isbn']").get(0)).attr("content"); - var score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text(); - var detailDom = html(html("#info").get(0)); - var publish = detailDom.find("span.pl"); - - var valueMap = new Map(); - - publish.map((index, info) => { - let key = html(info).text().trim(); - let value = '' - if(key.indexOf('作者') >= 0 || key.indexOf('丛书') >= 0 || key.indexOf('译者') >= 0 || key.indexOf('出版社') >= 0){ - value = html(info.next.next).text().trim(); - }else{ - value = html(info.next).text().trim(); - } - valueMap.set(BookKeyValueMap.get(key), value); - }) - - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(url); - - const result:DoubanBookSubject = { - author: [author], - translator: [valueMap.get('translator')], - bookType: "", - image: image, - datePublished: valueMap.has('datePublished')?new Date(valueMap.get('datePublished')) : null, - totalWord: valueMap.has('totalWord') ? Number(valueMap.get('totalWord')) : null, - isbn: isbn, - publish: valueMap.has('publish') ? valueMap.get('publish') : "", - score: Number(score), - originalTitle: valueMap.has('originalTitle') ? valueMap.get('originalTitle') : "", - subTitle: "", - totalPage: valueMap.has('originalTitle') ? Number(valueMap.get('totalPage')) : null, - belong: "", - menu: [], - price: valueMap.has('price') ? Number(valueMap.get('price').replace('元', '')) : null, - labels: [], - id: id ? id[0]:"", - type: "Book", - title: title, - desc: desc, - url: url - }; - return result; -} - - -} - - -const BookKeyValueMap:Map = new Map( - [['作者', 'author'], - ['出版社:', 'publish'], - ['原作名:', 'originalTitle'], - ['出版年:', 'datePublished'], - ['页数:', 'totalPage'], - ['定价:', 'price'], - ['装帧:', 'binding'], - ['丛书:', 'bush'], - ['ISBN:', 'isbn'], - ['译者', 'translator'], - ] -); \ No newline at end of file diff --git a/douban/handler/DoubanMovieLoadHandler.ts b/douban/handler/DoubanMovieLoadHandler.ts deleted file mode 100644 index a410ca3..0000000 --- a/douban/handler/DoubanMovieLoadHandler.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { CheerioAPI } from 'cheerio'; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanMovieSubject from "douban/model/DoubanMovieSubject"; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import SchemaOrg from "utils/SchemaOrg"; -import { moment } from "obsidian"; - -export default class DoubanMovieLoadHandler extends DoubanAbstractLoadHandler { - - parseText(extract: DoubanMovieSubject, settings:DoubanPluginSettings): string { - return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id) - .replaceAll("{{type}}", extract.type ? extract.type : "") - .replaceAll("{{title}}", extract.title ? extract.title : "") - .replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "") - .replaceAll("{{desc}}", extract.desc ? extract.desc : "") - .replaceAll("{{image}}", extract.image ? extract.image : "") - .replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{actor}}", extract.actor ? extract.actor.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{score}}", extract.aggregateRating && extract.aggregateRating.ratingValue ? extract.aggregateRating.ratingValue + "" : "") - .replaceAll("{{genre}}", extract.genre ? extract.genre.join(settings.arraySpilt) : "") - - : undefined; } - support(extract: DoubanSubject): boolean { - return extract && extract.type && (extract.type.contains("电影") || extract.type.contains("Movie") || extract.type.contains("movie")); - } - - - - - - constructor(doubanPlugin:DoubanPlugin) { - super(doubanPlugin); - } - - parseSubjectFromHtml(data: CheerioAPI): DoubanMovieSubject { - return data('script') - .get() - .filter(scd => "application/ld+json" == data(scd).attr("type")) - .map(i => { - var item = data(i).text(); - item = super.html_decode(item); - var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(obj.url); - var name = obj.name; - var titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name); - var title = titleExec?titleExec[0]:name; - - var originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); - var originalTitle = originalTitleExec?originalTitleExec[0]:name; - - const result:DoubanMovieSubject = { - id: id?id[0]:'', - type: 'Movie', - title: title, - originalTitle: originalTitle, - desc: obj.description, - url: "https://movie.douban.com" + obj.url, - director: obj.director, - author: obj.author, - actor: obj.actor, - aggregateRating: obj.aggregateRating, - datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, - image:obj.image, - genre:obj.genre - } - return result; - })[0]; - } - -} - - diff --git a/douban/handler/DoubanMusicLoadHandler.ts b/douban/handler/DoubanMusicLoadHandler.ts deleted file mode 100644 index 9d36f63..0000000 --- a/douban/handler/DoubanMusicLoadHandler.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { CheerioAPI } from 'cheerio'; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanMusicSubject from 'douban/model/DoubanMusicSubject'; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import { moment } from "obsidian"; - -export default class DoubanMusicLoadHandler extends DoubanAbstractLoadHandler { - - parseText(extract: DoubanMusicSubject, settings:DoubanPluginSettings): string { - return settings.bookTemplate ? settings.musicTemplate - .replaceAll("{{id}}", extract.id) - .replaceAll("{{type}}", extract.type ? extract.type : "") - .replaceAll("{{title}}", extract.title ? extract.title : "") - .replaceAll("{{desc}}", extract.desc ? extract.desc : "") - .replaceAll("{{image}}", extract.image ? extract.image : "") - .replaceAll("{{actor}}", extract.actor ? extract.actor.join(settings.arraySpilt) : "") - .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{score}}", extract.score && extract.score ? extract.score + "" : "") - .replaceAll("{{barcode}}", extract.barcode ? extract.barcode : "") - .replaceAll("{{publish}}", extract.publish ? extract.publish : "") - .replaceAll("{{genre}}", extract.genre ? extract.genre : "") - .replaceAll("{{medium}}", extract.medium ? extract.medium : "") - .replaceAll("{{albumType}}", extract.albumType ? extract.albumType : "") - .replaceAll("{{numberOfRecords}}", extract.numberOfRecords ? extract.numberOfRecords + "" : "") - : undefined; - } - support(extract: DoubanSubject): boolean { - return extract && extract.type && (extract.type.contains("音乐") || extract.type.contains("Music") || extract.type.contains("music")); - } - - - - - - constructor(doubanPlugin:DoubanPlugin) { - super(doubanPlugin); - } - - parseSubjectFromHtml(html: CheerioAPI): DoubanMusicSubject { - var title = html(html("head > meta[property= 'og:title']").get(0)).attr("content"); - var desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content"); - var url = html(html("head > meta[property= 'og:url']").get(0)).attr("content"); - var image = html(html("head > meta[property= 'og:image']").get(0)).attr("content"); - var score = html(html("#interest_sectl > div > div.rating_self.clearfix > strong[property= 'v:average']").get(0)).text(); - var detailDom = html(html("#info").get(0)); - var publish = detailDom.find("span.pl"); - - var valueMap = new Map(); - - publish.map((index, info) => { - let key = html(info).text().trim(); - let value = '' - if(key.indexOf('表演者') >= 0){ - // value = html(info.next.next).text().trim(); - var vas:string[] = key.split("\n \n "); - value = vas && vas.length > 1? vas[1]:""; - key = vas && vas.length > 0? vas[0]:""; - }else{ - value = html(info.next).text().trim(); - } - valueMap.set(BookKeyValueMap.get(key), value); - }) - - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(url); - - const result:DoubanMusicSubject = { - image: image, - datePublished: valueMap.has('datePublished') ? new Date(valueMap.get('datePublished')) : null, - publish: valueMap.has('publish') ? valueMap.get('publish') : "", - score: Number(score), - numberOfRecords: valueMap.has('numberOfRecords') ? Number(valueMap.get('numberOfRecords')) : null, - id: id ? id[0] : "", - type: "Music", - title: title, - desc: desc, - url: url, - actor: [valueMap.has('actor') ? valueMap.get('actor') : null], - genre: valueMap.has('genre') ? valueMap.get('genre') : "", - albumType: valueMap.has('albumType') ? valueMap.get('albumType') : "", - medium: valueMap.has('medium') ? valueMap.get('medium') : "", - barcode: valueMap.has('barcode') ? valueMap.get('barcode') : "" - }; - return result; -} - - -} - - -const BookKeyValueMap:Map = new Map( - [['表演者:', 'actor'], - ['流派:', 'genre'], - ['发行时间:', 'datePublished'], - ['专辑类型:', 'albumType'], - ['介质:', 'medium'], - ['出版者:', 'publish'], - ['唱片数:', 'numberOfRecords'], - ['条形码:', 'barcode']] -); \ No newline at end of file diff --git a/douban/handler/DoubanNoteLoadHandler.ts b/douban/handler/DoubanNoteLoadHandler.ts deleted file mode 100644 index 3659124..0000000 --- a/douban/handler/DoubanNoteLoadHandler.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { CheerioAPI } from 'cheerio'; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanNoteSubject from 'douban/model/DoubanNoteSubject'; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import html2markdown from '@notable/html2markdown'; -import { moment } from "obsidian"; - -export default class DoubanNoteLoadHandler extends DoubanAbstractLoadHandler { - - parseText(extract: DoubanNoteSubject, settings:DoubanPluginSettings): string { - return settings.bookTemplate ? settings.noteTemplate - .replaceAll("{{id}}", extract.id) - .replaceAll("{{type}}", extract.type ? extract.type : "") - .replaceAll("{{title}}", extract.title ? extract.title : "") - .replaceAll("{{desc}}", extract.desc ? extract.desc : "") - .replaceAll("{{image}}", extract.image ? extract.image : "") - .replaceAll("{{timePublished}}", extract.timePublished ? moment(extract.timePublished).format(settings.dateTimeFormat) : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{content}}", extract.content ? extract.content : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{authorUrl}}", extract.authorUrl ? extract.authorUrl : "") - .replaceAll("{{author}}", extract.author ? extract.author : "") - - - : undefined; - } - support(extract: DoubanSubject): boolean { - return extract && extract.type && (extract.type.contains("日记") || extract.type.contains("Note") || extract.type.contains("Article")); - } - - - - - - constructor(doubanPlugin:DoubanPlugin) { - super(doubanPlugin); - } - - parseSubjectFromHtml(html: CheerioAPI): DoubanNoteSubject { - var title = html(html("head > meta[property= 'og:title']").get(0)).attr("content"); - var desc = html(html("head > meta[property= 'og:description']").get(0)).attr("content"); - var url = html(html("head > meta[property= 'og:url']").get(0)).attr("content"); - var image = html(html("head > meta[property= 'og:image']").get(0)).attr("content"); - var type = html(html("head > meta[property= 'og:type']").get(0)).attr("content"); - var authorA = html(html("a.note-author").get(0)); - var timePublished = html(html(".pub-date").get(0)).text(); - var content = html(html(".note").get(1)); - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(url); - - const result:DoubanNoteSubject = { - image: image, - timePublished: timePublished ? new Date(timePublished) : null, - content: content ? html2markdown(content.toString()): "", - id: id ? id[0] : "", - type: "Article", - title: title, - desc: desc, - url: url, - author: authorA ? authorA.text() : null, - authorUrl: authorA ? authorA.attr("href") : null, - }; - return result; -} - - -} diff --git a/douban/handler/DoubanOtherLoadHandler.ts b/douban/handler/DoubanOtherLoadHandler.ts deleted file mode 100644 index 964cea3..0000000 --- a/douban/handler/DoubanOtherLoadHandler.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Editor, Notice } from "obsidian"; - -import { CheerioAPI } from "cheerio"; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import { i18nHelper } from "lang/helper"; -import { log } from "utils/Logutil"; - -/** - * 默认的处理器 - */ -export default class DoubanOtherLoadHandler extends DoubanAbstractLoadHandler { - parseText(extract: DoubanSubject, settings:DoubanPluginSettings): string { - log.warn(i18nHelper.getMessage('current version not support type')); - return ""; - } - support(extract: DoubanSubject): boolean { - return false; - } - parseSubjectFromHtml(data: CheerioAPI): DoubanSubject { - return undefined; - } - - - - - -} \ No newline at end of file diff --git a/douban/handler/DoubanSearchChooseItemHandler.ts b/douban/handler/DoubanSearchChooseItemHandler.ts deleted file mode 100644 index 5d20947..0000000 --- a/douban/handler/DoubanSearchChooseItemHandler.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { App, Editor } from "obsidian"; - -import DoubanBookLoadHandler from "./DoubanBookLoadHandler"; -import DoubanMovieLoadHandler from "./DoubanMovieLoadHandler"; -import DoubanMusicLoadHandler from "./DoubanMusicLoadHandler"; -import DoubanNoteLoadHandler from "./DoubanNoteLoadHandler"; -import DoubanOtherLoadHandler from "./DoubanOtherLoadHandler"; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "../model/DoubanSubject"; -import DoubanSubjectLoadHandler from "./DoubanSubjectLoadHandler"; -import { DoubanTeleplayLoadHandler } from "./DoubanTeleplayLoadHandler"; - -export class DoubanSearchChooseItemHandler { - - private _app:App; - private _doubanPlugin:DoubanPlugin; - private _doubanSubjectHandlers:DoubanSubjectLoadHandler[]; - private _doubanSubjectHandlerDefault:DoubanSubjectLoadHandler; - - - - constructor(app:App, doubanPlugin:DoubanPlugin) { - this._app = app; - this._doubanPlugin = doubanPlugin; - this._doubanSubjectHandlerDefault = new DoubanOtherLoadHandler(doubanPlugin); - this._doubanSubjectHandlers = [new DoubanMovieLoadHandler(doubanPlugin), new DoubanBookLoadHandler(doubanPlugin), - new DoubanTeleplayLoadHandler(doubanPlugin), - new DoubanMusicLoadHandler(doubanPlugin), - new DoubanNoteLoadHandler(doubanPlugin), - - this._doubanSubjectHandlerDefault]; - - } - - public handle(searchExtract:DoubanSubject, editor: Editor):void{ - if(!searchExtract) { - return; - } - var doubanSubjectHandlers:DoubanSubjectLoadHandler[] = this._doubanSubjectHandlers - .filter(h => h.support(searchExtract)); - if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) { - doubanSubjectHandlers[0].handle(searchExtract.url, editor); - }else { - this._doubanSubjectHandlerDefault.handle(searchExtract.url, editor); - } - } - - public parseText(extract:DoubanSubject, settings:DoubanPluginSettings):string { - if(!settings) { - return ""; - } - var doubanSubjectHandlers:DoubanSubjectLoadHandler[] = this._doubanSubjectHandlers - .filter(h => h.support(extract)); - if(doubanSubjectHandlers && doubanSubjectHandlers.length > 0) { - var result = doubanSubjectHandlers.map(h => h.parseText(extract, settings)); - if(result && result.length > 0) { - return result[0]; - }else { - return ""; - } - }else { - return this._doubanSubjectHandlerDefault.parseText(extract, settings); - } - - } - -} - diff --git a/douban/handler/DoubanSubjectLoadHandler.ts b/douban/handler/DoubanSubjectLoadHandler.ts deleted file mode 100644 index 6a9c5a8..0000000 --- a/douban/handler/DoubanSubjectLoadHandler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import { Editor } from "obsidian"; - -export default interface DoubanSubjectLoadHandler { - - parseText(extract: T, settings:DoubanPluginSettings): string; - - support(extract:DoubanSubject):boolean; - - handle(url:string, editor: Editor):void; - - -} \ No newline at end of file diff --git a/douban/handler/DoubanTeleplayLoadHandler.ts b/douban/handler/DoubanTeleplayLoadHandler.ts deleted file mode 100644 index 8ad1069..0000000 --- a/douban/handler/DoubanTeleplayLoadHandler.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { CheerioAPI } from "cheerio"; -import DoubanAbstractLoadHandler from "./DoubanAbstractLoadHandler"; -import DoubanPlugin from "main"; -import { DoubanPluginSettings } from "douban/Douban"; -import DoubanSubject from "douban/model/DoubanSubject"; -import DoubanTeleplaySubject from "douban/model/DoubanTeleplaySubject"; -import SchemaOrg from "utils/SchemaOrg"; -import { moment } from "obsidian"; - -/** - * teleplay - */ -export class DoubanTeleplayLoadHandler extends DoubanAbstractLoadHandler{ - - - - constructor(doubanPlugin:DoubanPlugin) { - super(doubanPlugin); - } - - - parseText(extract: DoubanTeleplaySubject, settings:DoubanPluginSettings): string { - return settings.movieTemplate ? settings.movieTemplate.replaceAll("{{id}}", extract.id) - .replaceAll("{{type}}", extract.type ? extract.type : "") - .replaceAll("{{title}}", extract.title ? extract.title : "") - .replaceAll("{{originalTitle}}", extract.originalTitle ? extract.originalTitle : "") - .replaceAll("{{desc}}", extract.desc ? extract.desc : "") - .replaceAll("{{image}}", extract.image ? extract.image : "") - .replaceAll("{{director}}", extract.director ? extract.director.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{actor}}", extract.actor ? extract.actor.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{author}}", extract.author ? extract.author.map(SchemaOrg.getPersonName).map(name => super.getPersonName(name, settings)).filter(c => c).join(settings.arraySpilt) : "") - .replaceAll("{{datePublished}}", extract.datePublished ? moment(extract.datePublished).format(settings.dateFormat) : "") - .replaceAll("{{url}}", extract.url ? extract.url : "") - .replaceAll("{{score}}", extract.aggregateRating && extract.aggregateRating.ratingValue ? extract.aggregateRating.ratingValue + "" : "") - .replaceAll("{{genre}}", extract.genre ? extract.genre.join(settings.arraySpilt) : "") - - : undefined; } - - support(extract: DoubanSubject): boolean { - return extract && extract.type && (extract.type.contains("电视剧") || extract.type.contains("Teleplay") || extract.type.contains("teleplay")); - } - - - parseSubjectFromHtml(data: CheerioAPI): DoubanTeleplaySubject { - return data('script') - .get() - .filter(scd => "application/ld+json" == data(scd).attr("type")) - .map(i => { - var item = data(i).text(); - item = super.html_decode(item); - var obj = JSON.parse(item.replace(/[\r\n\s+]/g, '')); - var idPattern = /(\d){5,10}/g; - var id = idPattern.exec(obj.url); - var name = obj.name; - var titleExec = /[\u4e00-\u9fa5]{2,20}/g.exec(name); - var title = titleExec?titleExec[0]:name; - - var originalTitleExec = /[a-zA-Z.\s\-]{2,50}/g.exec(name); - var originalTitle = originalTitleExec?originalTitleExec[0]:name; - - const result:DoubanTeleplaySubject = { - id: id?id[0]:'', - type: 'Movie', - title: title, - originalTitle: originalTitle, - desc: obj.description, - url: "https://movie.douban.com" + obj.url, - director: obj.director, - author: obj.author, - actor: obj.actor, - aggregateRating: obj.aggregateRating, - datePublished: obj.datePublished ? new Date(obj.datePublished) : undefined, - image:obj.image, - genre:obj.genre - } - return result; - })[0]; - } - -} \ No newline at end of file diff --git a/douban/model/DoubanBookSubject.ts b/douban/model/DoubanBookSubject.ts deleted file mode 100644 index c0287c2..0000000 --- a/douban/model/DoubanBookSubject.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {AggregateRating, Person, WithContext} from 'schema-dts'; - -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanMovieSubject extends DoubanSubject { - author:string[]; - translator:string[]; - bookType:string; - image:string; - datePublished:Date; - totalWord:number; - isbn:string; - publish:string; - score:number; - originalTitle:string; - subTitle:string; - totalPage:number - belong:string; - menu:string[]; - price:number; - labels:string[]; -} diff --git a/douban/model/DoubanMovieSubject.ts b/douban/model/DoubanMovieSubject.ts deleted file mode 100644 index 0f827c2..0000000 --- a/douban/model/DoubanMovieSubject.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {AggregateRating, Person, WithContext} from 'schema-dts'; - -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanMovieSubject extends DoubanSubject { - director:Person[]; - author:Person[]; - actor:Person[]; - aggregateRating:AggregateRating; - datePublished:Date; - image:string; - genre:string[]; - originalTitle:string; - -} diff --git a/douban/model/DoubanMusicSubject.ts b/douban/model/DoubanMusicSubject.ts deleted file mode 100644 index 0101da5..0000000 --- a/douban/model/DoubanMusicSubject.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {AggregateRating, Person, WithContext} from 'schema-dts'; - -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanMusicSubject extends DoubanSubject { - actor:string[]; - datePublished:Date; - image:string; - genre:string; - albumType:string; - medium:string; - publish:string; - numberOfRecords:number; - barcode:string; - score:number; -} diff --git a/douban/model/DoubanNoteSubject.ts b/douban/model/DoubanNoteSubject.ts deleted file mode 100644 index cd13513..0000000 --- a/douban/model/DoubanNoteSubject.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {AggregateRating, Person, WithContext} from 'schema-dts'; - -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanNoteSubject extends DoubanSubject { - author:string; - authorUrl:string; - timePublished:Date; - image:string; - content:string; -} diff --git a/douban/model/DoubanSearchResultSubject.ts b/douban/model/DoubanSearchResultSubject.ts deleted file mode 100644 index dd31f9b..0000000 --- a/douban/model/DoubanSearchResultSubject.ts +++ /dev/null @@ -1,6 +0,0 @@ -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanSearchResultSubject extends DoubanSubject { - score:string; - cast:string; -} \ No newline at end of file diff --git a/douban/model/DoubanSubject.ts b/douban/model/DoubanSubject.ts deleted file mode 100644 index 9d67dd4..0000000 --- a/douban/model/DoubanSubject.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default class DoubanExtract { - id: string; - type: string; - title: string; - desc: string; - url: string; -} diff --git a/douban/model/DoubanTeleplaySubject.ts b/douban/model/DoubanTeleplaySubject.ts deleted file mode 100644 index dc7263e..0000000 --- a/douban/model/DoubanTeleplaySubject.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {AggregateRating, Person, WithContext} from 'schema-dts'; - -import DoubanSubject from "./DoubanSubject"; - -export default class DoubanTeleplaySubject extends DoubanSubject { - director:Person[]; - author:Person[]; - actor:Person[]; - aggregateRating:AggregateRating; - datePublished:Date; - image:string; - genre:string[]; - originalTitle:string; -} diff --git a/douban/search/DoubanSearchFuzzySuggestModal.ts b/douban/search/DoubanSearchFuzzySuggestModal.ts deleted file mode 100644 index e00cc4c..0000000 --- a/douban/search/DoubanSearchFuzzySuggestModal.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { App, Editor, FuzzySuggestModal } from "obsidian"; - -import DoubanPlugin from "main"; -import DoubanSearchResultSubject from "douban/model/DoubanSearchResultSubject"; -import { log } from "utils/Logutil"; - -export {DoubanFuzzySuggester} - - -class DoubanFuzzySuggester extends FuzzySuggestModal { - - public editor: Editor; - private plugin: DoubanPlugin; - private doubanSearchResultExtract:DoubanSearchResultSubject[] - - constructor(plugin: DoubanPlugin, editor: Editor) { - super(app); - this.editor = editor; - this.plugin = plugin; - this.setPlaceholder("Choose an item..."); - - } - - - - getItems(): DoubanSearchResultSubject[] { - return this.doubanSearchResultExtract; - } - - getItemText(item: DoubanSearchResultSubject): string { - let text:string = item.type + "/" + item.score + "/" + item.title + "/" + item.cast; - return text; - } - - onChooseItem(item: DoubanSearchResultSubject, evt: MouseEvent | KeyboardEvent): void { - log.trace(`you chosen : ${JSON.stringify(item)}`) - this.plugin.doubanEtractHandler.handle(item, this.editor); - } - - public showSearchList(doubanSearchResultExtractList:DoubanSearchResultSubject[]) { - this.doubanSearchResultExtract = doubanSearchResultExtractList; - this.start(); - } - - public start(): void { - try { - this.open(); - } catch (e) { - log.error(e); - } - } - -} \ No newline at end of file diff --git a/douban/search/DoubanSearchModal.ts b/douban/search/DoubanSearchModal.ts deleted file mode 100644 index 77e0d67..0000000 --- a/douban/search/DoubanSearchModal.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { App, Editor, Modal, TextComponent } from "obsidian"; - -import DoubanPlugin from "../../main"; -import { i18nHelper } from "lang/helper"; -import { log } from "utils/Logutil"; - -export class DoubanSearchModal extends Modal { - searchTerm: string; - plugin: DoubanPlugin; - editor: Editor; - - constructor(app: App, plugin: DoubanPlugin, editor: Editor) { - super(app); - this.plugin = plugin; - this.editor = editor; - } - - onOpen() { - let { contentEl } = this; - - contentEl.createEl("h2", { text: i18nHelper.getMessage('Enter Search Term:') }); - - const inputs = contentEl.createDiv("inputs"); - const searchInput = new TextComponent(inputs).onChange((searchTerm) => { - this.searchTerm = searchTerm; - }); - searchInput.inputEl.addClass("search_input"); - - searchInput.inputEl.focus(); - searchInput.inputEl.addEventListener("keydown", (event) => { - if (event.key === "Enter") { - this.close(); - } - }); - - - - const controls = contentEl.createDiv("controls"); - const searchButton = controls.createEl("button", { - text: i18nHelper.getMessage('Search'), - cls: "mod-cta", - attr: { - autofocus: true, - }, - }); - searchButton.addClass("search_button"); - - searchButton.addEventListener("click", this.close.bind(this)); - const cancelButton = controls.createEl("button", { text: i18nHelper.getMessage('Cancel') }); - cancelButton.addEventListener("click", this.close.bind(this)); - cancelButton.addClass("search_button"); - - } - - - async onClose() { - let { contentEl } = this; - - contentEl.empty(); - if (this.searchTerm) { - await this.plugin.search(this.searchTerm, this.editor); - } - } - - } \ No newline at end of file diff --git a/douban/search/Search.ts b/douban/search/Search.ts deleted file mode 100644 index f0ad96d..0000000 --- a/douban/search/Search.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { DoubanPluginSettings, doubanHeadrs } from 'douban/Douban'; -import cheerio, { load } from 'cheerio'; -import { get, readStream } from 'tiny-network'; - -import DoubanSearchResultSubject from 'douban/model/DoubanSearchResultSubject'; -import SearchParserHandler from './SearchParser'; -import { ensureStatusCode } from 'douban/ResponseHandle'; -import { log } from 'utils/Logutil'; - -export default class Searcher { - static search(searchItem:string, doubanSettings:DoubanPluginSettings):Promise { - // getData(); - // getData2(); - // return Promise.resolve(); - return Promise - .resolve() - .then(() => get(log.traceN("GET", doubanSettings.searchUrl + searchItem), JSON.parse(doubanSettings.searchHeaders))) - .then(ensureStatusCode(200)) - .then(readStream) - .then(load) - .then(SearchParserHandler.parseSearch) - .then(log.trace); - }; -} diff --git a/douban/search/SearchParser.ts b/douban/search/SearchParser.ts deleted file mode 100644 index a4da63c..0000000 --- a/douban/search/SearchParser.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { CheerioAPI } from "cheerio"; -import DoubanSearchResultSubject from "douban/model/DoubanSearchResultSubject"; - -export default class SearchParserHandler { - static parseSearch(dataHtml:CheerioAPI):DoubanSearchResultSubject[] { - return dataHtml('.result') - .get() - .map((i:any) => { - const item = dataHtml(i); - var idPattern = /(\d){5,10}/g; - var urlPattern = /(https%3A%2F%2F)\S+(\d){5,10}/g; - var linkValue = item.find("div.content > div > h3 > a").attr("href"); - var ececResult = idPattern.exec(linkValue); - var urlResult = urlPattern.exec(linkValue); - var cast = item.find(".subject-cast").text(); - const result:DoubanSearchResultSubject = { - id: ececResult?ececResult[0]:'', - title: item.find("div.content > div > h3 > a").text(), - score: item.find(".rating_nums").text(), - cast: cast, - type: item.find("div.content > div > h3 > span").text(), - desc: item.find("div.content > p").text(), - url: urlResult?decodeURIComponent(urlResult[0]):'https://www.douban.com', - }; - return result; - }) - }; -} \ No newline at end of file diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..d90152b --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +const { default: tsjPreset } = require('ts-jest/presets'); +module.exports = { + preset: 'ts-jest', + rootDir: './', + transform: { + ...tsjPreset.transform + }, + testRegex: '(/test/.*\\.(test|spec))\\.[tj]sx?$', + moduleFileExtensions: [ + "ts", + "tsx", + "js", + "jsx" + ], + moduleNameWrapper: { + '^@APP/(.*)$': '/src/douban/$1' + }, + collectCoverageFrom: { + "**/baseTs/upperFirst.ts", + "**/baseTs/camelCase.ts", + "!**/node_modules/**", + "!**/vendor/**" + } +} \ No newline at end of file diff --git a/lang/helper.ts b/lang/helper.ts deleted file mode 100644 index 91f44ab..0000000 --- a/lang/helper.ts +++ /dev/null @@ -1,23 +0,0 @@ -import en from './locale/en'; -import zhCN from './locale/zh-cn'; - -const localeMap: { [k: string]: Partial } = { - en, - zh: zhCN, -}; - -const lang = window.localStorage.getItem('language'); -const locale = localeMap[lang || 'en']; - - -export default class I18nHelper { - public getMessage(str: keyof typeof en): string { - if (!locale) { - console.error('Error: obsidian douban locale not found', lang); - } - - return (locale && locale[str]) || en[str]; - } -} - -export const i18nHelper:I18nHelper = new I18nHelper(); \ No newline at end of file diff --git a/lang/locale/en.ts b/lang/locale/en.ts deleted file mode 100644 index cf1f436..0000000 --- a/lang/locale/en.ts +++ /dev/null @@ -1,77 +0,0 @@ -//简体中文 -export default { - //main.ts - 'search douban by current file name':'search douban by current file name', - 'search douban and import to current file':'search douban and import to current file', - 'Enter Search Term:':`Enter Search Term:`, - 'Search':`Search`, - 'Cancel':`Cancel`, - //DoubanSettingTab - 'douban search url': `Douban Search Url`, - 'douban search url desc 1': `Douban search page request address. `, - 'douban search url desc 2': `First go to:`, - 'douban search url desc 3': `Don't enter anything in the search input box, just click Search,`, - 'douban search url desc 4': `The redirected web page address is the search address,`, - 'douban search url desc 5': `Just copy the web address to the current input box.`, - - 'movie content template': `Movie Content Template`, - 'movie content template desc 1': `Set markdown Movie template for extract to be inserted.`, - 'movie content template desc 2': `Available template variables are :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, - 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, - 'movie content template desc 6': `{{image}}, {{url}}`, - - 'book content template': `Book Content Template`, - 'book content template desc 1': `Set markdown Book template for extract to be inserted.`, - 'book content template desc 2': `Available Book template variables are :`, - 'book content template desc 3': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, - 'book content template desc 4': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, - 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, - 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, - - 'music content template': `Music Content Template`, - 'music content template desc 1': `Set markdown Music template for extract to be inserted.`, - 'music content template desc 2': `Available Music template variables are :`, - 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, - 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, - 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, - 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, - - 'note content template': `Article Content Template`, - 'note content template desc 1': `Set markdown Article template for extract to be inserted.`, - 'note content template desc 2': `Available Article template variables are :`, - 'note content template desc 3': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, - 'note content template desc 4': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, - 'note content template desc 5': `{{content}}`, - - 'Date format': `Date Format`, - 'DateTime format': `DateTime Format`, - - 'This format will be used when available template variables contain date.': - `This format will be used when available template variables contain date.`, - 'This format will be used when available template variables contain dateTime.': - `This format will be used when available template variables contain dateTime.`, - 'For more syntax, refer to': `For more syntax, refer to`, - 'Your current syntax looks like this':`Your current syntax looks like this`, - 'format reference': `format reference`, - 'Array Spilt String':`Array Spilt String`, - 'string to join between array type, such as author, actor':`string to join between array type, such as author, actor`, - 'Douban Request Headers':`Douban Request Headers`, - 'current version not support type': `This type of import is not supported temporarily, please go to github to submit issues for help`, - 'Douban': `Douban`, - 'Person Name Language Mode':'Person Name Language Mode', - 'options:':"options:", - 'Chinese Name mode, only show Chinese name':'Chinese Name mode, person name only show Chinese name', - 'English Name mode, only show English name':'English Name mode, person name only show English name', - 'Chinese English Name mode, show Chinese English name both':'Chinese English Name mode, show Chinese and English name both', - 'Chinese Name': 'Chinese Name', - 'English Name': 'English Name', - 'Chinese And English Name': 'Chinese And English Name', - - - //error - "Fetch Data Error": "Fetch Data Error, You can go to Github add Issues", - "Obsidian Douban Plugin Error:": "Obsidian Douban Plugin Error: ", - "Obsidian Douban Plugin Warn:": "Obsidian Douban Plugin Warn: ", -} \ No newline at end of file diff --git a/lang/locale/zh-cn.ts b/lang/locale/zh-cn.ts deleted file mode 100644 index d6ca27a..0000000 --- a/lang/locale/zh-cn.ts +++ /dev/null @@ -1,83 +0,0 @@ -//简体中文 -export default { - //main.ts - 'search douban by current file name':'用当前文档名搜索豆瓣并写入当前文档', - 'search douban and import to current file':'在豆瓣搜索并写入到当前文档', - 'Enter Search Term:':`输入搜索内容:`, - 'Search':`搜索`, - 'Cancel':`取消`, - - //DoubanSettingTab - 'douban search url': `豆瓣搜索地址`, - 'douban search url desc 1': `豆瓣搜索页面请求地址, 通常是网页搜索的地址. `, - 'douban search url desc 2': `先访问:`, - 'douban search url desc 3': `然后在搜索输入框不输入任何内容,直接点击搜索,`, - 'douban search url desc 4': `所跳转的网页地址即是搜索地址,`, - 'douban search url desc 5': `将网页地址复制到当前输入框即可,`, - - 'movie content template': `电影文本模板`, - 'movie content template desc 1': `设置选择电影后导入的文本内容模板,`, - 'movie content template desc 2': `支持以下参数名称 :`, - 'movie content template desc 3': `{{id}}, {{type}}, {{title}}, {{originalTitle}},`, - 'movie content template desc 4': `{{score}}, {{datePublished}}, {{director}},`, - 'movie content template desc 5': `{{author}}, {{actor}}, {{desc}}, {{genre}},`, - 'movie content template desc 6': `{{image}}, {{url}}`, - - 'book content template': `书籍文本模板`, - 'book content template desc 1': `设置选择书籍后导入的文本内容模板,`, - 'book content template desc 2': `支持以下参数名称 :`, - 'book content template desc 3': `{{id}}, {{title}}, {{originalTitle}}, {{subTitle}},`, - 'book content template desc 4': `{{score}}, {{author}}, {{datePublished}}, {{type}},`, - 'book content template desc 5': `{{publish}}, {{desc}}, {{translator}}, {{isbn}},`, - 'book content template desc 6': `{{image}}, {{url}}, {{price}}, {{desc}}, {{totalPage}}`, - - 'music content template': `音乐文本模板`, - 'music content template desc 1': `设置选择音乐后导入的文本内容模板,`, - 'music content template desc 2': `支持以下参数名称 :`, - 'music content template desc 3': `{{id}}, {{title}}, {{actor}}, {{genre}},`, - 'music content template desc 4': `{{score}}, {{medium}}, {{datePublished}}, {{type}},`, - 'music content template desc 5': `{{publish}}, {{desc}}, {{albumType}}, {{barcode}},`, - 'music content template desc 6': `{{image}}, {{url}}, {{numberOfRecords}}, {{desc}}`, - - 'note content template': `日记文本模板`, - 'note content template desc 1': `设置选择日记后导入的文本内容模板,`, - 'note content template desc 2': `支持以下参数名称 :`, - 'note content template desc 3': `{{id}}, {{title}}, {{author}}, {{authorUrl}},`, - 'note content template desc 4': `{{timePublished}}, {{url}}, {{desc}}, {{type}},`, - 'note content template desc 5': `{{content}}`, - - - 'Date format': `参数日期格式`, - 'This format will be used when available template variables contain date.': - `这个格式是给上面获取到的参数进行格式化日期时显示的内容 .`, - - 'DateTime format': `参数时间格式`, - 'This format will be used when available template variables contain dateTime.': - `这个格式是给上面获取到的参数进行格式化时间时显示的内容 .`, - 'For more syntax, refer to': `详细介绍请参考`, - 'Your current syntax looks like this':`时间参数时间格式预览`, - 'format reference': `格式参考`, - 'Array Spilt String':`数组分割字符串`, - 'string to join between array type, such as author, actor':`当模板中的变量存在数组, 则需要设定数组元素中的分割符号,比如 演员列表等`, - 'Douban Request Headers':`豆瓣HTTP请求头`, - 'Douban Request Headers Desc': `如果豆瓣搜索或者获取数据失败,请尝试修改这个参数,\n - 参数获取方式为:\n - 1. 访问http://www.douban.com - 2. 复制请求头,仅复制以下请求头 `, - 'current version not support type': `暂时不支持该类型导入,请至github提交issuess获取帮助`, - 'Douban': `豆瓣网`, - - 'Person Name Language Mode':'人名显示模式', - 'options:':"可选项:", - 'Chinese Name mode, only show Chinese name':'中文名称模式, 人名只显示中文名', - 'English Name mode, only show English name':'英文名称模式, 人名只显示英文名', - 'Chinese English Name mode, show Chinese English name both':'中文和英文名称模式, 人名同时显示中文和英文名', - 'Chinese Name': '中文名', - 'English Name': '英文名', - 'Chinese And English Name': '中文名和英文名', - - "Fetch Data Error": "获取数据失败,您如有需要请至Github提交Issues", - "Obsidian Douban Plugin Error: ": "Obsidian Douban插件错误提示:", - "Obsidian Douban Plugin Warn: ": "Obsidian Douban插件异常提示:", - -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 48fb8e1..065b103 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,434 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, + "@babel/core": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.18.7", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", + "dev": true, + "requires": { + "@babel/types": "^7.18.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.8", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", + "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@babel/types": "^7.18.8" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.18.8", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.8.tgz", + "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/traverse": { + "version": "7.18.8", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.18.8.tgz", + "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.8", + "@babel/types": "^7.18.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.8", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.18.8.tgz", + "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "@codemirror/rangeset": { "version": "0.19.9", "resolved": "https://registry.npmmirror.com/@codemirror/rangeset/-/rangeset-0.19.9.tgz", @@ -41,6 +469,284 @@ "w3c-keyname": "^2.2.4" } }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/@jest/console/-/console-28.1.1.tgz", + "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/core/-/core-28.1.2.tgz", + "integrity": "sha512-Xo4E+Sb/nZODMGOPt2G3cMmCBqL4/W2Ijwr7/mrXlq4jdJwcFQ/9KrrJZT2adQRk2otVBXXOz1GRQ4Z5iOgvRQ==", + "dev": true, + "requires": { + "@jest/console": "^28.1.1", + "@jest/reporters": "^28.1.2", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.2", + "@jest/types": "^28.1.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.0.2", + "jest-config": "^28.1.2", + "jest-haste-map": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.1", + "jest-resolve-dependencies": "^28.1.2", + "jest-runner": "^28.1.2", + "jest-runtime": "^28.1.2", + "jest-snapshot": "^28.1.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "jest-watcher": "^28.1.1", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/environment/-/environment-28.1.2.tgz", + "integrity": "sha512-I0CR1RUMmOzd0tRpz10oUfaChBWs+/Hrvn5xYhMEF/ZqrDaaeHwS8yDBqEWCrEnkH2g+WE/6g90oBv3nKpcm8Q==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.2", + "@jest/types": "^28.1.1", + "@types/node": "*", + "jest-mock": "^28.1.1" + } + }, + "@jest/expect": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/expect/-/expect-28.1.2.tgz", + "integrity": "sha512-HBzyZBeFBiOelNbBKN0pilWbbrGvwDUwAqMC46NVJmWm8AVkuE58NbG1s7DR4cxFt4U5cVLxofAoHxgvC5MyOw==", + "dev": true, + "requires": { + "expect": "^28.1.1", + "jest-snapshot": "^28.1.2" + } + }, + "@jest/expect-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz", + "integrity": "sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" + } + }, + "@jest/fake-timers": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/fake-timers/-/fake-timers-28.1.2.tgz", + "integrity": "sha512-xSYEI7Y0D5FbZN2LsCUj/EKRR1zfQYmGuAUVh6xTqhx7V5JhjgMcK5Pa0iR6WIk0GXiHDe0Ke4A+yERKE9saqg==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.1", + "jest-mock": "^28.1.1", + "jest-util": "^28.1.1" + } + }, + "@jest/globals": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/globals/-/globals-28.1.2.tgz", + "integrity": "sha512-cz0lkJVDOtDaYhvT3Fv2U1B6FtBnV+OpEyJCzTHM1fdoTsU4QNLAt/H4RkiwEUU+dL4g/MFsoTuHeT2pvbo4Hg==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.2", + "@jest/expect": "^28.1.2", + "@jest/types": "^28.1.1" + } + }, + "@jest/reporters": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/reporters/-/reporters-28.1.2.tgz", + "integrity": "sha512-/whGLhiwAqeCTmQEouSigUZJPVl7sW8V26EiboImL+UyXznnr1a03/YZ2BX8OlFw0n+Zlwu+EZAITZtaeRTxyA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.1", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.2", + "@jest/types": "^28.1.1", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", + "jest-worker": "^28.1.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "28.0.2", + "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.23.3" + } + }, + "@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", + "dev": true, + "requires": { + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz", + "integrity": "sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/@jest/transform/-/transform-28.1.2.tgz", + "integrity": "sha512-3o+lKF6iweLeJFHBlMJysdaPbpoMmtbHEFsjzSv37HIq/wWt5ijTeO2Yf7MO5yyczCopD507cNwNLeX8Y/CuIg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.1", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + } + }, + "@jest/types": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -75,6 +781,71 @@ "mime2ext": "^1.0.1" } }, + "@sinclair/typebox": { + "version": "0.23.5", + "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.17.1", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/codemirror": { "version": "0.0.108", "resolved": "https://registry.npmmirror.com/@types/codemirror/-/codemirror-0.0.108.tgz", @@ -90,6 +861,49 @@ "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "28.1.4", + "resolved": "https://registry.npmmirror.com/@types/jest/-/jest-28.1.4.tgz", + "integrity": "sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==", + "dev": true, + "requires": { + "jest-matcher-utils": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -102,6 +916,18 @@ "integrity": "sha512-FR5QJe+TaoZ2GsMHkjuwoNabr+UrJNRr2HNOo+r/7vhcuntM6Ee/pRPOnRhhL2XE9OOvX9VLEq+BcXl3VjNoWA==", "dev": true }, + "@types/prettier": { + "version": "2.6.3", + "resolved": "https://registry.npmmirror.com/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, "@types/tern": { "version": "0.23.4", "resolved": "https://registry.npmmirror.com/@types/tern/-/tern-0.23.4.tgz", @@ -111,6 +937,21 @@ "@types/estree": "*" } }, + "@types/yargs": { + "version": "17.0.10", + "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmmirror.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "5.25.0", "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.25.0.tgz", @@ -206,6 +1047,49 @@ "eslint-visitor-keys": "^3.3.0" } }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", @@ -226,11 +1110,97 @@ "form-data": "^4.0.0" } }, + "babel-jest": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/babel-jest/-/babel-jest-28.1.2.tgz", + "integrity": "sha512-pfmoo6sh4L/+5/G2OOfQrGJgvH7fTa1oChnuYH2G/6gA+JwDvO8PELwvwnofKBMNrQsam0Wy/Rw+QSrBNewq2Q==", + "dev": true, + "requires": { + "@jest/transform": "^28.1.2", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz", + "integrity": "sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz", + "integrity": "sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^28.1.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", @@ -240,12 +1210,82 @@ "fill-range": "^7.0.1" } }, + "browserslist": { + "version": "4.21.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001363", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", + "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.11", "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.11.tgz", @@ -281,6 +1321,56 @@ "domutils": "^3.0.1" } }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", @@ -289,6 +1379,32 @@ "delayed-stream": "~1.0.0" } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "css-select": { "version": "5.1.0", "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz", @@ -320,11 +1436,35 @@ "ms": "2.1.2" } }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", @@ -375,11 +1515,38 @@ "xxhashjs": "^0.2.2" } }, + "electron-to-chromium": { + "version": "1.4.185", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.185.tgz", + "integrity": "sha512-9kV/isoOGpKkBt04yYNaSWIBn3187Q5VZRtoReq8oz5NY/A4XmU6cAoqgQlDp7kKJCZMRjWZ8nsQyxfpFHvfyw==", + "dev": true + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmmirror.com/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "entities": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/entities/-/entities-4.3.0.tgz", "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "esbuild": { "version": "0.13.12", "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.13.12.tgz", @@ -524,6 +1691,18 @@ "dev": true, "optional": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -557,6 +1736,12 @@ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", @@ -580,6 +1765,42 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/expect/-/expect-28.1.1.tgz", + "integrity": "sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==", + "dev": true, + "requires": { + "@jest/expect-utils": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1" + } + }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz", @@ -593,6 +1814,12 @@ "micromatch": "^4.0.4" } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz", @@ -602,6 +1829,15 @@ "reusify": "^1.0.4" } }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", @@ -611,6 +1847,16 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "follow-redirects": { "version": "1.15.0", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz", @@ -626,12 +1872,69 @@ "mime-types": "^2.1.12" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -641,6 +1944,12 @@ "is-glob": "^4.0.1" } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", @@ -655,6 +1964,33 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "htmlparser2": { "version": "8.0.1", "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.1.tgz", @@ -666,18 +2002,83 @@ "entities": "^4.3.0" } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", @@ -693,6 +2094,571 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest/-/jest-28.1.2.tgz", + "integrity": "sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==", + "dev": true, + "requires": { + "@jest/core": "^28.1.2", + "@jest/types": "^28.1.1", + "import-local": "^3.0.2", + "jest-cli": "^28.1.2" + }, + "dependencies": { + "jest-cli": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-cli/-/jest-cli-28.1.2.tgz", + "integrity": "sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==", + "dev": true, + "requires": { + "@jest/core": "^28.1.2", + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^28.1.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + } + } + }, + "jest-changed-files": { + "version": "28.0.2", + "resolved": "https://registry.npmmirror.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz", + "integrity": "sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-circus/-/jest-circus-28.1.2.tgz", + "integrity": "sha512-E2vdPIJG5/69EMpslFhaA46WkcrN74LI5V/cSJ59L7uS8UNoXbzTxmwhpi9XrIL3zqvMt5T0pl5k2l2u2GwBNQ==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.2", + "@jest/expect": "^28.1.2", + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.1", + "jest-matcher-utils": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-runtime": "^28.1.2", + "jest-snapshot": "^28.1.2", + "jest-util": "^28.1.1", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-config": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-28.1.2.tgz", + "integrity": "sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.1", + "@jest/types": "^28.1.1", + "babel-jest": "^28.1.2", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.2", + "jest-environment-node": "^28.1.2", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.1", + "jest-runner": "^28.1.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-diff/-/jest-diff-28.1.1.tgz", + "integrity": "sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" + } + }, + "jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-each/-/jest-each-28.1.1.tgz", + "integrity": "sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.1", + "pretty-format": "^28.1.1" + } + }, + "jest-environment-node": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-28.1.2.tgz", + "integrity": "sha512-oYsZz9Qw27XKmOgTtnl0jW7VplJkN2oeof+SwAwKFQacq3CLlG9u4kTGuuLWfvu3J7bVutWlrbEQMOCL/jughw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.2", + "@jest/fake-timers": "^28.1.2", + "@jest/types": "^28.1.1", + "@types/node": "*", + "jest-mock": "^28.1.1", + "jest-util": "^28.1.1" + } + }, + "jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmmirror.com/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true + }, + "jest-haste-map": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz", + "integrity": "sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.1", + "jest-worker": "^28.1.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz", + "integrity": "sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" + } + }, + "jest-matcher-utils": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz", + "integrity": "sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.1" + } + }, + "jest-message-util": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-mock/-/jest-mock-28.1.1.tgz", + "integrity": "sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmmirror.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-28.1.1.tgz", + "integrity": "sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.2.tgz", + "integrity": "sha512-OXw4vbOZuyRTBi3tapWBqdyodU+T33ww5cPZORuTWkg+Y8lmsxQlVu3MWtJh6NMlKRTHQetF96yGPv01Ye7Mbg==", + "dev": true, + "requires": { + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.2" + } + }, + "jest-runner": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-runner/-/jest-runner-28.1.2.tgz", + "integrity": "sha512-6/k3DlAsAEr5VcptCMdhtRhOoYClZQmxnVMZvZ/quvPGRpN7OBQYPIC32tWSgOnbgqLXNs5RAniC+nkdFZpD4A==", + "dev": true, + "requires": { + "@jest/console": "^28.1.1", + "@jest/environment": "^28.1.2", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.2", + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.2", + "jest-haste-map": "^28.1.1", + "jest-leak-detector": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-resolve": "^28.1.1", + "jest-runtime": "^28.1.2", + "jest-util": "^28.1.1", + "jest-watcher": "^28.1.1", + "jest-worker": "^28.1.1", + "source-map-support": "0.5.13", + "throat": "^6.0.1" + } + }, + "jest-runtime": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-runtime/-/jest-runtime-28.1.2.tgz", + "integrity": "sha512-i4w93OsWzLOeMXSi9epmakb2+3z0AchZtUQVF1hesBmcQQy4vtaql5YdVe9KexdJaVRyPDw8DoBR0j3lYsZVYw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.2", + "@jest/fake-timers": "^28.1.2", + "@jest/globals": "^28.1.2", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.2", + "@jest/types": "^28.1.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-mock": "^28.1.1", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.1", + "jest-snapshot": "^28.1.2", + "jest-util": "^28.1.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "28.1.2", + "resolved": "https://registry.npmmirror.com/jest-snapshot/-/jest-snapshot-28.1.2.tgz", + "integrity": "sha512-wzrieFttZYfLvrCVRJxX+jwML2YTArOUqFpCoSVy1QUapx+LlV9uLbV/mMEhYj4t7aMeE9aSQFHSvV/oNoDAMA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.1", + "@jest/transform": "^28.1.2", + "@jest/types": "^28.1.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.1", + "jest-matcher-utils": "^28.1.1", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.1", + "semver": "^7.3.5" + } + }, + "jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-28.1.1.tgz", + "integrity": "sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "leven": "^3.1.0", + "pretty-format": "^28.1.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-watcher/-/jest-watcher-28.1.1.tgz", + "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.1", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-28.1.1.tgz", + "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", @@ -702,6 +2668,44 @@ "yallist": "^4.0.0" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", @@ -736,6 +2740,21 @@ "resolved": "https://registry.npmmirror.com/mime2ext/-/mime2ext-1.0.1.tgz", "integrity": "sha512-GW9keW4FtnqfEn4PltsEiSlfQj3rNAU+nGsvPk8+4kQJpo0tQ7/dCojFYgkPtOD2xk9ePrRqVFUAtPpjzY1Cgw==" }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "moment": { "version": "2.29.2", "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.2.tgz", @@ -748,11 +2767,44 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.0.1.tgz", @@ -773,6 +2825,60 @@ "moment": "2.29.2" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parse5": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.0.0.tgz", @@ -790,36 +2896,164 @@ "parse5": "^7.0.0" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-format": { + "version": "28.1.1", + "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", + "dev": true, + "requires": { + "@jest/schemas": "^28.0.2", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", @@ -829,6 +3063,12 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "schema-dts": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/schema-dts/-/schema-dts-1.1.0.tgz", @@ -843,23 +3083,201 @@ "lru-cache": "^6.0.0" } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "style-mod": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.0.0.tgz", "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", "dev": true }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, "tiny-network": { "version": "0.0.6", "resolved": "https://registry.npmmirror.com/tiny-network/-/tiny-network-0.0.6.tgz", "integrity": "sha512-fYNn6nnbKZFch5nd1aWtwVwJG7zJc5dcyypKx1PgJvv1EFr/tUhQPSFx5Tw6lKTVqemxZystG8mkbQuu/P/R5g==" }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -869,6 +3287,22 @@ "is-number": "^7.0.0" } }, + "ts-jest": { + "version": "28.0.5", + "resolved": "https://registry.npmmirror.com/ts-jest/-/ts-jest-28.0.5.tgz", + "integrity": "sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^28.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + } + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", @@ -892,18 +3326,96 @@ } } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, "typescript": { "version": "4.7.2", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.2.tgz", "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, "w3c-keyname": { "version": "2.2.4", "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz", "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==", "dev": true }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, "xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmmirror.com/xxhashjs/-/xxhashjs-0.2.2.tgz", @@ -912,11 +3424,38 @@ "cuint": "^0.2.2" } }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true } } } diff --git a/package.json b/package.json index 61d112c..3e61808 100644 --- a/package.json +++ b/package.json @@ -6,20 +6,24 @@ "scripts": { "dev": "node esbuild.config.mjs", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "version": "node version-bump.mjs && git add manifest.json versions.json" + "version": "node version-bump.mjs && git add manifest.json versions.json", + "test": "jest" }, "keywords": [], "author": "", "license": "MIT", "devDependencies": { + "@types/jest": "^28.1.4", "@types/node": "^16.11.6", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "builtin-modules": "^3.2.0", "esbuild": "0.13.12", + "jest": "^28.1.2", "obsidian": "latest", + "ts-jest": "^28.0.5", "tslib": "2.3.1", - "typescript": "4.7.2" + "typescript": "^4.7.2" }, "dependencies": { "@notable/html2markdown": "^1.1.3", diff --git a/tsconfig.json b/tsconfig.json index 2989e32..1d58d7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,9 @@ "ES2021.String" ], "outDir": "dist", - + "paths": { + "@App/*": ["src/douban/*"] + } }, "include": [ "**/*.ts" diff --git a/typings/tiny-network.d.ts b/typings/tiny-network.d.ts deleted file mode 100644 index 03d3fb7..0000000 --- a/typings/tiny-network.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module 'tiny-network' { - export function get(url:string, headers:any): any; - export function get(url:string): any; - export function readStream(param:any): any; - export function ensureStatusCode(code:number): any; -} \ No newline at end of file diff --git a/utils/HttpUtil.ts b/utils/HttpUtil.ts deleted file mode 100644 index c6cb07c..0000000 --- a/utils/HttpUtil.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as https from 'https'; - -import { get } from 'tiny-network'; -import { log } from './Logutil'; - -export default class HttpUtil { - - static getHttps(url:string, options:any):Promise { - return new Promise( - function (resolve, reject) { - https.get(url + '/', options, (response) => { - console.log('url:', url + '/'); - console.log('statusCode:', response.statusCode); - console.log('headers:', response.headers); - if (response.statusCode === 200) { - response.on('data', (d) => { - resolve(d); - }); - } if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode == 303) { - resolve(response.headers.location); - } else { - reject(new Error(response.statusMessage)); - } - response.on('data', (d) => { - process.stdout.write(d); - }); - - }).on('error', (e) => { - reject(new Error('XMLHttpRequest Error: ' + e.message)); - }); - - }); - } -} \ No newline at end of file diff --git a/utils/Logutil.ts b/utils/Logutil.ts deleted file mode 100644 index c901065..0000000 --- a/utils/Logutil.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Notice } from "obsidian"; -import SchemaOrg from "./SchemaOrg"; -import { i18nHelper } from "lang/helper"; - -class Logger { - - public error(e:any):any { - new Notice(i18nHelper.getMessage("Obsidian Douban Plugin Error:") + e); - return e; - } - - public warn(e:any):any { - new Notice(i18nHelper.getMessage("Obsidian Douban Plugin Warn:") + e); - return e; - } - - public info(e:any):any { - // console.log(`Douban Plugin info:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } - - public trace(e:any):any { - // return e; - // console.log(`Douban Plugin trace:` + `${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } - - public traceN(notion:string, e:any):any { - // return e; - // console.log(`${notion} ${typeof e == 'string' ? e : JSON.stringify(e)}`); - return e; - } -} - -export const log:Logger = new Logger(); \ No newline at end of file diff --git a/utils/SchemaOrg.ts b/utils/SchemaOrg.ts deleted file mode 100644 index 264908f..0000000 --- a/utils/SchemaOrg.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Person } from "schema-dts"; - -export default class SchemaOrg { - public static getPersonName(p:Person):string { - if(isString(p)) { - return p; - }else { - let name: any = getProperty(p, 'name'); - return name + ""; - } - } - - -} - -function isString(s:any): s is string { - return typeof s === 'string'; - } - - -function getProperty(o: T, name: K): T[K] { - return o[name]; -} - -