diff --git a/aio/.eslintrc.json b/aio/.eslintrc.json new file mode 100644 index 0000000000..2f94590cd8 --- /dev/null +++ b/aio/.eslintrc.json @@ -0,0 +1,91 @@ +{ + "root": true, + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "tsconfig.json", + "tests/e2e/tsconfig.json" + ], + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/ng-cli-compat", + "plugin:@angular-eslint/ng-cli-compat--formatting-add-on", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@typescript-eslint/ban-types": "error", + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "aio", + "style": "kebab-case" + } + ], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "aio", + "style": "camelCase" + } + ], + "dot-notation": "error", + "indent": "off", + "@typescript-eslint/member-delimiter-style": ["error", { + "singleline": { + "delimiter": "comma", + "requireLast": false + } + }], + "@typescript-eslint/member-ordering": "off", + "@typescript-eslint/naming-convention": "off", + "no-console": ["error", {"allow": ["log", "warn", "error"]}], + "no-empty-function": "off", + "no-restricted-syntax": [ + "error", + { + "selector": "CallExpression[callee.name=/^(fdescribe|fit)$/]", + "message": "Don't keep jasmine focus methods." + } + ], + "no-shadow": "off", + "@typescript-eslint/no-shadow": ["error"], + "no-tabs": "error", + "no-underscore-dangle": "off", + "no-unused-expressions": "error", + "no-use-before-define": "off", + "prefer-arrow/prefer-arrow-functions": "off", + "quotes": "off", + "@typescript-eslint/quotes": ["error", "single", {"avoidEscape": true}], + "semi": "error" + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended" + ], + "rules": { + "@angular-eslint/template/accessibility-alt-text": "error", + "@angular-eslint/template/accessibility-elements-content": "error", + "@angular-eslint/template/accessibility-label-has-associated-control": "error", + "@angular-eslint/template/accessibility-table-scope": "error", + "@angular-eslint/template/accessibility-valid-aria": "error", + "@angular-eslint/template/click-events-have-key-events": "error", + "@angular-eslint/template/eqeqeq": "off", + "@angular-eslint/template/mouse-events-have-key-events": "error", + "@angular-eslint/template/no-autofocus": "error", + "@angular-eslint/template/no-distracting-elements": "error", + "@angular-eslint/template/no-positive-tabindex": "error" + } + } + ] +} diff --git a/aio/angular.json b/aio/angular.json index 513d7eef7f..215aa49ea4 100644 --- a/aio/angular.json +++ b/aio/angular.json @@ -196,16 +196,12 @@ } }, "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "builder": "@angular-eslint/builder:lint", "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "tsconfig.worker.json", - "tests/e2e/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**" + "lintFilePatterns": [ + "src/!(generated)/**/*.ts", + "src/!(generated)/**/*.html", + "tests/**/*.ts" ] } }, diff --git a/aio/content/file-not-found.md b/aio/content/file-not-found.md index b8a0ff887f..02b880dd99 100644 --- a/aio/content/file-not-found.md +++ b/aio/content/file-not-found.md @@ -1,6 +1,6 @@
- + not found

Page Not Found

We're sorry. The page you are looking for cannot be found.

diff --git a/aio/package.json b/aio/package.json index 371e27b460..d789f5af43 100644 --- a/aio/package.json +++ b/aio/package.json @@ -105,6 +105,10 @@ }, "devDependencies": { "@angular-devkit/build-angular": "12.1.1", + "@angular-eslint/builder": "12.2.2", + "@angular-eslint/eslint-plugin": "12.2.2", + "@angular-eslint/eslint-plugin-template": "12.2.2", + "@angular-eslint/template-parser": "12.2.2", "@angular/cli": "12.1.1", "@angular/compiler-cli": "12.1.1", "@swc/cli": "^0.1.36", @@ -114,6 +118,8 @@ "@types/node": "^12.7.9", "@types/stemmer": "^1.0.2", "@types/xregexp": "^4.3.0", + "@typescript-eslint/eslint-plugin": "4.23.0", + "@typescript-eslint/parser": "4.23.0", "@yarnpkg/lockfile": "^1.1.0", "archiver": "^5.3.0", "assert": "^2.0.0", @@ -127,8 +133,11 @@ "dgeni-packages": "^0.29.1", "entities": "^2.2.0", "esbuild": "^0.12.0", - "eslint": "^7.23.0", + "eslint": "^7.26.0", + "eslint-plugin-import": "^2.23.4", "eslint-plugin-jasmine": "^4.1.2", + "eslint-plugin-jsdoc": "^35.4.3", + "eslint-plugin-prefer-arrow": "^1.2.3", "find-free-port": "^2.0.0", "firebase-tools": "^9.8.0", "fs-extra": "^10.0.0", diff --git a/aio/src/404-body.html b/aio/src/404-body.html index a41585acb3..3e48190479 100644 --- a/aio/src/404-body.html +++ b/aio/src/404-body.html @@ -27,7 +27,7 @@
- + not found

Resource Not Found

We're sorry. The resource you are looking for cannot be found.

diff --git a/aio/src/app/app.component.spec.ts b/aio/src/app/app.component.spec.ts index 18385db24a..b3f2718d67 100644 --- a/aio/src/app/app.component.spec.ts +++ b/aio/src/app/app.component.spec.ts @@ -589,7 +589,7 @@ describe('AppComponent', () => { }); describe('restrainScrolling()', () => { - const preventedScrolling = (currentTarget: object, deltaY: number) => { + const preventedScrolling = (currentTarget: { scrollTop: number, scrollHeight?: number, clientHeight?: number }, deltaY: number) => { const evt = { deltaY, currentTarget, @@ -1311,7 +1311,6 @@ class TestHttpClient { { title: 'v2', url: 'https://v2.angular.io' } ]; - // tslint:disable:quotemark navJson = { TopBar: [ { diff --git a/aio/src/app/app.module.ts b/aio/src/app/app.module.ts index 4a27d5b562..c81ccecec4 100644 --- a/aio/src/app/app.module.ts +++ b/aio/src/app/app.module.ts @@ -47,7 +47,7 @@ import { SwUpdatesModule } from 'app/sw-updates/sw-updates.module'; import { environment } from '../environments/environment'; // These are the hardcoded inline svg sources to be used by the `` component. -// tslint:disable: max-line-length +/* eslint-disable max-len */ export const svgIconProviders = [ { provide: SVG_ICONS, @@ -145,7 +145,7 @@ export const svgIconProviders = [ multi: true, }, ]; -// tslint:enable: max-line-length +/* eslint-enable max-len */ @NgModule({ imports: [ diff --git a/aio/src/app/custom-elements/api/api-list.component.spec.ts b/aio/src/app/custom-elements/api/api-list.component.spec.ts index c12aa9f5c2..1f79d2e600 100644 --- a/aio/src/app/custom-elements/api/api-list.component.spec.ts +++ b/aio/src/app/custom-elements/api/api-list.component.spec.ts @@ -29,7 +29,8 @@ describe('ApiListComponent', () => { }); /** - * Expectation Utility: Assert that filteredSections has the expected result for this test + * Expectation Utility: Assert that filteredSections has the expected result for this test. + * * @param itemTest - return true if the item passes the match test * * Subscibes to `filteredSections` and performs expectation within subscription callback. @@ -220,7 +221,6 @@ class TestApiService { sections = this.sectionsSubject.asObservable(); } -// tslint:disable:quotemark const apiSections: ApiSection[] = [ { name: 'common', diff --git a/aio/src/app/custom-elements/code/code-example.component.spec.ts b/aio/src/app/custom-elements/code/code-example.component.spec.ts index 91d6dc673d..56d5598aeb 100644 --- a/aio/src/app/custom-elements/code/code-example.component.spec.ts +++ b/aio/src/app/custom-elements/code/code-example.component.spec.ts @@ -33,7 +33,7 @@ describe('CodeExampleComponent', () => { }); it('should be able to capture the code snippet provided in content', () => { - expect(codeExampleComponent.aioCode.code.trim()).toBe(`const foo = "bar";`); + expect(codeExampleComponent.aioCode.code.trim()).toBe('const foo = "bar";'); }); it('should clean-up the projected code snippet once captured', () => { @@ -98,7 +98,7 @@ describe('CodeExampleComponent', () => { ` }) class HostComponent { - code = `const foo = "bar";`; + code = 'const foo = "bar";'; header = 'Great Example'; path = 'code-path'; hidecopy: boolean | string = false; diff --git a/aio/src/app/custom-elements/code/code-example.component.ts b/aio/src/app/custom-elements/code/code-example.component.ts index c7219edac1..6a01e9b13b 100644 --- a/aio/src/app/custom-elements/code/code-example.component.ts +++ b/aio/src/app/custom-elements/code/code-example.component.ts @@ -1,4 +1,4 @@ -/* tslint:disable component-selector */ +/* eslint-disable @angular-eslint/component-selector */ import { Component, HostBinding, ElementRef, ViewChild, Input, AfterViewInit } from '@angular/core'; import { CodeComponent } from './code.component'; @@ -32,7 +32,7 @@ import { CodeComponent } from './code.component'; `, }) export class CodeExampleComponent implements AfterViewInit { - classes: {}; + classes: { 'headed-code': boolean, 'simple-code': boolean }; @Input() language: string; @@ -67,11 +67,13 @@ export class CodeExampleComponent implements AfterViewInit { get hidecopy(): boolean { return this._hidecopy; } private _hidecopy: boolean; + /* eslint-disable-next-line @angular-eslint/no-input-rename */ @Input('hide-copy') set hyphenatedHideCopy(hidecopy: boolean) { this.hidecopy = hidecopy; } + /* eslint-disable-next-line @angular-eslint/no-input-rename */ @Input('hideCopy') set capitalizedHideCopy(hidecopy: boolean) { this.hidecopy = hidecopy; diff --git a/aio/src/app/custom-elements/code/code-tabs.component.ts b/aio/src/app/custom-elements/code/code-tabs.component.ts index 3ed2cc6d11..1a0e5adb80 100644 --- a/aio/src/app/custom-elements/code/code-tabs.component.ts +++ b/aio/src/app/custom-elements/code/code-tabs.component.ts @@ -1,4 +1,4 @@ -/* tslint:disable component-selector */ +/* eslint-disable @angular-eslint/component-selector */ import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { CodeComponent } from './code.component'; diff --git a/aio/src/app/custom-elements/code/code.component.spec.ts b/aio/src/app/custom-elements/code/code.component.spec.ts index f223af7f44..d7914e7918 100644 --- a/aio/src/app/custom-elements/code/code.component.spec.ts +++ b/aio/src/app/custom-elements/code/code.component.spec.ts @@ -290,7 +290,6 @@ describe('CodeComponent', () => { }); //// Test helpers //// -// tslint:disable:member-ordering @Component({ selector: 'aio-host-comp', template: ` diff --git a/aio/src/app/custom-elements/code/code.component.ts b/aio/src/app/custom-elements/code/code.component.ts index a3b40df5ae..44ad422767 100644 --- a/aio/src/app/custom-elements/code/code.component.ts +++ b/aio/src/app/custom-elements/code/code.component.ts @@ -120,7 +120,7 @@ export class CodeComponent implements OnChanges { .pipe(tap(formattedCode => this.setCodeHtml(formattedCode))); if (linenums !== false && this.language === 'none') { - this.logger.warn(`Using 'linenums' with 'language: none' is currently not supported.`); + this.logger.warn("Using 'linenums' with 'language: none' is currently not supported."); } ((this.language === 'none' ? skipPrettify : prettifyCode) as Observable) diff --git a/aio/src/app/custom-elements/code/pretty-printer.service.ts b/aio/src/app/custom-elements/code/pretty-printer.service.ts index 0f234dd787..f03616f8e2 100644 --- a/aio/src/app/custom-elements/code/pretty-printer.service.ts +++ b/aio/src/app/custom-elements/code/pretty-printer.service.ts @@ -36,7 +36,8 @@ export class PrettyPrinter { } /** - * Format code snippet as HTML + * Format code snippet as HTML. + * * @param code - the code snippet to format; should already be HTML encoded * @param [language] - The language of the code to render (could be javascript, html, typescript, etc) * @param [linenums] - Whether to display line numbers: diff --git a/aio/src/app/custom-elements/contributor/contributor-list.component.spec.ts b/aio/src/app/custom-elements/contributor/contributor-list.component.spec.ts index ccf426558a..19e6943d6c 100644 --- a/aio/src/app/custom-elements/contributor/contributor-list.component.spec.ts +++ b/aio/src/app/custom-elements/contributor/contributor-list.component.spec.ts @@ -81,7 +81,9 @@ describe('ContributorListComponent', () => { return comp; } - interface SearchResult { [index: string]: string; } + interface SearchResult { + [index: string]: string; + } class TestLocationService { searchResult: SearchResult = {}; diff --git a/aio/src/app/custom-elements/contributor/contributor-list.component.ts b/aio/src/app/custom-elements/contributor/contributor-list.component.ts index a55f631f18..980d3f9186 100644 --- a/aio/src/app/custom-elements/contributor/contributor-list.component.ts +++ b/aio/src/app/custom-elements/contributor/contributor-list.component.ts @@ -4,12 +4,12 @@ import { ContributorService } from './contributor.service'; import { LocationService } from 'app/shared/location.service'; @Component({ - selector: `aio-contributor-list`, + selector: 'aio-contributor-list', template: ` diff --git a/aio/src/app/custom-elements/contributor/contributor.service.ts b/aio/src/app/custom-elements/contributor/contributor.service.ts index 520e15223b..05be2dd9da 100644 --- a/aio/src/app/custom-elements/contributor/contributor.service.ts +++ b/aio/src/app/custom-elements/contributor/contributor.service.ts @@ -37,8 +37,7 @@ export class ContributorService { }), // Flatten group map into sorted group array of sorted contributors - map(cmap => { - return Object.keys(cmap).map(key => { + map(cmap => Object.keys(cmap).map(key => { const order = knownGroups.indexOf(key); return { name: key, @@ -46,8 +45,8 @@ export class ContributorService { contributors: cmap[key].sort(compareContributors) } as ContributorGroup; }) - .sort(compareGroups); - }), + .sort(compareGroups) + ), publishLast(), ); diff --git a/aio/src/app/custom-elements/live-example/live-example.component.spec.ts b/aio/src/app/custom-elements/live-example/live-example.component.spec.ts index 1225c9e2e0..de3741096a 100644 --- a/aio/src/app/custom-elements/live-example/live-example.component.spec.ts +++ b/aio/src/app/custom-elements/live-example/live-example.component.spec.ts @@ -17,7 +17,7 @@ describe('LiveExampleComponent', () => { @Component({ selector: 'aio-host-comp', - template: `` + template: '' }) class HostComponent { } diff --git a/aio/src/app/custom-elements/live-example/live-example.component.ts b/aio/src/app/custom-elements/live-example/live-example.component.ts index d5c6246a3f..d8390c560d 100644 --- a/aio/src/app/custom-elements/live-example/live-example.component.ts +++ b/aio/src/app/custom-elements/live-example/live-example.component.ts @@ -1,4 +1,4 @@ -/* tslint:disable component-selector */ +/* eslint-disable @angular-eslint/component-selector */ import { AfterContentInit, AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core'; import { Location } from '@angular/common'; import { CONTENT_URL_PREFIX } from 'app/documents/document.service'; @@ -136,7 +136,7 @@ export class LiveExampleComponent implements AfterContentInit { */ @Component({ selector: 'aio-embedded-stackblitz', - template: ``, + template: '', styles: [ 'iframe { min-height: 400px; }' ] }) export class EmbeddedStackblitzComponent implements AfterViewInit { diff --git a/aio/src/app/custom-elements/resource/resource-list.component.html b/aio/src/app/custom-elements/resource/resource-list.component.html index d26938d462..0ac703950d 100644 --- a/aio/src/app/custom-elements/resource/resource-list.component.html +++ b/aio/src/app/custom-elements/resource/resource-list.component.html @@ -8,9 +8,7 @@
- -

{{subCategory.title}}

- +

{{subCategory.title}}

diff --git a/aio/src/app/custom-elements/resource/resource-list.component.spec.ts b/aio/src/app/custom-elements/resource/resource-list.component.spec.ts index 11c31ff241..06ba2477e3 100644 --- a/aio/src/app/custom-elements/resource/resource-list.component.spec.ts +++ b/aio/src/app/custom-elements/resource/resource-list.component.spec.ts @@ -86,7 +86,9 @@ describe('ResourceListComponent', () => { categories = of(this.testCategories); } - interface SearchResult { [index: string]: string; } + interface SearchResult { + [index: string]: string; + } class TestLocationService { searchResult: SearchResult = {}; diff --git a/aio/src/app/custom-elements/resource/resource-list.component.ts b/aio/src/app/custom-elements/resource/resource-list.component.ts index 63be0ec155..9393c16c37 100644 --- a/aio/src/app/custom-elements/resource/resource-list.component.ts +++ b/aio/src/app/custom-elements/resource/resource-list.component.ts @@ -4,7 +4,6 @@ import { Category } from './resource.model'; import { ResourceService } from './resource.service'; import { LocationService } from 'app/shared/location.service'; -/* tslint:disable:template-accessibility-elements-content */ @Component({ selector: 'aio-resource-list', templateUrl: 'resource-list.component.html' diff --git a/aio/src/app/documents/document.service.spec.ts b/aio/src/app/documents/document.service.spec.ts index 6ea5132a6c..62f5d2e774 100644 --- a/aio/src/app/documents/document.service.spec.ts +++ b/aio/src/app/documents/document.service.spec.ts @@ -93,7 +93,7 @@ describe('DocumentService', () => { expect(logger.output.error).toEqual([ [jasmine.any(Error)] ]); - expect(logger.output.error[0][0].message).toEqual(`Document file not found at 'missing/doc'`); + expect(logger.output.error[0][0].message).toEqual("Document file not found at 'missing/doc'"); // Subsequent request for not-found document. logger.output.error = []; @@ -134,7 +134,7 @@ describe('DocumentService', () => { [jasmine.any(Error)] ]); expect(logger.output.error[0][0].message) - .toEqual(`Error fetching document 'initial/doc': (Http failure response for generated/docs/initial/doc.json: 500 Server Error)`); + .toEqual("Error fetching document 'initial/doc': (Http failure response for generated/docs/initial/doc.json: 500 Server Error)"); locationService.go('new/doc'); httpMock.expectOne({}).flush(doc1); diff --git a/aio/src/app/documents/document.service.ts b/aio/src/app/documents/document.service.ts index 872f8b6205..a9ff6a6805 100644 --- a/aio/src/app/documents/document.service.ts +++ b/aio/src/app/documents/document.service.ts @@ -67,9 +67,9 @@ export class DocumentService { throw Error('Invalid data'); } }), - catchError((error: HttpErrorResponse) => { - return error.status === 404 ? this.getFileNotFoundDoc(id) : this.getErrorDoc(id, error); - }), + catchError((error: HttpErrorResponse) => + error.status === 404 ? this.getFileNotFoundDoc(id) : this.getErrorDoc(id, error) + ), ) .subscribe(subject); diff --git a/aio/src/app/layout/doc-viewer/doc-viewer.component.ts b/aio/src/app/layout/doc-viewer/doc-viewer.component.ts index dcab6be9c3..b1610c7c78 100644 --- a/aio/src/app/layout/doc-viewer/doc-viewer.component.ts +++ b/aio/src/app/layout/doc-viewer/doc-viewer.component.ts @@ -62,12 +62,12 @@ export class DocViewerComponent implements OnDestroy { @Output() docRendered = new EventEmitter(); constructor( - elementRef: ElementRef, - private logger: Logger, - private titleService: Title, - private metaService: Meta, - private tocService: TocService, - private elementsLoader: ElementsLoader) { + elementRef: ElementRef, + private logger: Logger, + private titleService: Title, + private metaService: Meta, + private tocService: TocService, + private elementsLoader: ElementsLoader) { this.hostElement = elementRef.nativeElement; // Security: the initialDocViewerContent comes from the prerendered DOM and is considered to be secure this.hostElement.innerHTML = initialDocViewerContent; @@ -311,7 +311,7 @@ async function printSwDebugInfo(): Promise { async function getCacheEntries( name: string, includeValues: boolean, - ignoredKeys: string[] = []): Promise<{key: string, value?: object}[]> { + ignoredKeys: string[] = []): Promise<{key: string, value?: unknown}[]> { const ignoredUrls = new Set(ignoredKeys.map(key => new Request(key).url)); const cache = await caches.open(name); @@ -324,7 +324,7 @@ async function printSwDebugInfo(): Promise { return entries; } - function printCacheEntries(name: string, entries: {key: string, value?: object}[]): void { + function printCacheEntries(name: string, entries: {key: string, value?: unknown}[]): void { const entriesStr = entries .map(({key, value}) => ` - ${key}${!value ? '' : `: ${JSON.stringify(value)}`}`) .join('\n'); diff --git a/aio/src/app/layout/mode-banner/mode-banner.component.ts b/aio/src/app/layout/mode-banner/mode-banner.component.ts index efc0e229cd..759dcc5c38 100644 --- a/aio/src/app/layout/mode-banner/mode-banner.component.ts +++ b/aio/src/app/layout/mode-banner/mode-banner.component.ts @@ -4,7 +4,7 @@ import { VersionInfo } from 'app/navigation/navigation.service'; @Component({ selector: 'aio-mode-banner', template: ` -
+ diff --git a/aio/src/app/search/search-box/search-box.component.ts b/aio/src/app/search/search-box/search-box.component.ts index 741df09dd1..eefcc19eb1 100644 --- a/aio/src/app/search/search-box/search-box.component.ts +++ b/aio/src/app/search/search-box/search-box.component.ts @@ -30,9 +30,9 @@ export class SearchBoxComponent implements AfterViewInit { private searchSubject = new Subject(); @ViewChild('searchBox', { static: true }) searchBox: ElementRef; - // tslint:disable-next-line: no-output-on-prefix + // eslint-disable-next-line @angular-eslint/no-output-on-prefix @Output() onSearch = this.searchSubject.pipe(distinctUntilChanged(), debounceTime(this.searchDebounce)); - // tslint:disable-next-line: no-output-on-prefix + // eslint-disable-next-line @angular-eslint/no-output-on-prefix @Output() onFocus = new EventEmitter(); constructor(private locationService: LocationService) { } diff --git a/aio/src/app/search/search.service.ts b/aio/src/app/search/search.service.ts index 280ffc7141..52c69471f4 100644 --- a/aio/src/app/search/search.service.ts +++ b/aio/src/app/search/search.service.ts @@ -27,7 +27,6 @@ export class SearchService { .pipe( concatMap(() => { // Create the worker and load the index - // tslint:disable-next-line: whitespace const worker = new Worker(new URL('./search.worker', import.meta.url), { type: 'module' }); this.worker = WebWorkerClient.create(worker, this.zone); return this.worker.sendMessage('load-index'); @@ -42,6 +41,7 @@ export class SearchService { /** * Search the index using the given query and emit results on the observable that is returned. + * * @param query The query to run against the index. * @returns an observable collection of search results */ diff --git a/aio/src/app/shared/attribute-utils.spec.ts b/aio/src/app/shared/attribute-utils.spec.ts index 25246a4ea9..50e0abf14f 100644 --- a/aio/src/app/shared/attribute-utils.spec.ts +++ b/aio/src/app/shared/attribute-utils.spec.ts @@ -7,7 +7,7 @@ describe('Attribute Utilities', () => { beforeEach(() => { const div = document.createElement('div'); - div.innerHTML = `
`; + div.innerHTML = '
'; testEl = div.querySelector('div') as HTMLElement; }); diff --git a/aio/src/app/shared/attribute-utils.ts b/aio/src/app/shared/attribute-utils.ts index ddf66e9672..ec732c007a 100644 --- a/aio/src/app/shared/attribute-utils.ts +++ b/aio/src/app/shared/attribute-utils.ts @@ -8,6 +8,7 @@ export interface AttrMap { /** * Get attribute map from element or ElementRef `attributes`. * Attribute map keys are forced lowercase for case-insensitive lookup. + * * @param el The source of the attributes. */ export function getAttrs(el: HTMLElement | ElementRef): AttrMap { @@ -21,6 +22,7 @@ export function getAttrs(el: HTMLElement | ElementRef): AttrMap { /** * Return the attribute that matches `attr`. + * * @param attr Name of the attribute or a string of candidate attribute names. */ export function getAttrValue(attrs: AttrMap, attr: string | string[]): string | undefined { @@ -32,7 +34,8 @@ export function getAttrValue(attrs: AttrMap, attr: string | string[]): string | } /** - * Return the boolean state of an attribute value (if supplied) + * Return the boolean state of an attribute value (if supplied). + * * @param attrValue The string value of some attribute (or undefined if attribute not present). * @param def Default boolean value when attribute is undefined. */ @@ -41,7 +44,8 @@ export function boolFromValue(attrValue: string | undefined, def: boolean = fals } /** - * Return the boolean state of attribute from an element + * Return the boolean state of attribute from an element. + * * @param el The source of the attributes. * @param atty Name of the attribute or a string of candidate attribute names. * @param def Default boolean value when attribute is undefined. diff --git a/aio/src/app/shared/custom-icon-registry.ts b/aio/src/app/shared/custom-icon-registry.ts index 8ad73b2a29..4cc0f04862 100644 --- a/aio/src/app/shared/custom-icon-registry.ts +++ b/aio/src/app/shared/custom-icon-registry.ts @@ -59,11 +59,10 @@ export class CustomIconRegistry extends MatIconRegistry { } private loadSvgElement(iconName: string, namespace?: string): SVGElement | undefined { - const svgIcon = this.svgIcons.find(icon => { - return namespace + const svgIcon = this.svgIcons.find(icon => namespace ? icon.name === iconName && icon.namespace === namespace - : icon.name === iconName; - }); + : icon.name === iconName + ); if (!svgIcon) { return; diff --git a/aio/src/app/shared/location.service.ts b/aio/src/app/shared/location.service.ts index 95c4dd16a1..41d7ff6662 100644 --- a/aio/src/app/shared/location.service.ts +++ b/aio/src/app/shared/location.service.ts @@ -30,9 +30,7 @@ export class LocationService { this.urlSubject.next(location.path(true)); - this.location.subscribe(state => { - return this.urlSubject.next(state.url || ''); - }); + this.location.subscribe(state => this.urlSubject.next(state.url || '')); } /** @@ -79,7 +77,7 @@ export class LocationService { } search() { - const search: { [index: string]: string|undefined; } = {}; + const search: { [index: string]: string|undefined } = {}; const path = this.location.path(); const q = path.indexOf('?'); if (q > -1) { diff --git a/aio/src/app/shared/reporting-error-handler.ts b/aio/src/app/shared/reporting-error-handler.ts index badb88bdff..33a0e947c1 100644 --- a/aio/src/app/shared/reporting-error-handler.ts +++ b/aio/src/app/shared/reporting-error-handler.ts @@ -15,6 +15,7 @@ export class ReportingErrorHandler extends ErrorHandler { /** * Send error info to Google Analytics, in addition to the default handling. + * * @param error Information about the error. */ handleError(error: any) { diff --git a/aio/src/app/shared/scroll.service.ts b/aio/src/app/shared/scroll.service.ts index 43155f1c98..394e52aa45 100644 --- a/aio/src/app/shared/scroll.service.ts +++ b/aio/src/app/shared/scroll.service.ts @@ -113,7 +113,8 @@ export class ScrollService implements OnDestroy { /** * When we load a document, we have to scroll to the correct position depending on whether this is - * a new location, a back/forward in the history, or a refresh + * a new location, a back/forward in the history, or a refresh. + * * @param delay before we scroll to the good position */ scrollAfterRender(delay: number) { diff --git a/aio/src/app/shared/select/select.component.ts b/aio/src/app/shared/select/select.component.ts index 0a8b7edd2f..a854deb6d4 100644 --- a/aio/src/app/shared/select/select.component.ts +++ b/aio/src/app/shared/select/select.component.ts @@ -10,24 +10,18 @@ export interface Option { templateUrl: 'select.component.html' }) export class SelectComponent implements OnInit { - @Input() - selected: Option; + @Input() selected: Option; - @Input() - options: Option[]; + @Input() options: Option[]; - // tslint:disable-next-line: no-output-native - @Output() - change = new EventEmitter<{option: Option, index: number}>(); + // eslint-disable-next-line @angular-eslint/no-output-native + @Output() change = new EventEmitter<{option: Option, index: number}>(); - @Input() - showSymbol = false; + @Input() showSymbol = false; - @Input() - label: string; + @Input() label: string; - @Input() - disabled: boolean; + @Input() disabled: boolean; showOptions = false; diff --git a/aio/src/app/shared/toc.service.spec.ts b/aio/src/app/shared/toc.service.spec.ts index 85a7c8c894..c4e25c996e 100644 --- a/aio/src/app/shared/toc.service.spec.ts +++ b/aio/src/app/shared/toc.service.spec.ts @@ -345,18 +345,16 @@ interface TestSafeHtml extends SafeHtml { class TestDomSanitizer { bypassSecurityTrustHtml = jasmine.createSpy('bypassSecurityTrustHtml') - .and.callFake((html: string) => { - return { - changingThisBreaksApplicationSecurity: html, - getTypeName: () => 'HTML', - } as TestSafeHtml; - }); + .and.callFake((html: string) => ({ + changingThisBreaksApplicationSecurity: html, + getTypeName: () => 'HTML', + } as TestSafeHtml)); } class MockScrollSpyService { private $$lastInfo: { - active: Subject, - unspy: jasmine.Spy, + active: Subject; + unspy: jasmine.Spy; } | undefined; get $lastInfo() { diff --git a/aio/tests/deployment/e2e/site.po.ts b/aio/tests/deployment/e2e/site.po.ts index e1bc0a5037..d7a6beb68a 100644 --- a/aio/tests/deployment/e2e/site.po.ts +++ b/aio/tests/deployment/e2e/site.po.ts @@ -1,4 +1,4 @@ -import { browser, by, element, ExpectedConditions } from 'protractor'; +import { browser, by, element, ElementFinder, ExpectedConditions } from 'protractor'; export class SitePage { /** The base URL with the trailing `/` stripped off (if any). */ @@ -34,7 +34,7 @@ export class SitePage { async getSearchResults() { const results = element.all(by.css('.search-results li')); await browser.wait(ExpectedConditions.presenceOf(results.first()), 8000); - return await results.map(link => link!.getText()); + return await results.map(link => (link as ElementFinder).getText()); } /** diff --git a/aio/tests/e2e/src/api-pages.e2e-spec.ts b/aio/tests/e2e/src/api-pages.e2e-spec.ts index 6a2318fddb..720617c277 100644 --- a/aio/tests/e2e/src/api-pages.e2e-spec.ts +++ b/aio/tests/e2e/src/api-pages.e2e-spec.ts @@ -69,11 +69,11 @@ describe('Api pages', () => { it('should show links to github', async () => { await page.navigateTo('api/core/EventEmitter'); - /* tslint:disable:max-line-length */ + /* eslint-disable max-len */ expect(await page.ghLinks.get(0).getAttribute('href')) .toMatch(/https:\/\/github\.com\/angular\/angular\/edit\/master\/packages\/core\/src\/event_emitter\.ts\?message=docs\(core\)%3A%20describe%20your%20change\.\.\.#L\d+-L\d+/); expect(await page.ghLinks.get(1).getAttribute('href')) .toMatch(/https:\/\/github\.com\/angular\/angular\/tree\/[^/]+\/packages\/core\/src\/event_emitter\.ts#L\d+-L\d+/); - /* tslint:enable:max-line-length */ + /* eslint-enable max-len */ }); }); diff --git a/aio/tests/e2e/src/app.e2e-spec.ts b/aio/tests/e2e/src/app.e2e-spec.ts index 50e77ca67b..0210521216 100644 --- a/aio/tests/e2e/src/app.e2e-spec.ts +++ b/aio/tests/e2e/src/app.e2e-spec.ts @@ -230,15 +230,15 @@ describe('site App', () => { it('should be present on all docs pages', async () => { await page.navigateTo('tutorial/toh-pt1'); expect(await page.ghLinks.count()).toEqual(1); - /* tslint:disable:max-line-length */ + /* eslint-disable max-len */ expect(await page.ghLinks.get(0).getAttribute('href')) .toMatch(/https:\/\/github\.com\/angular\/angular\/edit\/master\/aio\/content\/tutorial\/toh-pt1\.md\?message=docs%3A%20describe%20your%20change\.\.\./); await page.navigateTo('guide/router'); expect(await page.ghLinks.count()).toEqual(1); - /* tslint:disable:max-line-length */ expect(await page.ghLinks.get(0).getAttribute('href')) .toMatch(/https:\/\/github\.com\/angular\/angular\/edit\/master\/aio\/content\/guide\/router\.md\?message=docs%3A%20describe%20your%20change\.\.\./); + /* eslint-enable max-len */ }); it('should not be present on top level pages', async () => { diff --git a/aio/tests/e2e/src/pwa-manifest.po.ts b/aio/tests/e2e/src/pwa-manifest.po.ts index 5cd1932d20..be31e70110 100644 --- a/aio/tests/e2e/src/pwa-manifest.po.ts +++ b/aio/tests/e2e/src/pwa-manifest.po.ts @@ -12,7 +12,7 @@ export type Json = null | boolean | number | string | Json[] | { [key: string]: * See https://developer.mozilla.org/en-US/docs/Web/Manifest. */ export type PwaManifest = Json & { - shortcuts?: PwaShortcutItem[], + shortcuts?: PwaShortcutItem[]; }; /** @@ -20,11 +20,11 @@ export type PwaManifest = Json & { * See https://developer.mozilla.org/en-US/docs/Web/Manifest/shortcuts. */ export type PwaShortcutItem = Json & { - url: string, - name: string, - short_name?: string, - description?: string, - icons?: PwaImageResource[], + url: string; + name: string; + short_name?: string; + description?: string; + icons?: PwaImageResource[]; }; /** @@ -33,10 +33,10 @@ export type PwaShortcutItem = Json & { * See https://w3c.github.io/manifest/#manifestimageresource-and-its-members. */ export type PwaImageResource = Json & { - src: string, - sizes?: string, - type?: string, - purpose?: string, + src: string; + sizes?: string; + type?: string; + purpose?: string; }; diff --git a/aio/tools/transforms/angular-api-package/mocks/methodParameters.ts b/aio/tools/transforms/angular-api-package/mocks/methodParameters.ts index 2772938049..acf63449d2 100644 --- a/aio/tools/transforms/angular-api-package/mocks/methodParameters.ts +++ b/aio/tools/transforms/angular-api-package/mocks/methodParameters.ts @@ -1,8 +1,9 @@ +/* eslint-disable no-unused-vars */ export class TestClass { method1( /** description of param1 */ param1: number, /** description of param2 */ param2?: string, - /** description of param3 */ param3: object = {}, + /** description of param3 */ param3: unknown = {}, /** description of param4 */ param4 = 'default string', ) { /// @@ -10,6 +11,7 @@ export class TestClass { /** * Some description of method 2 + * * @param param5 description of param5 * @param param6 description of param6 * @param param7 description of param7 diff --git a/aio/tools/transforms/angular-api-package/mocks/testSrc.ts b/aio/tools/transforms/angular-api-package/mocks/testSrc.ts index 8a0dcd7343..80c95983bf 100644 --- a/aio/tools/transforms/angular-api-package/mocks/testSrc.ts +++ b/aio/tools/transforms/angular-api-package/mocks/testSrc.ts @@ -22,13 +22,14 @@ export * from './importedSrc'; * This is MyClass */ export class MyClass { - message: String; + message: string; /** * Create a new MyClass - * @param {String} name The name to say hello to + * + * @param name The name to say hello to */ - constructor(name) { this.message = 'hello ' + name; } + constructor(name: string) { this.message = 'hello ' + name; } /** * Return a greeting message diff --git a/aio/tslint.json b/aio/tslint.json deleted file mode 100644 index 1fd7816557..0000000000 --- a/aio/tslint.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "extends": "tslint:recommended", - "rulesDirectory": [ - "codelyzer" - ], - "rules": { - "align": { - "options": [ - "parameters", - "statements" - ] - }, - "array-type": false, - "arrow-return-shorthand": true, - "ban": [ - true, - {"name": "fdescribe", "message": "Don't keep jasmine focus methods."}, - {"name": "fit", "message": "Don't keep jasmine focus methods."} - ], - "curly": true, - "deprecation": { - "severity": "warning" - }, - "eofline": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": { - "options": [ - "spaces" - ] - }, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "quotemark": [ - true, - "single" - ], - "semicolon": { - "options": [ - "always" - ] - }, - "space-before-function-paren": { - "options": { - "anonymous": "never", - "asyncArrow": "always", - "constructor": "never", - "method": "never", - "named": "never" - } - }, - // TODO(gkalpak): Fix the code and enable this to align with CLI. (Failures: 243) - // "typedef": [ - // true, - // "call-signature" - // ], - "typedef-whitespace": { - "options": [ - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ] - }, - "variable-name": { - "options": [ - "ban-keywords", - "check-format", - "allow-leading-underscore", - "allow-pascal-case", - "require-const-for-all-caps" - ] - }, - "whitespace": { - "options": [ - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type", - "check-typecast" - ] - }, - "component-class-suffix": true, - "contextual-lifecycle": true, - "directive-class-suffix": true, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, - "no-output-on-prefix": true, - "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-accessibility-alt-text": true, - "template-accessibility-elements-content": true, - "template-accessibility-label-for": true, - "template-accessibility-tabindex-no-positive": true, - "template-accessibility-table-scope": true, - "template-accessibility-valid-aria": true, - "template-banana-in-box": true, - "template-click-events-have-key-events": true, - "template-mouse-events-have-key-events": true, - "template-no-autofocus": true, - "template-no-distracting-elements": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "directive-selector": [ - true, - "attribute", - "aio", - "camelCase" - ], - "component-selector": [ - true, - "element", - "aio", - "kebab-case" - ] - } -} diff --git a/aio/yarn.lock b/aio/yarn.lock index 4a8c982504..14691e2c5d 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -123,6 +123,36 @@ ora "5.4.1" rxjs "6.6.7" +"@angular-eslint/builder@12.2.2": + version "12.2.2" + resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-12.2.2.tgz#3feedd73b7c97ef9fab41de0c0b4962385220864" + integrity sha512-V5p0cxlbBNpZQqsbGNq5Qtt061DvZE2lzIb9Yoq1jP+wcv/PuDvkVz2ik5sJqaOaMaQOSXT+jI5Iq+w0XNkPmQ== + dependencies: + "@nrwl/devkit" ">= 12.0.0 < 13.0.0" + +"@angular-eslint/eslint-plugin-template@12.2.2": + version "12.2.2" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.2.2.tgz#4073a1e7a306f8c8f14893ab207ea0860c98e201" + integrity sha512-BZUjo1jFboNUEGE3XauWLBgxOoQpstwnPm9gRl8sr+g9SdhMsI+xvwCPhNzbrDYNayBwP/XRPLWmMc+zEzmoog== + dependencies: + "@typescript-eslint/experimental-utils" "4.23.0" + aria-query "^4.2.2" + axobject-query "^2.2.0" + +"@angular-eslint/eslint-plugin@12.2.2": + version "12.2.2" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-12.2.2.tgz#11f975a6fd23f3cfc559d201a0e3d1cc2dd4c8c1" + integrity sha512-n1dIoXCjEZj8nZOLR2i+/Q87JZ9cm/UgGZ/17UXHMZBo03b+kh9iiabPzLzmIphcI1IQIWAfhH/41YIqBER7vw== + dependencies: + "@typescript-eslint/experimental-utils" "4.23.0" + +"@angular-eslint/template-parser@12.2.2": + version "12.2.2" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-12.2.2.tgz#5a024d06f46dc3f94001c558f999a5dd855f9ed0" + integrity sha512-Tm8xhBd0k+wb8hT+8oq6moFaFQm5tpFFNjIu1kTLcva4cJoRFdNBPDX3IHVOGThb/9VSXDS4So4P2aXMeszCvQ== + dependencies: + eslint-scope "^5.1.0" + "@angular/animations@12.1.1": version "12.1.1" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.1.1.tgz#7da62f1c753e9d3e6f4ada9ef8f4dd97795265b5" @@ -1120,7 +1150,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime-corejs3@^7.12.1": +"@babel/runtime-corejs3@^7.10.2", "@babel/runtime-corejs3@^7.12.1": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz#0ef292bbce40ca00f874c9724ef175a12476465c" integrity sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA== @@ -1128,7 +1158,7 @@ core-js-pure "^3.15.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.14.6", "@babel/runtime@^7.8.4": +"@babel/runtime@7.14.6", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== @@ -1186,6 +1216,15 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== +"@es-joy/jsdoccomment@^0.9.0-alpha.1": + version "0.9.0-alpha.1" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz#f48bd162e185ec7f9f222273a282d10e52fe52f7" + integrity sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA== + dependencies: + comment-parser "1.1.6-beta.0" + esquery "^1.4.0" + jsdoc-type-pratt-parser "1.0.4" + "@eslint/eslintrc@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" @@ -1392,6 +1431,33 @@ node-gyp "^7.1.0" read-package-json-fast "^2.0.1" +"@nrwl/devkit@>= 12.0.0 < 13.0.0": + version "12.5.8" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-12.5.8.tgz#0450f9d2bb614fcc478086d1529e37ed91d9c884" + integrity sha512-Rhcx8fU30qfoaCMrMUND5lZIDu/0Fik26dE3flgKRgfeGprPSctq/w/k81+HJy7inGVvis20JBSeYH1HSPcePw== + dependencies: + "@nrwl/tao" "12.5.8" + ejs "^3.1.5" + ignore "^5.0.4" + semver "7.3.4" + tslib "^2.0.0" + +"@nrwl/tao@12.5.8": + version "12.5.8" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-12.5.8.tgz#20bde1f54210fb1d0a60f1814b5b1b6578169f7d" + integrity sha512-sbVxUnnZMLAFFwbEE/dx4W7U4fUKW5pTIIzlnNuzzTn8KDN3rAON6KqXF+KR/Ny9cGlmkBKlWSq8PvhUrSaZvw== + dependencies: + chalk "4.1.0" + enquirer "~2.3.6" + fs-extra "^9.1.0" + jsonc-parser "3.0.0" + rxjs "^6.5.4" + rxjs-for-await "0.0.2" + semver "7.3.4" + tmp "~0.2.1" + tslib "^2.0.0" + yargs-parser "20.0.0" + "@opentelemetry/api@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.1.tgz#03c72f548431da5820a0c8864d1401e348e7e79f" @@ -1664,7 +1730,7 @@ resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.8.1.tgz#8feebf4035d1e4c6a6ed4d27f3bbd285d8d0da91" integrity sha512-ioRNoJvv0eXL1c9BZKpnywZWb5YflhaSiF3IOp9deyoh30MOwkB3bNuzi4UW76EFEhcmqpoEpdWhcUAAilomTw== -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": version "7.0.8" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== @@ -1770,6 +1836,76 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.23.0.tgz#29d3c9c81f6200b1fd6d8454cfb007ba176cde80" + integrity sha512-tGK1y3KIvdsQEEgq6xNn1DjiFJtl+wn8JJQiETtCbdQxw1vzjXyAaIkEmO2l6Nq24iy3uZBMFQjZ6ECf1QdgGw== + dependencies: + "@typescript-eslint/experimental-utils" "4.23.0" + "@typescript-eslint/scope-manager" "4.23.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz#f2059434cd6e5672bfeab2fb03b7c0a20622266f" + integrity sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.23.0" + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/typescript-estree" "4.23.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.23.0.tgz#239315d38e42e852bef43a4b0b01bef78f78911c" + integrity sha512-wsvjksHBMOqySy/Pi2Q6UuIuHYbgAMwLczRl4YanEPKW5KVxI9ZzDYh3B5DtcZPQTGRWFJrfcbJ6L01Leybwug== + dependencies: + "@typescript-eslint/scope-manager" "4.23.0" + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/typescript-estree" "4.23.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz#8792ef7eacac122e2ec8fa2d30a59b8d9a1f1ce4" + integrity sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w== + dependencies: + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/visitor-keys" "4.23.0" + +"@typescript-eslint/types@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.23.0.tgz#da1654c8a5332f4d1645b2d9a1c64193cae3aa3b" + integrity sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw== + +"@typescript-eslint/typescript-estree@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz#0753b292097523852428a6f5a1aa8ccc1aae6cd9" + integrity sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw== + dependencies: + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/visitor-keys" "4.23.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz#7215cc977bd3b4ef22467b9023594e32f9e4e455" + integrity sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg== + dependencies: + "@typescript-eslint/types" "4.23.0" + eslint-visitor-keys "^2.0.0" + "@webassemblyjs/ast@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" @@ -2255,6 +2391,14 @@ aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +aria-query@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" + integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== + dependencies: + "@babel/runtime" "^7.10.2" + "@babel/runtime-corejs3" "^7.10.2" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -2285,6 +2429,17 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2307,6 +2462,15 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -2390,6 +2554,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + async@^1.3.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -2417,6 +2586,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2462,6 +2636,11 @@ axobject-query@2.0.2: dependencies: ast-types-flow "0.0.7" +axobject-query@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" + integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + babel-loader@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2948,6 +3127,14 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -3385,6 +3572,11 @@ commander@^7.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +comment-parser@1.1.6-beta.0: + version "1.1.6-beta.0" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.6-beta.0.tgz#57e503b18d0a5bd008632dcc54b1f95c2fffe8f6" + integrity sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -3976,14 +4168,14 @@ date-format@^3.0.0: resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== -debug@2.6.9, debug@^2.0.0, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.0.0, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@~4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -3997,7 +4189,7 @@ debug@4.3.1: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.1.1, debug@^3.2.6: +debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4274,6 +4466,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -4438,6 +4637,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^3.1.5: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + electron-to-chromium@^1.3.723: version "1.3.775" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.775.tgz#046517d1f2cea753e06fff549995b9dc45e20082" @@ -4515,7 +4721,7 @@ enhanced-resolve@5.8.2, enhanced-resolve@^5.8.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6, enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -4566,7 +4772,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: version "1.18.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== @@ -4709,12 +4915,69 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.23.4: + version "2.23.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" + integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.1" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.4.0" + minimatch "^3.0.4" + object.values "^1.1.3" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.9.0" + eslint-plugin-jasmine@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.2.tgz#50cc20d603b02b37727f8d174d4b83b9b8ef25a5" integrity sha512-Jr52EBi6Ql5WVDvRCKBID9kRD6/CaObvCWmgHpqobczX2Mzt8/QMu9vpgx6q/O5jyQ9CIGrKaEbPuEfHRf8guw== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-plugin-jsdoc@^35.4.3: + version "35.4.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.4.3.tgz#54deb74b0f53bda4bda5ee1ccfd0deace71c8943" + integrity sha512-hBEn+VNjVX0IKoZ2OdZs0Z1fU8CqZkBSzLqD8ZpwZEamrdi2TUgKvujvETe8gXYQ/67hpRtbR5iPFTgmWpRevw== + dependencies: + "@es-joy/jsdoccomment" "^0.9.0-alpha.1" + comment-parser "1.1.6-beta.0" + debug "^4.3.2" + esquery "^1.4.0" + jsdoc-type-pratt-parser "^1.0.4" + lodash "^4.17.21" + regextras "^0.8.0" + semver "^7.3.5" + spdx-expression-parse "^3.0.1" + +eslint-plugin-prefer-arrow@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz#e7fbb3fa4cd84ff1015b9c51ad86550e55041041" + integrity sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ== + +eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4722,7 +4985,7 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.1.0: +eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== @@ -4739,7 +5002,7 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.17.0, eslint@^7.23.0: +eslint@^7.17.0, eslint@^7.26.0: version "7.30.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== @@ -5172,6 +5435,13 @@ file-uri-to-path@2: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== +filelist@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" + integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ== + dependencies: + minimatch "^3.0.4" + filesize@^6.1.0: version "6.4.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" @@ -5221,6 +5491,13 @@ find-free-port@^2.0.0: resolved "https://registry.yarnpkg.com/find-free-port/-/find-free-port-2.0.0.tgz#4b22e5f6579eb1a38c41ac6bcb3efed1b6da9b1b" integrity sha1-SyLl9leesaOMQaxryz7+0bbamxs= +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -5425,6 +5702,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -5673,7 +5960,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@^11.0.3: +globby@^11.0.1, globby@^11.0.3: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -6235,7 +6522,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4, ignore@^5.1.8: +ignore@^5.0.4, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -6554,7 +6841,7 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0: +is-core-module@^2.2.0, is-core-module@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== @@ -7011,6 +7298,16 @@ istanbul-reports@^3.0.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jasmine-core@^3.6.0, jasmine-core@~3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.8.0.tgz#815399aae5aa5d9beeb1262805f981b99ffc9bf0" @@ -7117,6 +7414,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdoc-type-pratt-parser@1.0.4, jsdoc-type-pratt-parser@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz#5750d2d32ffb001866537d3baaedea7cf84c7036" + integrity sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ== + jsdom@^16.0.0: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" @@ -7635,6 +7937,14 @@ loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7840,7 +8150,7 @@ lodash.values@^2.4.1: dependencies: lodash.keys "~2.4.1" -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8825,6 +9135,15 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + objectdiff@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/objectdiff/-/objectdiff-1.1.0.tgz#8d7a15be6cb8670df8a490cc6be12a4f05ea82f4" @@ -8993,6 +9312,13 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -9007,6 +9333,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -9040,6 +9373,11 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -9331,6 +9669,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9345,6 +9690,13 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + portfinder@^1.0.23, portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -10262,6 +10614,14 @@ read-package-json-fast@^2.0.1: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -10402,7 +10762,7 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -10419,6 +10779,11 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regextras@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217" + integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ== + registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -10641,7 +11006,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.3.2: +resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.2: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -10759,7 +11124,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@6.6.7, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.6.6, rxjs@^6.6.7: +rxjs-for-await@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz#26598a1d6167147cc192172970e7eed4e620384b" + integrity sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw== + +rxjs@6.6.7, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.5.4, rxjs@^6.6.6, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -10930,6 +11300,13 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -11331,7 +11708,7 @@ spdx-exceptions@^2.1.0: resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-expression-parse@^3.0.0: +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -11985,7 +12362,7 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: +tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -12116,6 +12493,15 @@ ts-node@^10.0.0: source-map-support "^0.5.17" yn "3.1.1" +tsconfig-paths@^3.9.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7" + integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q== + dependencies: + json5 "^2.2.0" + minimist "^1.2.0" + strip-bom "^3.0.0" + tslib@2.3.0, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" @@ -12152,6 +12538,13 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -13268,6 +13661,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@20.0.0: + version "20.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.0.0.tgz#c65a1daaa977ad63cebdd52159147b789a4e19a9" + integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"