From 5e52bb46af09e3efa97748fdbcd7c46699049371 Mon Sep 17 00:00:00 2001 From: neobooru <50623835+neobooru@users.noreply.github.com> Date: Fri, 15 Jan 2021 20:13:05 +0100 Subject: [PATCH] Fix gelbooru + grab original source when available --- .prettierrc | 4 + package.json | 2 +- src/NeoScraper.test.ts | 60 ++-- src/NeoScraper.ts | 2 +- src/ScrapeEngine.ts | 69 ++--- src/engines/Danbooru.ts | 155 +++++----- src/engines/Fallback.ts | 41 +-- src/engines/Gelbooru.ts | 262 +++++++++-------- src/engines/Moebooru.ts | 167 +++++------ src/engines/Pixiv.ts | 2 +- src/engines/Reddit.ts | 2 +- src/engines/SankakuComplex.ts | 140 ++++----- src/engines/Shimmie2.ts | 79 ++--- src/engines/Shuushuu.ts | 2 +- src/engines/Twitter.ts | 2 +- src/engines/Zerochan.ts | 118 ++++---- src/engines/e621.ts | 118 ++++---- yarn.lock | 529 ++++++++++++++++++---------------- 18 files changed, 917 insertions(+), 837 deletions(-) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f4071dc --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 120, + "tabWidth": 2 +} \ No newline at end of file diff --git a/package.json b/package.json index 9ad7e0f..8dfc5f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neo-scraper", - "version": "0.2.6", + "version": "0.3.0", "description": "Scrape a booru-like post object from the DOM.", "main": "dist/index.js", "types": "dist/index.d.js", diff --git a/src/NeoScraper.test.ts b/src/NeoScraper.test.ts index 7979113..cd93df8 100644 --- a/src/NeoScraper.test.ts +++ b/src/NeoScraper.test.ts @@ -41,82 +41,82 @@ test("all default scrapers have unique names", () => { // All links are SFW unless stated otherwise test("get danbooru.donmai.us post 3555872", async () => { - var source = "https://danbooru.donmai.us/posts/3555872"; - const res = await scrapeUrl(source); + var pageUrl = "https://danbooru.donmai.us/posts/3555872"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://danbooru.donmai.us/data/__flint_girls_und_panzer_drawn_by_omachi_slabco__90332299216db81b8793084e4cb7c15d.jpg"); }); // Gelbooru test("get safebooru.org post 2871532", async () => { - var source = "https://safebooru.org/index.php?page=post&s=view&id=2871532"; - const res = await scrapeUrl(source); + var pageUrl = "https://safebooru.org/index.php?page=post&s=view&id=2871532"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://safebooru.org//images/2757/5f19c7744db918c3d4c4c6035bc65dfa9e18866f.jpg"); }); test("get gelbooru.com post 4925055", async () => { - var source = "https://gelbooru.com/index.php?page=post&s=view&id=4925055&tags=kimetsu_no_yaiba"; - const res = await scrapeUrl(source); + var pageUrl = "https://gelbooru.com/index.php?page=post&s=view&id=4925055&tags=kimetsu_no_yaiba"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://img2.gelbooru.com/images/3d/03/3d03f6858637805d6473d390a4b1d8c8.jpg"); }); test("get rule34.xxx post 2740994", async () => { - var source = "https://rule34.xxx/index.php?page=post&s=view&id=2740994"; - const res = await scrapeUrl(source); + var pageUrl = "https://rule34.xxx/index.php?page=post&s=view&id=2740994"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toContain(".rule34.xxx//images/2472/35bf31c98f53a369c047baf9bae496fb.jpeg"); }); // Moebooru test("get yande.re post 438510", async () => { - var source = "https://yande.re/post/show/438510"; - const res = await scrapeUrl(source); + var pageUrl = "https://yande.re/post/show/438510"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://files.yande.re/image/49b79bc372716a579d8525dcaccb56e2/yande.re%20438510%20landscape%20link%20nintendo%20princess_zelda%20sword%20the_legend_of_zelda%20the_legend_of_zelda%3A_breath_of_the_wild.jpg"); }); test("get konachan.com post 289968", async () => { - var source = "https://konachan.com/post/show/289968/ahri_-league_of_legends-akali-animal_ears-blonde_h"; - const res = await scrapeUrl(source); + var pageUrl = "https://konachan.com/post/show/289968/ahri_-league_of_legends-akali-animal_ears-blonde_h"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://konachan.com/image/e40b38fb704434e4da3eae41e26bca39/Konachan.com%20-%20289968%20akali%20blue_eyes%20breasts%20choker%20cleavage%20evelynn%20foxgirl%20gloves%20group%20hat%20kai%27sa%20long_hair%20microphone%20ponytail%20saphirya%20short_hair%20signed%20watermark.jpg"); }); // Reddit test("get old.reddit.com post", async () => { - var source = "https://old.reddit.com/r/IceCreamWaifu/comments/ce0wgh/rtx_2018_neo_luluchan92/"; - const res = await scrapeUrl(source); + var pageUrl = "https://old.reddit.com/r/IceCreamWaifu/comments/ce0wgh/rtx_2018_neo_luluchan92/"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://i.redd.it/ln8ahz17kpa31.jpg"); }); test("get new.reddit.com post", async () => { - var source = "https://new.reddit.com/r/IceCreamWaifu/comments/ce0wgh/rtx_2018_neo_luluchan92/"; - const res = await scrapeUrl(source); + var pageUrl = "https://new.reddit.com/r/IceCreamWaifu/comments/ce0wgh/rtx_2018_neo_luluchan92/"; + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toBe("https://i.redd.it/ln8ahz17kpa31.jpg"); }); // Shimmie2 test("get rule34.paheal.net post 2505982", async () => { - var source = "https://rule34.paheal.net/post/view/2505982"; // Somewhat sketchy - const res = await scrapeUrl(source); + var pageUrl = "https://rule34.paheal.net/post/view/2505982"; // Somewhat sketchy + const res = await scrapeUrl(pageUrl); expect(res.posts.length).toBe(1); - expect(res.posts[0].source).toBe(source); + expect(res.posts[0].pageUrl).toBe(pageUrl); expect(res.posts[0].imageUrl).toContain(".paheal.net/_images/15427ab5ed2cddbeef947e30f5c9cab6/2505982%20-%20Kai%27Sa%20League_of_Legends%20lawzilla.png"); }); @@ -125,9 +125,9 @@ test("get rule34.paheal.net post 2505982", async () => { test("get twitter.com post", async () => { pending("JSDOM can't parse this page"); // TODO: JSDOM sucks - // var source = "https://twitter.com/Dishwasher1910/status/1171162651461746688/photo/1"; - // const res = await scrapeUrl(source); + // var pageUrl = "https://twitter.com/Dishwasher1910/status/1171162651461746688/photo/1"; + // const res = await scrapeUrl(pageUrl); // expect(res.posts.length).toBe(1); - // expect(res.posts[0].source).toBe(source); + // expect(res.posts[0].pageUrl).toBe(pageUrl); // expect(res.posts[0].imageUrl).toBe("https://pbs.twimg.com/media/EEDOOCdU0AAHX00?format=jpg&name=orig"); }); diff --git a/src/NeoScraper.ts b/src/NeoScraper.ts index c9ea83a..5aa396a 100644 --- a/src/NeoScraper.ts +++ b/src/NeoScraper.ts @@ -26,7 +26,7 @@ export default class NeoScraper { } scrapeDocument(document: Document, engines: string[] | null = null, allowFallbackEngine: boolean = false, ignoreCanImport: boolean = false): ScrapeResults { - let res = new ScrapeResults(); + const res = new ScrapeResults(); for (const engine of this.engines) { if (ignoreCanImport || engine.canImport(document.location)) { diff --git a/src/ScrapeEngine.ts b/src/ScrapeEngine.ts index 2ce368a..96b26c2 100644 --- a/src/ScrapeEngine.ts +++ b/src/ScrapeEngine.ts @@ -1,56 +1,59 @@ import { TagCategory, SafetyRating } from "./BooruTypes"; export class ScrapedPost { - imageUrl: string = ""; - source: string = ""; - rating: SafetyRating = "safe"; - tags: ScrapedTag[] = []; + imageUrl: string = ""; + pageUrl: string = ""; + rating: SafetyRating = "safe"; + tags: ScrapedTag[] = []; + source: string | undefined = undefined; } export class ScrapedTag { - name: string = ""; - category?: TagCategory; + name: string = ""; + category?: TagCategory; - constructor(name: string, category?: TagCategory) { - this.name = name.replace(/\s/g, "_").toLowerCase(); // Replace all spaces with underscores and make everything lowercase - this.category = category; - } + constructor(name: string, category?: TagCategory) { + this.name = name.replace(/\s/g, "_").toLowerCase(); // Replace all spaces with underscores and make everything lowercase + this.category = category; + } } export class ScrapeResult { - engine: string; - description: string = ""; - posts: ScrapedPost[] = []; + engine: string; + description: string = ""; + posts: ScrapedPost[] = []; - constructor(engine: string) { - this.engine = engine; - } + constructor(engine: string) { + this.engine = engine; + } - tryAddPost(post: ScrapedPost) { - if (!post.imageUrl) { - console.log(`[${this.engine}] Not adding post because imageUrl is unset!`); - } else { - this.posts.push(post); - } + tryAddPost(post: ScrapedPost) { + if (!post.imageUrl) { + console.log( + `[${this.engine}] Not adding post because imageUrl is unset!` + ); + } else { + this.posts.push(post); } + } } export class ScrapeResults { - results: ScrapeResult[] = []; + results: ScrapeResult[] = []; - get posts(): ScrapedPost[] { - var posts: ScrapedPost[] = []; + get posts(): ScrapedPost[] { + var posts: ScrapedPost[] = []; - for (var res of this.results) { - posts = posts.concat(res.posts); - } - - return posts; + for (var res of this.results) { + posts = posts.concat(res.posts); } + + return posts; + } } export interface ScrapeEngine { - name: string; - canImport(url: Location): boolean; - scrapeDocument(document: Document): ScrapeResult; + name: string; + canImport(url: Location): boolean; + scrapeDocument(document: Document): ScrapeResult; } diff --git a/src/engines/Danbooru.ts b/src/engines/Danbooru.ts index 9b5a54f..df78faf 100644 --- a/src/engines/Danbooru.ts +++ b/src/engines/Danbooru.ts @@ -2,84 +2,91 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEn import { TagCategory } from "../BooruTypes"; export default class Danbooru implements ScrapeEngine { - name = "danbooru"; + name = "danbooru"; - canImport(url: Location): boolean { - return ( - url.host == "danbooru.donmai.us" || - url.host == "safebooru.donmai.us" - ); + canImport(url: Location): boolean { + return url.host == "danbooru.donmai.us" || url.host == "safebooru.donmai.us"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + const originalImageElements = Array.from(document.querySelectorAll("#post-information > ul > li > a")).filter( + (x) => x.parentElement && x.parentElement.innerText.startsWith("Size") + ); + + if (originalImageElements.length > 0) { + post.imageUrl = (originalImageElements[0] as HTMLAnchorElement).href; } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let post = new ScrapedPost(); - post.source = document.location.href; + // Set rating + const safetyExp = new RegExp("Rating: (.*)"); + const safetyElements = Array.from(document.querySelectorAll("#post-information > ul > li")) + .map((x) => x as HTMLLIElement) + .filter((x) => x.innerText.startsWith("Rating")); - // Set image url - const originalImageElements = Array.from(document.querySelectorAll("#post-information > ul > li > a")) - .filter(x => x.parentElement && x.parentElement.innerText.startsWith("Size")); - - if (originalImageElements.length > 0) { - post.imageUrl = (originalImageElements[0] as HTMLAnchorElement).href; + if (safetyElements.length > 0) { + const matches = safetyElements[0].innerText.match(safetyExp); + if (matches && matches.length > 0) { + switch (matches[1].toLowerCase()) { + case "safe": + post.rating = "safe"; + break; + case "questionable": + post.rating = "sketchy"; + break; + case "explicit": + post.rating = "unsafe"; + break; } - - // Set rating - const safetyExp = new RegExp("Rating: (.*)"); - const safetyElements = Array.from(document.querySelectorAll("#post-information > ul > li")) - .map(x => x as HTMLLIElement) - .filter(x => x.innerText.startsWith("Rating")); - - if (safetyElements.length > 0) { - const matches = safetyElements[0].innerText.match(safetyExp); - if (matches && matches.length > 0) { - switch (matches[1].toLowerCase()) { - case "safe": - post.rating = "safe"; - break; - case "questionable": - post.rating = "sketchy"; - break; - case "explicit": - post.rating = "unsafe"; - break; - } - } - } - - // Set tags - const tagElements = Array.from(document.querySelectorAll("#tag-list > ul > li")).map(x => x as HTMLLIElement); - for (const tagElement of tagElements) { - let tagName: string | undefined; - const tagNameElement = tagElement.querySelector(".search-tag") as HTMLAnchorElement; - if (tagNameElement) { - tagName = tagNameElement.innerText; - } - - let category: TagCategory | undefined; - switch (tagElement.className) { - case "tag-type-3": - category = "copyright"; - break; - case "tag-type-4": - category = "character"; - break; - case "tag-type-1": - category = "artist"; - break; - case "tag-type-5": - category = "meta"; - break; - } - - if (tagName) { - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - } - - result.tryAddPost(post); - - return result; + } } + + // Set tags + const tagElements = Array.from(document.querySelectorAll("#tag-list > ul > li")).map((x) => x as HTMLLIElement); + for (const tagElement of tagElements) { + let tagName: string | undefined; + const tagNameElement = tagElement.querySelector(".search-tag") as HTMLAnchorElement; + if (tagNameElement) { + tagName = tagNameElement.innerText; + } + + let category: TagCategory | undefined; + switch (tagElement.className) { + case "tag-type-3": + category = "copyright"; + break; + case "tag-type-4": + category = "character"; + break; + case "tag-type-1": + category = "artist"; + break; + case "tag-type-5": + category = "meta"; + break; + } + + if (tagName) { + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } + } + + // Set source + const sourceEl = document.getElementById("post-info-source"); + if (sourceEl && sourceEl.children.length > 0) { + const sourceLink = sourceEl.children[0] as HTMLAnchorElement; + if (sourceLink) { + post.source = sourceLink.href; + } + } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/Fallback.ts b/src/engines/Fallback.ts index eb545a6..fad8964 100644 --- a/src/engines/Fallback.ts +++ b/src/engines/Fallback.ts @@ -1,30 +1,31 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost } from "../ScrapeEngine"; export default class Fallback implements ScrapeEngine { - name = "fallback"; + name = "fallback"; - canImport(location: Location): boolean { - return false; + canImport(location: Location): boolean { + return false; + } + + scrapeDocument(document: Document): ScrapeResult { + function getSize(el: HTMLImageElement) { + return el.width * el.height; } - scrapeDocument(document: Document): ScrapeResult { - function getSize(el: HTMLImageElement) { - return el.width * el.height; - } + // Get largest img element on this page + const largestImgElement = Array.from(document.getElementsByTagName("img")).reduce((a, b) => + getSize(a) > getSize(b) ? a : b + ); - // Get largest img element on this page - const largestImgElement = Array.from(document.getElementsByTagName('img')) - .reduce((a, b) => getSize(a) > getSize(b) ? a : b); + let result = new ScrapeResult(this.name); - let result = new ScrapeResult(this.name); - - if (largestImgElement) { - let post = new ScrapedPost(); - post.source = document.location.href; - post.imageUrl = largestImgElement.src; - result.posts.push(post); - } - - return result; + if (largestImgElement) { + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + post.imageUrl = largestImgElement.src; + result.posts.push(post); } + + return result; + } } diff --git a/src/engines/Gelbooru.ts b/src/engines/Gelbooru.ts index 0d58c59..00dd734 100644 --- a/src/engines/Gelbooru.ts +++ b/src/engines/Gelbooru.ts @@ -3,140 +3,148 @@ import { TagCategory } from "../BooruTypes"; // Small hack to avoid screwing with semver enum Version { - v020 = 1, // 0.2.0 - v025, // 0.2.5 + v020 = 1, // 0.2.0 + v025, // 0.2.5 } type CategoryMap = Record; export default class Gelbooru implements ScrapeEngine { - name = "gelbooru"; + name = "gelbooru"; - canImport(url: Location): boolean { - return ( - url.host == "safebooru.org" || - url.host == "gelbooru.com" || - url.host == "rule34.xxx" || - url.host == "tbib.org" - ); - } - - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let version: Version | null = null; - switch (document.location.host) { - case "safebooru.org": - case "rule34.xxx": - case "tbib.org": - version = Version.v020; - break; - case "gelbooru.com": - version = Version.v025; - break; - default: - console.error("Couldn't guess version"); - return result; - } - - console.log("Gelbooru guessed version: " + version); - - let post = new ScrapedPost(); - post.source = document.location.href; - - // Set image url - Array.from(document.querySelectorAll("li > a")) - .map(x => x as HTMLAnchorElement) - .filter(x => x && x.innerText == "Original image") - .map(x => post.imageUrl = x.href); - - // Set rating - const safetyExp = new RegExp("Rating: (.*)"); - let safetyElements: NodeListOf; - - if (version == Version.v020) { - safetyElements = document.querySelectorAll("#stats > ul > li"); - } else { - safetyElements = document.querySelectorAll("#tag-list > div > li"); - } - - for (const idx in safetyElements) { - const el = safetyElements[idx] as HTMLLIElement; - if (el && el.innerText) { - // matches is an array where (index) - // 0: full string - // 1: capture group 1 (rating, so 'Safe', 'Questionable', 'Explicit') - const matches = el.innerText.match(safetyExp); - if (matches && matches.length > 0) { - switch (matches[1].toLowerCase()) { - case "safe": - post.rating = "safe"; - break; - case "questionable": - post.rating = "sketchy"; - break; - case "explicit": - post.rating = "unsafe"; - break; - } - } - } - } - - // Set tags - let tagElements: NodeListOf; - - if (version == Version.v020) { - tagElements = document.querySelectorAll("#tag-sidebar > li"); - } else { - tagElements = document.querySelectorAll("#tag-list > div > li[class^='tag-type']"); - } - - for (const idx in tagElements) { - const el = tagElements[idx] as HTMLLIElement; - if (el && el.innerText) { - let tagName: string; - - if (version == Version.v020) { - const nameElements = el.getElementsByTagName("a"); - - // Some
  • don't actually contain a name. - // E.g. the sub-headers ("Copyright", "Character", "General", "Meta") on rule34.xxx - if (nameElements.length > 0) { - tagName = el.getElementsByTagName("a")[0].innerText; - } - else { - continue; - } - } else { - // First is "?" - // Second is "actual_tag_name" - tagName = el.getElementsByTagName("a")[1].innerText; - } - - let category: TagCategory | undefined; - - const classNameToCategoryMap: CategoryMap = { - "tag-type-copyright": "copyright", - "tag-type-character": "character", - "tag-type-artist": "artist", - "tag-type-metadata": "meta" - }; - - // Loop over all classes, because some websites use multiple. E.g. `class="tag tag-type-copyright"` - for (const className of el.classList) { - if (classNameToCategoryMap[className]) { - category = classNameToCategoryMap[className]; - break; - } - } - - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - } - - result.tryAddPost(post); + canImport(url: Location): boolean { + return ( + url.host == "safebooru.org" || url.host == "gelbooru.com" || url.host == "rule34.xxx" || url.host == "tbib.org" + ); + } + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let version: Version | null = null; + switch (document.location.host) { + case "safebooru.org": + case "rule34.xxx": + case "tbib.org": + version = Version.v020; + break; + case "gelbooru.com": + version = Version.v025; + break; + default: + console.error("Couldn't guess version"); return result; } + + console.log("Gelbooru guessed version: " + version); + + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + Array.from(document.querySelectorAll("li > a")) + .map((x) => x as HTMLAnchorElement) + .filter((x) => x && x.innerText == "Original image") + .map((x) => (post.imageUrl = x.href)); + + // Set rating and source + const regex = new RegExp("(.*): (.*)"); + let statsElements: NodeListOf; + + if (version == Version.v020) { + statsElements = document.querySelectorAll("#stats > ul > li"); + } else { + statsElements = document.querySelectorAll(".tag-list > li"); + } + + for (const idx in statsElements) { + const el = statsElements[idx] as HTMLLIElement; + if (el && el.innerText) { + // matches is an array where (index) + // 0: full string + // 1: capture group 1, the type of the statistic. E.g. 'Rating', 'Source' + // 2: capture group 2, the value of the statistic. + const matches = el.innerText.match(regex); + if (matches && matches.length == 3) { + // If Source element + if (matches[1] == "Source") { + if (version == Version.v020) { + post.source = matches[2]; + } else { + post.source = (el.children[0] as HTMLAnchorElement).href; + } + } + // If Rating element + else if (matches[1] == "Rating") { + switch (matches[2].toLowerCase()) { + case "safe": + post.rating = "safe"; + break; + case "questionable": + post.rating = "sketchy"; + break; + case "explicit": + post.rating = "unsafe"; + break; + } + } + } + } + } + + // Set tags + let tagElements: NodeListOf; + + if (version == Version.v020) { + tagElements = document.querySelectorAll("#tag-sidebar > li"); + } else { + tagElements = document.querySelectorAll(".tag-list > li[class^='tag-type']"); + } + + for (const idx in tagElements) { + const el = tagElements[idx] as HTMLLIElement; + if (el && el.innerText) { + let tagName: string; + + if (version == Version.v020) { + const nameElements = el.getElementsByTagName("a"); + + // Some
  • don't actually contain a name. + // E.g. the sub-headers ("Copyright", "Character", "General", "Meta") on rule34.xxx + if (nameElements.length > 0) { + tagName = el.getElementsByTagName("a")[0].innerText; + } else { + continue; + } + } else { + // First is "?" + // Second is "actual_tag_name" + tagName = el.getElementsByTagName("a")[1].innerText; + } + + let category: TagCategory | undefined; + + const classNameToCategoryMap: CategoryMap = { + "tag-type-copyright": "copyright", + "tag-type-character": "character", + "tag-type-artist": "artist", + "tag-type-metadata": "meta", + }; + + // Loop over all classes, because some websites use multiple. E.g. `class="tag tag-type-copyright"` + for (const className of el.classList) { + if (classNameToCategoryMap[className]) { + category = classNameToCategoryMap[className]; + break; + } + } + + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } + } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/Moebooru.ts b/src/engines/Moebooru.ts index 34e7422..e4d7aeb 100644 --- a/src/engines/Moebooru.ts +++ b/src/engines/Moebooru.ts @@ -2,94 +2,95 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEn import { TagCategory } from "../BooruTypes"; export default class Moebooru implements ScrapeEngine { - name = "moebooru"; + name = "moebooru"; - canImport(url: Location): boolean { - return ( - url.host == "yande.re" || - url.host == "konachan.com" - ); + canImport(url: Location): boolean { + return url.host == "yande.re" || url.host == "konachan.com"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + const originalImageElement = document.querySelector("#highres") as HTMLAnchorElement; + if (originalImageElement) { + post.imageUrl = originalImageElement.href; } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let post = new ScrapedPost(); - post.source = document.location.href; + // Set rating and source + // Same method as Gelbooru v025. + const regex = new RegExp("(.*): (.*)"); + const statsElements = Array.from(document.querySelectorAll("#stats > ul > li")).map((x) => x as HTMLLIElement); - // Set image url - const originalImageElement = document.querySelector("#highres") as HTMLAnchorElement; - if (originalImageElement) { - post.imageUrl = originalImageElement.href; + for (const el of statsElements) { + const matches = el.innerText.match(regex); + if (matches && matches.length == 3) { + // If Source element + if (matches[1] == "Source") { + post.source = (el.children[0] as HTMLAnchorElement).href; } - - // Set safety - // Same method as Gelbooru but cleaner code - const safetyExp = new RegExp("Rating: (.*)"); - const safetyElements = Array.from(document.querySelectorAll("#stats > ul > li")) - .map(x => x as HTMLLIElement) - .filter(x => x.innerText.startsWith("Rating:")); - - if (safetyElements.length > 0) { - const matches = safetyElements[0].innerText.match(safetyExp); - if (matches && matches.length > 0) { - switch (matches[1].toLowerCase()) { - case "safe": - post.rating = "safe"; - break; - case "questionable": - post.rating = "sketchy"; - break; - case "explicit": - post.rating = "unsafe"; - break; - } - } + // If Rating element + else if (matches[1] == "Rating") { + switch (matches[2].toLowerCase()) { + case "safe": + post.rating = "safe"; + break; + case "questionable": + post.rating = "sketchy"; + break; + case "explicit": + post.rating = "unsafe"; + break; + } } - - // Set tags - const tagElements = Array.from(document.querySelectorAll("#tag-sidebar > li")) - .map(x => x as HTMLLIElement); - - for (const el of tagElements) { - let tagName: string; - let tagNameElements = el.getElementsByTagName("a"); - - if (tagNameElements.length > 1) { - // First is "?" - // Second is "actual_tag_name" - tagName = tagNameElements[1].innerText; - } else { - // Skip if no tag name is found - continue; - } - - let category: TagCategory | undefined; - - // Loop over all classes because some sites (konachan) - // have mutliple classes, e.g. "tag-link tag-type-copyright" - for (const className of Array.from(el.classList)) { - switch (className) { - case "tag-type-copyright": - category = "copyright"; - break; - case "tag-type-character": - category = "character"; - break; - case "tag-type-artist": - category = "artist"; - break; - case "tag-type-metadata": - category = "meta"; - break; - } - } - - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - - result.tryAddPost(post); - - return result; + } } + + // Set tags + const tagElements = Array.from(document.querySelectorAll("#tag-sidebar > li")).map((x) => x as HTMLLIElement); + + for (const el of tagElements) { + let tagName: string; + let tagNameElements = el.getElementsByTagName("a"); + + if (tagNameElements.length > 1) { + // First is "?" + // Second is "actual_tag_name" + tagName = tagNameElements[1].innerText; + } else { + // Skip if no tag name is found + continue; + } + + let category: TagCategory | undefined; + + // Loop over all classes because some sites (konachan) + // have mutliple classes, e.g. "tag-link tag-type-copyright" + for (const className of Array.from(el.classList)) { + switch (className) { + case "tag-type-copyright": + category = "copyright"; + break; + case "tag-type-character": + category = "character"; + break; + case "tag-type-artist": + category = "artist"; + break; + case "tag-type-metadata": + category = "meta"; + break; + } + } + + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/Pixiv.ts b/src/engines/Pixiv.ts index 2e386b7..5c42a30 100644 --- a/src/engines/Pixiv.ts +++ b/src/engines/Pixiv.ts @@ -18,7 +18,7 @@ export default class Pixiv implements ScrapeEngine { for (const imgLink of imgLinks) { let post = new ScrapedPost(); - post.source = document.location.href; + post.pageUrl = document.location.href; post.imageUrl = imgLink.href; result.tryAddPost(post); } diff --git a/src/engines/Reddit.ts b/src/engines/Reddit.ts index bbd18ac..96c22ac 100644 --- a/src/engines/Reddit.ts +++ b/src/engines/Reddit.ts @@ -10,7 +10,7 @@ export default class Reddit implements ScrapeEngine { scrapeDocument(document: Document): ScrapeResult { let result = new ScrapeResult(this.name); let post = new ScrapedPost(); - post.source = document.location.href; + post.pageUrl = document.location.href; // Set image url // For old.reddit.com diff --git a/src/engines/SankakuComplex.ts b/src/engines/SankakuComplex.ts index ad66f26..2d04eaf 100644 --- a/src/engines/SankakuComplex.ts +++ b/src/engines/SankakuComplex.ts @@ -2,80 +2,80 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEn import { TagCategory } from "../BooruTypes"; export default class SankakuComplex implements ScrapeEngine { - name = "sankakucomplex"; + name = "sankakucomplex"; - canImport(url: Location): boolean { - return url.host == "chan.sankakucomplex.com"; + canImport(url: Location): boolean { + return url.host == "chan.sankakucomplex.com"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + const originalImageElement = document.getElementById("highres") as HTMLAnchorElement; + + if (originalImageElement) { + post.imageUrl = originalImageElement.href; } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let post = new ScrapedPost(); - post.source = document.location.href; + // Set rating + const safetyExp = new RegExp("Rating: (.*)"); + const safetyElements = Array.from(document.querySelectorAll("#stats > ul > li")) + .map((x) => x as HTMLLIElement) + .filter((x) => x.innerText.startsWith("Rating")); - // Set image url - const originalImageElement = document.getElementById("highres") as HTMLAnchorElement; - - if (originalImageElement) { - post.imageUrl = originalImageElement.href; + if (safetyElements.length > 0) { + const matches = safetyElements[0].innerText.match(safetyExp); + if (matches && matches.length > 0) { + switch (matches[1].toLowerCase()) { + case "safe": + post.rating = "safe"; + break; + case "questionable": + post.rating = "sketchy"; + break; + case "explicit": + post.rating = "unsafe"; + break; } - - // Set rating - const safetyExp = new RegExp("Rating: (.*)"); - const safetyElements = Array.from(document.querySelectorAll("#stats > ul > li")) - .map(x => x as HTMLLIElement) - .filter(x => x.innerText.startsWith("Rating")); - - if (safetyElements.length > 0) { - const matches = safetyElements[0].innerText.match(safetyExp); - if (matches && matches.length > 0) { - switch (matches[1].toLowerCase()) { - case "safe": - post.rating = "safe"; - break; - case "questionable": - post.rating = "sketchy"; - break; - case "explicit": - post.rating = "unsafe"; - break; - } - } - } - - // Set tags - const tagElements = Array.from(document.querySelectorAll("#tag-sidebar > li")).map(x => x as HTMLLIElement); - for (const tagElement of tagElements) { - let tagName: string | undefined; - const tagNameElement = tagElement.querySelector("a") as HTMLAnchorElement; - if (tagNameElement) { - tagName = tagNameElement.innerText; - } - - let category: TagCategory | undefined; - switch (tagElement.className) { - case "tag-type-copyright": - category = "copyright"; - break; - case "tag-type-character": - category = "character"; - break; - case "tag-type-artist": - category = "artist"; - break; - case "tag-type-medium": - category = "meta"; - break; - } - - if (tagName) { - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - } - - result.tryAddPost(post); - - return result; + } } + + // Set tags + const tagElements = Array.from(document.querySelectorAll("#tag-sidebar > li")).map((x) => x as HTMLLIElement); + for (const tagElement of tagElements) { + let tagName: string | undefined; + const tagNameElement = tagElement.querySelector("a") as HTMLAnchorElement; + if (tagNameElement) { + tagName = tagNameElement.innerText; + } + + let category: TagCategory | undefined; + switch (tagElement.className) { + case "tag-type-copyright": + category = "copyright"; + break; + case "tag-type-character": + category = "character"; + break; + case "tag-type-artist": + category = "artist"; + break; + case "tag-type-medium": + category = "meta"; + break; + } + + if (tagName) { + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } + } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/Shimmie2.ts b/src/engines/Shimmie2.ts index c0877c6..7343dad 100644 --- a/src/engines/Shimmie2.ts +++ b/src/engines/Shimmie2.ts @@ -1,48 +1,51 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEngine"; export default class Shimmie2 implements ScrapeEngine { - name = "shimmie2"; + name = "shimmie2"; - canImport(url: Location): boolean { - return ( - url.host == "rule34.paheal.net" || - url.host == "rule34hentai.net" - ); + canImport(url: Location): boolean { + return url.host == "rule34.paheal.net" || url.host == "rule34hentai.net"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + const originalImageElements = Array.from(document.querySelectorAll(".image_info > tbody > tr > td > a")) + .map((x) => x as HTMLAnchorElement) + .filter((x) => x.innerText == "Image Only" || x.innerText == "File Only"); + + if (originalImageElements.length > 0) { + post.imageUrl = originalImageElements[0].href; + } else { + const dowloadBtnEl = document.querySelector("a[download]") as HTMLAnchorElement; + if (dowloadBtnEl) { + post.imageUrl = dowloadBtnEl.href; + } } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let post = new ScrapedPost(); - post.source = document.location.href; + // Set safety + post.rating = "unsafe"; // Usually it is unsafe - // Set image url - const originalImageElements = Array.from(document.querySelectorAll(".image_info > tbody > tr > td > a")) - .map(x => x as HTMLAnchorElement) - .filter(x => x.innerText == "Image Only"); + // Set tags + // Shimmie2 doesn't support categories so we don't need to worry about those. + // They also use uppercase tags, so we toLowerCase() those. + // Tags might not match with other booru-likes, but that is for the user to figure out. + // For example by deleting 'wrong' tags or setting up some aliases in szurubooru. + post.tags = Array.from(document.querySelectorAll("a.tag_name")) + .map((x) => (x as HTMLAnchorElement).innerText) + .map((x) => new ScrapedTag(x)); - if (originalImageElements.length > 0) { - post.imageUrl = originalImageElements[0].href; - } else { - const dowloadBtnEl = document.querySelector("a[download]") as HTMLAnchorElement; - if (dowloadBtnEl) { - post.imageUrl = dowloadBtnEl.href; - } - } - - // Set safety - post.rating = "unsafe"; // Usually it is unsafe - - // Set tags - // Shimmie2 doesn't support categories so we don't need to worry about those. - // They also use uppercase tags, so we toLowerCase() those. - // Tags might not match with other booru-likes, but that is for the user to figure out. - // For example by deleting 'wrong' tags or setting up some aliases in szurubooru. - post.tags = Array.from(document.querySelectorAll("a.tag_name")) - .map(x => (x as HTMLAnchorElement).innerText) - .map(x => new ScrapedTag(x)); - - result.tryAddPost(post); - - return result; + // Set source + const sourceEl = document.querySelector(".image_info > tbody > tr > td > div > a") as HTMLAnchorElement; + if (sourceEl) { + post.source = sourceEl.href; } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/Shuushuu.ts b/src/engines/Shuushuu.ts index 3151a81..6b81728 100644 --- a/src/engines/Shuushuu.ts +++ b/src/engines/Shuushuu.ts @@ -11,7 +11,7 @@ export default class Shuushuu implements ScrapeEngine { scrapeDocument(document: Document): ScrapeResult { let result = new ScrapeResult(this.name); let post = new ScrapedPost(); - post.source = document.location.href; + post.pageUrl = document.location.href; // Set image url const imgElement = document.querySelector(".thumb_image") as HTMLAnchorElement; diff --git a/src/engines/Twitter.ts b/src/engines/Twitter.ts index 3b3af8a..7b46cca 100644 --- a/src/engines/Twitter.ts +++ b/src/engines/Twitter.ts @@ -15,7 +15,7 @@ export default class Twitter implements ScrapeEngine { scrapeDocument(document: Document): ScrapeResult { let result = new ScrapeResult(this.name); let post = new ScrapedPost(); - post.source = document.location.href; + post.pageUrl = document.location.href; // Set image url // When clicked on post (not fullscreen, with post text etc) diff --git a/src/engines/Zerochan.ts b/src/engines/Zerochan.ts index 4d263bb..ffb1fac 100644 --- a/src/engines/Zerochan.ts +++ b/src/engines/Zerochan.ts @@ -2,72 +2,72 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEn import { TagCategory } from "../BooruTypes"; export default class Zerochan implements ScrapeEngine { - name = "zerochan"; + name = "zerochan"; - canImport(url: Location): boolean { - return url.host.endsWith("zerochan.net"); + canImport(url: Location): boolean { + return url.host.endsWith("zerochan.net"); + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + let post = new ScrapedPost(); + post.pageUrl = document.location.href; + + // Set image url + const previewElements = document.getElementsByClassName("preview"); + if (previewElements.length > 0) { + // The preview element only exists when there is a larger size available. Preview's img element contains a downscaled version. + post.imageUrl = (previewElements[0] as HTMLAnchorElement).href; + } else { + // When there is no larger version available just use the displayed version. + const imgElement = document.querySelector("img[title='No larger size available']") as HTMLImageElement; + if (imgElement) { + post.imageUrl = imgElement.src; + } } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); - let post = new ScrapedPost(); - post.source = document.location.href; + // Set rating + post.rating = "safe"; - // Set image url - const previewElements = document.getElementsByClassName("preview"); - if (previewElements.length > 0) { - // The preview element only exists when there is a larger size available. Preview's img element contains a downscaled version. - post.imageUrl = (previewElements[0] as HTMLAnchorElement).href; - } else { - // When there is no larger version available just use the displayed version. - const imgElement = document.querySelector("img[title='No larger size available']") as HTMLImageElement; - if (imgElement) { - post.imageUrl = imgElement.src; - } - } + // Set tags + const tagElements = Array.from(document.getElementById("tags")!.children); - // Set rating - post.rating = "safe"; + for (const tagElement of tagElements) { + // Get tag name from url, because some longer tags are shortened. + // Eg. "Tate no Yuusha no Nariagari" -> "Tate no Yuusha no Nariaga..." + // (ironically this is longer, but you get the idea) + const tagUrl = (tagElement.children[0] as HTMLAnchorElement).pathname.substr(1); + const tagName = decodeURIComponent(tagUrl.replace(/\+/g, "_")).toLowerCase(); - // Set tags - const tagElements = Array.from(document.getElementById("tags")!.children); + let tagType = ""; + if (tagElement.childNodes.length > 1 && tagElement.childNodes[1].textContent) + tagType = tagElement.childNodes[1].textContent.trim().toLowerCase(); - for (const tagElement of tagElements) { - // Get tag name from url, because some longer tags are shortened. - // Eg. "Tate no Yuusha no Nariagari" -> "Tate no Yuusha no Nariaga..." - // (ironically this is longer, but you get the idea) - const tagUrl = (tagElement.children[0] as HTMLAnchorElement).pathname.substr(1); - const tagName = decodeURIComponent(tagUrl.replace(/\+/g, '_')).toLowerCase(); + let category: TagCategory | undefined; + switch (tagType) { + case "game": + case "series": + category = "copyright"; + break; + case "character": + category = "character"; + break; + case "mangaka": + category = "artist"; + break; + case "source": + // Skip these type of tags, because they are not 'booru-like' + continue; + } - let tagType = ""; - if (tagElement.childNodes.length > 1 && tagElement.childNodes[1].textContent) - tagType = tagElement.childNodes[1].textContent.trim().toLowerCase(); - - let category: TagCategory | undefined; - switch (tagType) { - case "game": - case "series": - category = "copyright"; - break; - case "character": - category = "character"; - break; - case "mangaka": - category = "artist"; - break; - case "source": - // Skip these type of tags, because they are not 'booru-like' - continue; - } - - if (tagName) { - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - } - - result.tryAddPost(post); - - return result; + if (tagName) { + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } } + + result.tryAddPost(post); + + return result; + } } diff --git a/src/engines/e621.ts b/src/engines/e621.ts index c56bf49..2e3abb2 100644 --- a/src/engines/e621.ts +++ b/src/engines/e621.ts @@ -2,67 +2,73 @@ import { ScrapeEngine, ScrapeResult, ScrapedPost, ScrapedTag } from "../ScrapeEn import { TagCategory } from "../BooruTypes"; export default class e621 implements ScrapeEngine { - name = "e621"; + name = "e621"; - canImport(url: Location): boolean { - return url.host == "e621.net"; + canImport(url: Location): boolean { + return url.host == "e621.net"; + } + + scrapeDocument(document: Document): ScrapeResult { + let result = new ScrapeResult(this.name); + + let post = new ScrapedPost(); + post.source = document.location.href; + + // Set image url + const downloadEl = document.querySelector("#image-download-link > a") as HTMLAnchorElement; + post.imageUrl = downloadEl?.href; + + // Set rating + const ratingEl = document.getElementById("post-rating-text") as HTMLSpanElement; + switch (ratingEl?.innerText) { + case "Safe": + post.rating = "safe"; + break; + case "Questionable": + post.rating = "sketchy"; + break; + case "Explicit": + post.rating = "unsafe"; + break; } - scrapeDocument(document: Document): ScrapeResult { - let result = new ScrapeResult(this.name); + // Set tags + const tagEls = Array.from(document.querySelectorAll("#tag-list > ul > li")).map((x) => x as HTMLLIElement); - let post = new ScrapedPost(); - post.source = document.location.href; + for (const el of tagEls) { + const tagName = (el.querySelector(".search-tag") as HTMLAnchorElement)?.innerText; + let category: TagCategory | undefined; - // Set image url - const downloadEl = document.querySelector("#image-download-link > a") as HTMLAnchorElement; - post.imageUrl = downloadEl?.href; + switch (el.className) { + case "category-3": + category = "copyright"; + break; + case "category-4": + category = "character"; + break; + case "category-1": + category = "artist"; + break; + case "category-7": + category = "meta"; + break; + } - // Set rating - const ratingEl = document.getElementById("post-rating-text") as HTMLSpanElement; - switch (ratingEl?.innerText) { - case "Safe": - post.rating = "safe"; - break; - case "Questionable": - post.rating = "sketchy"; - break; - case "Explicit": - post.rating = "unsafe"; - break; - } - - // Set tags - const tagEls = Array.from(document.querySelectorAll("#tag-list > ul > li")) - .map(x => x as HTMLLIElement); - - for (const el of tagEls) { - const tagName = (el.querySelector(".search-tag") as HTMLAnchorElement)?.innerText; - let category: TagCategory | undefined; - - switch (el.className) { - case "category-3": - category = "copyright"; - break; - case "category-4": - category = "character"; - break; - case "category-1": - category = "artist"; - break; - case "category-7": - category = "meta"; - break; - } - - if (tagName) { - let tag = new ScrapedTag(tagName, category); - post.tags.push(tag); - } - } - - result.tryAddPost(post); - - return result; + if (tagName) { + let tag = new ScrapedTag(tagName, category); + post.tags.push(tag); + } } + + // Set source + const sourceEls = Array.from(document.querySelectorAll(".source-link > a")).map((x) => x as HTMLAnchorElement); + // We currently only support one source. + if (sourceEls.length > 0) { + post.source = sourceEls[0].href; + } + + result.tryAddPost(post); + + return result; + } } diff --git a/yarn.lock b/yarn.lock index 52ddd96..720292b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,137 +2,137 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/core@^7.1.0": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" - integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.4" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" lodash "^4.17.19" - resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.11.0", "@babel/generator@^7.11.4", "@babel/generator@^7.4.0": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" - integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11", "@babel/generator@^7.4.0": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.11" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.10" -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== +"@babel/helper-member-expression-to-functions@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.7" -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== +"@babel/helper-module-imports@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.5" -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" lodash "^4.17.19" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/helper-optimise-call-expression@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.10" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== +"@babel/helper-replace-supers@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" + integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.7" + "@babel/helper-optimise-call-expression" "^7.12.10" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.11" -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== + dependencies: + "@babel/types" "^7.12.11" + +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== dependencies: "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" "@babel/highlight@^7.10.4": version "7.10.4" @@ -143,10 +143,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.4", "@babel/parser@^7.4.3": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" - integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.4.3": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== "@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.8.3" @@ -155,36 +155,36 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/template@^7.10.4", "@babel/template@^7.4.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== +"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.4.0": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0", "@babel/traverse@^7.4.3": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.4.3": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" @@ -345,9 +345,9 @@ "@types/yargs" "^13.0.0" "@types/babel__core@^7.1.0": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== + version "7.1.12" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" + integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -356,24 +356,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" - integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ== + version "7.11.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" + integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== dependencies: "@babel/types" "^7.3.0" @@ -414,9 +414,9 @@ parse5 "^4.0.0" "@types/node@*": - version "14.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499" - integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA== + version "14.14.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.21.tgz#d934aacc22424fe9622ebf6857370c052eae464e" + integrity sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A== "@types/stack-utils@^1.0.1": version "1.0.1" @@ -429,21 +429,21 @@ integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== "@types/yargs@^13.0.0": - version "13.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b" - integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ== + version "13.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" + integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== dependencies: "@types/yargs-parser" "*" abab@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" - integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== acorn-globals@^4.1.0, acorn-globals@^4.3.2: version "4.3.4" @@ -464,19 +464,19 @@ acorn@^5.5.3: integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.1.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== ajv@^6.12.3: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -581,9 +581,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== babel-jest@^24.9.0: version "24.9.0" @@ -725,6 +725,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -903,11 +911,11 @@ debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" decamelize@^1.2.0: version "1.2.0" @@ -924,7 +932,7 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1002,20 +1010,21 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" @@ -1033,6 +1042,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.11.1, escodegen@^1.9.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -1196,6 +1210,13 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1241,15 +1262,24 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1314,7 +1344,7 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -1452,10 +1482,10 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^2.0.0: version "2.0.0" @@ -1464,6 +1494,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -1523,6 +1560,11 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-negative-zero@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -1537,7 +1579,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.0: +is-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== @@ -2256,17 +2298,17 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== dependencies: - mime-db "1.44.0" + mime-db "1.45.0" minimatch@^3.0.4: version "3.0.4" @@ -2300,15 +2342,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanomatch@^1.2.9: version "1.2.13" @@ -2401,12 +2443,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -2418,23 +2460,24 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -2603,12 +2646,12 @@ pretty-format@^24.9.0: react-is "^16.8.4" prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" psl@^1.1.28: version "1.8.0" @@ -2759,11 +2802,12 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@1.x, resolve@^1.10.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== dependencies: + is-core-module "^2.1.0" path-parse "^1.0.6" ret@~0.1.10: @@ -2879,7 +2923,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sisteransi@^1.0.4: +sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== @@ -2975,9 +3019,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -3002,9 +3046,11 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" + integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -3037,20 +3083,20 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.5" strip-ansi@^4.0.0: version "4.0.0" @@ -3228,9 +3274,9 @@ unset-value@^1.0.0: isobject "^3.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -3245,14 +3291,15 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util.promisify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.2" + for-each "^0.3.3" has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" + object.getownpropertydescriptors "^2.1.1" uuid@^3.3.2: version "3.4.0" @@ -3382,9 +3429,9 @@ ws@^5.2.0: async-limiter "~1.0.0" ws@^7.0.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xml-name-validator@^3.0.0: version "3.0.0" @@ -3397,9 +3444,9 @@ xmlchars@^2.1.1: integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yargs-parser@10.x: version "10.1.0"