From 559d0cc0b67bda44238563f8ca10266e40cdddee Mon Sep 17 00:00:00 2001 From: John Brayton Date: Thu, 23 Apr 2020 17:34:29 -0400 Subject: [PATCH 1/9] feat:Add a custom extractor for ma.ttias.be. When parsing content for cron.weekly issues, such as the one at https://ma.ttias.be/cronweekly/issue-130/, Mercury Parser would remove headings and ordered lists that were part of the content. This resolves that as follows: * Remove "id" attributes from "h1" and "h2" elements. Those attributes would result in the elements having a low weight. * Since Mercury Parser demotes "h1" elements to "h2", demote "h2" elements to "h3". * Add class="entry-content-asset" to "ul" elements to avoid them being removed. --- fixtures/ma.ttias.be/1587659928239.html | 540 ++++++++++++++++++ src/extractors/custom/index.js | 1 + src/extractors/custom/ma.ttias.be/index.js | 46 ++ .../custom/ma.ttias.be/index.test.js | 127 ++++ 4 files changed, 714 insertions(+) create mode 100644 fixtures/ma.ttias.be/1587659928239.html create mode 100644 src/extractors/custom/ma.ttias.be/index.js create mode 100644 src/extractors/custom/ma.ttias.be/index.test.js diff --git a/fixtures/ma.ttias.be/1587659928239.html b/fixtures/ma.ttias.be/1587659928239.html new file mode 100644 index 000000000..03515ab69 --- /dev/null +++ b/fixtures/ma.ttias.be/1587659928239.html @@ -0,0 +1,540 @@ + + + + + + + cron.weekly issue #130: Github, keycloak, proc, redis6, cron & more + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+

+ cron.weekly issue #130: Github, keycloak, proc, redis6, cron & more +

+ +
+ +
+

+ cron.weekly is a newsletter about Linux, open source & webdevelopment. Want to get it in your inbox every Sunday? Subscribe below! +

+ +
+ + +
+ + I respect your privacy and you won't get spam. Ever. Just a weekly-ish newsletter about Linux and open source. + +
+
+
+
+
+
+ +
+
+
+ Image of Mattias Geniar +
+

+ Mattias Geniar, April 19, 2020 +

+

+ Follow me on Twitter as @mattiasgeniar +

+
+
+ + + + +
+
+ + +

Hi everyone! 👋

+ +

Welcome to cron.weekly issue #130.

+ +

There’s quite a bit of news from Github this week, together with Windows 10 (I know, on a Linux-focussed newsletter no less!) and ARM servers. I should have some content for everyone to enjoy.

+ +

Stay strong, stay home, stay alive.

+ +

Oh, and ☕️, of course.

+ +

News & general 🗞

+ +

Is BGP safe yet? No.

+ +

Did you know the internet is held together with duct tape? BGP is one of those pieces of tape. Resource Public Key Infrastructure (RPKI) can help authenticate routes, but is only seeing slow adoption.

+ +

GitHub is now free for teams

+ +

This is a pretty big move on their part: you can now create teams and host unlimited private git repositories at Github for free!

+ +
+

We’ve wanted to make this change for the last 18 months, but needed our Enterprise business to be big enough to enable the free use of GitHub by the rest of the world. - Nat Friedman

+
+ +

Big players pay for the little ones, I appreciate that.

+ +

Academics steal data from air-gapped systems using PC fan vibrations

+ +

Even your computer fan can leak your personal data. tl;dr: don’t use computers. Ever.

+ +

ICANN delays .org sell off

+ +

Good news, for now - as the .org sale announced late last year is put on hold. Question is, for how long?

+ +

npm has joined GitHub

+ +

GitHub has completed its acquisition of npm. Which is a bit of a weird announcement from Github, as npm already announced it last month? Oh well, corporate stuff. 😄

+ +

Scaleway ARM64 instances reach end-of-life

+ +

Scaleway is sunsetting its ARM64 instances at the end of this year. This is a bit of a surprise move, as they reached their fame (I believe?) mostly because they did ARM server hosting at scale.

+ +

In an age where Apple is supposed to release ARM laptops within the year, I’d be very curious to learn why Scaleway is terminating their ARM support.

+ +

Windows WSL2 & Explorer integration for Linux

+ +

Two interesting stories that caught my attention last week from the Windows front:

+ + + +

The new Windows Subsystem for Linux 2 (WSL2) will run as a lightweight VM running a full Linux kernel, which means it’ll support things like Docker and FUSE.

+ +

The new Explorer integration means you’ll be able to access the files on that tiny Linux VM much easier.

+ +

Tools & Projects 🛠

+ +

Learning-to-See-in-the-Dark

+ +

This is crazy: a machine learning dataset that can turn just about any (really) dark image into a bright-as-day version. The video blew my mind.

+ +

ProtonMail Bridge

+ +

The ProtonMail Bridge is an application that runs on your computer in the background and seamlessly encrypts and decrypts your mail as it enters and leaves your computer.

+ +

Simplify Complexity in Containerized Environments

+ +

Enhance visibility into containers and container orchestration with Datadog. Automatically track containerized services with Autodiscovery and receive smarter alerts that won’t panic as customers scale down. Easily monitor the health of all your containers with granular, real-time metrics and visualize performance from a bird’s eye view with Datadog’s live container map. Start your free Datadog trial today! Sponsored

+ +

Phoenix LiveDashboard

+ +

LiveDashboard provides real-time performance monitoring and debugging tools for Phoenix developers.

+ +

prestissimo

+ +

This is a composer plugin (PHP’s package manager) that downloads packages in parallel to speed up the installation process.

+ +

Kanboard

+ +

Kanboard is a free and open-source Kanban project management software.

+ +

Hund: versatile service monitoring

+ +

Monitor your services every 30 seconds, get notified the way you want! Slack, Email, Webhooks, … your pick. See rich metrics and use our customizable status pages to keep all your customers informed. Try us for free for 30 days! Sponsored

+ +

regex2fat

+ +

“Did you ever want to match a regex, but all you had was a fat32 driver? Ever wanted to serialize your regex DFAs into one of the most widely supported formats used by over 3 billion devices?”

+ +

I have no idea how any of this works, but it got shared far & wide on the internet, so I figure I’ll do the same here. But really … even the tagline confuses me. 🙈

+ +

falcon

+ +

Falcon is a free, open-source SQL editor with inline data visualization. It currently supports connecting to RedShift, MySQL, PostgreSQL, IBM DB2, Impala, MS SQL, Oracle, SQLite.

+ +

keycloak

+ +

Keycloak is an Open Source Identity and Access Management solution for modern Applications and Services. It allows you to add authentication to applications and secure services with minimum fuss. No need to deal with storing users or authenticating users. It’s all available out of the box. You’ll even get advanced features such as User Federation, Identity Brokering and Social Login.

+ +

mdBook

+ +

Ever wanted to write a book (You’re crazy)? Ever wanted to do it in Markdown (OK, maybe you’re not crazy)? You can use mdBook to take Markdown files, parse them & create online books.

+ +

3mux

+ +

3mux is a terminal multiplexer with out-of-the-box support for search, mouse-controlled scrollback, and i3-like keybindings. Imagine tmux with a smaller learning curve and more sane defaults.

+ +

Guides & Tutorials 🎓

+ +

Now I Understand why Almost No One uses Encrypted Email

+ +

It’s true, using PGP with email isn’t very user friendly, to this day. This post contains the commands used to send encrypted e-mails, and it’s enough to put you off - honestly.

+ +

Troubleshoot using the proc filesystem on Linux

+ +

A good overview of the basics when looking at the /proc filesystem. I use this all the time when debugging, it’s a good place to start a lot of debug-quests.

+ +

Comparing the new Redis6 multithreaded I/O to Elasticache & KeyDB

+ +

The team at KeyDB compares its key/value daemon (originally a fork of Redis) with the latest Redis 6. Surprise surprise, KeyDB wins. 😅 But the metrics & numbers are interesting enough to share the post regardless.

+ +

Why does cron only offer minute granularity?

+ +

In short, compatibility. The format that crontab uses is described in minute detail as part of the POSIX Specification.

+ +

How to Boost UDP Transaction Performance

+ +

A nice in-depth set of slides to optimize UDP traffic on a Linux server. This might come in handy when HTTP/3 takes off and you want to optimise your throughput.

+ +

Rename files in linux without typing the full name twice

+ +

This is clever use of a Bash alias and the read method in Bash to prompt for input.

+ +

Technical reasons to choose FreeBSD over GNU/Linux

+ +

This post covers some of the technical reasons to choose FreeBSD over GNU/Linux.

+ +

Wireguard VPN: Typical Setup

+ +

This guide helps you set up Wireguard VPN on your Linux box with step-by-step instructions.

+ +
+ + +
+ + + + + + +
+ +
+
+ +
+
+ +
+ +
+
+

Want to subscribe to the cron.weekly newsletter?

+ +

+ I write a weekly-ish newsletter on Linux, open source & webdevelopment called cron.weekly. +

+ +

+ It features the latest news, guides & tutorials and new open source projects. You can sign up via email below. +

+ +
+ +
+ +

+ No spam. Just some good, practical Linux & open source content. +

+
+
+
+
+ + +
+ + + diff --git a/src/extractors/custom/index.js b/src/extractors/custom/index.js index e3bc157c4..8c75604df 100644 --- a/src/extractors/custom/index.js +++ b/src/extractors/custom/index.js @@ -132,3 +132,4 @@ export * from './www.phoronix.com'; export * from './pitchfork.com'; export * from './biorxiv.org'; export * from './epaper.zeit.de'; +export * from './ma.ttias.be'; diff --git a/src/extractors/custom/ma.ttias.be/index.js b/src/extractors/custom/ma.ttias.be/index.js new file mode 100644 index 000000000..51f0cefd6 --- /dev/null +++ b/src/extractors/custom/ma.ttias.be/index.js @@ -0,0 +1,46 @@ +export const MaTtiasBeExtractor = { + domain: 'ma.ttias.be', + + title: { + selectors: [['meta[name="twitter:title"]', 'value']], + }, + + author: { + selectors: [['meta[name="author"]', 'value']], + }, + + date_published: { + selectors: [['meta[name="article:published_time"]', 'value']], + }, + + content: { + selectors: [['.content']], + + // Is there anything in the content you selected that needs transformed + // before it's consumable content? E.g., unusual lazy loaded images + transforms: { + h2: $node => { + // The "id" attribute values would result in low scores and the element being + // removed. + $node.attr('id', null); + + // h1 elements will be demoted to h2, so demote h2 elements to h3. + return 'h3'; + }, + h1: $node => { + // The "id" attribute values would result in low scores and the element being + // removed. + $node.attr('id', null); + + // A subsequent h2 will be removed if there is not a paragraph before it, so + // add a paragraph here. It will be removed anyway because it is empty. + $node.after('

'); + }, + ul: $node => { + // Articles contain lists of links which look like, but are not, navigation + // elements. Adding this class attribute avoids them being incorrectly removed. + $node.attr('class', 'entry-content-asset'); + }, + }, + }, +}; diff --git a/src/extractors/custom/ma.ttias.be/index.test.js b/src/extractors/custom/ma.ttias.be/index.test.js new file mode 100644 index 000000000..13429bb39 --- /dev/null +++ b/src/extractors/custom/ma.ttias.be/index.test.js @@ -0,0 +1,127 @@ +import assert from 'assert'; +import URL from 'url'; +import cheerio from 'cheerio'; + +import Mercury from 'mercury'; +import getExtractor from 'extractors/get-extractor'; +import { excerptContent } from 'utils/text'; + +const fs = require('fs'); + +describe('MaTtiasBeExtractor', () => { + describe('initial test case', () => { + let result; + let url; + beforeAll(() => { + url = 'https://ma.ttias.be/cronweekly/issue-130/'; + const html = fs.readFileSync('./fixtures/ma.ttias.be/1587659928239.html'); + result = Mercury.parse(url, { html, fallback: false }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the title', async () => { + // To pass this test, fill out the title selector + // in ./src/extractors/custom/ma.ttias.be/index.js. + const { title } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + title, + `cron.weekly issue #130: Github, keycloak, proc, redis6, cron & more` + ); + }); + + it('returns the author', async () => { + // To pass this test, fill out the author selector + // in ./src/extractors/custom/ma.ttias.be/index.js. + const { author } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(author, 'Mattias Geniar'); + }); + + it('returns the date_published', async () => { + // To pass this test, fill out the date_published selector + // in ./src/extractors/custom/ma.ttias.be/index.js. + const { date_published } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(date_published, `2020-04-19T05:50:00.000Z`); + }); + + it('returns the dek', async () => { + // To pass this test, fill out the dek selector + // in ./src/extractors/custom/ma.ttias.be/index.js. + const { dek } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(dek, null); + }); + + it('returns the lead_image_url', async () => { + // To pass this test, fill out the lead_image_url selector + // in ./src/extractors/custom/ma.ttias.be/index.js. + const { lead_image_url } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(lead_image_url, null); + }); + + it('returns the content', async () => { + const html = fs.readFileSync('./fixtures/ma.ttias.be/1587659928239.html'); + const uri = 'https://ma.ttias.be/cronweekly/issue-130/'; + + const { content } = await Mercury.parse(uri, { html }); + + const $ = cheerio.load(content || ''); + + // Ensure that there are 3 h2 elements. + const h2 = $('h2'); + + assert.equal(h2.length, 3); + + // Ensure that there are h2 h2 elements. + const h3 = $('h3'); + + assert.equal(h3.length, 27); + + // Ensure that there is 1 ul element. + const ul = $('ul'); + + assert.equal(ul.length, 1); + + // Ensure that there are no nav elements. + const nav = $('nav'); + + assert.equal(nav.length, 0); + + // Check the first 13 words. + + const first13 = excerptContent( + $('*') + .first() + .text(), + 13 + ); + + // Update these values with the expected values from + // the article. + assert.equal( + first13, + 'Hi everyone! 👋 Welcome to cron.weekly issue #130. There’s quite a bit of' + ); + }); + }); +}); From 921d9d4909d07f02e5adf7f6d9e0b7cb20ef0e84 Mon Sep 17 00:00:00 2001 From: John Brayton Date: Thu, 23 Apr 2020 17:43:39 -0400 Subject: [PATCH 2/9] removed redundant comment. --- src/extractors/custom/ma.ttias.be/index.test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/extractors/custom/ma.ttias.be/index.test.js b/src/extractors/custom/ma.ttias.be/index.test.js index 13429bb39..9aa73b206 100644 --- a/src/extractors/custom/ma.ttias.be/index.test.js +++ b/src/extractors/custom/ma.ttias.be/index.test.js @@ -116,8 +116,6 @@ describe('MaTtiasBeExtractor', () => { 13 ); - // Update these values with the expected values from - // the article. assert.equal( first13, 'Hi everyone! 👋 Welcome to cron.weekly issue #130. There’s quite a bit of' From 0d63d8e89c0d24ede5eab57661bfd9b1e12db5eb Mon Sep 17 00:00:00 2001 From: John Brayton Date: Fri, 24 Apr 2020 18:56:57 -0400 Subject: [PATCH 3/9] feat: Add a custom extractor for engadget.com. --- fixtures/www.engadget.com/1587759947079.html | 1566 +++++++++++++++++ src/extractors/custom/index.js | 1 + .../custom/www.engadget.com/index.js | 53 + .../custom/www.engadget.com/index.test.js | 120 ++ 4 files changed, 1740 insertions(+) create mode 100644 fixtures/www.engadget.com/1587759947079.html create mode 100644 src/extractors/custom/www.engadget.com/index.js create mode 100644 src/extractors/custom/www.engadget.com/index.test.js diff --git a/fixtures/www.engadget.com/1587759947079.html b/fixtures/www.engadget.com/1587759947079.html new file mode 100644 index 000000000..e02780c87 --- /dev/null +++ b/fixtures/www.engadget.com/1587759947079.html @@ -0,0 +1,1566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lyft extends free scooter rides for critical workers through May | Engadget + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+
+
+ +
+ +
+ + + + +
+ +
+ +
+
+
+ + + + + + +
+ + + + +
+ + + + + + + + + + + + + +
+
+ +
+ + + + + + +
+
+ +
+

+ Latest in Gear +

+
+ + + +
+
+ + + +
+ + +
+ +
+ +
+
Image credit: REUTERS/Brendan McDermid
+
+
+ +
+ + +
+ +
+ +
+ +
+

Lyft extends free scooter rides for critical workers through May

+
Emergency, healthcare and transit workers won't need to pay.
+
+ +
+
+
+ + +
Jon Fingas, @jonfingas
+ 1h ago +
+
+
+
+
+ +
+ +33 +Shares +
+
+
+ + +
+ +
+
+
+ Share + +
+
+
+
+
+ +
+
+
+ Tweet + +
+
+
+
+
+ +
+
+
+ Share + +
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + + +
+ +
+ +
+
+
+ + + +
+
+

Sponsored Links

+ + +
+ + +
+ + + + +
+ +
+
+ A Lyft Scooter is parked in Washington, U.S., March 29, 2019. REUTERS/Brendan McDermid +
+ + + REUTERS/Brendan McDermid + +
+
+
+
+
+ + +
+
+
+
+ + + +

Lyft isn’t waiting until the end of April to decide on the fate of its free scooter rides for critical workers during the COVID-19 pandemic. The ridesharing firm has extended its LyftUp Scooter Program through May, giving free rides to healthcare, emergency and transit workers in six cities another month. Employers will still have to enroll staff, but registered workers will continue get as many no-cost 30-minute rides as they need to commute without having to get close to others on public transportation or in rideshare cars.

The program is currently available in Austin, Denver, Los Angeles, San Diego, Santa Monica and the metro DC area. Lyft has also promised stricter cleaning protocols to make sure the scooters themselves are cleaner.

+ +
+
+
+
+ + + +
+ +
+
+
+
+ + + +

This isn’t the only scooter program available to vital workers. Uber, for instance, pledged 10 million free rides and deliveries for people on the front line of the COVID-19 fight. Lyft’s extension could still be important in the cities where it’s offered, though, and it suggests these programs will continue for as long as nurses, bus drivers and other key staff need to get to work safely.

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ All products recommended by Engadget are selected by our editorial team, independent of our parent company. Some of our stories include affiliate links. If you buy something through one of these links, we may earn an affiliate commission. +
+
+
+
+ Comment +
+
+ + + + Comments +
+ +
+
+
+ Share +
+
+ 33 + Shares +
+
+
+
+ + +
+ +
+
+
+ Share + +
+
+
+
+
+ +
+
+
+ Tweet + +
+
+
+
+
+ +
+
+
+ Share + +
+
+
+
+ + +
+
+
+ +
+
+
+
+
+ +
+ + +
+ +
+ +
+ +
+ +
+ + + + + + +
+ + + + +
+
+
+ +
+

+ Popular on Engadget +

+ +
+ + + +
+
+
+
+
+
+
+ + +
+
+
+
+ Dyson won't build ventilators for the UK after all +
+
+
+

+ + Dyson won't build ventilators for the UK after all + +

+
+ View +
+
+ + +
+
+
+
+ Apple Watch Series 5 cellular models are $100 off +
+
+
+

+ + Apple Watch Series 5 cellular models are $100 off + +

+
+ View +
+
+ + +
+
+
+
+ SpaceX will make its Starlink satellites less of a blight on the night sky +
+
+
+

+ + SpaceX will make its Starlink satellites less of a blight on the night sky + +

+
+ View +
+
+ + +
+
+
+
+ Facebook takes on Zoom with 'Messenger Rooms' +
+
+
+

+ + Facebook takes on Zoom with 'Messenger Rooms' + +

+
+ View +
+
+ + +
+
+
+
+ Tesla competitor Polestar 2 will start at $59,900 in the US +
+
+
+

+ + Tesla competitor Polestar 2 will start at $59,900 in the US + +

+
+ View +
+
+
+
+
+
+ +
+
+
+
+ + +
+ +
+
+
+
+
+
+ + + +
+

+ From around the web

+
+ +
+
+
+
+ +
+
+
+ + +
+ + +
+ +
+ +
+ + + + +
+ + + + + + + +
+ + +
+ + +
+ +
+ Page 1Page 1ear iconeye iconFill 23text filevr
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/extractors/custom/index.js b/src/extractors/custom/index.js index e3bc157c4..4a743cab1 100644 --- a/src/extractors/custom/index.js +++ b/src/extractors/custom/index.js @@ -132,3 +132,4 @@ export * from './www.phoronix.com'; export * from './pitchfork.com'; export * from './biorxiv.org'; export * from './epaper.zeit.de'; +export * from './www.engadget.com'; diff --git a/src/extractors/custom/www.engadget.com/index.js b/src/extractors/custom/www.engadget.com/index.js new file mode 100644 index 000000000..aef64bd70 --- /dev/null +++ b/src/extractors/custom/www.engadget.com/index.js @@ -0,0 +1,53 @@ +export const WwwEngadgetComExtractor = { + domain: 'www.engadget.com', + + title: { + selectors: [['meta[name="og:title"]', 'value']], + }, + + author: { + selectors: ['a.th-meta[data-ylk*="subsec:author"]'], + }, + + // Engadget stories have publish dates, but the only representation of them on the page + // is in a format like "2h ago". There are also these tags with blank values: + // + date_published: { + selectors: [ + // enter selectors + ], + }, + + dek: { + selectors: ['div[class*="o-title_mark"] div'], + }, + + // Engadget stories do have lead images specified by an og:image meta tag, but selecting + // the value attribute of that tag fails. I believe the "ℑ" sequence of characters + // is triggering this inability to select the attribute value. + lead_image_url: { + selectors: [ + // enter selectors + ], + }, + + content: { + selectors: [ + [ + // Some figures will be inside div.article-text, but some header figures/images + // will not. + '#page_body figure:not(div.article-text figure)', + 'div.article-text', + ], + ], + + // Is there anything in the content you selected that needs transformed + // before it's consumable content? E.g., unusual lazy loaded images + transforms: {}, + + // Is there anything that is in the result that shouldn't be? + // The clean selectors will remove anything that matches from + // the result + clean: [], + }, +}; diff --git a/src/extractors/custom/www.engadget.com/index.test.js b/src/extractors/custom/www.engadget.com/index.test.js new file mode 100644 index 000000000..db691fe91 --- /dev/null +++ b/src/extractors/custom/www.engadget.com/index.test.js @@ -0,0 +1,120 @@ +import assert from 'assert'; +import URL from 'url'; +import cheerio from 'cheerio'; + +import Mercury from 'mercury'; +import getExtractor from 'extractors/get-extractor'; +import { excerptContent } from 'utils/text'; + +const fs = require('fs'); + +describe('WwwEngadgetComExtractor', () => { + describe('initial test case', () => { + let result; + let url; + beforeAll(() => { + url = + 'https://www.engadget.com/lyft-extends-free-scooter-rides-for-critical-workers-184144961.html'; + const html = fs.readFileSync( + './fixtures/www.engadget.com/1587759947079.html' + ); + result = Mercury.parse(url, { html, fallback: false }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the title', async () => { + // To pass this test, fill out the title selector + // in ./src/extractors/custom/www.engadget.com/index.js. + const { title } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + title, + `Lyft extends free scooter rides for critical workers through May` + ); + }); + + it('returns the author', async () => { + // To pass this test, fill out the author selector + // in ./src/extractors/custom/www.engadget.com/index.js. + const { author } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(author, 'Jon Fingas'); + }); + + it('returns the date_published', async () => { + // To pass this test, fill out the date_published selector + // in ./src/extractors/custom/www.engadget.com/index.js. + const { date_published } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(date_published, null); + }); + + it('returns the dek', async () => { + // To pass this test, fill out the dek selector + // in ./src/extractors/custom/www.engadget.com/index.js. + const { dek } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + dek, + "Emergency, healthcare and transit workers won't need to pay." + ); + }); + + it('returns the lead_image_url', async () => { + // To pass this test, fill out the lead_image_url selector + // in ./src/extractors/custom/www.engadget.com/index.js. + const { lead_image_url } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(lead_image_url, null); + }); + + it('returns the content', async () => { + // To pass this test, fill out the content selector + // in ./src/extractors/custom/www.engadget.com/index.js. + // You may also want to make use of the clean and transform + // options. + const { content } = await result; + + const $ = cheerio.load(content || ''); + + const first13 = excerptContent( + $('*') + .first() + .text(), + 13 + ); + + // Update these values with the expected values from + // the article. + assert.equal( + first13, + 'REUTERS/Brendan McDermid Lyft isn’t waiting until the end of April to decide on' + ); + + // Ensure that the figure is present. + const figure = $('figure'); + assert.equal(figure.length, 1); + + // Ensure that there are 3 paragraphs + const p = $('p'); + assert.equal(p.length, 3); + }); + }); +}); From 032ac6cd9bf81c7dcb27a4f50e03ac8bf725838e Mon Sep 17 00:00:00 2001 From: John Brayton Date: Sat, 25 Apr 2020 21:03:50 -0400 Subject: [PATCH 4/9] feat: Add a custom extractor for www.ndtv.com. --- fixtures/www.ndtv.com/1587821636077.html | 17 + src/extractors/custom/index.js | 1 + src/extractors/custom/www.ndtv.com/index.js | 54 ++ .../custom/www.ndtv.com/index.test.js | 120 +++++ yarn.lock | 466 ++++++++++++++++-- 5 files changed, 610 insertions(+), 48 deletions(-) create mode 100644 fixtures/www.ndtv.com/1587821636077.html create mode 100644 src/extractors/custom/www.ndtv.com/index.js create mode 100644 src/extractors/custom/www.ndtv.com/index.test.js diff --git a/fixtures/www.ndtv.com/1587821636077.html b/fixtures/www.ndtv.com/1587821636077.html new file mode 100644 index 000000000..64eb4f76c --- /dev/null +++ b/fixtures/www.ndtv.com/1587821636077.html @@ -0,0 +1,17 @@ +Coronavirus News: Donald Trump Talks Retaliation If India Rejects Export Of Key Drug +

COVID-19: Trump Talks "Retaliation" If India Rejects Export Of Key Drug

Amid rising pressure, the government is likely to take a decision on the matter today and clear the move after calculating sufficient stocks for the country, sources have told NDTV.

COVID-19: Trump Talks 'Retaliation' If India Rejects Export Of Key Drug

Coronavirus: US President Donald Trump said he spoke to PM Modi on Sunday.

Highlights

  • Hydroxychloroquine is a key drug used in the treatment of COVID-19
  • The centre announced a hold on export of hydroxychloroquine on March 25
  • India is one of the world's largest manufacturers of the medicine
Washington/ New Delhi:

US President Donald Trump has said "there may be retaliation" if India does not agree to export hydroxychloroquine, a key anti-malaria drug believed by many to be effective in the treatment of coronavirus. His remarks come nearly two weeks after the government banned export of the drug as experts test its efficacy in helping treat COVID-19 patients.

"I would be surprised if he (Prime Minister Narendra Modi) would, you know, because India does very well with the United States," Mr Trump said at a White House press briefing on Monday, when a reporter asked whether he was worried about "retaliation to the US ban on export of medical goods" from India.

"I don't like that decision, I didn't hear that that was his decision. I know that he stopped it for other countries. I spoke to him yesterday, we had a very good talk and we'll see whether or not that's his... For many years, they've been taken advantage of the United States on trade. So I would be surprised if that were his decision. He'd have to tell me that. I spoke to him Sunday morning, called him, and I said, we'd appreciate you allowing our supply to come out. If he doesn't allow it to come out. That would be OK. But of course, there may be retaliation. Why wouldn't there be," the US President said.

Trump has described hydroxychloroquine as a "game-changer" though it is yet to be established as an effective cure for COVID-19.

Last month, the Indian Council of Medical Research or ICMR had recommended the use of hydroxychloroquine for treating healthcare workers serving coronavirus patients.

In a notification on March 25, the government announced a hold on the medicine's export, adding that it would be allowed only on "case-to case basis" on humanitarian grounds. India has reported over 4,000 coronavirus patients so far and more than 100 deaths. 

This morning, however, the government said that key drugs linked to COVID-19 cure will be supplied to "nations that have been badly affected" by the pandemic.   

"In view of the humanitarian aspects of the pandemic, it has been decided that India would licence paracetamol and Hydroxychloroquine in appropriate quantities to all our neighbouring countries who are dependent on our capabilities. We will also be supplying these essential drugs to some nations who have been particularly badly affected by the pandemic. We would therefore discourage any speculation in this regard or any attempts to politicise the matter," Foreign Ministry spokesperson Anurag Srivastava said.

Currently, the US has the most number of coronavirus cases in the world. The coronavirus death count has crossed 10,000-mark in US; over 366,000 have contracted infection so far.

Last week, the US Food and Drug Administration (FDA) issued an Emergency Use Authorization or EUA to permit the emergency use of hydroxychloroquine sulfate supplied from the national stockpile to treat adult and adolescent COVID-19 patients who weigh 50 kg or more and are hospitalised, according to an official statement.

World

28,25,140Cases
18,29,648Active
7,97,826Recovered
1,97,666Deaths
Coronavirus has spread to 185 countries. The total confirmed cases worldwide are 28,25,140 and 1,97,666 have died; 18,29,648 are active cases and 7,97,826 have recovered as on April 25, 2020 at 5:36 pm.

India

24,942 1490Cases
18,953 1038Active
5,210 396Recovered
779 56Deaths
In India, there are 24,942 confirmed cases including 779 deaths. The number of active cases is 18,953 and 5,210 have recovered as on April 25, 2020 at 5:00 pm.

State & District Details

+ State + + Cases + + Active + + Recovered + + Deaths +
DistrictCases
Mumbai3029
Pune660
Thane465
Nashik96
Nagpur76
Mumbai Sub Ur67
Yavatmal32
Aurangabad30
Sangli27
Ahmednagar27
Sholapur21
Buldhana21
Palaghar17
Akola17
Raigad17
Satara14
Kolhapur8
Latur8
Ratnagiri7
Amravati6
Jalgaon3
Osmanabad3
Sindhudurg (kudal)2
Chandrapur2
Dhule2
Beed1
Washim1
Parbhani1
Jalna1
Nandurbar1
Gondia1
Hingoli1
Details Awaited*2153

6817 387

5559 252

957 117

301 18

DistrictCases
Ahmedabad1298
Surat338
Vadodara188
Rajkot40
Bhavnagar32
Anand28
Bharuch23
Gandhi Nagar17
Patan15
Narmada12
Panchmahal11
Banaskantha10
Arvalli8
Chhota Udepur7
Kutch6
Mehsana6
Botad5
Porbandar3
Mahisagar3
Kheda3
Gir Somnath3
Dahod3
Sabarkantha2
Valsad2
Morbi1
Jamnagar1
Tapi1
Details Awaited*749

2815 191

2423 169

265 7

127 15

DistrictCases
Tj From Quaritine1080
Others Non Tracable213
Central Delhi184
South East130
West Delhi122
South Delhi70
North Delhi60
Shahadara48
South West Delhi42
East Delhi38
New Delhi37
North West Delhi32
North East Delhi25
Details Awaited*433

2514 138

1604 86

857 49

53 3

DistrictCases
Jaipur537
Jodhpur228
Bharatpur102
Kota99
Tonk95
Banswara60
Iran Evacuees60
Nagaur58
Jhunjhunu37
Bikaner35
Jaisalmer32
Bhilwara28
Ajmer23
Jhalawar20
Churu14
Dausa13
Alwar7
Dungarpur5
Sawai Madhopur5
Udaipur4
Hanumangarh3
Karauli3
Pali2
Pratapgarh2
Sikar2
Dholpur1
Barmer1
Details Awaited*558

2034 70

1777 70

230

27

DistrictCases
Indore915
Bhopal277
Khargon41
Dhaar41
Khandwa (east Nimar)32
Ujjain29
Raisen29
Hoshangabad25
Jabalpur25
Barwani24
Dewas18
Vidisha13
Ratlam13
Morena13
Mandsaur9
Agar8
Shajapur6
Sheopur-kalan4
Alirajpur3
Gwalior3
Sagar2
Shivpuri2
Chindwara2
Betul2
Rajgarh1
Dindori1
Tikamgarh1
Details Awaited*413

1952 100

1650 84

210 7

92 9

DistrictCases
Agra241
Lucknow167
Gautam Budha Nagar98
Meerut75
Saharanpur72
Kanpur59
Firozabad58
Moradabad58
Ghaziabad41
Shamli26
Bijnor26
Basti19
Bulandshahar18
Sitapur17
Hapur17
Amroha17
Baghpat15
Rampur15
Varanasi14
Budaun13
Azamgarh7
Auraiya7
Sambhal7
Mathura6
Maharajganj6
Ghazipur6
Kannauj6
Pratapgarh6
Bareilly6
Muzaffar Nagar5
Jaunpur5
Lakhimpur Kheri4
Mainpuri4
Hathras4
Kanshi Ram Nagar (kasganj)3
Mirzapur3
Etah3
Etawah3
Kaushambi2
Banda2
Pilibhit2
Hardoi2
Rae-bareilly2
Unnao1
Sultanpur1
Bara-banki1
Sant Kabir Nagar1
Shahjahanpur1
Sant Ravi Das Nagar (bhadoi)1
Mau1
Gonda1
Allahabad1
Details Awaited*602

1778 174

1504 130

248 42

26 2

DistrictCases
Chennai303
Coimbatore133
Tiruppur109
Dindigul76
Erode70
Tirunelveli62
Chengalpattu53
Tiruchirapalli50
Namakkal50
Thiruvallur48
Thanjavur46
Madurai46
Nagapattinam44
Theni43
Karur42
Ranipet39
Villupuram36
Thoothukudi27
Thiruvarur27
Cuddalore26
Tenkasi26
Salem24
Vellore22
Virudhunagar19
Tirupattur17
Nagerkoil (kanyakumari)16
Sivagangai12
Tiruvannamalai12
Ramanathapuram11
Udagamandalam9
Kancheepuram9
Perambalur5
Ariyalur4
Kalllakurichi3
Pudukottai1
Details Awaited*235

1755 72

867

866 114

22 2

DistrictCases
Kurnool158
Guntur128
Krishna76
Nellore67
Prakasam44
Kadapa37
West Godavari35
Anantapur29
Chittoor28
East Godavari24
Visakhapatnam20
Details Awaited*415

1061 106

859 78

171 26

31 2

DistrictCases
Hyderabad472
Suryapet75
Nizamabad56
Vikarabad36
Hyderabad Rural (ranga Reddy)35
Gadwal (jogulamba)32
Medchal30
Warangal25
Adilabad19
Karimnagar19
Nirmal18
Yadadri15
Nalgonda15
Mahaboobnagar12
Kamareddy11
Sangareddy8
Khammam7
Medak6
Asifabad (komarambhim)5
Kothagudem (badadri)4
Jagityal3
Siricilla (rajanna)3
Bhupalpally (jayashanker)3
Nagarkurnool2
Peddapally2
Mulugu2
Janagoan2
Siddipet1
Mahabubabad1
Details Awaited*65

984

705

253

26

DistrictCases
Kolkata184
Howrah79
North 24 Parganas46
Purba Mednipur21
Hooghly12
South 24 Parganas9
Kalimpomg7
Paschim Burdwan7
Nadia6
Jalpaiguri5
Darjeeling4
Paschim Mednipur4
Diamond Harbour-hd3
Murshidabad2
Basirhat-hd1
Purba Burdwan1
Nandigram-hd1
Details Awaited*179

571 57

450 54

103

18 3

DistrictCases
Mysuru84
Bbmp66
Belagavi42
Vijayapura32
Kalburgi27
Bengaluru (u)23
Bagalkote21
Chikkaballapur16
Bidar15
Dakshin Kannada14
Ballari13
Mandya12
Bengaluru (r)12
Uttara Kannada11
Dharwad7
Gadag4
Udupi3
Tumakuru2
Davanagere2
Kodagu1
Chitradurga1
Details Awaited*81

489 26

318 23

153 3

18

DistrictCases
Bandipora81
Srinagar79
Baramulla43
Kupwara31
Jammu27
Shopian22
Udhampur20
Ganderbal14
Badgam13
Kulgam6
Rajouri4
Samba4
Anantnag3
Pulwama3
Details Awaited*104

454 27

340 10

109 17

5

DistrictCases
Kasaragode170
Cannanore(kannur)92
Ernakulam24
Kozhicode (calicut)20
Malappuram20
Pathanamthitta17
Thiruvananthapuram14
Thrissur13
Idukki10
Kollam9
Palakkad8
Alappuzha5
Kottayam3
Wyanad3
Details Awaited*43

451 3

116

331 7

4 1

DistrictCases
Sasnagar61
Jalandhar48
Patiala26
Pathankot24
Nawanshahr (sbs Nagar)19
Ludhiana16
Amritsar11
Mansa11
Hoshiarpur7
Moga4
Rupnagar3
Sangrur3
Faridkot3
Kapurthala2
Barnala2
Fatehgarh Sahib (sarhind)2
Muktsar1
Gurdaspur1
Firozepur1
Details Awaited*53

298 21

214 18

67 2

17 1

DistrictCases
Nuh57
Faridabad42
Gurgaon38
Palwal34
Panchkula18
Ambala12
Sonepat7
Karnal6
Panipat5
Sirsa4
Yamunanagar3
Bhiwani3
Kurukshetra2
Kaithal2
Jind2
Hissar2
Rohtak1
Fatehabad1
Charkhi Dadri1
Details Awaited*32

272

113

156

3

DistrictCases
Siwan29
Nalanda28
Munger20
Begusarai9
Patna7
Gaya5
Buxar4
Gopalganj3
Nawada3
Bhagalpur1
Bhojpur1
Lakhisarai1
Saran1
Vaishali1
Details Awaited*115

228 52

180 52

46

2

DistrictCases
Khurda (bhuvaneshwar)46
Bhadrak8
Balasore3
Jajpur2
Kalahandi2
Kendrapara2
Sundargarh2
Cuttack1
Dhenkanal1
Puri1
Details Awaited*26

94 4

60 4

33

1

DistrictCases
Ranchi25
Bokaro10
Hazaribagh3
Dhanbad2
Simdega2
Deoghar1
Giridh1
Koderma1
Details Awaited*14

59 4

47 3

9 1

3

DistrictCases
Dehradun24
Nainital9
Haridwar7
Udhamsingh Nagar4
Almora1
Pauri Garhwal1
Details Awaited*2

48 1

23

25 1

0

DistrictCases
Una16
Solan9
Chamba6
Kangra5
Hamirpur2
Sirmaur1
Details Awaited*1

40

21

18

1

DistrictCases
Korba28
Raipur5
Bilaspur1
Durg1
Rajnandgaon1

36

6

30 2

0

DistrictCases
Golaghat9
Marigaon6
Dhubri4
Goalpara4
Nalbari4
Kamrup Metro2
Cachar1
Hailakandi1
Kamrup1
Karimganj1
Lakhimpur1
S Mancachar1
Details Awaited*1

36

16

19

1

DistrictCases
Chandigarh26
Details Awaited*2

28 1

13

15 1

0

DistrictCases
South Andaman16
Details Awaited*11

27 5

16 5

11

0

DistrictCases
Leh (ladakh)14
Details Awaited*6

20 2

6 2

14

0

DistrictCases
East Khasi Hills11
Details Awaited*1

12

11

0

1

DistrictCases
Puducherry6
Details Awaited*1

7

4

3

0

DistrictCases
North Goa6
South Goa1

7

0

7

0

DistrictCases
Imphal West1
Thoubal1

2

0

2

0

DistrictCases
Gomati1
North Tripura1

2

1

1

0

DistrictCases
Aizwal West1

1

1

0

0

DistrictCases
Lohit1

1

0

1

0

Listen to the latest songs, only on JioSaavn.com
diff --git a/src/extractors/custom/index.js b/src/extractors/custom/index.js index e3bc157c4..21da08bd5 100644 --- a/src/extractors/custom/index.js +++ b/src/extractors/custom/index.js @@ -132,3 +132,4 @@ export * from './www.phoronix.com'; export * from './pitchfork.com'; export * from './biorxiv.org'; export * from './epaper.zeit.de'; +export * from './www.ndtv.com'; diff --git a/src/extractors/custom/www.ndtv.com/index.js b/src/extractors/custom/www.ndtv.com/index.js new file mode 100644 index 000000000..daa85b22d --- /dev/null +++ b/src/extractors/custom/www.ndtv.com/index.js @@ -0,0 +1,54 @@ +export const WwwNdtvComExtractor = { + domain: 'www.ndtv.com', + + title: { + selectors: [['meta[name="og:title"]', 'value'], 'h1.entry-title'], + }, + + author: { + selectors: ['span[itemprop="author"] span[itemprop="name"]'], + }, + + date_published: { + selectors: [['span[itemprop="dateModified"]', 'content']], + }, + + dek: { + selectors: ['h2'], + }, + + lead_image_url: { + selectors: [['meta[name="og:image"]', 'value']], + }, + + content: { + selectors: ['div[itemprop="articleBody"]'], + + // Is there anything in the content you selected that needs transformed + // before it's consumable content? E.g., unusual lazy loaded images + transforms: { + // This site puts a dateline in a 'b' above the first paragraph, and then somehow + // blends it into the first paragraph with CSS. This transform moves the dateline + // to the first paragraph. + '.place_cont': $node => { + if (!$node.parents('p').length) { + const nextSibling = $node.next('p'); + if (nextSibling) { + $node.remove(); + nextSibling.prepend($node); + } + } + }, + }, + + // Is there anything that is in the result that shouldn't be? + // The clean selectors will remove anything that matches from + // the result + clean: [ + '.highlghts_Wdgt', + '.ins_instory_dv_caption', + 'input', + '._world-wrapper .mt20', + ], + }, +}; diff --git a/src/extractors/custom/www.ndtv.com/index.test.js b/src/extractors/custom/www.ndtv.com/index.test.js new file mode 100644 index 000000000..f39f37030 --- /dev/null +++ b/src/extractors/custom/www.ndtv.com/index.test.js @@ -0,0 +1,120 @@ +import assert from 'assert'; +import URL from 'url'; +import cheerio from 'cheerio'; + +import Mercury from 'mercury'; +import getExtractor from 'extractors/get-extractor'; +import { excerptContent } from 'utils/text'; + +const fs = require('fs'); + +describe('WwwNdtvComExtractor', () => { + describe('initial test case', () => { + let result; + let url; + beforeAll(() => { + url = + 'https://www.ndtv.com/india-news/coronavirus-us-president-donald-trump-says-there-may-be-retaliation-if-india-doesnt-clear-export-of-2207327'; + const html = fs.readFileSync( + './fixtures/www.ndtv.com/1587821636077.html' + ); + result = Mercury.parse(url, { html, fallback: false }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the title', async () => { + // To pass this test, fill out the title selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + const { title } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + title, + `COVID-19: Trump Talks "Retaliation" If India Rejects Export Of Key Drug` + ); + }); + + it('returns the author', async () => { + // To pass this test, fill out the author selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + const { author } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(author, 'Swati Bhasin'); + }); + + it('returns the date_published', async () => { + // To pass this test, fill out the date_published selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + const { date_published } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(date_published, '2020-04-07T10:19:34.000Z'); + }); + + it('returns the dek', async () => { + // To pass this test, fill out the dek selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + const { dek } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + dek, + 'Amid rising pressure, the government is likely to take a decision on the matter today and clear the move after calculating sufficient stocks for the country, sources have told NDTV.' + ); + }); + + it('returns the lead_image_url', async () => { + // To pass this test, fill out the lead_image_url selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + const { lead_image_url } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + lead_image_url, + `https://c.ndtvimg.com/2020-04/u9vkhue_donald-trump-white-house-afp_625x300_04_April_20.jpg` + ); + }); + + it('returns the content', async () => { + // To pass this test, fill out the content selector + // in ./src/extractors/custom/www.ndtv.com/index.js. + // You may also want to make use of the clean and transform + // options. + const { content } = await result; + + const $ = cheerio.load(content || ''); + + const first13 = excerptContent( + $('*') + .first() + .text(), + 13 + ); + + // Update these values with the expected values from + // the article. + assert.equal( + first13, + 'Washington/ New Delhi: US President Donald Trump has said "there may be retaliation"' + ); + + // Confirm that the dateline is moved. + const dateline = $('.place_cont'); + assert.equal(dateline.length, 1); + assert.equal(dateline.get(0).parent.tagName, 'p'); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index c1a23102a..f72887c2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,6 +8,13 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + "@babel/core@^7.0.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" @@ -27,6 +34,28 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.5.5": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" @@ -37,6 +66,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -81,12 +120,28 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" dependencies: "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-hoist-variables@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" @@ -99,12 +154,26 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" dependencies: "@babel/types" "^7.0.0" +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-module-transforms@^7.1.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" @@ -116,12 +185,32 @@ "@babel/types" "^7.2.2" lodash "^4.17.10" +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" dependencies: "@babel/types" "^7.0.0" +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" @@ -151,6 +240,16 @@ "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" +"@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -158,12 +257,32 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" dependencies: "@babel/types" "^7.0.0" +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -181,6 +300,15 @@ "@babel/traverse" "^7.1.5" "@babel/types" "^7.2.0" +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -189,10 +317,24 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -525,6 +667,15 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" +"@babel/template@^7.4.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" @@ -539,6 +690,21 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" @@ -547,6 +713,15 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@babel/types@^7.5.5", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@iamstarkov/listr-update-renderer@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e" @@ -610,6 +785,11 @@ dependencies: any-observable "^0.3.0" +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -718,6 +898,13 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" @@ -735,6 +922,11 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -745,6 +937,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -986,7 +1186,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.4.0: +babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -1103,13 +1303,16 @@ babel-plugin-module-resolver@^3.1.2: reselect "^3.0.1" resolve "^1.4.0" -babel-plugin-static-fs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-static-fs/-/babel-plugin-static-fs-1.1.0.tgz#812aedc06297e90beab8ed02f2a69acdcca23c05" +babel-plugin-static-fs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-static-fs/-/babel-plugin-static-fs-2.0.1.tgz#3d3df782e7063848c40b2a75ef4505e5cfc91215" + integrity sha512-LIH+OIIEs1oo7xN4zZhDhEV90Zpcjl9ZZIcXfbm20+CmpIiTu2VOY9718uqra0htaHkwkmTGFGZyYgOy2pllGw== dependencies: - babel-template "^6.3.13" - babel-types "^6.4.1" + "@babel/template" "^7.4.4" + "@babel/types" "^7.5.5" + browser-resolve "^1.11.3" events "^1.1.0" + resolve "^1.11.1" babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" @@ -1148,7 +1351,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.3.13: +babel-template@^6.16.0: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" dependencies: @@ -1205,7 +1408,7 @@ babel-types@^6.0.0, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.4.1: +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0: version "6.19.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" dependencies: @@ -1405,12 +1608,13 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -brfs-babel@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/brfs-babel/-/brfs-babel-1.0.0.tgz#672df60067d029210c49328d78b3979d57b50b18" +brfs-babel@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/brfs-babel/-/brfs-babel-2.0.0.tgz#b1d32ba5372037b5094e3439961cd326f170fa42" + integrity sha512-PzvOpd+5b0ScbN35oRiQvU+g60yt2+TazPKGtnsG4uSbLBfS3wm7A/VnYc0jUbrcqwc+cxV9BN9DndV3CT3XTQ== dependencies: - babel-core "^6.4.0" - babel-plugin-static-fs "^1.1.0" + "@babel/core" "^7.5.5" + babel-plugin-static-fs "^2.0.1" through2 "^2.0.0" brfs@^2.0.1: @@ -1717,7 +1921,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" dependencies: @@ -1725,6 +1929,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -1888,9 +2100,17 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" + integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== cli-truncate@^0.2.1: version "0.2.1" @@ -1944,10 +2164,22 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colors@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -2086,6 +2318,13 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.1: dependencies: safe-buffer "~5.1.1" +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -2762,9 +3001,10 @@ eslint-config-airbnb@^17.1.0: object.assign "^4.1.0" object.entries "^1.0.4" -eslint-config-prettier@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-5.1.0.tgz#bf29442e7c818236a77acfe2241ec991299f9bf1" +eslint-config-prettier@^6.1.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== dependencies: get-stdin "^6.0.0" @@ -3151,6 +3391,15 @@ external-editor@^3.0.0: iconv-lite "^0.4.24" tmp "^0.0.33" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -3400,12 +3649,6 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" -fs-access@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" - dependencies: - null-check "^1.0.0" - fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3468,6 +3711,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +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== + get-assigned-identifiers@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -3707,6 +3955,11 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" @@ -3979,7 +4232,7 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" -inquirer@^6.1.0, inquirer@^6.2.1: +inquirer@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" dependencies: @@ -3997,6 +4250,25 @@ inquirer@^6.1.0, inquirer@^6.2.1: strip-ansi "^5.0.0" through "^2.3.6" +inquirer@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + insert-module-globals@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" @@ -4255,6 +4527,11 @@ is-hidden@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-hidden/-/is-hidden-1.1.1.tgz#82ee6a93aeef3fb007ad5b9457c0584d45329f38" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" @@ -4893,6 +5170,13 @@ json5@^2.0.0, json5@^2.1.0: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -4935,11 +5219,11 @@ karma-browserify@^6.0.0: minimatch "^3.0.0" os-shim "^0.1.3" -karma-chrome-launcher@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" +karma-chrome-launcher@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== dependencies: - fs-access "^1.0.0" which "^1.2.1" karma-cli@^2.0.0: @@ -5271,7 +5555,7 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" -lodash@^4.17.15: +lodash@^4.17.13, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -5288,6 +5572,13 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -5521,6 +5812,11 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -5545,6 +5841,11 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -5654,6 +5955,11 @@ mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nan@^2.9.2: version "2.12.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" @@ -5857,10 +6163,6 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -null-check@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -5976,6 +6278,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + opencollective-postinstall@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" @@ -5999,15 +6308,18 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" - dependencies: - chalk "^2.3.1" - cli-cursor "^2.1.0" - cli-spinners "^1.1.0" - log-symbols "^2.2.0" - strip-ansi "^4.0.0" +ora@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" + integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== + dependencies: + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-spinners "^2.2.0" + is-interactive "^1.0.0" + log-symbols "^3.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" wcwidth "^1.0.1" os-browserify@~0.3.0: @@ -7154,6 +7466,13 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" +resolve@^1.11.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7161,6 +7480,14 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -7255,6 +7582,13 @@ run-async@^2.2.0: is-promise "^2.1.0" pinkie-promise "^2.0.0" +run-async@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" + integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== + dependencies: + is-promise "^2.1.0" + run-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" @@ -7265,6 +7599,13 @@ rxjs@^6.1.0, rxjs@^6.3.3: dependencies: tslib "^1.9.0" +rxjs@^6.5.3: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -7772,6 +8113,15 @@ string-width@^4.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -7832,6 +8182,13 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -7885,6 +8242,13 @@ supports-color@^6.0.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -8114,6 +8478,11 @@ type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" @@ -8675,9 +9044,10 @@ yargs-parser@11.1.1, yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0: - version "13.0.0" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" +yargs-parser@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-14.0.0.tgz#42e25777b06718ec99eac2c3a98ad3de73b6818f" + integrity sha512-zn/Mnx+tbFjkCFUodEpjXckNS65NfpB5oyqOkDDEG/8uxlfLZJu2IoBLQFjukUkn9rBbGkVYNzrDh6qy4NUd3g== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" From d6966bd8f2b623ef8355941cdc27633e4e6df130 Mon Sep 17 00:00:00 2001 From: John Brayton Date: Sun, 26 Apr 2020 15:36:58 -0400 Subject: [PATCH 5/9] Works, but I need to figure how to make pagination work correctly. --- fixtures/arstechnica.com/1587927767738.html | 525 +++++++++++++++ fixtures/arstechnica.com/1587929444000.html | 615 ++++++++++++++++++ .../custom/arstechnica.com/index.js | 54 ++ .../custom/arstechnica.com/index.test.js | 159 +++++ src/extractors/custom/index.js | 1 + 5 files changed, 1354 insertions(+) create mode 100644 fixtures/arstechnica.com/1587927767738.html create mode 100644 fixtures/arstechnica.com/1587929444000.html create mode 100644 src/extractors/custom/arstechnica.com/index.js create mode 100644 src/extractors/custom/arstechnica.com/index.test.js diff --git a/fixtures/arstechnica.com/1587927767738.html b/fixtures/arstechnica.com/1587927767738.html new file mode 100644 index 000000000..293ce90d3 --- /dev/null +++ b/fixtures/arstechnica.com/1587927767738.html @@ -0,0 +1,525 @@ + + + +The connected renter: How to make your apartment smarter | Ars Technica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+
+ +
+
+

+ Tech — +

+

The connected renter: How to make your apartment smarter

+

Turning your rented space into a smart home can be tricky; we have some advice.

+
+ +
+
+ +
+ The connected renter: How to make your apartment smarter +
Valentina Palladino
+ + + + + + + +

+

Name a home appliance or product, and there's probably a smart version of it today. But for the renters among us, it can be tricky to navigate the aisles of smart light bulbs, thermostats, air conditioners, and vacuums to pick out devices that won't jeopardize your security deposit. When you don't own your home, there’s a different set of rules dictating modifications, and some smart home products don't take that into account.

+

Luckily these days, an increasing number of smart home devices can cater to apartment dwellers that want to avoid ripping open walls and trussing up wires. And as a NYC-based Ars staffer, I had a particularly perfect rental laboratory to recently test and explore what kinds of smart home devices fit renters' needs.

+

What protocols should/can you use?

+

When picking out accessories, for convenience's sake you'll probably want to decide ahead of time which of the many competing smart home ecosystems you'd like those products to come from. If you want to control all of your smart home products from the same app or want every product to be able to "talk" to each other, brand or protocol lock-in is the easiest current approach.

+

HomeKit

+

Let's start with the one everyone has heard of: HomeKit. Apple's IoT framework lets you control HomeKit-compatible devices via your iPhone or iPad. This framework tries to make it easier for users to control all smart home products by allowing the devices to talk to each other over a home's Wi-Fi network. With HomeKit, you can use Siri voice commands to control smart products—with iOS 10 in fact, an official "Home" app will make it easier to control HomeKit devices and group them together. After setting devices up, you can control them using simple phrases like, "Siri, turn off the living room lights." You can also make nuanced commands that control only certain devices. For example, the voice command "Good morning" could initiate a group of actions including turning on the bedroom and bathroom lights and opening the blinds.

+

The thing to remember about HomeKit is that manufacturers must integrate compatible hardware into their products under the terms of Apple's MFi licensing program . For example, a year or so ago Philips came out with a HomeKit-enabled Hue bridge for its smart lighting systems. The Philips Hue bridge already existed, but the company needed to make a new one that worked specifically with HomeKit. So far, companies including Belkin, Honeywell, and iHome among others have made HomeKit-ready devices. But still, the overall number of HomeKit-compatible devices is dwarfed by the number of smart home products available. HomeKit is also only available on Apple devices running iOS 8.2 or later, and watchOS 2 allows you to control devices via your Apple Watch.

+

Video shot/edited by Jennifer Hahn.

+

Alexa

+

Amazon's Alexa voice assistant is tied to Amazon's products, namely the Echo, and you can ask it questions about basically anything. Along the same lines as Siri, you can also control some smart home products by asking Alexa to turn things on and off. Through the Alexa mobile app, users can create batch commands similar to those available through Siri, and this option makes it possible to control entire rooms filled with devices. Unlike with Siri and HomeKit, though, manufacturers can create Alexa compatibility with software updates rather than implementing entirely new hardware—that's why companies like Nest and Haiku have been able to add Alexa support to their smart home products.

+

The convenience of HomeKit and Alexa is that you can control all of your devices using your voice—Alexa and Siri handle the communication from there. Otherwise, most smart home devices instead rely on dedicated apps that act like remote controls. HomeKit has the added benefit that devices can "talk" to one another, much like compatible devices under the Works with Nest framework. If, for example, you leave your home and lock your smart door lock behind you, that action could trigger turning off the lights inside a home.

+

Zigbee and Z-Wave

+

While HomeKit and Alexa have a lot of growing to do in terms of compatibility, Zigbee and Z-Wave have already linked to hundreds of working smart home devices. Both are mesh networking systems that send information between all devices on a network bound together by a hub. Zigbee runs on the universal 2.4GHz ISM frequency band, meaning its products are country-agnostic. By contrast, Z-Wave runs on the 915 MHz ISM band in the United States and the 868 MHz RFID band in the UK.

+

Both of these protocols, especially Zigbee, are suited for those who want to fiddle around with their devices and set unique commands and controls. However, keep in mind that hubs and devices on Zigbee and Z-Wave tend to have shorter ranges, meaning you'll need to keep individual devices relatively close to each other. For apartment dwellers, that might actually work to your advantage if you have only a few small rooms to connect.

+

Which products are off-limits?

+

The best way to know what can and can’t work within your rental is decidedly analogue—read your lease and any other renter's agreements you may have signed upon moving in. Check the official documentation to see what you have access to and what you don't. For example, my apartment came with a refrigerator, oven, and microwave, and my lease forbids me from installing any different ones without notifying the landlord's office first. I'm also not allowed to have washer or dryer units in my apartment. You don't want to buy any smart home product only to realize its installation or very existence violates your lease agreements.

+

As a general rule of thumb, smart thermostats are typically off-limits for renters. These products require rewiring stuff that's hidden behind walls, after all. Another category you'll want to be careful with is smart locks. Many (not all—we'll get to some examples) replace the locks on your doors, which renters typically cannot do without a specific reason or without informing management.

+ + +
+
+ + + + +
+
+ +
+
+ + + + + +
+
+ +
+ +
+
+ + +
+
+
+ + +
+ + + +
+
+ +
+
+

You must to comment.

+
+
+
+
+ +
+
+
+
+
+

Channel Ars Technica

+
+
+
+ +
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fixtures/arstechnica.com/1587929444000.html b/fixtures/arstechnica.com/1587929444000.html new file mode 100644 index 000000000..6e9a4e1d3 --- /dev/null +++ b/fixtures/arstechnica.com/1587929444000.html @@ -0,0 +1,615 @@ + + + +Face masks for COVID-19: A deep dive into the data | Ars Technica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+
+ +
+
+

+ Last resort — +

+

Face masks for COVID-19: A deep dive into the data

+

With all the talk of masks, here's what the data really says.

+
+ +
+
+ + + + + + +
Aurich Lawson / Getty
+

Filtration by N95 respirators, surgical masks, and homemade masks

+

N95 respirators get their name from their National Institute for Occupational Safety and Health (NIOSH) designation. They contain filter material that uses electrostatic attraction to thwart particles of all sizes. The N in the name means the masks are not resistant to oil and the 95 refers to their efficiency. To get a 95 designation, a mask has to filter out at least 95 percent of all particles. Specifically, the designation is granted if the mask proves to filter out at least 95 percent of particles in the size range it is least efficient at filtering out in standard conditions. This is considered “worst case” testing.

+

In one 2014 study, researchers compared the effectiveness of 44 masks, including N95 equivalent respirators, surgical and dental masks, general cotton masks, and handkerchiefs. They used particle penetration tests similar to those used by NIOSH and the European Union.

+

They found that the N95 equivalent mask blocked more than 95 percent of all particles, as expected. The surgical mask was around 40 percent effective, with the dental masks coming in at around 60 percent. Cotton masks were around 30 percent effective and cotton handkerchiefs ranged from 2 percent (one layer) to 13 percent (four layers).

+

A similar study in 2010 by NIOSH researchers looked at masks made of different types of fabrics. They found that masks made from t-shirts blocked about 10 percent of particles in a wide range, masks made from sweatshirt fabric blocked 20 to 40 percent, masks made from towels blocked around 40 percent, and scarves blocked 10 to 20 percent.

+

In a study published April 3, 2020 in Nature Medicine, researchers found that surgical masks reduced the detection of respiratory viruses in aerosols generated by infected people breathing or coughing in a breath-collecting machine.

+

Masks in the real world

+

Overall, the body of research on mask efficacy in real-world settings is small and scattershot. And because SARS-CoV-2 was completely unknown to humanity just five (extremely long) months ago, there is no data on the efficacy of any type of mask wearing in any setting (healthcare or home) for this virus.

+

As such, any relevant data has to be gleaned from studies looking at other respiratory illnesses and how various masks in various settings play a role.

+

Masks on healthy people

+

In a 2011 randomized clinical trial, researchers monitored 1,441 healthcare workers in 15 Beijing hospitals to compare the rates of respiratory infections if they wore either a surgical mask or an N95 respirator during their shifts. They compared infection rates in the two masked groups to a convenience sample of 481 healthcare workers who didn’t wear masks.

+

Overall, both masked groups had fewer respiratory symptoms, influenza-like illnesses, and confirmed viral infections than the control group. The rates of illness were approximately double in those who wore surgical masks compared with those who wore N95 respirators, though. For instance, about 9 percent of non-mask wearers reported respiratory symptoms compared with about 7 percent of surgical mask wearers and 4 percent of N95 wearers.

+

But with such small infection rates overall, there was limited power to detect differences, and the authors note that the findings may not hold up in other settings.

+
Dawn Canova, clinical manager for outpatient wound care at Carroll Hospital, takes samples from people to test them for the coronavirus at a drive-thru station in the hospital's parking garage while wearing a medical grade mask.
Enlarge / Dawn Canova, clinical manager for outpatient wound care at Carroll Hospital, takes samples from people to test them for the coronavirus at a drive-thru station in the hospital's parking garage while wearing a medical grade mask.
+

Masks on sick people

+

The push to preserve medical-grade masks for healthcare workers is intended to try to protect them from contracting illnesses from their patients. But the push for public face mask use is powered by the desire to prevent sick people from spraying respiratory droplets around and potentially sicken others.

+

This has become a greater concern as more evidence has pointed to apparent symptomless spread of COVID-19. That is, people who don’t show symptoms (either asymptomatic or pre-symptomatic) may be able to pass on the infection without knowing it. While there is evidence that this is happening in some cases, it’s still very unclear how often it happens. Estimates of how many cases are spreading stealthily like this have ranged from between 25 percent of cases to over 60 percent. Experts at the WHO, though, continue to say that people who are coughing or sneezing are still most likely to be the ones passing on the virus.

+

In a 2016 randomized controlled trial, researchers examined whether wearing a surgical mask could keep people with influenza-like illnesses (ILI) from passing the infection on to members of their household. Those household members were not asked to wear masks and the researchers didn’t collect data on it. The study included 123 ILI patients who were instructed to wear masks at home around other household members and 122 ILI patients who didn’t wear masks. The masked and unmasked ILI patients were in households with, on average, 2.5 or 2.4 members, respectively.

+

While the infection rates in home of masks-wearing patients were consistently lower than those in the homes of unmasked patients, the numbers were too small to be statistically significant.

+

“The study indicates a potential benefit of medical masks for source control but is limited by small sample size and low secondary attack rates [subsequent infections],” the authors concluded. “Larger trials are needed to confirm efficacy of medical masks as source control.”

+

Masks on everyone

+

With the new recommendations, everyone may be wearing masks, which has also been examined in a number of studies.

+

In 2008, a randomized controlled trial led by researchers in Hong Kong looked at the effect of blanket mask wearing on the spread of flu within households. They started with 198 households with one confirmed case at the beginning. Of those households, 127 were told that all household members should wear masks around each other. In 35 households, members were instructed to adhere to hand hygiene protocols and the remaining 36 households were controls.The researchers found little difference in infection spread among all three groups.

+

In 2009, researchers led by a group in Australia followed up with a similar randomized controlled study. The group looked at the spread of influenza-like illness to 286 adults in 143 households with a sick child. Participants were either assorted into a control group, a surgical mask group, or a more protective mask. Overall, they detected no difference in infection rates among the three groups. They noted that at least half of masked participants didn’t adhere to wearing the mask.

+

Another randomized controlled trial in 2009 followed people in 259 households in Hong Kong. Collectively, the households started with 407 household members with flu and 794 uninfected contacts. The households were randomly assorted to either all wear surgical masks, practice hand hygiene, or act as controls. Overall, the interventions didn’t lead to statistically significant differences in the spread of infections within the households. But when they looked at households that started using masks quickly (within 36 hours) after the onset of flu symptoms in a member, they did see a statistically significant reduction in infection spread.

+

Likewise, in a 2012 randomized controlled trial involving 84 households in Germany, researchers again found no difference in disease spread among household members that used masks, masks and hand hygiene, or were in a control group. However, when they did a separate analysis just looking at the households who fully implemented mask wearing or mask wearing and hygiene within 36 hours of onset of symptoms in their first case, they did note a lower chance of transmission than what was seen in controls.

+

Cloth masks

+

While most studies have looked at the effectiveness of surgical masks and other medical-grade masks, a few have ventured to look at cloth and homemade masks.

+

In a 2015 randomized controlled trial involving 1,607 healthcare workers, researchers compared the rate of influenza-like illness in healthcare workers wearing cloth masks or medical masks to those in a control group (which sometimes used masks). Wearing cloth masks resulted in significantly higher rates of infection, the authors found. They also noted that in their test, the cloth masks were only 3 percent effective at blocking particles.

+

Potential risks of masks

+

There is evidence that virus particles hang out on the outside of masks—particularly among healthcare workers who likely have high exposure. Among 59 healthcare workers who had their protective gear, clothes, and skin sampled in a 2019 study, many were contaminated with virus. Overall, 31 percent of gloves, 21 percent of gowns, and 12 percent of face masks were positive for virus. Moreover, 11 percent had viral particles on their scrubs and 7 percent had them on their bare faces.

+

A similar study, also in 2019, confirmed that respiratory viruses are often found on the outside surface of medical masks and can be a source of self-contamination.

+

In yet another study from last year, researchers in Chicago observed healthcare workers taking off their person protective equipment (masks, gloves, gowns, etc)—the removal is called doffing. This is a time when healthcare workers can easily self-contaminate by taking gear off incorrectly. The researchers found that healthcare workers incorrectly removed their protective gear 90 percent of the time.

+

If you do wear a mask, be sure to remove it from behind your head. Don’t touch the surface of the mask. If you do touch the surface, immediately wash your hands or use hand sanitizer.

+

Update 4/3/2020, 6:20pm ET: This post was updated to include the new federal recommendation for the public to wear cloth masks.

+ + +
+
+ + + + +
+
+ +
+
+ + + + + +
+
+ +
+ +
+
+ + +
+
+
+ + +
+ + + +
+
+ +
+
+

You must to comment.

+
+
+
+
+ +
+
+
+
+
+

Channel Ars Technica

+
+
+
+ +
+ +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/extractors/custom/arstechnica.com/index.js b/src/extractors/custom/arstechnica.com/index.js new file mode 100644 index 000000000..12213a78a --- /dev/null +++ b/src/extractors/custom/arstechnica.com/index.js @@ -0,0 +1,54 @@ +export const ArstechnicaComExtractor = { + domain: 'arstechnica.com', + + title: { + selectors: ['title'], + }, + + author: { + selectors: ['*[rel="author"] *[itemprop="name"]'], + }, + + date_published: { + selectors: [['.byline time', 'datetime']], + }, + + dek: { + selectors: ['h2[itemprop="description"]'], + }, + + lead_image_url: { + selectors: [['meta[name="og:image"]', 'value']], + }, + + content: { + selectors: ['div[itemprop="articleBody"]'], + + // Is there anything in the content you selected that needs transformed + // before it's consumable content? E.g., unusual lazy loaded images + transforms: { + h2: $node => { + $node.before('

'); + }, + }, + + // Is there anything that is in the result that shouldn't be? + // The clean selectors will remove anything that matches from + // the result + clean: [ + // Remove enlarge links and separators inside image captions. + 'figcaption .enlarge-link', + 'figcaption .sep', + + // I could not transform the video into usable elements, so I + // removed them. + 'figure.video', + + // Image galleries that do not work. + '.gallery', + + 'aside', + '.sidebar', + ], + }, +}; diff --git a/src/extractors/custom/arstechnica.com/index.test.js b/src/extractors/custom/arstechnica.com/index.test.js new file mode 100644 index 000000000..547800c37 --- /dev/null +++ b/src/extractors/custom/arstechnica.com/index.test.js @@ -0,0 +1,159 @@ +import assert from 'assert'; +import URL from 'url'; +import cheerio from 'cheerio'; + +import Mercury from 'mercury'; +import getExtractor from 'extractors/get-extractor'; +import { excerptContent } from 'utils/text'; + +const fs = require('fs'); + +describe('ArstechnicaComExtractor', () => { + describe('initial test case', () => { + let result; + let url; + beforeAll(() => { + url = + 'https://arstechnica.com/gadgets/2016/08/the-connected-renter-how-to-make-your-apartment-smarter/'; + const html = fs.readFileSync( + './fixtures/arstechnica.com/1587927767738.html' + ); + result = Mercury.parse(url, { html, fallback: false }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the title', async () => { + // To pass this test, fill out the title selector + // in ./src/extractors/custom/arstechnica.com/index.js. + const { title } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + title, + `The connected renter: How to make your apartment smarter` + ); + }); + + it('returns the author', async () => { + // To pass this test, fill out the author selector + // in ./src/extractors/custom/arstechnica.com/index.js. + const { author } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(author, `Valentina Palladino`); + }); + + it('returns the date_published', async () => { + // To pass this test, fill out the date_published selector + // in ./src/extractors/custom/arstechnica.com/index.js. + const { date_published } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(date_published, `2016-08-10T11:15:53.000Z`); + }); + + it('returns the dek', async () => { + // To pass this test, fill out the dek selector + // in ./src/extractors/custom/arstechnica.com/index.js. + const { dek } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + dek, + 'Turning your rented space into a smart home can be tricky; we have some advice.' + ); + }); + + it('returns the lead_image_url', async () => { + // To pass this test, fill out the lead_image_url selector + // in ./src/extractors/custom/arstechnica.com/index.js. + const { lead_image_url } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + lead_image_url, + `https://cdn.arstechnica.net/wp-content/uploads/2016/07/smartapartment_hero5-640x215.jpg` + ); + }); + + // it('returns the pages_rendered', async () => { + // // To pass this test, fill out the pages_rendered selector + // // in ./src/extractors/custom/arstechnica.com/index.js. + // const { pages_rendered } = await result + // + // // Update these values with the expected values from + // // the article. + // assert.equal(pages_rendered, `3`) + // }); + + it('returns the content', async () => { + // To pass this test, fill out the content selector + // in ./src/extractors/custom/arstechnica.com/index.js. + // You may also want to make use of the clean and transform + // options. + const { content } = await result; + + const $ = cheerio.load(content || ''); + + const first13 = excerptContent( + $('*') + .first() + .text(), + 13 + ); + + // Update these values with the expected values from + // the article. + assert.equal( + first13, + "Name a home appliance or product, and there's probably a smart version of" + ); + }); + }); + + describe('Keep the first h2 on subsequent pages test', () => { + let result; + let url; + beforeAll(() => { + url = + 'https://arstechnica.com/science/2020/04/should-you-wear-a-face-mask-heres-all-the-data-we-have/2/'; + const html = fs.readFileSync( + './fixtures/arstechnica.com/1587927767738.html' + ); + result = Mercury.parse(url, { html, fallback: false }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the content', async () => { + // To pass this test, fill out the content selector + // in ./src/extractors/custom/arstechnica.com/index.js. + // You may also want to make use of the clean and transform + // options. + const { content } = await result; + + const $ = cheerio.load(content || ''); + + const h2 = $('h2'); + assert.equal(h2.length, 1); + }); + }); +}); diff --git a/src/extractors/custom/index.js b/src/extractors/custom/index.js index e3bc157c4..083aba6f7 100644 --- a/src/extractors/custom/index.js +++ b/src/extractors/custom/index.js @@ -132,3 +132,4 @@ export * from './www.phoronix.com'; export * from './pitchfork.com'; export * from './biorxiv.org'; export * from './epaper.zeit.de'; +export * from './arstechnica.com'; From 58612cdcac7be01a7aa35da093e99cf60adea2e9 Mon Sep 17 00:00:00 2001 From: John Brayton Date: Sun, 26 Apr 2020 16:36:08 -0400 Subject: [PATCH 6/9] fixed pagination - would only retrieve first or second page because we would send contentOnly: true on subsequent pages (page 2). removed failover: true from preview. --- preview | 2 +- src/extractors/collect-all-pages.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/preview b/preview index e2207e229..89e3795e2 100755 --- a/preview +++ b/preview @@ -25,7 +25,7 @@ var Mercury = require('./dist/mercury_test') console.log(`Fetching link(s)`) urls.map(url => { - Mercury.parse(url, { fallback: false }).then(function(result) { + Mercury.parse(url).then(function(result) { var htmlFile = './preview.html' var jsonFile = './preview.json' diff --git a/src/extractors/collect-all-pages.js b/src/extractors/collect-all-pages.js index e15a3e4a6..d33c423b5 100644 --- a/src/extractors/collect-all-pages.js +++ b/src/extractors/collect-all-pages.js @@ -30,7 +30,6 @@ export default async function collectAllPages({ html, $, metaCache, - contentOnly: true, extractedTitle: title, previousUrls, }; From 3df6604b8b91f63ae64eb81697abba1529bb892b Mon Sep 17 00:00:00 2001 From: John Brayton Date: Mon, 27 Apr 2020 08:07:51 -0400 Subject: [PATCH 7/9] rolled back { fallback: false } option removal --- preview | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preview b/preview index 89e3795e2..e2207e229 100755 --- a/preview +++ b/preview @@ -25,7 +25,7 @@ var Mercury = require('./dist/mercury_test') console.log(`Fetching link(s)`) urls.map(url => { - Mercury.parse(url).then(function(result) { + Mercury.parse(url, { fallback: false }).then(function(result) { var htmlFile = './preview.html' var jsonFile = './preview.json' From 9c93f9ec2589541a41e2996beb63a4d1b1b89c60 Mon Sep 17 00:00:00 2001 From: John Brayton Date: Mon, 27 Apr 2020 08:17:05 -0400 Subject: [PATCH 8/9] Clarified comments. --- src/extractors/custom/arstechnica.com/index.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/extractors/custom/arstechnica.com/index.js b/src/extractors/custom/arstechnica.com/index.js index 12213a78a..7bfcf2cd1 100644 --- a/src/extractors/custom/arstechnica.com/index.js +++ b/src/extractors/custom/arstechnica.com/index.js @@ -1,6 +1,12 @@ export const ArstechnicaComExtractor = { domain: 'arstechnica.com', + // Articles from this site are often paginated, but I was unable to write a CSS + // selector to find the next page. On the last page, there will be a link with a CSS + // selector indicating that the previous page is next. But the parser appears to find + // the next page without this extractor finding it, as long as the fallback option is + // left at its default value of true. + title: { selectors: ['title'], }, @@ -28,13 +34,16 @@ export const ArstechnicaComExtractor = { // before it's consumable content? E.g., unusual lazy loaded images transforms: { h2: $node => { + // Some pages have an element h2 that is significant, and that the parser will + // remove if not following a paragraph. Adding this empty paragraph fixes it, and + // the empty paragraph will be removed anyway. $node.before('

'); }, }, // Is there anything that is in the result that shouldn't be? // The clean selectors will remove anything that matches from - // the result + // the result. clean: [ // Remove enlarge links and separators inside image captions. 'figcaption .enlarge-link', From d0acfb3bd91bf3583b1400a49e38e9d170552e38 Mon Sep 17 00:00:00 2001 From: John Brayton Date: Mon, 27 Apr 2020 08:36:08 -0400 Subject: [PATCH 9/9] rolling back yarn.lock changes --- yarn.lock | 466 ++++++------------------------------------------------ 1 file changed, 48 insertions(+), 418 deletions(-) diff --git a/yarn.lock b/yarn.lock index f72887c2b..c1a23102a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,13 +8,6 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - "@babel/core@^7.0.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" @@ -34,28 +27,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.5.5": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/generator@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" @@ -66,16 +37,6 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" - integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== - dependencies: - "@babel/types" "^7.9.5" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -120,28 +81,12 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" dependencies: "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-hoist-variables@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" @@ -154,26 +99,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-transforms@^7.1.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" @@ -185,32 +116,12 @@ "@babel/types" "^7.2.2" lodash "^4.17.10" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" dependencies: "@babel/types" "^7.0.0" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" @@ -240,16 +151,6 @@ "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -257,32 +158,12 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" dependencies: "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -300,15 +181,6 @@ "@babel/traverse" "^7.1.5" "@babel/types" "^7.2.0" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -317,24 +189,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" -"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== - "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -667,15 +525,6 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/template@^7.4.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" @@ -690,21 +539,6 @@ globals "^11.1.0" lodash "^4.17.10" -"@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" - integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.5" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" @@ -713,15 +547,6 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@babel/types@^7.5.5", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" - integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@iamstarkov/listr-update-renderer@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e" @@ -785,11 +610,6 @@ dependencies: any-observable "^0.3.0" -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -898,13 +718,6 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" @@ -922,11 +735,6 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -937,14 +745,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -1186,7 +986,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.26.0, babel-core@^6.4.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -1303,16 +1103,13 @@ babel-plugin-module-resolver@^3.1.2: reselect "^3.0.1" resolve "^1.4.0" -babel-plugin-static-fs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-static-fs/-/babel-plugin-static-fs-2.0.1.tgz#3d3df782e7063848c40b2a75ef4505e5cfc91215" - integrity sha512-LIH+OIIEs1oo7xN4zZhDhEV90Zpcjl9ZZIcXfbm20+CmpIiTu2VOY9718uqra0htaHkwkmTGFGZyYgOy2pllGw== +babel-plugin-static-fs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-static-fs/-/babel-plugin-static-fs-1.1.0.tgz#812aedc06297e90beab8ed02f2a69acdcca23c05" dependencies: - "@babel/template" "^7.4.4" - "@babel/types" "^7.5.5" - browser-resolve "^1.11.3" + babel-template "^6.3.13" + babel-types "^6.4.1" events "^1.1.0" - resolve "^1.11.1" babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" @@ -1351,7 +1148,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0: +babel-template@^6.16.0, babel-template@^6.3.13: version "6.16.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" dependencies: @@ -1408,7 +1205,7 @@ babel-types@^6.0.0, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0: +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.4.1: version "6.19.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" dependencies: @@ -1608,13 +1405,12 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -brfs-babel@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/brfs-babel/-/brfs-babel-2.0.0.tgz#b1d32ba5372037b5094e3439961cd326f170fa42" - integrity sha512-PzvOpd+5b0ScbN35oRiQvU+g60yt2+TazPKGtnsG4uSbLBfS3wm7A/VnYc0jUbrcqwc+cxV9BN9DndV3CT3XTQ== +brfs-babel@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/brfs-babel/-/brfs-babel-1.0.0.tgz#672df60067d029210c49328d78b3979d57b50b18" dependencies: - "@babel/core" "^7.5.5" - babel-plugin-static-fs "^2.0.1" + babel-core "^6.4.0" + babel-plugin-static-fs "^1.1.0" through2 "^2.0.0" brfs@^2.0.1: @@ -1921,7 +1717,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" dependencies: @@ -1929,14 +1725,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -2100,17 +1888,9 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" - integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" cli-truncate@^0.2.1: version "0.2.1" @@ -2164,22 +1944,10 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - colors@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -2318,13 +2086,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.1: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -3001,10 +2762,9 @@ eslint-config-airbnb@^17.1.0: object.assign "^4.1.0" object.entries "^1.0.4" -eslint-config-prettier@^6.1.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== +eslint-config-prettier@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-5.1.0.tgz#bf29442e7c818236a77acfe2241ec991299f9bf1" dependencies: get-stdin "^6.0.0" @@ -3391,15 +3151,6 @@ external-editor@^3.0.0: iconv-lite "^0.4.24" tmp "^0.0.33" -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -3649,6 +3400,12 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3711,11 +3468,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -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== - get-assigned-identifiers@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -3955,11 +3707,6 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" @@ -4232,7 +3979,7 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" -inquirer@^6.1.0: +inquirer@^6.1.0, inquirer@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" dependencies: @@ -4250,25 +3997,6 @@ inquirer@^6.1.0: strip-ansi "^5.0.0" through "^2.3.6" -inquirer@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - insert-module-globals@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" @@ -4527,11 +4255,6 @@ is-hidden@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-hidden/-/is-hidden-1.1.1.tgz#82ee6a93aeef3fb007ad5b9457c0584d45329f38" -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" @@ -5170,13 +4893,6 @@ json5@^2.0.0, json5@^2.1.0: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -5219,11 +4935,11 @@ karma-browserify@^6.0.0: minimatch "^3.0.0" os-shim "^0.1.3" -karma-chrome-launcher@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" - integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== +karma-chrome-launcher@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" dependencies: + fs-access "^1.0.0" which "^1.2.1" karma-cli@^2.0.0: @@ -5555,7 +5271,7 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" -lodash@^4.17.13, lodash@^4.17.15: +lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -5572,13 +5288,6 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" @@ -5812,11 +5521,6 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -5841,11 +5545,6 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -5955,11 +5654,6 @@ mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.9.2: version "2.12.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" @@ -6163,6 +5857,10 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -6278,13 +5976,6 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - opencollective-postinstall@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" @@ -6308,18 +5999,15 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.4.tgz#e8da697cc5b6a47266655bf68e0fb588d29a545d" - integrity sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww== - dependencies: - chalk "^3.0.0" - cli-cursor "^3.1.0" - cli-spinners "^2.2.0" - is-interactive "^1.0.0" - log-symbols "^3.0.0" - mute-stream "0.0.8" - strip-ansi "^6.0.0" +ora@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" + dependencies: + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" wcwidth "^1.0.1" os-browserify@~0.3.0: @@ -7466,13 +7154,6 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" -resolve@^1.11.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7480,14 +7161,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -7582,13 +7255,6 @@ run-async@^2.2.0: is-promise "^2.1.0" pinkie-promise "^2.0.0" -run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" - run-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" @@ -7599,13 +7265,6 @@ rxjs@^6.1.0, rxjs@^6.3.3: dependencies: tslib "^1.9.0" -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8113,15 +7772,6 @@ string-width@^4.0.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^5.2.0" -string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -8182,13 +7832,6 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -8242,13 +7885,6 @@ supports-color@^6.0.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -8478,11 +8114,6 @@ type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" @@ -9044,10 +8675,9 @@ yargs-parser@11.1.1, yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-14.0.0.tgz#42e25777b06718ec99eac2c3a98ad3de73b6818f" - integrity sha512-zn/Mnx+tbFjkCFUodEpjXckNS65NfpB5oyqOkDDEG/8uxlfLZJu2IoBLQFjukUkn9rBbGkVYNzrDh6qy4NUd3g== +yargs-parser@^13.0.0: + version "13.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" dependencies: camelcase "^5.0.0" decamelize "^1.2.0"