From 7c19677e9c51f11c17e05429902fd13acf87ee5c Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 01:34:07 +0200 Subject: [PATCH 01/16] feat: add from RSS plugin --- package.json | 2 + scully.this-is-learning.config.ts | 11 ++- scully/plugins/from-rss.plugin.ts | 48 ++++++++++++ yarn.lock | 118 +++++++++++++++++++++++++++++- 4 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 scully/plugins/from-rss.plugin.ts diff --git a/package.json b/package.json index e8b7e93..8f10b22 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,8 @@ "jest": "~26.2.2", "jest-preset-angular": "~8.4.0", "prettier": "~2.2.1", + "rss-parser": "^3.12.0", + "string-strip-html": "^8.3.0", "ts-jest": "~26.5.5", "ts-node": "~9.1.1", "typescript": "~4.2.4" diff --git a/scully.this-is-learning.config.ts b/scully.this-is-learning.config.ts index 17ed8d7..0264d55 100644 --- a/scully.this-is-learning.config.ts +++ b/scully.this-is-learning.config.ts @@ -4,5 +4,14 @@ export const config: ScullyConfig = { projectRoot: './apps/this-is-learning/src', projectName: 'this-is-learning', outDir: './dist/static/this-is-learning', - routes: {}, + routes: { + '/this-is-angular': { + rss: 'https://dev.to/feed/this-is-angular', + type: 'tilFromRss', + }, + '/this-is-learning': { + rss: 'https://dev.to/feed/this-is-learning', + type: 'tilFromRss', + }, + }, }; diff --git a/scully/plugins/from-rss.plugin.ts b/scully/plugins/from-rss.plugin.ts new file mode 100644 index 0000000..1cc6063 --- /dev/null +++ b/scully/plugins/from-rss.plugin.ts @@ -0,0 +1,48 @@ +import { HandledRoute, registerPlugin } from '@scullyio/scully'; +import RssParser from 'rss-parser'; +import { stripHtml } from 'string-strip-html'; + +interface DevCommunityRssFeed { + readonly language: string; +} +interface DevCommunityRssItem { + readonly description: string; +} + +const rssParser = new RssParser({ + customFields: { + feed: ['language'], + item: ['description'], + }, +}); + +export const fromRss = 'tilFromRss'; + +interface FromRssOptions { + readonly rss: string; +} + +async function fromRssPlugin( + route: string, + options: FromRssOptions +): Promise { + const feed = await rssParser.parseURL(options.rss); + const items = feed.items.map((article) => ({ + ...article, + description: + stripHtml(article.description).result.substr(0, 255) + ' (...)', + })); + + return [ + { + route, + data: { + items, + }, + }, + ]; +} + +const validator = async () => []; + +registerPlugin('router', fromRss, fromRssPlugin, validator); diff --git a/yarn.lock b/yarn.lock index a908051..c480d97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1185,7 +1185,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.14.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": +"@babel/runtime@7.14.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.14.0", "@babel/runtime@^7.8.4": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== @@ -4419,7 +4419,7 @@ enquirer@^2.3.5, enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^2.0.0: +entities@^2.0.0, entities@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== @@ -5481,6 +5481,11 @@ html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -6976,6 +6981,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -6986,6 +6996,11 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= +lodash.trim@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.trim/-/lodash.trim-4.5.1.tgz#36425e7ee90be4aa5e27bcebb85b7d11ea47aa57" + integrity sha1-NkJefukL5KpeJ7zruFt9EepHqlc= + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -6996,6 +7011,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.without@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= + lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.5.0, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -8936,6 +8956,40 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +ranges-apply@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ranges-apply/-/ranges-apply-5.1.0.tgz#d18ec097844e548eb4a325f9257ad81179946f85" + integrity sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-merge "^7.1.0" + +ranges-merge@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ranges-merge/-/ranges-merge-7.1.0.tgz#b2626d5865060944297a21cd499b886cb59127b9" + integrity sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-push "^5.1.0" + ranges-sort "^4.1.0" + +ranges-push@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ranges-push/-/ranges-push-5.1.0.tgz#73cd42e347b8e7807e42ccf35d6e5041e1705fb4" + integrity sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA== + dependencies: + "@babel/runtime" "^7.14.0" + ranges-merge "^7.1.0" + string-collapse-leading-whitespace "^5.1.0" + string-trim-spaces-only "^3.1.0" + +ranges-sort@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ranges-sort/-/ranges-sort-4.1.0.tgz#ec2313421b2538186582062751c77be30182f186" + integrity sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA== + dependencies: + "@babel/runtime" "^7.14.0" + raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -9303,6 +9357,14 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rss-parser@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.12.0.tgz#b8888699ea46304a74363fbd8144671b2997984c" + integrity sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A== + dependencies: + entities "^2.0.3" + xml2js "^0.4.19" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -9391,7 +9453,7 @@ sass@1.32.12: dependencies: chokidar ">=3.0.0 <4.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -9872,6 +9934,22 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +string-collapse-leading-whitespace@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz#3ebe317241421bcba651e697ef60d6b9a9bf43c3" + integrity sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw== + dependencies: + "@babel/runtime" "^7.14.0" + +string-left-right@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-left-right/-/string-left-right-4.1.0.tgz#d73c066720cb0a8cd2b6a61e3188d3458b22b776" + integrity sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ== + dependencies: + "@babel/runtime" "^7.14.0" + lodash.clonedeep "^4.5.0" + lodash.isplainobject "^4.0.6" + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -9880,6 +9958,27 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-strip-html@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/string-strip-html/-/string-strip-html-8.3.0.tgz#d5dddee58d5832cc6c25448b536c69a65230802a" + integrity sha512-1+rjTPt0JjpFr1w0bfNL1S6O0I9fJDqM+P3pFTpC6eEEpIXhmBvPLnaQoEuWarswiH219qCefDSxTLxGQyHKUg== + dependencies: + "@babel/runtime" "^7.14.0" + html-entities "^2.3.2" + lodash.isplainobject "^4.0.6" + lodash.trim "^4.5.1" + lodash.without "^4.4.0" + ranges-apply "^5.1.0" + ranges-push "^5.1.0" + string-left-right "^4.1.0" + +string-trim-spaces-only@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz#b7936051706110caec5bcf3f7f866fe46354d7aa" + integrity sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ== + dependencies: + "@babel/runtime" "^7.14.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -11056,6 +11155,19 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@^0.4.19: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" From 6a331870bccbf72801fe65b769186d52f420a9bb Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 01:54:25 +0200 Subject: [PATCH 02/16] feat: add This is Angular feature --- angular.json | 37 ++++++++++++++++--- .../src/app/app-routing.module.ts | 7 ++++ .../src/app/hello/hello.component.ts | 16 +++++--- .../src/app/hello/hello.scam.ts | 3 +- jest.config.js | 5 ++- .../feature-this-is-angular/.eslintrc.json | 36 ++++++++++++++++++ .../feature-this-is-angular/README.md | 1 + .../feature-this-is-angular/jest.config.js | 24 ++++++++++++ .../feature-this-is-angular/src/index.ts | 1 + ...ications-feature-this-is-angular.module.ts | 8 ++++ .../src/lib/shell/shell.component.ts | 24 ++++++++++++ .../src/lib/shell/shell.module.ts | 17 +++++++++ .../src/lib/shell/shell.scam.ts | 10 +++++ .../feature-this-is-angular/src/test-setup.ts | 1 + .../feature-this-is-angular/tsconfig.json | 24 ++++++++++++ .../feature-this-is-angular/tsconfig.lib.json | 14 +++++++ .../tsconfig.spec.json | 10 +++++ nx.json | 3 ++ package.json | 4 +- tsconfig.base.json | 6 ++- yarn.lock | 14 +++++++ 21 files changed, 251 insertions(+), 14 deletions(-) create mode 100644 libs/publications/feature-this-is-angular/.eslintrc.json create mode 100644 libs/publications/feature-this-is-angular/README.md create mode 100644 libs/publications/feature-this-is-angular/jest.config.js create mode 100644 libs/publications/feature-this-is-angular/src/index.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/publications-feature-this-is-angular.module.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts create mode 100644 libs/publications/feature-this-is-angular/src/test-setup.ts create mode 100644 libs/publications/feature-this-is-angular/tsconfig.json create mode 100644 libs/publications/feature-this-is-angular/tsconfig.lib.json create mode 100644 libs/publications/feature-this-is-angular/tsconfig.spec.json diff --git a/angular.json b/angular.json index 11fdcaf..33096ea 100644 --- a/angular.json +++ b/angular.json @@ -1,5 +1,4 @@ { - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "cli": { "defaultCollection": "@nrwl/angular" @@ -7,16 +6,16 @@ "defaultProject": "this-is-learning", "schematics": { "@nrwl/angular:application": { - "e2eTestRunner": "cypress", - "linter": "eslint", "style": "scss", - "tags": "type:app", + "linter": "eslint", "unitTestRunner": "jest", + "e2eTestRunner": "cypress", + "tags": "type:app", "viewEncapsulation": "None" }, "@nrwl/angular:library": { - "linter": "eslint", "style": "scss", + "linter": "eslint", "unitTestRunner": "jest" }, "@nrwl/angular:storybook-configuration": { @@ -28,6 +27,9 @@ "export": true, "style": "scss", "viewEncapsulation": "None" + }, + "@nrwl/angular:component": { + "style": "scss" } }, "projects": { @@ -163,6 +165,31 @@ } } } + }, + "publications-feature-this-is-angular": { + "projectType": "library", + "root": "libs/publications/feature-this-is-angular", + "sourceRoot": "libs/publications/feature-this-is-angular/src", + "prefix": "this-is-learning", + "architect": { + "test": { + "builder": "@nrwl/jest:jest", + "outputs": ["coverage/libs/publications/feature-this-is-angular"], + "options": { + "jestConfig": "libs/publications/feature-this-is-angular/jest.config.js", + "passWithNoTests": true + } + }, + "lint": { + "builder": "@nrwl/linter:eslint", + "options": { + "lintFilePatterns": [ + "libs/publications/feature-this-is-angular/src/**/*.ts", + "libs/publications/feature-this-is-angular/src/**/*.html" + ] + } + } + } } } } diff --git a/apps/this-is-learning/src/app/app-routing.module.ts b/apps/this-is-learning/src/app/app-routing.module.ts index 501b8fd..fbdcc67 100644 --- a/apps/this-is-learning/src/app/app-routing.module.ts +++ b/apps/this-is-learning/src/app/app-routing.module.ts @@ -9,6 +9,13 @@ const routes: Routes = [ path: '', component: HelloComponent, }, + { + path: 'this-is-angular', + loadChildren: () => + import('@this-is-learning/publications/feature-this-is-angular').then( + (esModule) => esModule.PublicationsFeatureThisIsAngularModule + ), + }, ]; @NgModule({ diff --git a/apps/this-is-learning/src/app/hello/hello.component.ts b/apps/this-is-learning/src/app/hello/hello.component.ts index 73c461c..9a4c915 100644 --- a/apps/this-is-learning/src/app/hello/hello.component.ts +++ b/apps/this-is-learning/src/app/hello/hello.component.ts @@ -1,8 +1,4 @@ -import { - ChangeDetectionStrategy, - Component, - ViewEncapsulation, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -18,6 +14,16 @@ import { template: `

Hello, Scully!

Render time: {{ now | date: 'long' }}

+ +

Publications

+ + `, }) export class HelloComponent { diff --git a/apps/this-is-learning/src/app/hello/hello.scam.ts b/apps/this-is-learning/src/app/hello/hello.scam.ts index 319f9af..88ec672 100644 --- a/apps/this-is-learning/src/app/hello/hello.scam.ts +++ b/apps/this-is-learning/src/app/hello/hello.scam.ts @@ -1,10 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; import { HelloComponent } from './hello.component'; @NgModule({ declarations: [HelloComponent], - imports: [CommonModule], + imports: [CommonModule, RouterModule], }) export class HelloScam {} diff --git a/jest.config.js b/jest.config.js index 8b07ace..159fa6f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,3 +1,6 @@ module.exports = { - projects: ['/apps/this-is-learning'], + projects: [ + '/apps/this-is-learning', + '/libs/publications/feature-this-is-angular', + ], }; diff --git a/libs/publications/feature-this-is-angular/.eslintrc.json b/libs/publications/feature-this-is-angular/.eslintrc.json new file mode 100644 index 0000000..8d48015 --- /dev/null +++ b/libs/publications/feature-this-is-angular/.eslintrc.json @@ -0,0 +1,36 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "plugin:@nrwl/nx/angular", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "thisIsLearning", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "this-is-learning", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nrwl/nx/angular-template"], + "rules": {} + } + ] +} diff --git a/libs/publications/feature-this-is-angular/README.md b/libs/publications/feature-this-is-angular/README.md new file mode 100644 index 0000000..d68d5b4 --- /dev/null +++ b/libs/publications/feature-this-is-angular/README.md @@ -0,0 +1 @@ +# This is Angular publication feature diff --git a/libs/publications/feature-this-is-angular/jest.config.js b/libs/publications/feature-this-is-angular/jest.config.js new file mode 100644 index 0000000..920388e --- /dev/null +++ b/libs/publications/feature-this-is-angular/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + displayName: 'publications-feature-this-is-angular', + preset: '../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + globals: { + 'ts-jest': { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + astTransformers: { + before: [ + 'jest-preset-angular/build/InlineFilesTransformer', + 'jest-preset-angular/build/StripStylesTransformer', + ], + }, + }, + }, + coverageDirectory: + '../../../coverage/libs/publications/feature-this-is-angular', + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/publications/feature-this-is-angular/src/index.ts b/libs/publications/feature-this-is-angular/src/index.ts new file mode 100644 index 0000000..c736ca8 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/index.ts @@ -0,0 +1 @@ +export * from './lib/publications-feature-this-is-angular.module'; diff --git a/libs/publications/feature-this-is-angular/src/lib/publications-feature-this-is-angular.module.ts b/libs/publications/feature-this-is-angular/src/lib/publications-feature-this-is-angular.module.ts new file mode 100644 index 0000000..97ac9d7 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/publications-feature-this-is-angular.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core'; + +import { ShellModule } from './shell/shell.module'; + +@NgModule({ + imports: [ShellModule], +}) +export class PublicationsFeatureThisIsAngularModule {} diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts new file mode 100644 index 0000000..b1f7986 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -0,0 +1,24 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + selector: 'til-this-is-angular-shell', + styles: [ + ` + til-this-is-angular-shell { + display: block; + } + `, + ], + template: ` +

TiA shell

+ +

Route data

+
{{ route.data | async | json }}
+ `, +}) +export class ShellComponent { + constructor(public route: ActivatedRoute) {} +} diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts new file mode 100644 index 0000000..8125c4a --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { ShellComponent } from './shell.component'; +import { ShellScam } from './shell.scam'; + +const routes: Routes = [ + { + path: '', + component: ShellComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes), ShellScam], +}) +export class ShellModule {} diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts new file mode 100644 index 0000000..92ea1e3 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts @@ -0,0 +1,10 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { ShellComponent } from './shell.component'; + +@NgModule({ + declarations: [ShellComponent], + imports: [CommonModule], +}) +export class ShellScam {} diff --git a/libs/publications/feature-this-is-angular/src/test-setup.ts b/libs/publications/feature-this-is-angular/src/test-setup.ts new file mode 100644 index 0000000..1100b3e --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular/setup-jest'; diff --git a/libs/publications/feature-this-is-angular/tsconfig.json b/libs/publications/feature-this-is-angular/tsconfig.json new file mode 100644 index 0000000..5358376 --- /dev/null +++ b/libs/publications/feature-this-is-angular/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "angularCompilerOptions": { + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/libs/publications/feature-this-is-angular/tsconfig.lib.json b/libs/publications/feature-this-is-angular/tsconfig.lib.json new file mode 100644 index 0000000..4002dc8 --- /dev/null +++ b/libs/publications/feature-this-is-angular/tsconfig.lib.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "target": "es2015", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2018"] + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts"], + "include": ["**/*.ts"] +} diff --git a/libs/publications/feature-this-is-angular/tsconfig.spec.json b/libs/publications/feature-this-is-angular/tsconfig.spec.json new file mode 100644 index 0000000..fd405a6 --- /dev/null +++ b/libs/publications/feature-this-is-angular/tsconfig.spec.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/nx.json b/nx.json index 240ad8f..e110d81 100644 --- a/nx.json +++ b/nx.json @@ -30,6 +30,9 @@ "this-is-learning-e2e": { "tags": [], "implicitDependencies": ["this-is-learning"] + }, + "publications-feature-this-is-angular": { + "tags": ["scope:publications", "type:feature"] } } } diff --git a/package.json b/package.json index 8f10b22..427a0eb 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "postinstall": "node ./decorate-angular-cli.js", + "postinstall": "node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main", "ngcc": "ngcc --first-only --properties es2015 module fesm2015 esm2015 browser main --create-ivy-entry-points", "ng": "nx", "nx": "nx", @@ -33,9 +33,11 @@ "scully:serve": "scully serve --noPrompt true" }, "dependencies": { + "@angular/animations": "^12.0.0", "@angular/common": "~12.0.0", "@angular/compiler": "~12.0.0", "@angular/core": "~12.0.0", + "@angular/forms": "^12.0.0", "@angular/platform-browser": "~12.0.0", "@angular/platform-browser-dynamic": "~12.0.0", "@angular/router": "~12.0.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index 11253ac..c11d015 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -14,7 +14,11 @@ "skipLibCheck": true, "skipDefaultLibCheck": true, "baseUrl": ".", - "paths": {} + "paths": { + "@this-is-learning/publications/feature-this-is-angular": [ + "libs/publications/feature-this-is-angular/src/index.ts" + ] + } }, "exclude": ["node_modules", "tmp"] } diff --git a/yarn.lock b/yarn.lock index c480d97..fadd04d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -144,6 +144,13 @@ dependencies: eslint-scope "^5.1.0" +"@angular/animations@^12.0.0": + version "12.0.3" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.0.3.tgz#97dd24455df2efdcf2d19afbd7e81877145e1308" + integrity sha512-uaOltimrGBJe1vIunaz9d8gtE8IY242XwakYGSFYf1zIseJRI7GBQ29L8+O2/QHbdTgdtsubYaqrPyMYLKYDvA== + dependencies: + tslib "^2.1.0" + "@angular/cli@~12.0.0": version "12.0.3" resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.0.3.tgz#cd1cb61fb51e406c42edc8dbae17ed6b0e6bcdba" @@ -211,6 +218,13 @@ dependencies: tslib "^2.1.0" +"@angular/forms@^12.0.0": + version "12.0.3" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.0.3.tgz#853992ccaaca0261eee1fba752de6ef20a7ee2d2" + integrity sha512-AdOX8epoXgges1hchv5hYRhO6iOZhjSfEmJkVCpInq08evVG7ON/FjN3n4bP4xRHrpNB63rIzoSraD3AYw8A/A== + dependencies: + tslib "^2.1.0" + "@angular/language-service@~12.0.0": version "12.0.3" resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-12.0.3.tgz#5240db3612b32d0d5434a6e27c5dc2678e1f2300" From 193c8a35691e628391a68f34fc0c50b05ceab746 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 02:01:01 +0200 Subject: [PATCH 03/16] style: format --- apps/this-is-learning/src/app/hello/hello.component.ts | 6 +++++- .../src/lib/shell/shell.component.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/this-is-learning/src/app/hello/hello.component.ts b/apps/this-is-learning/src/app/hello/hello.component.ts index 9a4c915..720ea61 100644 --- a/apps/this-is-learning/src/app/hello/hello.component.ts +++ b/apps/this-is-learning/src/app/hello/hello.component.ts @@ -1,4 +1,8 @@ -import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + ViewEncapsulation, +} from '@angular/core'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts index b1f7986..674f9da 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -1,4 +1,8 @@ -import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + ViewEncapsulation, +} from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @Component({ From 47e499a625c82dae4fb5d2125a8730ea70abf8e8 Mon Sep 17 00:00:00 2001 From: Maina Wycliffe Date: Sun, 6 Jun 2021 09:49:29 +0300 Subject: [PATCH 04/16] fix: use declared const plugin name instead of name directly (#10) * fix: use declared const plugin name instead of name directly * fix: disable linting error for this PR (temporary) This issue can be fixed in the PR this PR is being into. --- .../feature-this-is-angular/src/lib/shell/shell.component.ts | 1 + scully.this-is-learning.config.ts | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts index 674f9da..0890e5b 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -8,6 +8,7 @@ import { ActivatedRoute } from '@angular/router'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, + // eslint-disable-next-line @angular-eslint/component-selector selector: 'til-this-is-angular-shell', styles: [ ` diff --git a/scully.this-is-learning.config.ts b/scully.this-is-learning.config.ts index 0264d55..b127722 100644 --- a/scully.this-is-learning.config.ts +++ b/scully.this-is-learning.config.ts @@ -1,4 +1,5 @@ import { ScullyConfig } from '@scullyio/scully'; +import { fromRss } from "./scully/plugins/from-rss.plugin" export const config: ScullyConfig = { projectRoot: './apps/this-is-learning/src', @@ -7,11 +8,11 @@ export const config: ScullyConfig = { routes: { '/this-is-angular': { rss: 'https://dev.to/feed/this-is-angular', - type: 'tilFromRss', + type: fromRss, }, '/this-is-learning': { rss: 'https://dev.to/feed/this-is-learning', - type: 'tilFromRss', + type: fromRss, }, }, }; From d6daf9c182bbedbd8aa1ef9caeaf9162f04cedd1 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 21:17:58 +0200 Subject: [PATCH 05/16] chore: configure prefixes --- angular.json | 13 +++++++++---- .../feature-this-is-angular/.eslintrc.json | 4 ++-- .../src/lib/shell/shell.component.ts | 1 - 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/angular.json b/angular.json index 33096ea..fc29c0b 100644 --- a/angular.json +++ b/angular.json @@ -6,16 +6,21 @@ "defaultProject": "this-is-learning", "schematics": { "@nrwl/angular:application": { - "style": "scss", + "e2eTestRunner": "cypress", + "inlineStyle": true, + "inlineTemplate": true, "linter": "eslint", + "prefix": "til", + "style": "scss", "unitTestRunner": "jest", - "e2eTestRunner": "cypress", "tags": "type:app", "viewEncapsulation": "None" }, "@nrwl/angular:library": { - "style": "scss", + "changeDetection": "OnPush", "linter": "eslint", + "prefix": "til", + "style": "scss", "unitTestRunner": "jest" }, "@nrwl/angular:storybook-configuration": { @@ -170,7 +175,7 @@ "projectType": "library", "root": "libs/publications/feature-this-is-angular", "sourceRoot": "libs/publications/feature-this-is-angular/src", - "prefix": "this-is-learning", + "prefix": "til", "architect": { "test": { "builder": "@nrwl/jest:jest", diff --git a/libs/publications/feature-this-is-angular/.eslintrc.json b/libs/publications/feature-this-is-angular/.eslintrc.json index 8d48015..c2afb3b 100644 --- a/libs/publications/feature-this-is-angular/.eslintrc.json +++ b/libs/publications/feature-this-is-angular/.eslintrc.json @@ -13,7 +13,7 @@ "error", { "type": "attribute", - "prefix": "thisIsLearning", + "prefix": "til", "style": "camelCase" } ], @@ -21,7 +21,7 @@ "error", { "type": "element", - "prefix": "this-is-learning", + "prefix": "til", "style": "kebab-case" } ] diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts index 0890e5b..674f9da 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -8,7 +8,6 @@ import { ActivatedRoute } from '@angular/router'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, - // eslint-disable-next-line @angular-eslint/component-selector selector: 'til-this-is-angular-shell', styles: [ ` From e5be7afd583eca7ba39adae03a2213d55bfabc09 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 21:18:04 +0200 Subject: [PATCH 06/16] style: format --- scully.this-is-learning.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scully.this-is-learning.config.ts b/scully.this-is-learning.config.ts index b127722..e44d078 100644 --- a/scully.this-is-learning.config.ts +++ b/scully.this-is-learning.config.ts @@ -1,5 +1,6 @@ import { ScullyConfig } from '@scullyio/scully'; -import { fromRss } from "./scully/plugins/from-rss.plugin" + +import { fromRss } from './scully/plugins/from-rss.plugin'; export const config: ScullyConfig = { projectRoot: './apps/this-is-learning/src', From db5990c278269369a4b061b7625080dce092c0a1 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 22:40:36 +0200 Subject: [PATCH 07/16] chore: patch rss-parser for browser --- angular.json | 3 ++- package.json | 4 +++- yarn.lock | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/angular.json b/angular.json index fc29c0b..10e6310 100644 --- a/angular.json +++ b/angular.json @@ -58,7 +58,8 @@ "apps/this-is-learning/src/assets" ], "styles": ["apps/this-is-learning/src/styles.scss"], - "scripts": [] + "scripts": [], + "allowedCommonJsDependencies": ["rss-parser"] }, "configurations": { "production": { diff --git a/package.json b/package.json index 427a0eb..999c84c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "postinstall": "node ./decorate-angular-cli.js && ngcc --properties es2015 browser module main", + "postinstall": "node ./decorate-angular-cli.js && yarn patch-commonjs-dependencies", + "patch-commonjs-dependencies": "json -I -f node_modules/rss-parser/package.json -e \"this.main = 'dist/rss-parser.js';\"", "ngcc": "ngcc --first-only --properties es2015 module fesm2015 esm2015 browser main --create-ivy-entry-points", "ng": "nx", "nx": "nx", @@ -76,6 +77,7 @@ "eslint-plugin-cypress": "^2.10.3", "jest": "~26.2.2", "jest-preset-angular": "~8.4.0", + "json": "^11.0.0", "prettier": "~2.2.1", "rss-parser": "^3.12.0", "string-strip-html": "^8.3.0", diff --git a/yarn.lock b/yarn.lock index fadd04d..0421b73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6743,6 +6743,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/json/-/json-11.0.0.tgz#2e84493134e2f42c131165aa22a124df38b3a3ee" + integrity sha512-N/ITv3Yw9Za8cGxuQqSqrq6RHnlaHWZkAFavcfpH/R52522c26EbihMxnY7A1chxfXJ4d+cEFIsyTgfi9GihrA== + jsonc-parser@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" From 2084888908021e49d36149fc06d95f08565bae21 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 22:40:49 +0200 Subject: [PATCH 08/16] chore: disable Scully routing --- scully.this-is-learning.config.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/scully.this-is-learning.config.ts b/scully.this-is-learning.config.ts index e44d078..18e74d7 100644 --- a/scully.this-is-learning.config.ts +++ b/scully.this-is-learning.config.ts @@ -1,19 +1,17 @@ import { ScullyConfig } from '@scullyio/scully'; -import { fromRss } from './scully/plugins/from-rss.plugin'; - export const config: ScullyConfig = { projectRoot: './apps/this-is-learning/src', projectName: 'this-is-learning', outDir: './dist/static/this-is-learning', routes: { - '/this-is-angular': { - rss: 'https://dev.to/feed/this-is-angular', - type: fromRss, - }, - '/this-is-learning': { - rss: 'https://dev.to/feed/this-is-learning', - type: fromRss, - }, + // '/this-is-angular': { + // rss: 'https://dev.to/feed/this-is-angular', + // type: fromRss, + // }, + // '/this-is-learning': { + // rss: 'https://dev.to/feed/this-is-learning', + // type: fromRss, + // }, }, }; From 2a06256abc14ee5be49258a9cfbfe606fbfa7872 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 23:09:05 +0200 Subject: [PATCH 09/16] chore: add metascraper --- package.json | 4 +- yarn.lock | 374 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 272 insertions(+), 106 deletions(-) diff --git a/package.json b/package.json index 999c84c..4009e33 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,8 @@ "@nrwl/angular": "~12.3.5", "@scullyio/ng-lib": "^1.1.1", "@scullyio/scully": "^1.1.1", + "metascraper": "^5.22.0", + "rss-parser": "^3.12.0", "rxjs": "~6.6.0", "tslib": "^2.1.0", "zone.js": "~0.11.4" @@ -79,8 +81,6 @@ "jest-preset-angular": "~8.4.0", "json": "^11.0.0", "prettier": "~2.2.1", - "rss-parser": "^3.12.0", - "string-strip-html": "^8.3.0", "ts-jest": "~26.5.5", "ts-node": "~9.1.1", "typescript": "~4.2.4" diff --git a/yarn.lock b/yarn.lock index 0421b73..37c1eae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1199,7 +1199,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.14.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.14.0", "@babel/runtime@^7.8.4": +"@babel/runtime@7.14.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== @@ -1529,6 +1529,33 @@ merge-source-map "^1.1.0" schema-utils "^2.7.0" +"@metascraper/helpers@^5.22.0": + version "5.22.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.22.0.tgz#71d36b92c9ab488446221008bdf660effafdda93" + integrity sha512-lByOIjtMnefbMEF+lQ/QNhmxzQcHjEfbYe5bzwLViNKEGMOsa+nPopuwt+sUc5R3X9+SD20zIa8MZSU6cLlt+g== + dependencies: + audio-extensions "0.0.0" + chrono-node "2.2.7" + condense-whitespace "~2.0.0" + entities "~2.2.0" + file-extension "~4.0.5" + has-values "~2.0.1" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~2.2.0" + isostring "0.0.1" + jsdom "~16.6.0" + lodash "~4.17.21" + memoize-one "~5.2.1" + microsoft-capitalize "~1.0.5" + mime-types "~2.1.30" + normalize-url "~6.0.1" + smartquotes "~2.3.2" + truncate "~2.1.0" + url-regex-safe "~2.0.2" + video-extensions "~1.1.0" + "@ngtools/webpack@12.0.3": version "12.0.3" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-12.0.3.tgz#47fd9abffe96d554edf063eb252d4f2c06d834e1" @@ -2782,6 +2809,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +audio-extensions@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/audio-extensions/-/audio-extensions-0.0.0.tgz#d0eefe077fb9eb625898eed9985890548cf1f8d2" + integrity sha1-0O7+B3+562JYmO7ZmFiQVIzx+NI= + autoprefixer@^9.6.1: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" @@ -3313,6 +3345,30 @@ check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= +cheerio-select@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.4.0.tgz#3a16f21e37a2ef0f211d6d1aa4eff054bb22cdc9" + integrity sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew== + dependencies: + css-select "^4.1.2" + css-what "^5.0.0" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils "^2.6.0" + +cheerio@~1.0.0-rc.9: + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.9.tgz#a3ae6b7ce7af80675302ff836f628e7cb786a67f" + integrity sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng== + dependencies: + cheerio-select "^1.4.0" + dom-serializer "^1.3.1" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" + "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.3.0, chokidar@^3.4.0: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -3362,6 +3418,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chrono-node@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.2.7.tgz#4a496157febda78146833aefd3e3a97727ffa5ad" + integrity sha512-QQxlQUwebgNJDtUJpRQlhKoJJgSfvNTe6Zk1LgyVHVnbCj6xKygmiviJonS/n5A4xd9qjEl1u+ke2vzD77ty/g== + dependencies: + dayjs "^1.10.0" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3392,7 +3455,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^2.0.0: +clean-stack@^2.0.0, clean-stack@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== @@ -3620,6 +3683,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + confusing-browser-globals@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" @@ -3869,6 +3937,17 @@ css-select@^3.1.2: domutils "^2.4.3" nth-check "^2.0.0" +css-select@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + css-tree@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3882,6 +3961,11 @@ css-what@^4.0.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -4055,7 +4139,7 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dayjs@^1.10.4: +dayjs@^1.10.0, dayjs@^1.10.4: version "1.10.5" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.5.tgz#5600df4548fc2453b3f163ebb2abbe965ccfb986" integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g== @@ -4290,7 +4374,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@^1.0.1: +dom-serializer@^1.0.1, dom-serializer@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== @@ -4327,6 +4411,15 @@ domutils@^2.4.3: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^2.5.2, domutils@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dotenv@8.2.0, dotenv@~8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" @@ -4433,7 +4526,7 @@ enquirer@^2.3.5, enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^2.0.0, entities@^2.0.3: +entities@^2.0.0, entities@^2.0.3, entities@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== @@ -4951,6 +5044,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-extension@~4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/file-extension/-/file-extension-4.0.5.tgz#ae6cef34c28e7313a92baa4aa955755cacdf0ce3" + integrity sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg== + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -5341,7 +5439,7 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -5439,6 +5537,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-values@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d" + integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w== + dependencies: + kind-of "^6.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -5495,16 +5600,21 @@ html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5669,6 +5779,11 @@ ignore@^5.0.4, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +image-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/image-extensions/-/image-extensions-1.1.0.tgz#b8e6bf6039df0056e333502a00b6637a3105d894" + integrity sha1-uOa/YDnfAFbjM1AqALZjejEF2JQ= + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -5765,6 +5880,11 @@ inquirer@8.0.0: strip-ansi "^6.0.0" through "^2.3.6" +install-artifact-from-github@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.2.0.tgz#adcbd123c16a4337ec44ea76d0ebf253cc16b074" + integrity sha512-3OxCPcY55XlVM3kkfIpeCgmoSKnMsz2A3Dbhsq0RXpIknKQmrX1YiznCeW9cD2ItFmDxziA3w6Eg8d80AoL3oA== + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -5778,6 +5898,11 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip-regex@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -5788,7 +5913,7 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^3.0.3: +is-absolute-url@^3.0.0, is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== @@ -6089,6 +6214,13 @@ is-regex@^1.0.4, is-regex@^1.1.3: call-bind "^1.0.2" has-symbols "^1.0.2" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -6126,6 +6258,14 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-uri@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.0.tgz#b92ff234af68c0ed97d2eed46492d01793b7d420" + integrity sha1-uS/yNK9owO2X0u7UZJLQF5O31CA= + dependencies: + parse-uri "~1.0.0" + punycode2 "~1.0.0" + is-what@^3.12.0: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -6158,6 +6298,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +iso-639-3@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-2.2.0.tgz#eb01d7734d61396efec934979e8b0806550837f1" + integrity sha512-v9w/U4XDSfXCrXxf4E6ertGC/lTRX8MLLv7XC1j6N5oL3ympe38jp77zgeyMsn3MbufuAAoGeVzDJbOXnPTMhQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -6170,6 +6315,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isostring@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isostring/-/isostring-0.0.1.tgz#ddb608efbfc89cda86db9cb16be090a788134c7f" + integrity sha1-3bYI77/InNqG25yxa+CQp4gTTH8= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6646,7 +6796,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^16.4.0: +jsdom@^16.4.0, jsdom@~16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== @@ -7000,11 +7150,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7015,11 +7160,6 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash.trim@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/lodash.trim/-/lodash.trim-4.5.1.tgz#36425e7ee90be4aa5e27bcebb85b7d11ea47aa57" - integrity sha1-NkJefukL5KpeJ7zruFt9EepHqlc= - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -7030,12 +7170,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash.without@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" - integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= - -lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.5.0, lodash@^4.7.0: +lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.5.0, lodash@^4.7.0, lodash@~4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7108,7 +7243,7 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^8.0.9: +make-fetch-happen@^8.0.14, make-fetch-happen@^8.0.9: version "8.0.14" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== @@ -7185,6 +7320,11 @@ memfs@^3.2.0: dependencies: fs-monkey "1.0.3" +memoize-one@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -7228,6 +7368,16 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +metascraper@^5.22.0: + version "5.22.0" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.22.0.tgz#74469d87865999ea2f1584812be823a1a09a2b0e" + integrity sha512-JnEkhX68cM2txsY1ZMtpld5C7PCm/u5N/w8udE9iZ29IeyCR+kvvIwUglEViq0hcXwpOk8tGm4GQyzwgU4uFnw== + dependencies: + "@metascraper/helpers" "^5.22.0" + cheerio "~1.0.0-rc.9" + lodash "~4.17.21" + whoops "~4.1.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -7265,12 +7415,17 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.2.3" +microsoft-capitalize@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/microsoft-capitalize/-/microsoft-capitalize-1.0.5.tgz#bcaf915039f14224c8cfd74c31cea42fecacbb31" + integrity sha512-iqDMU9J643BHg8Zp7EMZNLTp6Pgs2f1S2SMnCW2VlUqMs17xCZ5vwVjalBJEGVcUfG+/1ePqeEGcMW3VfzHK5A== + mime-db@1.48.0, "mime-db@>= 1.43.0 < 2": version "1.48.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.30: version "2.1.31" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== @@ -7302,6 +7457,11 @@ mimic-fn@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== +mimic-fn@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.0.0.tgz#76044cfa8818bbf6999c5c9acadf2d3649b14b4b" + integrity sha512-PiVO95TKvhiwgSwg1IdLYlCTdul38yZxZMIcnDSFIBUm4BNZha2qpQ4GpJ++15bHoKDtrW2D69lMfFwdFYtNZQ== + mini-css-extract-plugin@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.5.1.tgz#c0ac557c48a7de47de3df0768fe037c9cf961f69" @@ -7453,7 +7613,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: +nan@^2.12.1, nan@^2.14.2: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== @@ -7535,6 +7695,22 @@ node-gyp@^7.1.0: tar "^6.0.2" which "^2.0.2" +node-gyp@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.1.0.tgz#81f43283e922d285c886fb0e0f520a7fd431d8c2" + integrity sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^8.0.14" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.0" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7606,6 +7782,11 @@ normalize-url@^4.5.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +normalize-url@~6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256" + integrity sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ== + npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" @@ -8061,6 +8242,11 @@ parse-node-version@^1.0.1: resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== +parse-uri@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.3.tgz#f3c24a74907a4e357c1741e96ca9faadecfd6db5" + integrity sha512-upMnGxNcm+45So85HoguwZTVZI9u11i36DdxJfGF2HYWS2eh3TIx7+/tTi7qrEq15qzGkVhsKjesau+kCk48pA== + parse5-html-rewriting-stream@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" @@ -8905,6 +9091,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode2@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" + integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -8975,40 +9166,6 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -ranges-apply@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ranges-apply/-/ranges-apply-5.1.0.tgz#d18ec097844e548eb4a325f9257ad81179946f85" - integrity sha512-VF3a0XUuYS/BQHv2RaIyX1K7S1hbfrs64hkGKgPVk0Y7p4XFwSucjTTttrBqmkcmB/PZx5ISTZdxErRZi/89aQ== - dependencies: - "@babel/runtime" "^7.14.0" - ranges-merge "^7.1.0" - -ranges-merge@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ranges-merge/-/ranges-merge-7.1.0.tgz#b2626d5865060944297a21cd499b886cb59127b9" - integrity sha512-coTHcyAEIhoEdsBs9f5f+q0rmy7UHvS/5nfuXzuj5oLX/l/tbqM5uxRb6eh8WMdetXia3lK67ZO4tarH4ieulQ== - dependencies: - "@babel/runtime" "^7.14.0" - ranges-push "^5.1.0" - ranges-sort "^4.1.0" - -ranges-push@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ranges-push/-/ranges-push-5.1.0.tgz#73cd42e347b8e7807e42ccf35d6e5041e1705fb4" - integrity sha512-vqGcaGq7GWV1zBa9w83E+dzYkOvE9/3pIRUPvLf12c+mGQCf1nesrkBI7Ob8taN2CC9V1HDSJx0KAQl0SgZftA== - dependencies: - "@babel/runtime" "^7.14.0" - ranges-merge "^7.1.0" - string-collapse-leading-whitespace "^5.1.0" - string-trim-spaces-only "^3.1.0" - -ranges-sort@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ranges-sort/-/ranges-sort-4.1.0.tgz#ec2313421b2538186582062751c77be30182f186" - integrity sha512-GOQgk6UtsrfKFeYa53YLiBVnLINwYmOk5l2QZG1csZpT6GdImUwooh+/cRrp7b+fYawZX/rnyA3Ul+pdgQBIzA== - dependencies: - "@babel/runtime" "^7.14.0" - raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -9027,6 +9184,15 @@ raw-loader@4.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" +re2@^1.15.9: + version "1.16.0" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.16.0.tgz#f311eb4865b1296123800ea8e013cec8dab25590" + integrity sha512-eizTZL2ZO0ZseLqfD4t3Qd0M3b3Nr0MBWpX81EbPMIud/1d/CSfUIx2GQK8fWiAeHoSekO5EOeFib2udTZLwYw== + dependencies: + install-artifact-from-github "^1.2.0" + nan "^2.14.2" + node-gyp "^8.0.0" + react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" @@ -9706,6 +9872,11 @@ smart-buffer@^4.1.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== +smartquotes@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/smartquotes/-/smartquotes-2.3.2.tgz#fb1630c49ba04e57446e1a97dc10d590072af4a6" + integrity sha512-0R6YJ5hLpDH4mZR7N5eZ12oCMLspvGOHL9A9SEm2e3b/CQmQidekW4SWSKEmor/3x6m3NCBBEqLzikcZC9VJNQ== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9953,22 +10124,6 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -string-collapse-leading-whitespace@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-5.1.0.tgz#3ebe317241421bcba651e697ef60d6b9a9bf43c3" - integrity sha512-mYz9/Kb5uvRB4DZj46zILwI4y9lD9JsvXG9Xb7zjbwm0I/R40G7oFfMsqJ28l2d7gWMTLJL569NfJQVLQbnHCw== - dependencies: - "@babel/runtime" "^7.14.0" - -string-left-right@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/string-left-right/-/string-left-right-4.1.0.tgz#d73c066720cb0a8cd2b6a61e3188d3458b22b776" - integrity sha512-ic/WvfNVUygWWsgg8akzSzp2NuttfhrdbH7QmSnda5b5RFmT9aCEDiS/M+gmTJwtFy7+b/2AXU4Z6vejcePQqQ== - dependencies: - "@babel/runtime" "^7.14.0" - lodash.clonedeep "^4.5.0" - lodash.isplainobject "^4.0.6" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -9977,27 +10132,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-strip-html@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/string-strip-html/-/string-strip-html-8.3.0.tgz#d5dddee58d5832cc6c25448b536c69a65230802a" - integrity sha512-1+rjTPt0JjpFr1w0bfNL1S6O0I9fJDqM+P3pFTpC6eEEpIXhmBvPLnaQoEuWarswiH219qCefDSxTLxGQyHKUg== - dependencies: - "@babel/runtime" "^7.14.0" - html-entities "^2.3.2" - lodash.isplainobject "^4.0.6" - lodash.trim "^4.5.1" - lodash.without "^4.4.0" - ranges-apply "^5.1.0" - ranges-push "^5.1.0" - string-left-right "^4.1.0" - -string-trim-spaces-only@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-trim-spaces-only/-/string-trim-spaces-only-3.1.0.tgz#b7936051706110caec5bcf3f7f866fe46354d7aa" - integrity sha512-AW7RSi3+QtE6wR+4m/kmwlyy39neBbCIzrzzu1/RGzNRiPKQOeB3rGzr4ubg4UIQgYtr2w0PrxhKPXgyqJ0vaQ== - dependencies: - "@babel/runtime" "^7.14.0" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -10385,6 +10519,11 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tlds@^1.217.0: + version "1.221.1" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.221.1.tgz#6cf6bff5eaf30c5618c5801c3f425a6dc61ca0ad" + integrity sha512-N1Afn/SLeOQRpxMwHBuNFJ3GvGrdtY4XPXKPFcx8he0U9Jg9ZkvTKE1k3jQDtCmlFn44UxjVtouF6PT4rEGd3Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10475,6 +10614,11 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + ts-jest@26.x, ts-jest@~26.5.5: version "26.5.6" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" @@ -10533,7 +10677,7 @@ tsconfig-paths@^3.4.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@2.2.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0: +tslib@2.2.0, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== @@ -10749,6 +10893,15 @@ url-parse@^1.4.3, url-parse@^1.5.1: querystringify "^2.1.1" requires-port "^1.0.0" +url-regex-safe@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/url-regex-safe/-/url-regex-safe-2.0.2.tgz#41d02bb7c927d57008389f636de0bd850a40fc7c" + integrity sha512-n5qtPAWvMLTmgYMCX1195CKV9oJE6SkSa5bVsMrHSFA/hnqila9J1KVf6gF2M66lCWwPDhJyQlX1tEXqtzBOPQ== + dependencies: + ip-regex "^4.3.0" + re2 "^1.15.9" + tlds "^1.217.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -10830,6 +10983,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +video-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/video-extensions/-/video-extensions-1.1.0.tgz#eaa86b45f29a853c2b873e9d8e23b513712997d6" + integrity sha1-6qhrRfKahTwrhz6djiO1E3Epl9Y= + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -11083,6 +11241,14 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +whoops@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.1.0.tgz#f42e51514c7af19a9491a44cabf2712292c6a8e1" + integrity sha512-42soctqvFs9FaU1r4ZadCy2F6A9dUc4SN3ud+tbDEdmyZDTeYBgKKqtIdo6NiQlnZnJegWRCyKLk2edYH9DsHA== + dependencies: + clean-stack "~2.2.0" + mimic-fn "~3.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" From d25c17395b3e74a935b27d02dec5045590c214ee Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 23:09:19 +0200 Subject: [PATCH 10/16] feat: add RSS items resolver --- .../lib/dev-community-rss-items.resolver.ts | 20 +++++++++ .../src/lib/dev-community-rss-parser.token.ts | 41 +++++++++++++++++++ .../src/lib/shell/shell.module.ts | 7 ++++ 3 files changed, 68 insertions(+) create mode 100644 libs/publications/feature-this-is-angular/src/lib/dev-community-rss-items.resolver.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/dev-community-rss-parser.token.ts diff --git a/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-items.resolver.ts b/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-items.resolver.ts new file mode 100644 index 0000000..13c00e8 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-items.resolver.ts @@ -0,0 +1,20 @@ +import { Inject, Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; + +import { DevCommunityRssItems, DevCommunityRssParser, devCommunityRssParserToken } from './dev-community-rss-parser.token'; + +@Injectable({ + providedIn: 'root', +}) +export class DevCommunityRssItemsResolver + implements Resolve { + constructor( + @Inject(devCommunityRssParserToken) private rssParser: DevCommunityRssParser + ) {} + + async resolve(route: ActivatedRouteSnapshot): Promise { + const feed = await this.rssParser.parseURL(route.data.rssUrl); + + return feed.items; + } +} diff --git a/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-parser.token.ts b/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-parser.token.ts new file mode 100644 index 0000000..77ebdfd --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/dev-community-rss-parser.token.ts @@ -0,0 +1,41 @@ +import { InjectionToken } from '@angular/core'; +import * as RssParser from 'rss-parser'; + +export interface DevCommunityRssFeedCustomFields { + readonly language: string; +} + +export interface DevCommunityRssItemCustomFields { + readonly author: string; + readonly contentSnippet: string; + readonly description: string; +} + +export type DevCommunityRssParser = RssParser< + DevCommunityRssFeedCustomFields, + DevCommunityRssItemCustomFields +>; + +export type DevCommunityRssItem = DevCommunityRssItemCustomFields & + RssParser.Item; +export type DevCommunityRssItems = readonly DevCommunityRssItem[]; + +export function devCommunityRssParserFactory(): DevCommunityRssParser { + return new RssParser< + DevCommunityRssFeedCustomFields, + DevCommunityRssItemCustomFields + >({ + customFields: { + feed: ['language'], + item: ['author', 'contentSnippet', 'description'], + }, + }); +} + +export const devCommunityRssParserToken = new InjectionToken( + 'DEV_Community_RSS_parser', + { + factory: devCommunityRssParserFactory, + providedIn: 'root', + } +); diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts index 8125c4a..39b8211 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.module.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { DevCommunityRssItemsResolver } from '../dev-community-rss-items.resolver'; import { ShellComponent } from './shell.component'; import { ShellScam } from './shell.scam'; @@ -8,6 +9,12 @@ const routes: Routes = [ { path: '', component: ShellComponent, + data: { + rssUrl: 'https://dev.to/feed/this-is-angular', + }, + resolve: { + rssItems: DevCommunityRssItemsResolver, + }, }, ]; From daebbdebaa7f0fc47e06774115c59d62ac8b0265 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 23:12:04 +0200 Subject: [PATCH 11/16] ci: add ngcc to postinstall hook --- .github/workflows/ci.yml | 6 ------ package.json | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b775bc8..b2a3489 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,8 +69,6 @@ jobs: ${{ runner.os }}- - name: Install dependencies run: yarn install - - name: Run Angular Compatibility Compiler - run: yarn ngcc - run: yarn test --max-parallel=$NX_MAX_PARALLEL @@ -99,8 +97,6 @@ jobs: ${{ runner.os }}- - name: Install dependencies run: yarn install - - name: Run Angular Compatibility Compiler - run: yarn ngcc - run: yarn build --max-parallel=$NX_MAX_PARALLEL - run: yarn scully @@ -168,7 +164,5 @@ jobs: ${{ runner.os }}- - name: Install dependencies run: yarn install - - name: Run Angular Compatibility Compiler - run: yarn ngcc - run: yarn e2e --configuration=ci --max-parallel=$NX_MAX_PARALLEL diff --git a/package.json b/package.json index 4009e33..08e68b6 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "postinstall": "node ./decorate-angular-cli.js && yarn patch-commonjs-dependencies", + "postinstall": "node ./decorate-angular-cli.js && yarn patch-commonjs-dependencies && yarn ngcc", "patch-commonjs-dependencies": "json -I -f node_modules/rss-parser/package.json -e \"this.main = 'dist/rss-parser.js';\"", "ngcc": "ngcc --first-only --properties es2015 module fesm2015 esm2015 browser main --create-ivy-entry-points", "ng": "nx", From 80e3f9cd90c690a622b442aabdea389572f76835 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 23:12:50 +0200 Subject: [PATCH 12/16] feat: remove HTML stripping --- .scully/settings.yml | 1 + scully/plugins/from-rss.plugin.ts | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 .scully/settings.yml diff --git a/.scully/settings.yml b/.scully/settings.yml new file mode 100644 index 0000000..80f42d9 --- /dev/null +++ b/.scully/settings.yml @@ -0,0 +1 @@ +identifier: k8p7l5odl6b2cet5 diff --git a/scully/plugins/from-rss.plugin.ts b/scully/plugins/from-rss.plugin.ts index 1cc6063..474ea70 100644 --- a/scully/plugins/from-rss.plugin.ts +++ b/scully/plugins/from-rss.plugin.ts @@ -1,6 +1,5 @@ import { HandledRoute, registerPlugin } from '@scullyio/scully'; import RssParser from 'rss-parser'; -import { stripHtml } from 'string-strip-html'; interface DevCommunityRssFeed { readonly language: string; @@ -27,11 +26,7 @@ async function fromRssPlugin( options: FromRssOptions ): Promise { const feed = await rssParser.parseURL(options.rss); - const items = feed.items.map((article) => ({ - ...article, - description: - stripHtml(article.description).result.substr(0, 255) + ' (...)', - })); + const items = feed.items; return [ { From 0a54d256c83a58a3785c6dca247441543ff16fec Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Sun, 6 Jun 2021 23:15:26 +0200 Subject: [PATCH 13/16] chore: scan Scully routes --- apps/this-is-learning/src/assets/scully-routes.json | 2 +- package.json | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/this-is-learning/src/assets/scully-routes.json b/apps/this-is-learning/src/assets/scully-routes.json index c539eca..f448d41 100644 --- a/apps/this-is-learning/src/assets/scully-routes.json +++ b/apps/this-is-learning/src/assets/scully-routes.json @@ -1 +1 @@ -[{ "route": "/" }] +[{"route":"/"},{"route":"/this-is-angular"}] \ No newline at end of file diff --git a/package.json b/package.json index 08e68b6..3fad6c5 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,9 @@ "workspace-generator": "nx workspace-generator", "dep-graph": "nx dep-graph", "help": "nx help", - "scully": "scully --noPrompt true", - "scully:serve": "scully serve --noPrompt true" + "scully": "scully --noPrompt", + "scully:scan": "yarn scully --scanRoutes", + "scully:serve": "yarn scully serve" }, "dependencies": { "@angular/animations": "^12.0.0", From 8786df93c5f255aad34fd97112e0ae5fb820a2f6 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Thu, 19 Aug 2021 21:46:01 +0200 Subject: [PATCH 14/16] refactor: extract selector constants --- apps/this-is-learning/src/app/hello/hello.component.ts | 6 ++++-- .../src/lib/shell/shell.component.ts | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/this-is-learning/src/app/hello/hello.component.ts b/apps/this-is-learning/src/app/hello/hello.component.ts index 720ea61..9751e2b 100644 --- a/apps/this-is-learning/src/app/hello/hello.component.ts +++ b/apps/this-is-learning/src/app/hello/hello.component.ts @@ -4,13 +4,15 @@ import { ViewEncapsulation, } from '@angular/core'; +const selector = 'til-hello'; + @Component({ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, - selector: 'til-hello', + selector, styles: [ ` - til-hello { + ${selector} { display: block; } `, diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts index 674f9da..c79bd23 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -5,13 +5,14 @@ import { } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; +const selector = 'til-this-is-angular-shell'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, - selector: 'til-this-is-angular-shell', + selector, styles: [ ` - til-this-is-angular-shell { + ${selector} { display: block; } `, From 2174c8d157b919840e66b00717d7ab8f31da5f7e Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Thu, 19 Aug 2021 23:31:19 +0200 Subject: [PATCH 15/16] chore: scan routes before serving Scully app --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fad6c5..65f7328 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "help": "nx help", "scully": "scully --noPrompt", "scully:scan": "yarn scully --scanRoutes", - "scully:serve": "yarn scully serve" + "scully:serve": "yarn scully:scan && yarn scully serve" }, "dependencies": { "@angular/animations": "^12.0.0", From 59d8309e40345baf50a40b6033d20b8c2050ad88 Mon Sep 17 00:00:00 2001 From: Lars Gyrup Brink Nielsen Date: Thu, 19 Aug 2021 23:31:39 +0200 Subject: [PATCH 16/16] feat: This is Angular article list --- .../src/lib/article/article.component.ts | 39 +++++++++++++++++++ .../src/lib/article/article.scam.ts | 12 ++++++ .../src/lib/shell/shell.component.ts | 32 ++++++++++----- .../src/lib/shell/shell.scam.ts | 3 +- .../src/lib/truncate/truncate.pipe.ts | 14 +++++++ .../src/lib/truncate/truncate.scam.ts | 9 +++++ 6 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 libs/publications/feature-this-is-angular/src/lib/article/article.component.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/article/article.scam.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/truncate/truncate.pipe.ts create mode 100644 libs/publications/feature-this-is-angular/src/lib/truncate/truncate.scam.ts diff --git a/libs/publications/feature-this-is-angular/src/lib/article/article.component.ts b/libs/publications/feature-this-is-angular/src/lib/article/article.component.ts new file mode 100644 index 0000000..c53940d --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/article/article.component.ts @@ -0,0 +1,39 @@ +import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core'; + +import { DevCommunityRssItem } from '../dev-community-rss-parser.token'; + +const selector = '[til-article]'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + selector, + template: ` +

+ {{ + rssItem?.title + }} +

+ +
+

+ By {{ rssItem?.author }}
+
+ #{{ tag }} +

+
+ +

{{ rssItem?.contentSnippet | tilTruncate }}

+ + Read article + `, +}) +export class ArticleComponent { + @Input() + rssItem: DevCommunityRssItem | null = null; +} diff --git a/libs/publications/feature-this-is-angular/src/lib/article/article.scam.ts b/libs/publications/feature-this-is-angular/src/lib/article/article.scam.ts new file mode 100644 index 0000000..a23c6ea --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/article/article.scam.ts @@ -0,0 +1,12 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { TruncateScam } from '../truncate/truncate.scam'; +import { ArticleComponent } from './article.component'; + +@NgModule({ + declarations: [ArticleComponent], + exports: [ArticleComponent], + imports: [CommonModule, TruncateScam], +}) +export class ArticleScam {} diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts index c79bd23..4937ae7 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.component.ts @@ -1,9 +1,9 @@ -import { - ChangeDetectionStrategy, - Component, - ViewEncapsulation, -} from '@angular/core'; +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { DevCommunityRssItems } from '../dev-community-rss-parser.token'; const selector = 'til-this-is-angular-shell'; @Component({ @@ -18,12 +18,26 @@ const selector = 'til-this-is-angular-shell'; `, ], template: ` -

TiA shell

+

+ This is Angular +

-

Route data

-
{{ route.data | async | json }}
+
`, }) export class ShellComponent { - constructor(public route: ActivatedRoute) {} + rssItems$: Observable = this.route.data.pipe( + map((data) => data.rssItems) + ); + rssUrl$: Observable = this.route.data.pipe( + map((data) => data.rssUrl) + ); + + constructor(private route: ActivatedRoute) {} } diff --git a/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts b/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts index 92ea1e3..73201b7 100644 --- a/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts +++ b/libs/publications/feature-this-is-angular/src/lib/shell/shell.scam.ts @@ -1,10 +1,11 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { ArticleScam } from '../article/article.scam'; import { ShellComponent } from './shell.component'; @NgModule({ declarations: [ShellComponent], - imports: [CommonModule], + imports: [CommonModule, ArticleScam], }) export class ShellScam {} diff --git a/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.pipe.ts b/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.pipe.ts new file mode 100644 index 0000000..13b91c2 --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'tilTruncate', +}) +export class TruncatePipe implements PipeTransform { + transform(text: string | null | undefined): string { + text ??= ''; + + const cutoff = 900; + + return text.length <= cutoff ? text : text.substring(0, cutoff) + ' (...)'; + } +} diff --git a/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.scam.ts b/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.scam.ts new file mode 100644 index 0000000..d9cc07b --- /dev/null +++ b/libs/publications/feature-this-is-angular/src/lib/truncate/truncate.scam.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { TruncatePipe } from './truncate.pipe'; + +@NgModule({ + declarations: [TruncatePipe], + exports: [TruncatePipe], +}) +export class TruncateScam {}