diff --git a/README.md b/README.md index 7b951ec5318664fb30d4c848615a2f6c71318ac6..ad1c7127075771ff829e64eca23668bd595900dd 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,23 @@ -# UtilsLib +# Utils Library -This project was generated using [Nx](https://nx.dev). +Monorepo for building-block type utilities that don't have dependencies on any other `@psu` libraries. -

+- [Browser](https://git.psu.edu/ais-swe/ux/utils/tree/develop/libs/utils/browser) + - Cache Interceptor + - Autofocus Directive + - Error Service + - Loading Events Service + - Local Storage Service + - Request Tracing Interceptor + - UrlBuilder + - Window Service +- [Rx](https://git.psu.edu/ais-swe/ux/utils/tree/develop/libs/utils/rx) + - Http Retry Backoff Operator +- [Security](https://git.psu.edu/ais-swe/ux/utils/tree/develop/libs/utils/security) + - `REQUIRE_AUTH_HEADER` string constant -🔎 **Nx is a set of Angular CLI power-ups for modern development.** +# Contributing -## Quick Start & Documentation +Write small, portable utils, and try to keep the docs up to date as you add things. -[Nx Documentation](https://nx.dev) - -[30-minute video showing all Nx features](https://nx.dev/getting-started/what-is-nx) - -[Interactive Tutorial](https://nx.dev/tutorial/01-create-application) - -## Adding capabilities to your workspace - -Nx supports many plugins which add capabilities for developing different types of applications and different tools. - -These capabilities include generating applications, libraries, .etc as well as the devtools to test, and build projects as well. - -Below are some plugins which you can add to your workspace: - -- [Angular](https://angular.io) - - `ng add @nrwl/angular` -- [React](https://reactjs.org) - - `ng add @nrwl/react` -- Web (no framework frontends) - - `ng add @nrwl/web` -- [Nest](https://nestjs.com) - - `ng add @nrwl/nest` -- [Express](https://expressjs.com) - - `ng add @nrwl/express` -- [Node](https://nodejs.org) - - `ng add @nrwl/node` - -## Generate an application - -Run `ng g @nrwl/angular:app my-app` to generate an application. - -> You can use any of the plugins above to generate applications as well. - -When using Nx, you can create multiple applications and libraries in the same workspace. - -## Generate a library - -Run `ng g @nrwl/angular:lib my-lib` to generate a library. - -> You can also use any of the plugins above to generate libraries as well. - -Libraries are sharable across libraries and applications. They can be imported from `@utils-lib/mylib`. - -## Development server - -Run `ng serve my-app` for a dev server. Navigate to http://localhost:4200/. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng g component my-component --project=my-app` to generate a new component. - -## Build - -Run `ng build my-app` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test my-app` to execute the unit tests via [Jest](https://jestjs.io). - -Run `npm run affected:test` to execute the unit tests affected by a change. - -## Running end-to-end tests - -Run `ng e2e my-app` to execute the end-to-end tests via [Cypress](https://www.cypress.io). - -Run `npm run affected:e2e` to execute the end-to-end tests affected by a change. - -## Understand your workspace - -Run `npm run dep-graph` to see a diagram of the dependencies of your projects. - -## Further help - -Visit the [Nx Documentation](https://nx.dev) to learn more. +See the README here for how to create a new entry point https://git.psu.edu/ais-swe/ux/components/blob/develop/README.md diff --git a/angular.json b/angular.json index a166d8010e92e72ac9a61ca65f8d6333582ef35b..324aca3bce06d4f5bf25cb2bb30997263911861b 100644 --- a/angular.json +++ b/angular.json @@ -73,10 +73,7 @@ "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { - "tsConfig": [ - "apps/demo/tsconfig.app.json", - "apps/demo/tsconfig.spec.json" - ], + "tsConfig": ["apps/demo/tsconfig.app.json", "apps/demo/tsconfig.spec.json"], "exclude": ["**/node_modules/**"] } }, @@ -132,10 +129,7 @@ "lint": { "builder": "@angular-devkit/build-angular:tslint", "options": { - "tsConfig": [ - "libs/utils/tsconfig.lib.json", - "libs/utils/tsconfig.spec.json" - ], + "tsConfig": ["libs/utils/tsconfig.lib.json", "libs/utils/tsconfig.spec.json"], "exclude": ["**/node_modules/**"] } }, @@ -153,6 +147,90 @@ "styleext": "scss" } } + }, + "utils-security": { + "projectType": "library", + "root": "libs/utils/security", + "sourceRoot": "libs/utils/security/src", + "prefix": "psu", + "architect": { + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["libs/utils/security/tsconfig.lib.json", "libs/utils/security/tsconfig.spec.json"], + "exclude": ["**/node_modules/**", "!libs/utils/security/**"] + } + }, + "test": { + "builder": "@nrwl/jest:jest", + "options": { + "jestConfig": "libs/utils/security/jest.config.js", + "tsConfig": "libs/utils/security/tsconfig.spec.json", + "setupFile": "libs/utils/security/src/test-setup.ts" + } + } + }, + "schematics": { + "@nrwl/angular:component": { + "styleext": "scss" + } + } + }, + "utils-rx": { + "projectType": "library", + "root": "libs/utils/rx", + "sourceRoot": "libs/utils/rx/src", + "prefix": "psu", + "architect": { + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["libs/utils/rx/tsconfig.lib.json", "libs/utils/rx/tsconfig.spec.json"], + "exclude": ["**/node_modules/**", "!libs/utils/rx/**"] + } + }, + "test": { + "builder": "@nrwl/jest:jest", + "options": { + "jestConfig": "libs/utils/rx/jest.config.js", + "tsConfig": "libs/utils/rx/tsconfig.spec.json", + "setupFile": "libs/utils/rx/src/test-setup.ts" + } + } + }, + "schematics": { + "@nrwl/angular:component": { + "styleext": "scss" + } + } + }, + "utils-browser": { + "projectType": "library", + "root": "libs/utils/browser", + "sourceRoot": "libs/utils/browser/src", + "prefix": "psu", + "architect": { + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["libs/utils/browser/tsconfig.lib.json", "libs/utils/browser/tsconfig.spec.json"], + "exclude": ["**/node_modules/**", "!libs/utils/browser/**"] + } + }, + "test": { + "builder": "@nrwl/jest:jest", + "options": { + "jestConfig": "libs/utils/browser/jest.config.js", + "tsConfig": "libs/utils/browser/tsconfig.spec.json", + "setupFile": "libs/utils/browser/src/test-setup.ts" + } + } + }, + "schematics": { + "@nrwl/angular:component": { + "styleext": "scss" + } + } } }, "cli": { @@ -169,7 +247,10 @@ "e2eTestRunner": "cypress" }, "@nrwl/angular:library": { - "unitTestRunner": "jest" + "unitTestRunner": "jest", + "directory": "utils", + "simpleModuleName": true, + "style": "scss" }, "@psu/schematics:ng-new": { "workspaceType": "library" diff --git a/libs/.gitkeep b/libs/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/libs/utils/README.md b/libs/utils/README.md deleted file mode 100644 index 2b5fb58bbac4a5502e9aaa03099c189fbdb7fdaf..0000000000000000000000000000000000000000 --- a/libs/utils/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# utils - -This library was generated with [Nx](https://nx.dev). - -## Running unit tests - -Run `ng test utils` to execute the unit tests. diff --git a/libs/utils/browser/README.md b/libs/utils/browser/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ca8a6b428c3adc13b347db721fded0a5611cef7e --- /dev/null +++ b/libs/utils/browser/README.md @@ -0,0 +1,71 @@ +# Browser Utils + +## Cache Interceptor + +Adds an always different `_d` param to any request which has the `NO_CACHE_HEADER` present. This header is only used by the client as a marker, and is deleted within this interceptor + +Must be registered at the same level as `HttpClientModule` + +### Exports + +- `CacheInterceptor` +- `const NO_CACHE_HEADER = 'X-No-Cache'` + +## Focus Directive + +Autofocuses the host element + +```html + +``` + +## Error Service + +Provides a facade for handling http errors + +```typescript +import { HttpErrorService } from '@psu/utils/browser'; + +http.get('some-url').pipe( + map(() => {}), + catchError(e => this.httpErrorService.handleError(e)) +); +``` + +## Loading Events Service + +Provides method to trigger a DOM event outside of angular that can be picked up by a loading screen defined in index.html. + +```typescript +import { LoadingEvents } from '@psu/utils/browser'; +``` + +## Local Storage Service + +Provides an abstraction layer over various local storage areas + +```typescript +import { LocalStorageService } from '@psu/utils/browser'; +``` + +## Request Tracing Interceptor + +Provides a client-only header, `TRACE_HEADER` that will enable server side request tracing on any request with said header attached. + +Must be registered at the same level as `HttpClientModule` + +## UrlBuilder + +A class which normalizes alot of the pain around consistently building URLs + +```typescript +import { UrlBuilder } from '@psu/utils/browser'; +``` + +## Window Service + +An abstraction over the browser's native window object. + +```typescript +import { WindowService } from '@psu/utils/browser'; +``` diff --git a/libs/utils/browser/jest.config.js b/libs/utils/browser/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..4c836155e3f6983ac9899fdd106c05ff466c7ed5 --- /dev/null +++ b/libs/utils/browser/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + name: 'utils-browser', + preset: '../../../jest.config.js', + coverageDirectory: '../../../coverage/libs/utils/browser', + snapshotSerializers: [ + 'jest-preset-angular/AngularSnapshotSerializer.js', + 'jest-preset-angular/HTMLCommentSerializer.js' + ] +}; diff --git a/libs/utils/browser/ng-package.json b/libs/utils/browser/ng-package.json new file mode 100644 index 0000000000000000000000000000000000000000..c781f0df4675ef304c7d745c98df9f59daa25dee --- /dev/null +++ b/libs/utils/browser/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "src/index.ts" + } +} diff --git a/libs/utils/browser/src/index.ts b/libs/utils/browser/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..627a64a376dffa93c923b10f30d25e7d020bda48 --- /dev/null +++ b/libs/utils/browser/src/index.ts @@ -0,0 +1,10 @@ +export { CacheInterceptor } from './lib/cache/cache.interceptor'; +export { FocusDirective } from './lib/focus/focus.directive'; +export { FocusModule } from './lib/focus/focus.module'; +export { HttpErrorService } from './lib/http-error/http-error.service'; +export { LoadingEvents } from './lib/loading-screen/loading-events'; +export { LocalStorageService } from './lib/local-storage/local-storage.service'; +export { RequestTracingConfig } from './lib/tracing/request-tracing.config'; +export { RequestTracingInterceptor } from './lib/tracing/request-tracing.interceptor'; +export { UrlBuilder } from './lib/url-builder/url-builder'; +export { WindowService } from './lib/window/window.service'; diff --git a/libs/utils/browser/src/lib/cache/cache.interceptor.spec.ts b/libs/utils/browser/src/lib/cache/cache.interceptor.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..31df77b0f3603db7224374db1b52b6cdf56187e5 --- /dev/null +++ b/libs/utils/browser/src/lib/cache/cache.interceptor.spec.ts @@ -0,0 +1,105 @@ +import { CacheInterceptor, NO_CACHE_HEADER } from './cache.interceptor'; +import * as MockDate from 'mockdate'; +import { TestBed } from '@angular/core/testing'; +import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; +import { HTTP_INTERCEPTORS, HttpClient, HttpRequest, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +@Injectable() +class TestService { + private headers: HttpHeaders; + + constructor(private httpClient: HttpClient) { + this.headers = new HttpHeaders().append(NO_CACHE_HEADER, 'true'); + } + + public getNoCache(): Observable { + return this.httpClient.get('busted', { + headers: this.headers.append('Another', 'abc') + }); + } + + public getNoCache2(): Observable { + return this.httpClient.get('busted2', { + headers: this.headers.append('Content-Type', 'junk'), + params: { + a: 'a', + b: 'b' + } + }); + } + + public get(): Observable { + return this.httpClient.get('normal'); + } +} + +describe('CacheInterceptor', () => { + let backend: HttpTestingController; + let service: TestService; + let now: Date; + + beforeEach(() => { + now = new Date(); + MockDate.set(now); + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [{ provide: HTTP_INTERCEPTORS, useClass: CacheInterceptor, multi: true }, TestService] + }); + service = TestBed.get(TestService); + backend = TestBed.get(HttpTestingController); + }); + + describe('intercept', () => { + describe('when request has cache bust header', () => { + beforeEach(() => { + service.getNoCache().subscribe(r => { + expect(r).toBeTruthy(); + }); + }); + + it('should add cache busting query param', () => { + const req = backend.expectOne((r: HttpRequest) => { + return r.url === 'busted'; + }); + expect(req.request.params.get('_d')).toEqual(`${now.getTime()}`); + expect(req.request.headers.has('X-No-Cache')).toBe(false); + expect(req.request.headers.get('Another')).toBe('abc'); + }); + }); + + describe('when request has cache bust header and other query params', () => { + beforeEach(() => { + service.getNoCache2().subscribe(r => { + expect(r).toBeTruthy(); + }); + }); + + it('should add cache busting query param', () => { + const req = backend.expectOne((r: HttpRequest) => { + return r.url === 'busted2'; + }); + expect(req.request.params.get('_d')).toEqual(`${now.getTime()}`); + expect(req.request.params.get('a')).toEqual('a'); + expect(req.request.params.get('b')).toEqual('b'); + expect(req.request.headers.has('X-No-Cache')).toBe(false); + expect(req.request.headers.get('Content-Type')).toBe('junk'); + }); + }); + + describe('when request does not have cache bust header', () => { + beforeEach(() => { + service.get().subscribe(r => { + expect(r).toBeTruthy(); + }); + }); + + it('should not add cache busting query param', () => { + const req = backend.expectOne('normal'); + expect(req.request.params.has('_d')).toBe(false); + expect(req.request.headers.has('X-No-Cache')).toBe(false); + }); + }); + }); +}); diff --git a/libs/utils/browser/src/lib/cache/cache.interceptor.ts b/libs/utils/browser/src/lib/cache/cache.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..ad71dd10d4d67ebc28e53f5207ec26e8df18bbf6 --- /dev/null +++ b/libs/utils/browser/src/lib/cache/cache.interceptor.ts @@ -0,0 +1,21 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +export const NO_CACHE_HEADER = 'X-No-Cache'; + +@Injectable({ providedIn: 'root' }) +export class CacheInterceptor implements HttpInterceptor { + public intercept(req: HttpRequest, next: HttpHandler): Observable> { + if (req.headers.has(NO_CACHE_HEADER)) { + const busted = req.clone({ + setParams: { + _d: `${new Date().getTime()}` + }, + headers: req.headers.delete(NO_CACHE_HEADER) + }); + return next.handle(busted); + } + return next.handle(req); + } +} diff --git a/libs/utils/browser/src/lib/focus/focus.directive.spec.ts b/libs/utils/browser/src/lib/focus/focus.directive.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..17213024574d2b3d97999293be37f44cb7d0b732 --- /dev/null +++ b/libs/utils/browser/src/lib/focus/focus.directive.spec.ts @@ -0,0 +1,50 @@ +import { CommonModule } from '@angular/common'; +import { Component, PLATFORM_ID } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FocusModule } from './focus.module'; + +@Component({ + selector: 'ut-test-comp', + template: ` + + ` +}) +class TestComponent {} + +describe('FocusDirective', () => { + let fixture: ComponentFixture; + + describe('when platform is browser', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [CommonModule, FocusModule], + declarations: [TestComponent], + providers: [{ provide: PLATFORM_ID, useValue: 'browser' }] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + }); + + it('should set focus', () => { + expect(document.activeElement.id).toEqual('inputId'); + }); + }); + + describe('when platform is server', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [CommonModule, FocusModule], + declarations: [TestComponent], + providers: [{ provide: PLATFORM_ID, useValue: 'server' }] + }).compileComponents(); + + fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + }); + + it('should not set focus', () => { + expect(document.activeElement.id).not.toBe('inputId'); + }); + }); +}); diff --git a/libs/utils/browser/src/lib/focus/focus.directive.ts b/libs/utils/browser/src/lib/focus/focus.directive.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0bec292be2a9dc38f6dcdefa6b27bdf0894ebdd --- /dev/null +++ b/libs/utils/browser/src/lib/focus/focus.directive.ts @@ -0,0 +1,15 @@ +import { isPlatformBrowser } from '@angular/common'; +import { AfterViewInit, Directive, ElementRef, Inject, PLATFORM_ID } from '@angular/core'; + +@Directive({ + selector: '[utAutoFocus]' +}) +export class FocusDirective implements AfterViewInit { + constructor(private element: ElementRef, @Inject(PLATFORM_ID) private platform: Object) {} + + public ngAfterViewInit(): void { + if (isPlatformBrowser(this.platform)) { + this.element.nativeElement.focus(); + } + } +} diff --git a/libs/utils/browser/src/lib/focus/focus.module.ts b/libs/utils/browser/src/lib/focus/focus.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..24feaf12204eebd6edcabc6c9004291183df844b --- /dev/null +++ b/libs/utils/browser/src/lib/focus/focus.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { FocusDirective } from './focus.directive'; +import { CommonModule } from '@angular/common'; + +@NgModule({ + imports: [CommonModule], + declarations: [FocusDirective], + exports: [FocusDirective] +}) +export class FocusModule {} diff --git a/libs/utils/browser/src/lib/http-error/http-error.service.spec.ts b/libs/utils/browser/src/lib/http-error/http-error.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4d33e069c6f561cab94b901a5cf6e6523c75c9d --- /dev/null +++ b/libs/utils/browser/src/lib/http-error/http-error.service.spec.ts @@ -0,0 +1,131 @@ +import { HttpErrorResponse } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; +import { HttpErrorService } from './http-error.service'; + +describe('HttpErrorService', () => { + let service: HttpErrorService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HttpErrorService] + }); + service = TestBed.get(HttpErrorService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('handleError', () => { + let result: string; + let emitted: boolean; + + beforeEach(() => { + emitted = false; + }); + + describe('when error message is a string', () => { + beforeEach(() => { + service.handleError('some error').subscribe(() => (emitted = true), e => (result = e)); + }); + + it('should not emit', () => { + expect(emitted).toBe(false); + }); + + it('should error with some error', () => { + expect(result).toBe('some error'); + }); + }); + + describe('when error message is specified', () => { + beforeEach(() => { + service + .handleError( + new HttpErrorResponse({ + status: 404, + statusText: 'Not Found', + error: { + errorMessage: 'oh no' + } + }) + ) + .subscribe(() => (emitted = true), e => (result = e)); + }); + + it('should not emit', () => { + expect(emitted).toBe(false); + }); + + it('should error with oh no', () => { + expect(result).toBe('oh no'); + }); + }); + + describe('when error message is not specified', () => { + beforeEach(() => { + service + .handleError( + new HttpErrorResponse({ + status: 404, + statusText: 'Not Found', + error: {} + }) + ) + .subscribe(() => (emitted = true), e => (result = e)); + }); + + it('should not emit', () => { + expect(emitted).toBe(false); + }); + + it('should error with oops', () => { + expect(result).toBe('Oops, something went wrong!'); + }); + }); + + describe('when error message is not specified with default', () => { + beforeEach(() => { + service + .handleError( + new HttpErrorResponse({ + status: 404, + statusText: 'Not Found', + error: {} + }), + 'my message' + ) + .subscribe(() => (emitted = true), e => (result = e)); + }); + + it('should not emit', () => { + expect(emitted).toBe(false); + }); + + it('should error with custom message', () => { + expect(result).toBe('my message'); + }); + }); + + describe('when error body is not specified', () => { + beforeEach(() => { + service + .handleError( + new HttpErrorResponse({ + status: 404, + statusText: 'Not Found' + }) + ) + .subscribe(() => (emitted = true), e => (result = e)); + }); + + it('should not emit', () => { + expect(emitted).toBe(false); + }); + + it('should error with oops', () => { + expect(result).toBe('Oops, something went wrong!'); + }); + }); + }); +}); diff --git a/libs/utils/browser/src/lib/http-error/http-error.service.ts b/libs/utils/browser/src/lib/http-error/http-error.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..4be9724097314e3267d7cd7f1608dbc8fc2d41ab --- /dev/null +++ b/libs/utils/browser/src/lib/http-error/http-error.service.ts @@ -0,0 +1,19 @@ +import { HttpErrorResponse } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable, throwError } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class HttpErrorService { + constructor() {} + + public handleError(error: HttpErrorResponse | string, defaultMessage?: string): Observable { + const errMsg = + (error instanceof HttpErrorResponse ? (error.error ? error.error.errorMessage : '') : error) || + (defaultMessage || 'Oops, something went wrong!'); + console.error(error); + + return throwError(errMsg); + } +} diff --git a/libs/utils/browser/src/lib/loading-screen/loading-events.ts b/libs/utils/browser/src/lib/loading-screen/loading-events.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7bc27a3eaf75a280ba312063c59edc39d0c653e --- /dev/null +++ b/libs/utils/browser/src/lib/loading-screen/loading-events.ts @@ -0,0 +1,31 @@ +import { DOCUMENT } from '@angular/common'; +import { Inject, Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class LoadingEvents { + private doc: Document; + private isAppReady: boolean; + + constructor(@Inject(DOCUMENT) doc: any) { + this.doc = doc; + this.isAppReady = false; + } + + public triggerAppReady(): void { + if (this.isAppReady) { + return; + } + const bubbles = true; + const cancelable = false; + this.doc.dispatchEvent(this.createEvent('appready', bubbles, cancelable)); + this.isAppReady = true; + } + + private createEvent(eventType: string, bubbles: boolean, cancelable: boolean): Event { + const customEvent: any = new CustomEvent(eventType, { + bubbles, + cancelable + }); + return customEvent; + } +} diff --git a/libs/utils/browser/src/lib/local-storage/local-storage.service.spec.ts b/libs/utils/browser/src/lib/local-storage/local-storage.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..03126120ae2ee86229256a55cf0f98c7ca57acdf --- /dev/null +++ b/libs/utils/browser/src/lib/local-storage/local-storage.service.spec.ts @@ -0,0 +1,98 @@ +import { LocalStorageService } from './local-storage.service'; +import { TestBed } from '@angular/core/testing'; +import { WindowService } from '../window/window.service'; +import { CookieService, CookieModule } from 'ngx-cookie'; + +class WindowServiceStubWithCookies { + get nativeWindow(): any { + return { + document: { + cookie: '' + } + }; + } +} + +class WindowServiceStubWithNoCookies { + get nativeWindow(): any { + return { + document: undefined + }; + } +} + +describe('LocalStorageService', () => { + let service: LocalStorageService; + let cookieService: CookieService; + + describe('LocalStorage', () => { + setup(WindowService); + runTest(); + }); + + describe('SessionStorage', () => { + beforeEach(() => { + spyOn(localStorage, 'setItem').and.throwError('not supported'); + }); + setup(WindowService); + runTest(); + }); + + describe('CookieStorage', () => { + beforeEach(() => { + spyOn(localStorage, 'setItem').and.throwError('not supported'); + spyOn(sessionStorage, 'setItem').and.throwError('not supported'); + }); + setup(WindowServiceStubWithCookies); + runTest(); + + it('clear does not touch other cookies', () => { + const key = '__karma-test__'; + cookieService.put(key, 'test'); + service.clear(); + expect(cookieService.get(key)).toBe('test'); + }); + }); + + describe('MemoryStorage', () => { + beforeEach(() => { + spyOn(localStorage, 'setItem').and.throwError('not supported'); + spyOn(sessionStorage, 'setItem').and.throwError('not supported'); + }); + setup(WindowServiceStubWithNoCookies); + runTest(); + }); + + function setup(wnd: any): void { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [CookieModule.forRoot()], + providers: [LocalStorageService, CookieService, { provide: WindowService, useClass: wnd }] + }); + service = TestBed.get(LocalStorageService); + cookieService = TestBed.get(CookieService); + }); + } + + function runTest(): void { + it('get when undefined', () => { + expect(service.getItem('unknown')).toBeFalsy(); + }); + + it('set/get/remove', () => { + service.setItem('test', 'val'); + expect(service.getItem('test')).toBe('val'); + + service.removeItem('test'); + expect(service.getItem('test')).toBeFalsy(); + }); + + it('clear', () => { + service.setItem('1', '1'); + service.setItem('2', '2'); + service.clear(); + expect(service.getItem('1')).toBeFalsy(); + expect(service.getItem('2')).toBeFalsy(); + }); + } +}); diff --git a/libs/utils/browser/src/lib/local-storage/local-storage.service.ts b/libs/utils/browser/src/lib/local-storage/local-storage.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..409bcb5414454d62a769a3b08e77170af52983c4 --- /dev/null +++ b/libs/utils/browser/src/lib/local-storage/local-storage.service.ts @@ -0,0 +1,129 @@ +import { Injectable } from '@angular/core'; +import { WindowService } from '../window/window.service'; +import { CookieService } from 'ngx-cookie'; + +interface StorageContainer { + clear(): void; + getItem(name: string): string; + setItem(name: string, value: string): void; + removeItem(name: string): void; +} + +const KEY = '__test__'; + +class CookieStorage implements StorageContainer { + private readonly prefix = '_PSU_LS_'; + + constructor(private cookieService: CookieService) {} + + public clear(): void { + const cookies = this.cookieService.getAll(); + for (const key in cookies) { + if (key.startsWith(this.prefix)) { + this.removeItem(key.substr(this.prefix.length)); + } + } + } + + public setItem(name: string, value: string): void { + this.cookieService.put(this.prefix + name, value); + } + + public getItem(name: string): string { + return this.cookieService.get(this.prefix + name); + } + + public removeItem(name: string): void { + this.cookieService.remove(this.prefix + name); + } +} + +class MemoryStorage implements StorageContainer { + private map = {}; + + public clear(): void { + this.map = {}; + } + + public setItem(name: string, value: string): void { + this.map[name] = value; + } + + public getItem(name: string): string { + return this.map[name]; + } + + public removeItem(name: string): void { + delete this.map[name]; + } +} + +@Injectable({ providedIn: 'root' }) +export class LocalStorageService { + private readonly storage: StorageContainer; + + constructor(private windowService: WindowService, private cookieService: CookieService) { + this.storage = this.findStorage(); + } + + public getItem(name: string): string { + return this.storage.getItem(name); + } + + public setItem(name: string, value: string): void { + this.storage.setItem(name, value); + } + + public removeItem(name: string): void { + this.storage.removeItem(name); + } + + public clear(): void { + this.storage.clear(); + } + + private findStorage(): StorageContainer { + // check in the following order: + // 1. localStorage + // 2. sessionStorage + // 3. cookies + // 4. memory (useless if you need to persist between page loads) + const local = localStorage || this.windowService.nativeWindow.localStorage; + if (this.test(local)) { + return local; + } + + const session = sessionStorage || this.windowService.nativeWindow.sessionStorage; + if (this.test(session)) { + return session; + } + + const cookies = this.testCookies(); + if (cookies) { + return cookies; + } + + return new MemoryStorage(); + } + + private test(storage: StorageContainer): boolean { + try { + storage.setItem(KEY, 'test'); + storage.removeItem(KEY); + return true; + } catch (err) { + return false; + } + } + + private testCookies(): CookieStorage { + const cookies = new CookieStorage(this.cookieService); + try { + cookies.setItem(KEY, 'test'); + cookies.removeItem(KEY); + return cookies; + } catch (err) { + return undefined; + } + } +} diff --git a/libs/utils/browser/src/lib/tracing/request-tracing.config.ts b/libs/utils/browser/src/lib/tracing/request-tracing.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b59a7f8dbbdc386ef4c3c27fe083fe9ca3f2b9dd --- /dev/null +++ b/libs/utils/browser/src/lib/tracing/request-tracing.config.ts @@ -0,0 +1,7 @@ +import { InjectionToken } from '@angular/core'; + +export interface RequestTracingConfig { + applicationId: string; +} + +export const REQUEST_TRACING_CONFIG = new InjectionToken('request.tracing'); diff --git a/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.spec.ts b/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..dd32c9e9fc1dd140f5a319366b1dfa01adf00e5d --- /dev/null +++ b/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.spec.ts @@ -0,0 +1,82 @@ +import { HttpClient, HttpHeaders, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { Injectable } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { Observable } from 'rxjs'; +import { REQUEST_TRACING_CONFIG } from './request-tracing.config'; +import { RequestTracingInterceptor, TRACE_HEADER } from './request-tracing.interceptor'; + +@Injectable() +class TestService { + constructor(private httpClient: HttpClient) {} + + public getStuff(trace = false): Observable { + let headers = new HttpHeaders({ + something: 'else' + }); + if (trace) { + headers = headers.append(TRACE_HEADER, 'true'); + } + return this.httpClient.get('http://stuff', { + headers + }); + } +} + +describe('RequestTracingInterceptor', () => { + let backend: HttpTestingController; + let service: TestService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + { + provide: HTTP_INTERCEPTORS, + useClass: RequestTracingInterceptor, + multi: true + }, + { + provide: REQUEST_TRACING_CONFIG, + useValue: { applicationId: 'my-app' } + }, + TestService + ] + }); + + service = TestBed.get(TestService); + backend = TestBed.get(HttpTestingController); + }); + + afterEach(() => { + backend.verify(); + }); + + describe('intercept', () => { + describe('when request has trace header', () => { + beforeEach(() => { + service.getStuff(true).subscribe(); + }); + + it('should add request id header', () => { + const req = backend.expectOne('http://stuff'); + expect(req.request.headers.has('something')).toBe(true); + expect(req.request.headers.get('x-request-id')).toMatch(/^my-app_\w+$/); + expect(req.request.headers.has(TRACE_HEADER)).toBe(false); + }); + }); + + describe('when request does not have trace header', () => { + beforeEach(() => { + service.getStuff().subscribe(); + }); + + it('should not add request id header', () => { + const req = backend.expectOne('http://stuff'); + expect(req.request.headers.has('something')).toBe(true); + expect(req.request.headers.has('x-request-id')).toBe(false); + expect(req.request.headers.has(TRACE_HEADER)).toBe(false); + }); + }); + }); +}); diff --git a/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.ts b/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..124ca735b34acc55255099e24cdaf54880043653 --- /dev/null +++ b/libs/utils/browser/src/lib/tracing/request-tracing.interceptor.ts @@ -0,0 +1,47 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Inject, Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { generate } from 'short-uuid'; +import { RequestTracingConfig, REQUEST_TRACING_CONFIG } from './request-tracing.config'; + +export const TRACE_HEADER = 'X-Trace'; + +@Injectable({ providedIn: 'root' }) +export class RequestTracingInterceptor implements HttpInterceptor { + constructor(@Inject(REQUEST_TRACING_CONFIG) protected config: RequestTracingConfig) {} + + public intercept(req: HttpRequest, next: HttpHandler): Observable> { + if (req.headers.has(TRACE_HEADER)) { + return next.handle( + req.clone({ + headers: req.headers.append('x-request-id', this.generateRequestId()).delete(TRACE_HEADER) + }) + ); + } else { + return next.handle(req); + } + } + + /** + * Generates a request ID, the default is based on the provided application ID and a short uuid. + * + * Subclasses can override this method in order to add additional data. + */ + protected generateRequestId(): string { + return `${this.getApplicationId()}_${this.getShortUuid()}`; + } + + /** + * Gets the provided application ID. + */ + protected getApplicationId(): string { + return this.config.applicationId; + } + + /** + * Generates a random short uuid. + */ + protected getShortUuid(): string { + return generate(); + } +} diff --git a/libs/utils/browser/src/lib/url-builder/url-builder.spec.ts b/libs/utils/browser/src/lib/url-builder/url-builder.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8db7fd97f70e6beb68211ae9ffa40d8d6dea2da --- /dev/null +++ b/libs/utils/browser/src/lib/url-builder/url-builder.spec.ts @@ -0,0 +1,131 @@ +import { UrlBuilder } from './url-builder'; + +describe('UrlBuilder', () => { + let builder: UrlBuilder; + let result: string; + let error: string; + + beforeEach(() => { + result = error = undefined; + }); + + describe('when baseUrl is undefined', () => { + beforeEach(() => { + builder = new UrlBuilder(undefined, 'test'); + builder.build('path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should throwError', () => { + expect(result).toBeUndefined(); + expect(error).toBe('Missing or invalid base URL for test: undefined'); + }); + }); + + describe('when baseUrl is null', () => { + beforeEach(() => { + builder = new UrlBuilder(null, 'test2'); + builder.build('path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should throwError', () => { + expect(result).toBeUndefined(); + expect(error).toBe('Missing or invalid base URL for test2: null'); + }); + }); + + describe('when baseUrl is empty', () => { + beforeEach(() => { + builder = new UrlBuilder('', 'test'); + builder.build('path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should throwError', () => { + expect(result).toBeUndefined(); + expect(error).toBe('Missing or invalid base URL for test: '); + }); + }); + + describe('when baseUrl is an invalid url', () => { + beforeEach(() => { + builder = new UrlBuilder('garbage', 'test'); + builder.build('path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should throwError', () => { + expect(result).toBeUndefined(); + expect(error).toBe('Missing or invalid base URL for test: garbage'); + }); + }); + + describe('when baseUrl is valid http with no trailing slash', () => { + beforeEach(() => { + builder = new UrlBuilder('http://dev.apps.psu.edu/test-service/resources', 'test'); + builder.build('path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('http://dev.apps.psu.edu/test-service/resources/path'); + }); + }); + + describe('when baseUrl is valid https with no trailing slash and path has a leading slash', () => { + beforeEach(() => { + builder = new UrlBuilder('http://dev.apps.psu.edu/test-service/resources', 'test'); + builder.build('/path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('http://dev.apps.psu.edu/test-service/resources/path'); + }); + }); + + describe('when baseUrl is valid https with a trailing slash and path has a leading slash', () => { + beforeEach(() => { + builder = new UrlBuilder('https://dev.apps.psu.edu/test-service/resources/', 'test'); + builder.build('/path').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('https://dev.apps.psu.edu/test-service/resources/path'); + }); + }); + + describe('when baseUrl is valid https with trailing slash', () => { + beforeEach(() => { + builder = new UrlBuilder('http://dev.apps.psu.edu/test-service/resources/longer/', 'test'); + builder.build('path/with/args/').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('http://dev.apps.psu.edu/test-service/resources/longer/path/with/args/'); + }); + }); + + describe('when baseUrl is valid ftp with trailing slash', () => { + beforeEach(() => { + builder = new UrlBuilder('ftp://test/longer/', 'test'); + builder.build('path/with/args/').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('ftp://test/longer/path/with/args/'); + }); + }); + + describe('when baseUrl is valid ws with trailing slash', () => { + beforeEach(() => { + builder = new UrlBuilder('ws://test/longer/', 'test'); + builder.build('path/with/args/').subscribe(r => (result = r), e => (error = e)); + }); + + it('should emit', () => { + expect(error).toBeUndefined(); + expect(result).toBe('ws://test/longer/path/with/args/'); + }); + }); +}); diff --git a/libs/utils/browser/src/lib/url-builder/url-builder.ts b/libs/utils/browser/src/lib/url-builder/url-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb86a8ad9dbd3d31928f7a77675e97b40c95f99a --- /dev/null +++ b/libs/utils/browser/src/lib/url-builder/url-builder.ts @@ -0,0 +1,20 @@ +import { Observable, throwError, of } from 'rxjs'; + +export class UrlBuilder { + constructor(private baseUrl: string, private name: string) {} + + public build(path: string): Observable { + try { + // NOTE: you may be tempted to use new URL() here, but alas, it does not correctly deal with base urls. + // In our case, if you do new Url('myPath', 'http://dev.apps.psu.edu/some-service/resources'), + // it will result in http://dev.apps.psu.edu/some-service/myPath (stripping out resources) + const base = + this.baseUrl && this.baseUrl.endsWith('/') ? this.baseUrl : this.baseUrl ? `${this.baseUrl}/` : this.baseUrl; + const newPath = !!path && path.startsWith('/') ? path.substr(1) : path; + const url = new URL(newPath, base).toString(); + return of(url); + } catch (err) { + return throwError(`Missing or invalid base URL for ${this.name}: ${this.baseUrl}`); + } + } +} diff --git a/libs/utils/browser/src/lib/window/window.service.spec.ts b/libs/utils/browser/src/lib/window/window.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c78dfb7d4dff3519199e5b1d78cbd1dc98f272ee --- /dev/null +++ b/libs/utils/browser/src/lib/window/window.service.spec.ts @@ -0,0 +1,14 @@ +import { WindowService } from './window.service'; + +describe('WindowService', () => { + it('nativeWindow', () => { + expect(new WindowService().nativeWindow).toBe(window); + }); + + it('openExternal', () => { + const service = new WindowService(); + window.open = jest.fn(); + service.openExternal('some url'); + expect(window.open).toHaveBeenCalledWith('some url', '_blank'); + }); +}); diff --git a/libs/utils/browser/src/lib/window/window.service.ts b/libs/utils/browser/src/lib/window/window.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..191c1ed0430694bd50db34b786a82508cbffbc78 --- /dev/null +++ b/libs/utils/browser/src/lib/window/window.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; + +function getWindow(): Window { + return window; +} + +@Injectable({ providedIn: 'root' }) +export class WindowService { + get nativeWindow(): any { + return getWindow(); + } + + public load(url: string): void { + getWindow().location.href = url; + } + + public openExternal(url: string): void { + const win = this.nativeWindow.open(url, '_blank'); + try { + win.opener = undefined; + } catch (err) {} + } +} diff --git a/libs/utils/browser/src/test-setup.ts b/libs/utils/browser/src/test-setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d88704e8ff09145a6310d3df98f124042268bfe --- /dev/null +++ b/libs/utils/browser/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular'; diff --git a/libs/utils/browser/tsconfig.json b/libs/utils/browser/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..08c7db8c96729fc7e5d208344835a678c973f96c --- /dev/null +++ b/libs/utils/browser/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": ["**/*.ts"] +} diff --git a/libs/utils/browser/tsconfig.lib.json b/libs/utils/browser/tsconfig.lib.json new file mode 100644 index 0000000000000000000000000000000000000000..1c600457d394acbbc693cc87f480a170a4b277cd --- /dev/null +++ b/libs/utils/browser/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2018"] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts"] +} diff --git a/libs/utils/browser/tsconfig.spec.json b/libs/utils/browser/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..fd405a65ef42fc2a9dece7054ce3338c0195210b --- /dev/null +++ b/libs/utils/browser/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/libs/utils/browser/tslint.json b/libs/utils/browser/tslint.json new file mode 100644 index 0000000000000000000000000000000000000000..5c1c5f0ecc3b54c086b81dbe1161948f212a4b49 --- /dev/null +++ b/libs/utils/browser/tslint.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tslint.json", + "rules": { + "directive-selector": [true, "attribute", "ut", "camelCase"], + "component-selector": [true, "element", "ut", "kebab-case"] + } +} diff --git a/libs/utils/rx/README.md b/libs/utils/rx/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4153059cca168491a2f6dd3ffb7d9ff502433c89 --- /dev/null +++ b/libs/utils/rx/README.md @@ -0,0 +1,11 @@ +# Reactive Utils + +## HttpRetryBackoff + +Pipeable operator for retrying http requests prone to intermittent failures + +```typescript +import { httpRetryBackoff } from '@psu/utils/rx'; + +httpClient.get('some_unreliable_service').pipe(retryBackoff(250)); +``` diff --git a/libs/utils/rx/jest.config.js b/libs/utils/rx/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..2515a55d534bc65ef8e552d1f8b9b8fae3175d36 --- /dev/null +++ b/libs/utils/rx/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + name: 'utils-rx', + preset: '../../../jest.config.js', + coverageDirectory: '../../../coverage/libs/utils/rx', + snapshotSerializers: [ + 'jest-preset-angular/AngularSnapshotSerializer.js', + 'jest-preset-angular/HTMLCommentSerializer.js' + ] +}; diff --git a/libs/utils/rx/ng-package.json b/libs/utils/rx/ng-package.json new file mode 100644 index 0000000000000000000000000000000000000000..c781f0df4675ef304c7d745c98df9f59daa25dee --- /dev/null +++ b/libs/utils/rx/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "src/index.ts" + } +} diff --git a/libs/utils/rx/src/index.ts b/libs/utils/rx/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c80fdc6653e4462ed2d2770d93873645d6c3eec6 --- /dev/null +++ b/libs/utils/rx/src/index.ts @@ -0,0 +1,2 @@ +export { httpRetryBackoff, HttpRetryBackoffConfig } from './lib/http-backoff'; +export { createReducer } from './lib/reducer-utils'; diff --git a/libs/utils/rx/src/lib/http-backoff.ts b/libs/utils/rx/src/lib/http-backoff.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4559fe4b15aa81725fc248b2755a48ee0baa238 --- /dev/null +++ b/libs/utils/rx/src/lib/http-backoff.ts @@ -0,0 +1,64 @@ +import { retryBackoff, RetryBackoffConfig } from 'backoff-rxjs'; +import { Observable } from 'rxjs'; + +export interface HttpRetryBackoffConfig { + initialIntervalMillis?: number; + maxAttempts?: number; + recoverable4xxCodes?: number[]; + ignored5xxCodes?: number[]; + skipCors?: boolean; +} + +export function httpRetryBackoff(config: number | HttpRetryBackoffConfig): (source: Observable) => Observable { + // parse the config argument + const { + initialIntervalMillis = 250, + maxAttempts = 5, + recoverable4xxCodes = [429], + ignored5xxCodes = [], + skipCors = false + } = typeof config === 'number' ? { initialIntervalMillis: config } : config; + + // convert our internal config into that which is expected by the library, + // including our custom shouldRetry function + const backoffConfig: RetryBackoffConfig = { + initialInterval: initialIntervalMillis, + maxRetries: maxAttempts, + shouldRetry: err => isRetryPossible(err, recoverable4xxCodes, ignored5xxCodes, skipCors) + }; + + return (source: Observable) => source.pipe(retryBackoff(backoffConfig)); +} + +function isRetryPossible( + error: any, + recoverable4xxCodes: number[], + ignored5xxCodes: number[], + skipCors: boolean +): boolean { + const status = extractStatus(error); + return ( + !isNaN(status) && + (is5xx(status, ignored5xxCodes) || isRecoverable4xx(status, recoverable4xxCodes) || (isCORS(status) && !skipCors)) + ); +} + +function extractStatus(error: any): number { + let ret = NaN; + if (error && error.status !== undefined) { + ret = parseInt(error.status, 10); + } + return ret; +} + +function is5xx(status: number, ignored5xxCodes: number[]): boolean { + return status >= 500 && status <= 599 && ignored5xxCodes.indexOf(status) === -1; +} + +function isRecoverable4xx(status: number, recoverable4xxCodes: number[]): boolean { + return recoverable4xxCodes.indexOf(status) > -1; +} + +function isCORS(status: number) { + return status === 0; +} diff --git a/libs/utils/rx/src/lib/reducer-utils.spec.ts b/libs/utils/rx/src/lib/reducer-utils.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..91ca184923a1bdc7c2c6ec16a0f0471054b0f533 --- /dev/null +++ b/libs/utils/rx/src/lib/reducer-utils.spec.ts @@ -0,0 +1,11 @@ +import { createReducer } from '..'; + +describe('reducer utils', () => { + describe('createReducer', () => { + it('should create reducer correctly', () => { + const result = createReducer({}, {}); + expect(result instanceof Function).toBe(true); + expect(result({ s: 's' }, {})).toEqual({ s: 's' }); + }); + }); +}); diff --git a/libs/utils/rx/src/lib/reducer-utils.ts b/libs/utils/rx/src/lib/reducer-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..5976b79a7f22816977d5441c157d049a6a215766 --- /dev/null +++ b/libs/utils/rx/src/lib/reducer-utils.ts @@ -0,0 +1,9 @@ +/** + * @deprecated use ngrx reducer creators instead + * + */ +export function createReducer(iState, handlers): (state, action) => any { + return (state = iState, action) => { + return handlers.hasOwnProperty(action.type) ? handlers[action.type](state, action) : state; + }; +} diff --git a/libs/utils/rx/src/test-setup.ts b/libs/utils/rx/src/test-setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d88704e8ff09145a6310d3df98f124042268bfe --- /dev/null +++ b/libs/utils/rx/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular'; diff --git a/libs/utils/rx/tsconfig.json b/libs/utils/rx/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..08c7db8c96729fc7e5d208344835a678c973f96c --- /dev/null +++ b/libs/utils/rx/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": ["**/*.ts"] +} diff --git a/libs/utils/rx/tsconfig.lib.json b/libs/utils/rx/tsconfig.lib.json new file mode 100644 index 0000000000000000000000000000000000000000..1c600457d394acbbc693cc87f480a170a4b277cd --- /dev/null +++ b/libs/utils/rx/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2018"] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts"] +} diff --git a/libs/utils/rx/tsconfig.spec.json b/libs/utils/rx/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..fd405a65ef42fc2a9dece7054ce3338c0195210b --- /dev/null +++ b/libs/utils/rx/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/libs/utils/rx/tslint.json b/libs/utils/rx/tslint.json new file mode 100644 index 0000000000000000000000000000000000000000..44c64460c8ae0db3ceb7074ff89c770907ebade7 --- /dev/null +++ b/libs/utils/rx/tslint.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tslint.json", + "rules": { + "directive-selector": [true, "attribute", "psu", "camelCase"], + "component-selector": [true, "element", "psu", "kebab-case"] + } +} diff --git a/libs/utils/security/README.md b/libs/utils/security/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0777509bb7c1503eae3ace3ff6263299eab52b1d --- /dev/null +++ b/libs/utils/security/README.md @@ -0,0 +1,3 @@ +# Security Utils + +This will eventually be the home of the refactored and de-spaghettified security utils, but for now it just has a single string constant for the `REQUIRE_AUTH_HEADER` since I needed somewhere to put it and didn't want to import the entire security library just for one constant. diff --git a/libs/utils/security/jest.config.js b/libs/utils/security/jest.config.js new file mode 100644 index 0000000000000000000000000000000000000000..a798a7fb5506bbd16e5dcbff767d0b4e6b5d04a9 --- /dev/null +++ b/libs/utils/security/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + name: 'utils-security', + preset: '../../../jest.config.js', + coverageDirectory: '../../../coverage/libs/utils/security', + snapshotSerializers: [ + 'jest-preset-angular/AngularSnapshotSerializer.js', + 'jest-preset-angular/HTMLCommentSerializer.js' + ] +}; diff --git a/libs/utils/security/ng-package.json b/libs/utils/security/ng-package.json new file mode 100644 index 0000000000000000000000000000000000000000..c781f0df4675ef304c7d745c98df9f59daa25dee --- /dev/null +++ b/libs/utils/security/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "src/index.ts" + } +} diff --git a/libs/utils/security/src/index.ts b/libs/utils/security/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b358e75f0a49668adad5855ff509cf1fca2afc5a --- /dev/null +++ b/libs/utils/security/src/index.ts @@ -0,0 +1 @@ +export { REQUIRE_AUTH_HEADER } from './lib/constants'; diff --git a/libs/utils/security/src/lib/constants.spec.ts b/libs/utils/security/src/lib/constants.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..71e8d203b0759010e9e2b629ad6725988c7d8786 --- /dev/null +++ b/libs/utils/security/src/lib/constants.spec.ts @@ -0,0 +1,5 @@ +describe('Need to have at least one test', () => { + it('should pass', () => { + expect(1).toEqual(1); + }); +}); diff --git a/libs/utils/security/src/lib/constants.ts b/libs/utils/security/src/lib/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..11ec44a82e618e77c8a4de0c7a281b21132b987b --- /dev/null +++ b/libs/utils/security/src/lib/constants.ts @@ -0,0 +1 @@ +export const REQUIRE_AUTH_HEADER = 'X-Auth'; diff --git a/libs/utils/security/src/test-setup.ts b/libs/utils/security/src/test-setup.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d88704e8ff09145a6310d3df98f124042268bfe --- /dev/null +++ b/libs/utils/security/src/test-setup.ts @@ -0,0 +1 @@ +import 'jest-preset-angular'; diff --git a/libs/utils/security/tsconfig.json b/libs/utils/security/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..08c7db8c96729fc7e5d208344835a678c973f96c --- /dev/null +++ b/libs/utils/security/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": ["**/*.ts"] +} diff --git a/libs/utils/security/tsconfig.lib.json b/libs/utils/security/tsconfig.lib.json new file mode 100644 index 0000000000000000000000000000000000000000..1c600457d394acbbc693cc87f480a170a4b277cd --- /dev/null +++ b/libs/utils/security/tsconfig.lib.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2018"] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": ["src/test-setup.ts", "**/*.spec.ts"] +} diff --git a/libs/utils/security/tsconfig.spec.json b/libs/utils/security/tsconfig.spec.json new file mode 100644 index 0000000000000000000000000000000000000000..fd405a65ef42fc2a9dece7054ce3338c0195210b --- /dev/null +++ b/libs/utils/security/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/libs/utils/security/tslint.json b/libs/utils/security/tslint.json new file mode 100644 index 0000000000000000000000000000000000000000..44c64460c8ae0db3ceb7074ff89c770907ebade7 --- /dev/null +++ b/libs/utils/security/tslint.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tslint.json", + "rules": { + "directive-selector": [true, "attribute", "psu", "camelCase"], + "component-selector": [true, "element", "psu", "kebab-case"] + } +} diff --git a/nx.json b/nx.json index 7bf8552ef09376a8f7ea2d642cf54e0c287e0c42..193958ba69bb7172d161b516e85453609a38c240 100644 --- a/nx.json +++ b/nx.json @@ -16,6 +16,15 @@ }, "utils": { "tags": ["none"] + }, + "utils-security": { + "tags": [] + }, + "utils-rx": { + "tags": [] + }, + "utils-browser": { + "tags": [] } } } diff --git a/package.json b/package.json index 47d74300e6ff3e38538a7628896e8cddd3b6078d..da4a97cd85b6c44a6e117db0cc311f250bf23f10 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "ng serve", "build": "ng build", "test": "ng test", - "lint": "nx lint && ng lint", + "lint": "ng lint", "e2e": "ng e2e", "affected:apps": "nx affected:apps", "affected:libs": "nx affected:libs", @@ -25,62 +25,65 @@ "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help", - "build:lib": "ng build utils && yarn bundle-styles", + "build:lib": "ng build utils", "bundle:report": "webpack-bundle-analyzer dist/apps/demo/stats.json", "format:html": "yarn html:format:apps && yarn html:format:libs", "html:format:apps": "find apps -name '*.html' -exec node_modules/.bin/html-beautify -qr {} +", "html:format:libs": "find libs -name '*.html' -exec node_modules/.bin/html-beautify -qr {} +", - "cz": "git-cz", - "bundle-styles": "scss-bundle -c scss-bundle.config.json" + "cz": "git-cz" }, "private": false, "dependencies": { - "@angular/animations": "^8.0.0", - "@angular/common": "^8.0.0", - "@angular/compiler": "^8.0.0", - "@angular/core": "^8.0.0", - "@angular/forms": "^8.0.0", - "@angular/platform-browser": "^8.0.0", - "@angular/platform-browser-dynamic": "^8.0.0", - "@angular/router": "^8.0.0", + "@angular/common": "^8.2.0", + "@angular/compiler": "^8.2.0", + "@angular/core": "^8.2.0", + "@angular/platform-browser": "^8.2.0", + "@angular/platform-browser-dynamic": "^8.2.0", "@nrwl/angular": "8.9.0", - "core-js": "^3.4.8", - "rxjs": "~6.5.3", - "tslib": "^1.9.0", - "zone.js": "^0.10.2" + "core-js": "^2.5.4", + "rxjs": "~6.4.0", + "tslib": "^1.10.0", + "zone.js": "^0.9.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.803.20", - "@angular-devkit/build-ng-packagr": "~0.803.20", - "@angular/cli": "8.3.20", - "@angular/compiler-cli": "^8.0.0", - "@angular/language-service": "^8.0.0", + "@angular-devkit/build-angular": "^0.803.14", + "@angular-devkit/build-ng-packagr": "^0.803.14", + "@angular/cli": "8.3.14", + "@angular/compiler-cli": "^8.2.0", + "@angular/language-service": "^8.2.0", + "@angular/router": "^8.2.14", + "@nguniversal/express-engine": "^8.1.1", "@nrwl/cypress": "8.9.0", "@nrwl/jest": "8.9.0", "@nrwl/workspace": "8.9.0", "@psu/schematics": "^1.0.4-beta.13", - "@types/jest": "24.0.23", - "@types/jquery": "3.3.31", - "@types/node": "~12.12.16", - "codelyzer": "~5.2.0", + "@types/jest": "24.0.9", + "@types/node": "~8.9.4", + "backoff-rxjs": "^6.3.3", + "codelyzer": "~5.0.1", "commitizen": "^4.0.3", - "conventional-changelog": "^3.1.8", - "cypress": "3.7.0", - "dotenv": "8.2.0", + "conventional-changelog": "^3.1.15", + "cypress": "3.6.1", + "dotenv": "6.2.0", + "eslint": "6.1.0", "husky": "3.1.0", - "jest": "24.9.0", - "jest-preset-angular": "8.0.0", - "js-beautify": "^1.10.0", + "jest": "24.1.0", + "jest-preset-angular": "7.0.0", + "js-beautify": "^1.10.2", "lint-staged": "^9.5.0", - "ng-packagr": "^5.1.0", + "mockdate": "^2.0.5", + "ng-packagr": "^5.4.0", + "ngx-cookie": "^4.1.2", "npm-link-check": "3.0.0", - "prettier": "1.19.1", - "scss-bundle": "^3.0.2", - "ts-jest": "24.2.0", - "ts-node": "~8.5.4", - "tsickle": "^0.37.1", - "tslint": "~5.20.1", - "typescript": "~3.4.5", + "prettier": "1.18.2", + "short-uuid": "^3.1.1", + "ts-jest": "24.0.0", + "ts-mocks": "^2.6.0", + "ts-node": "~7.0.0", + "tsickle": "^0.37.0", + "tslint": "~5.11.0", + "typescript": "~3.5.3", + "webpack": "^4.18.1", "webpack-bundle-analyzer": "^3.3.2" }, "repository": { @@ -88,10 +91,15 @@ "url": "https://git.psu.edu/ais-swe/ux/utils" }, "lint-staged": { - "*.{json,ts}": [ + "*.json": [ "prettier --write", "git add" ], + "*.ts": [ + "prettier --write", + "tslint --project tsconfig.json", + "git add" + ], "*.html": [ "html-beautify -qr", "git add" @@ -103,7 +111,7 @@ }, "husky": { "hooks": { - "pre-commit": "lint-staged && yarn lint", + "pre-commit": "lint-staged", "pre-push": "yarn test" } }, diff --git a/tsconfig.json b/tsconfig.json index ee5bf15ac4fe61607b9037fdbb2b180f28f00a9c..8c69f7d4f9824adf3c4ff01ba0de201ac171140d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,10 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@psu/utils": ["libs/utils/src/index.ts"] + "@psu/utils": ["libs/utils/src/index.ts"], + "@psu/utils/security": ["libs/utils/security/src/index.ts"], + "@psu/utils/rx": ["libs/utils/rx/src/index.ts"], + "@psu/utils/browser": ["libs/utils/browser/src/index.ts"] } }, "exclude": ["node_modules", "tmp"] diff --git a/yarn.lock b/yarn.lock index 0112d21ec1b3fa91961e56abc6415ed8b5e6dbe7..ca37fc6519222e184b4087feee0e662d59b90bb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,7 +18,7 @@ "@angular-devkit/core" "8.3.20" rxjs "6.4.0" -"@angular-devkit/build-angular@^0.803.20": +"@angular-devkit/build-angular@^0.803.14": version "0.803.20" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular-devkit/build-angular/-/build-angular-0.803.20.tgz#b19b0d82c75cbdd939b589a33ccb60e2c9f6eec9" integrity sha512-JDZkZjOqPbOtCMsSKxQf9C+uSTZ7fQGlKGsCpJMzfa4iQ0WrmrhZvnRKQeEpMTTZTpuou/HQeQjyDV+Sx3yumw== @@ -80,7 +80,7 @@ webpack-subresource-integrity "1.1.0-rc.6" worker-plugin "3.2.0" -"@angular-devkit/build-ng-packagr@~0.803.20": +"@angular-devkit/build-ng-packagr@^0.803.14": version "0.803.20" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.803.20.tgz#d5fcef89580b4077a27c77be078cfeb0c77e71f7" integrity sha512-4ccjjxfBFUDtz+P0tlxWaPgxlnZZmDAVDocbLPb0tba4f5onbKDn6cnoLxn/gEDRiXOTYuUhSvIH3BI9GcCDiw== @@ -196,23 +196,16 @@ minimist "^1.2.0" rxjs "^5.5.2" -"@angular/animations@^8.0.0": - version "8.2.14" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/animations/-/animations-8.2.14.tgz#76736b21e56165e6ca4925fb69605bdcc56aba7d" - integrity sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA4HOMj0TTXKZ+Jzkg== - dependencies: - tslib "^1.9.0" - -"@angular/cli@8.3.20": - version "8.3.20" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/cli/-/cli-8.3.20.tgz#63e8f626e7dcf37e73cda820ab38bcac13423326" - integrity sha512-bCo8zVFZ6iPc1EnHmVCmKvIcV7YkvalBKGNU7LtVHq6qZBI+ZmFtuyL5obKvFg1vJcminjKcY/UcMr9uGcAQrQ== +"@angular/cli@8.3.14": + version "8.3.14" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/cli/-/cli-8.3.14.tgz#ce1df037d0c6a2e3c84fb1796c4b679e253a7cca" + integrity sha512-cOP2UvnnYocx1U1aiNkuLCcBxSktIXkadzrY7UlWJtQiCPGWm3Y87BfrQXub9Nsh79iyV8k8uKZKEax2ayESSg== dependencies: - "@angular-devkit/architect" "0.803.20" - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" - "@schematics/angular" "8.3.20" - "@schematics/update" "0.803.20" + "@angular-devkit/architect" "0.803.14" + "@angular-devkit/core" "8.3.14" + "@angular-devkit/schematics" "8.3.14" + "@schematics/angular" "8.3.14" + "@schematics/update" "0.803.14" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "^4.1.1" @@ -229,14 +222,14 @@ universal-analytics "^0.4.20" uuid "^3.3.2" -"@angular/common@^8.0.0": +"@angular/common@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/common/-/common-8.2.14.tgz#027e52b2951c14082d6e3af1a4ffa1356220e439" integrity sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw== dependencies: tslib "^1.9.0" -"@angular/compiler-cli@^8.0.0": +"@angular/compiler-cli@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz#1997bec04a6b9d022954e5747505fe8906994594" integrity sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA== @@ -252,54 +245,47 @@ tslib "^1.9.0" yargs "13.1.0" -"@angular/compiler@^8.0.0": +"@angular/compiler@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/compiler/-/compiler-8.2.14.tgz#46db7a9d1c17f236126518ff26480c160d5a6183" integrity sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw== dependencies: tslib "^1.9.0" -"@angular/core@^8.0.0": +"@angular/core@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/core/-/core-8.2.14.tgz#35566f5b19480369229477e7e0e0fde740bd5204" integrity sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g== dependencies: tslib "^1.9.0" -"@angular/forms@^8.0.0": - version "8.2.14" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/forms/-/forms-8.2.14.tgz#7d357c346a3884881beb044c50ec4a09d3d7ee8e" - integrity sha512-zhyKL3CFIqcyHJ/TQF/h1OZztK611a6rxuPHCrt/5Sn1SuBTJJQ1pPTkOYIDy6IrCrtyANc8qB6P17Mao71DNQ== - dependencies: - tslib "^1.9.0" - -"@angular/language-service@^8.0.0": +"@angular/language-service@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/language-service/-/language-service-8.2.14.tgz#e18b27a6841577ce489ad31540150da5a444ca37" integrity sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA== -"@angular/platform-browser-dynamic@^8.0.0": +"@angular/platform-browser-dynamic@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz#4439a79fe10ec45170e6940a28835e9ff0918950" integrity sha512-mO2JPR5kLU/A3AQngy9+R/Q5gaF9csMStBQjwsCRI0wNtlItOIGL6+wTYpiTuh/ux+WVN1F2sLcEYU4Zf1ud9A== dependencies: tslib "^1.9.0" -"@angular/platform-browser@^8.0.0": +"@angular/platform-browser@^8.2.0": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/platform-browser/-/platform-browser-8.2.14.tgz#31f082e8ba977f9b89964d721c38cbc32ce0e433" integrity sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ== dependencies: tslib "^1.9.0" -"@angular/router@^8.0.0": +"@angular/router@^8.2.14": version "8.2.14" resolved "https://nexus.ci.psu.edu/repository/npm-all/@angular/router/-/router-8.2.14.tgz#5f9f9707710983c2143aead79dcd2da520ae3eb8" integrity sha512-DHA2BhODqV7F0g6ZKgFaZgbsqzHHWRcfWchCOrOVKu2rYiKUTwwHVLBgZAhrpNeinq2pWanVYSIhMr7wy+LfEA== dependencies: tslib "^1.9.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://nexus.ci.psu.edu/repository/npm-all/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== @@ -1148,7 +1134,7 @@ slash "^2.0.0" strip-ansi "^5.0.0" -"@jest/environment@^24.3.0", "@jest/environment@^24.9.0": +"@jest/environment@^24.9.0": version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== @@ -1158,7 +1144,7 @@ "@jest/types" "^24.9.0" jest-mock "^24.9.0" -"@jest/fake-timers@^24.3.0", "@jest/fake-timers@^24.9.0": +"@jest/fake-timers@^24.9.0": version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== @@ -1244,7 +1230,7 @@ source-map "^0.6.1" write-file-atomic "2.4.1" -"@jest/types@^24.3.0", "@jest/types@^24.9.0": +"@jest/types@^24.9.0": version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== @@ -1269,6 +1255,11 @@ tree-kill "1.2.1" webpack-sources "1.4.3" +"@nguniversal/express-engine@^8.1.1": + version "8.1.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@nguniversal/express-engine/-/express-engine-8.1.1.tgz#253f2a484764cf183a679847a0c25c52d5b25ab9" + integrity sha512-LKfNnKb1BU1IyI/U7LcDgU744ptrn7fTYb3QqHAlGaozHUNRjXpNuBdkrcAS5+8UAhRlTllpSt1c+TmY2/tomA== + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -1427,14 +1418,6 @@ "@angular-devkit/core" "8.3.14" "@angular-devkit/schematics" "8.3.14" -"@schematics/angular@8.3.20", "@schematics/angular@^8.0.6": - version "8.3.20" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/angular/-/angular-8.3.20.tgz#737d0a73e891446899a2267c4cc348b6c5a78ca8" - integrity sha512-Y20pSJhQ0KQd8Tk2kPQlmpRDNDaoIKMeOOGLT2FgCFrumxZXuIbBgN9fGDgW40iI2sq80bccOeo24RKkn3QpcA== - dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" - "@schematics/angular@^0.1.11": version "0.1.17" resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/angular/-/angular-0.1.17.tgz#084a7cbe2de6f94a856bd08d95c9d35ef8905e2b" @@ -1442,6 +1425,14 @@ dependencies: typescript "~2.6.2" +"@schematics/angular@^8.0.6": + version "8.3.20" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/angular/-/angular-8.3.20.tgz#737d0a73e891446899a2267c4cc348b6c5a78ca8" + integrity sha512-Y20pSJhQ0KQd8Tk2kPQlmpRDNDaoIKMeOOGLT2FgCFrumxZXuIbBgN9fGDgW40iI2sq80bccOeo24RKkn3QpcA== + dependencies: + "@angular-devkit/core" "8.3.20" + "@angular-devkit/schematics" "8.3.20" + "@schematics/schematics@0.0.11": version "0.0.11" resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/schematics/-/schematics-0.0.11.tgz#c8f70f270ed38f29b2873248126fd59abd635862" @@ -1455,13 +1446,13 @@ "@angular-devkit/core" "8.0.4" "@angular-devkit/schematics" "8.0.4" -"@schematics/update@0.803.20": - version "0.803.20" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/update/-/update-0.803.20.tgz#f6cce4f0ee435d8a4071817ac43e418f2b51d22a" - integrity sha512-MseLreuHdnSLUEnRxZFVSHKKK+3mGXH12SgOSeirwATIL22Df74+Q5BYvsge/Kd2k6s9ak/NCuRXG7FAo8mkMA== +"@schematics/update@0.803.14": + version "0.803.14" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@schematics/update/-/update-0.803.14.tgz#831c7f816f75d98aeec370cdfa490c7431130af8" + integrity sha512-1erj7oaR2vKXo1DLE0s4BbbouBmgeAHEkPHQM7FPtyroZ18kytlT+qjTbsSnlRCwcFsjxmRkbRjXaXDz7ttsYQ== dependencies: - "@angular-devkit/core" "8.3.20" - "@angular-devkit/schematics" "8.3.20" + "@angular-devkit/core" "8.3.14" + "@angular-devkit/schematics" "8.3.14" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.5" @@ -1481,11 +1472,6 @@ dependencies: defer-to-connect "^1.0.1" -"@types/archy@^0.0.31": - version "0.0.31" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/archy/-/archy-0.0.31.tgz#01650a4641e7e1d11dbd64eda42eec9a2f829c7f" - integrity sha512-v+dxizsFVyXgD3EpFuqT9YjdEjbJmPxNf1QIX9ohZOhxh1ZF2yhqv3vYaeum9lg3VghhxS5S0a6yldN9J9lPEQ== - "@types/babel__core@^7.1.0": version "7.1.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" @@ -1519,11 +1505,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== - "@types/estree@*": version "0.0.40" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/estree/-/estree-0.0.40.tgz#0e6cb9b9bbd098031fa19e4b4e8131bc70e5de13" @@ -1539,13 +1520,6 @@ resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/fs-extra@^8.0.0": - version "8.0.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/fs-extra/-/fs-extra-8.0.1.tgz#a2378d6e7e8afea1564e44aafa2e207dadf77686" - integrity sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw== - dependencies: - "@types/node" "*" - "@types/glob@^7.1.1": version "7.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -1580,47 +1554,40 @@ resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/jasmine/-/jasmine-3.5.0.tgz#2ad2006c8a937d20df20a8fee86071d0f730ef99" integrity sha512-kGCRI9oiCxFS6soGKlyzhMzDydfcPix9PpTkr7h11huxOxhWwP37Tg7DYBaQ18eQTNreZEuLkhpbGSqVNZPnnw== -"@types/jest@24.0.23": - version "24.0.23" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" - integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== +"@types/jest-diff@*": + version "24.3.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/jest-diff/-/jest-diff-24.3.0.tgz#29e237a3d954babfe6e23cc59b57ecd8ca8d858d" + integrity sha512-vx1CRDeDUwQ0Pc7v+hS61O1ETA81kD04IMEC0hS1kPyVtHDdZrokAvpF7MT9VI/fVSzicelUZNCepDvhRV1PeA== dependencies: - jest-diff "^24.3.0" + jest-diff "*" -"@types/jquery@3.3.31": - version "3.3.31" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/jquery/-/jquery-3.3.31.tgz#27c706e4bf488474e1cb54a71d8303f37c93451b" - integrity sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg== +"@types/jest@24.0.9": + version "24.0.9" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/jest/-/jest-24.0.9.tgz#74ce9cf337f25e189aa18f76ab3d65e8669b55f2" + integrity sha512-k3OOeevcBYLR5pdsOv5g3OP94h3mrJmLPHFEPWgbbVy2tGv0TZ/TlygiC848ogXhK8NL0I5up7YYtwpCp8xCJA== dependencies: - "@types/sizzle" "*" + "@types/jest-diff" "*" "@types/json5@^0.0.29": version "0.0.29" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/lodash.debounce@^4.0.6": - version "4.0.6" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz#c5a2326cd3efc46566c47e4c0aa248dc0ee57d60" - integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.149" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" - integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== - "@types/minimatch@*": version "3.0.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*", "@types/node@^12.0.10", "@types/node@^12.0.2", "@types/node@~12.12.16": +"@types/node@*", "@types/node@^12.0.10", "@types/node@^12.0.2": version "12.12.16" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/node/-/node-12.12.16.tgz#3ebcbd7bf978fa4c5120fee8be57083271a8b3ac" integrity sha512-vRuMyoOr5yfNf8QWxXegOjeyjpWJxFePzHzmBOIzDIzo+rSqF94RW0PkS6y4T2+VjAWLXHWrfbIJY3E3aS7lUw== +"@types/node@~8.9.4": + version "8.9.5" + resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" + integrity sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -1633,14 +1600,7 @@ dependencies: "@types/node" "*" -"@types/sass@^1.16.0": - version "1.16.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/sass/-/sass-1.16.0.tgz#b41ac1c17fa68ffb57d43e2360486ef526b3d57d" - integrity sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA== - dependencies: - "@types/node" "*" - -"@types/sizzle@*", "@types/sizzle@2.3.2": +"@types/sizzle@2.3.2": version "2.3.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== @@ -1863,7 +1823,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-globals@^4.1.0, acorn-globals@^4.3.2: +acorn-globals@^4.1.0, acorn-globals@^4.3.0: version "4.3.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== @@ -1871,6 +1831,11 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + acorn-walk@^6.0.1, acorn-walk@^6.1.1: version "6.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -1881,7 +1846,7 @@ acorn@^5.5.3: resolved "https://nexus.ci.psu.edu/repository/npm-all/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.0.7, acorn@^6.2.1: +acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.7, acorn@^6.2.1: version "6.4.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== @@ -1940,7 +1905,7 @@ ajv@6.10.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@6.10.2, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: +ajv@6.10.2, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -2036,6 +2001,11 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +any-base@^1.1.0: + version "1.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + any-observable@^0.3.0: version "0.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" @@ -2057,7 +2027,7 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -app-root-path@^2.0.1, app-root-path@^2.2.1: +app-root-path@^2.0.1, app-root-path@^2.1.0: version "2.2.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== @@ -2072,11 +2042,6 @@ arch@2.1.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== -archy@^1.0.0: - version "1.0.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://nexus.ci.psu.edu/repository/npm-all/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -2085,11 +2050,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -arg@^4.1.0: - version "4.1.2" - resolved "https://nexus.ci.psu.edu/repository/npm-all/arg/-/arg-4.1.2.tgz#e70c90579e02c63d80e3ad4e31d8bfdb8bd50064" - integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg== - argparse@^1.0.7: version "1.0.10" resolved "https://nexus.ci.psu.edu/repository/npm-all/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2105,12 +2065,19 @@ aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -2162,12 +2129,17 @@ array-uniq@^1.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= +array-unique@^0.2.1: + version "0.2.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + array-unique@^0.3.2: version "0.3.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arrify@^1.0.1: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -2226,7 +2198,7 @@ async-each@^1.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-limiter@^1.0.0, async-limiter@~1.0.0: +async-limiter@~1.0.0: version "1.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== @@ -2299,7 +2271,7 @@ axobject-query@^2.0.2: "@babel/runtime" "^7.7.4" "@babel/runtime-corejs3" "^7.7.4" -babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -2433,6 +2405,11 @@ babylon@^6.18.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backoff-rxjs@^6.3.3: + version "6.3.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/backoff-rxjs/-/backoff-rxjs-6.3.3.tgz#224b97495202a307abad8698e5006a722ec4c657" + integrity sha512-+NfPlA9GYB+6gFk7wDTsUMUecqHLmikt/yfUmddPPUNT9DzmU/p31CTsZT4b3S2g46q87fP34gwPJsZ66Eyedg== + balanced-match@^1.0.0: version "1.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -2563,6 +2540,15 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://nexus.ci.psu.edu/repository/npm-all/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -2699,7 +2685,7 @@ buffer-crc32@~0.2.3: resolved "https://nexus.ci.psu.edu/repository/npm-all/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-from@1.x, buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -2938,7 +2924,7 @@ caseless@~0.12.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2973,7 +2959,7 @@ check-types@^8.0.3: resolved "https://nexus.ci.psu.edu/repository/npm-all/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.0.2: +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0: version "3.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== @@ -3157,12 +3143,12 @@ code-point-at@^1.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codelyzer@~5.2.0: - version "5.2.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/codelyzer/-/codelyzer-5.2.0.tgz#b0ee573a12779c996090e596c5c1755479d83758" - integrity sha512-izfUfhEOOgAizszPlEDxo71DK/C4wprZw0vkY6UWcOSTQvN1JyfXf9DXwaV7WX+/JC+hH0ShXfdtGLA9Rca7LA== +codelyzer@~5.0.1: + version "5.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/codelyzer/-/codelyzer-5.0.1.tgz#c52a593368269b791594603968eb82cbecae3cda" + integrity sha512-UVV76+/y1RwaxzCeGPFE3G4GFtfV42r3x8EmRd7XMNFLlLC0ewdtCqWTbvhwPQMxFZZ+OTLEOJNWfyPPn3QFWg== dependencies: - app-root-path "^2.2.1" + app-root-path "^2.1.0" aria-query "^3.0.0" axobject-query "^2.0.2" css-selector-tokenizer "^0.7.1" @@ -3452,7 +3438,7 @@ conventional-changelog-writer@^4.0.11: split "^1.0.0" through2 "^3.0.0" -conventional-changelog@^3.1.8: +conventional-changelog@^3.1.15: version "3.1.15" resolved "https://nexus.ci.psu.edu/repository/npm-all/conventional-changelog/-/conventional-changelog-3.1.15.tgz#103d0b550436cf83e8a59ba88be82ece2613cd9f" integrity sha512-CoWM+Z9bYyF00QzNpTnxkCLiuLAeRocJz3C/foFjvhsdltdtkJgMChp7GytQNjm4pT7JFBVJTpqLHTpxNtOzaA== @@ -3565,16 +3551,11 @@ core-js@3.2.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== -core-js@^2.4.0: +core-js@^2.4.0, core-js@^2.5.4: version "2.6.11" resolved "https://nexus.ci.psu.edu/repository/npm-all/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.4.8: - version "3.4.8" - resolved "https://nexus.ci.psu.edu/repository/npm-all/core-js/-/core-js-3.4.8.tgz#e0fc0c61f2ef90cbc10c531dbffaa46dfb7152dd" - integrity sha512-b+BBmCZmVgho8KnBUOXpvlqEMguko+0P+kXCwD4vIprsXC6ht1qgPxtb1OK6XgSlrySF71wkwBQ0Hv695bk9gQ== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3725,30 +3706,18 @@ cssesc@^0.1.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@~0.3.6: +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4: version "0.3.8" resolved "https://nexus.ci.psu.edu/repository/npm-all/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssom@^0.4.1: - version "0.4.4" - resolved "https://nexus.ci.psu.edu/repository/npm-all/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssstyle@^1.0.0: +cssstyle@^1.0.0, cssstyle@^1.1.1: version "1.4.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== dependencies: cssom "0.3.x" -cssstyle@^2.0.0: - version "2.0.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/cssstyle/-/cssstyle-2.0.0.tgz#911f0fe25532db4f5d44afc83f89cc4b82c97fe3" - integrity sha512-QXSAu2WBsSRXCPjvI43Y40m6fMevvyRm8JVAuF9ksQz5jha4pWP1wpaK7Yu5oLFc6+XAY+hj8YhefyXcBB53gg== - dependencies: - cssom "~0.3.6" - cuint@^0.2.2: version "0.2.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" @@ -3766,10 +3735,10 @@ cyclist@^1.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -cypress@3.7.0: - version "3.7.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/cypress/-/cypress-3.7.0.tgz#e2cd71b87b6ce0d4c72c6ea25da1005d75c1f231" - integrity sha512-o+vfRxqAba8TduelzfZQ4WHmj2yNEjaoO2EuZ8dZ9pJpuW+WGtBGheKIp6zkoQsp8ZgFe8OoHh1i2mY8BDnMAw== +cypress@3.6.1: + version "3.6.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/cypress/-/cypress-3.6.1.tgz#4420957923879f60b7a5146ccbf81841a149b653" + integrity sha512-6n0oqENdz/oQ7EJ6IgESNb2M7Bo/70qX9jSJsAziJTC3kICfEMmJUlrAnP9bn+ut24MlXQST5nRXhUP5nRIx6A== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" @@ -3856,7 +3825,7 @@ dateformat@^3.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@*, debug@4.1.1, debug@^4.1.0, debug@^4.1.1: +debug@*, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4088,10 +4057,10 @@ diff-sequences@^24.9.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== -diff@^4.0.1: - version "4.0.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" - integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== +diff@^3.1.0, diff@^3.2.0: + version "3.5.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: version "5.0.3" @@ -4136,6 +4105,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + domain-browser@^1.1.1: version "1.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -4162,10 +4138,10 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dotenv@8.2.0: - version "8.2.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@6.2.0: + version "6.2.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== duplexer3@^0.1.4: version "0.1.4" @@ -4356,7 +4332,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://nexus.ci.psu.edu/repository/npm-all/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.11.1, escodegen@^1.9.1: +escodegen@^1.11.0, escodegen@^1.9.1: version "1.12.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== @@ -4376,6 +4352,78 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.4.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@6.1.0: + version "6.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" + integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^6.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.4.1" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.0.0: + version "6.1.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + esprima@^3.1.3: version "3.1.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -4386,6 +4434,13 @@ esprima@^4.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.0.1: + version "1.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -4393,7 +4448,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -4514,6 +4569,13 @@ exit@^0.1.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://nexus.ci.psu.edu/repository/npm-all/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -4527,6 +4589,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -4611,6 +4680,13 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -4750,6 +4826,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-loader@4.2.0: version "4.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e" @@ -4758,11 +4841,27 @@ file-loader@4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + filesize@^3.6.1: version "3.6.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== +fill-range@^2.1.0: + version "2.2.4" + resolved "https://nexus.ci.psu.edu/repository/npm-all/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4869,6 +4968,20 @@ findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -4884,11 +4997,18 @@ follow-redirects@^1.0.0: dependencies: debug "^3.0.0" -for-in@^1.0.2: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +for-own@^0.1.4: + version "0.1.5" + resolved "https://nexus.ci.psu.edu/repository/npm-all/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4946,7 +5066,7 @@ fs-extra@6.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@8.1.0, fs-extra@^8.0.0, fs-extra@^8.1.0: +fs-extra@8.1.0, fs-extra@^8.0.0: version "8.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -5000,6 +5120,11 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -5132,6 +5257,21 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -5140,7 +5280,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== @@ -5210,7 +5350,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.1.0: +globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -5257,13 +5397,6 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globs@^0.1.4: - version "0.1.4" - resolved "https://nexus.ci.psu.edu/repository/npm-all/globs/-/globs-0.1.4.tgz#1d13639f6174e4ae73a7f936da7d9a079f657c1c" - integrity sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ== - dependencies: - glob "^7.1.1" - got@^9.6.0: version "9.6.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -5639,6 +5772,11 @@ ignore@^3.3.5: resolved "https://nexus.ci.psu.edu/repository/npm-all/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.6: + version "4.0.6" + resolved "https://nexus.ci.psu.edu/repository/npm-all/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + ignore@^5.1.1: version "5.1.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" @@ -5809,7 +5947,7 @@ inquirer@6.5.1: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^6.3.1: +inquirer@^6.3.1, inquirer@^6.4.1: version "6.5.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -5926,7 +6064,7 @@ is-callable@^1.1.4: resolved "https://nexus.ci.psu.edu/repository/npm-all/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@1.2.1: +is-ci@1.2.1, is-ci@^1.0.10: version "1.2.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== @@ -5982,6 +6120,18 @@ is-directory@^0.3.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -5994,6 +6144,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6028,6 +6183,13 @@ is-generator-fn@^2.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6060,6 +6222,13 @@ is-npm@^3.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" integrity sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA== +is-number@^2.1.0: + version "2.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + is-number@^3.0.0: version "3.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -6067,6 +6236,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-number@^7.0.0: version "7.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -6127,6 +6301,16 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + is-promise@^2.1.0: version "2.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -6329,7 +6513,7 @@ jest-changed-files@^24.9.0: execa "^1.0.0" throat "^4.0.0" -jest-cli@^24.9.0: +jest-cli@^24.1.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== @@ -6371,7 +6555,7 @@ jest-config@^24.9.0: pretty-format "^24.9.0" realpath-native "^1.1.0" -jest-diff@^24.3.0, jest-diff@^24.9.0: +jest-diff@*, jest-diff@^24.9.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -6399,17 +6583,14 @@ jest-each@^24.9.0: jest-util "^24.9.0" pretty-format "^24.9.0" -jest-environment-jsdom-fifteen@^1.0.0: - version "1.0.2" - resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz#49a0af55e0d32737a6114a1575dd714702ad63b0" - integrity sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg== +jest-environment-jsdom-thirteen@^0.0.2: + version "0.0.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-environment-jsdom-thirteen/-/jest-environment-jsdom-thirteen-0.0.2.tgz#8de6a9cc178cb585adfaf2d58a646c514502df9f" + integrity sha512-NH7b44aUdSjSzIYogJS9WkymmJNA+Q3na6XebsxZmP70NzW++/WD1Ky8E6PVxTqKuEnYzxFA/5Of2VxoreugGg== dependencies: - "@jest/environment" "^24.3.0" - "@jest/fake-timers" "^24.3.0" - "@jest/types" "^24.3.0" - jest-mock "^24.0.0" - jest-util "^24.0.0" - jsdom "^15.2.1" + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^13.0.0" jest-environment-jsdom@^24.9.0: version "24.9.0" @@ -6498,6 +6679,17 @@ jest-matcher-utils@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + jest-message-util@^24.9.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" @@ -6512,7 +6704,12 @@ jest-message-util@^24.9.0: slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.0.0, jest-mock@^24.9.0: +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + +jest-mock@^24.9.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== @@ -6524,13 +6721,12 @@ jest-pnp-resolver@^1.2.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-preset-angular@8.0.0: - version "8.0.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-preset-angular/-/jest-preset-angular-8.0.0.tgz#6653f4cb5df32ca63af032417a18da44ad5e4f2b" - integrity sha512-POQUTOdZwHJOFTr8lT+bR9da1L5ItRPQSjC1gyKf3wXO9ct2Ht08CO60dYDshivfewThdqzMeVYzgM9tEssw2A== +jest-preset-angular@7.0.0: + version "7.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-preset-angular/-/jest-preset-angular-7.0.0.tgz#cf2dfa75ec8d3846e28afac0da0da269f8036ca2" + integrity sha512-XwMTabZ7/clqpWxgmrXeqKUNn5eXuyNtddFyG1JWTtVoRFIru8kEigk9Eyra82Yx0vJIN1KkNoOKieBQfqfvwQ== dependencies: - jest-environment-jsdom-fifteen "^1.0.0" - pretty-format "^24.0.0" + jest-environment-jsdom-thirteen "^0.0.2" ts-jest "^24.0.0" jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: @@ -6636,7 +6832,21 @@ jest-snapshot@^24.9.0: pretty-format "^24.9.0" semver "^6.2.0" -jest-util@^24.0.0, jest-util@^24.9.0: +jest-util@^23.4.0: + version "23.4.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + +jest-util@^24.9.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== @@ -6687,15 +6897,15 @@ jest-worker@24.9.0, jest-worker@^24.6.0, jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" -jest@24.9.0: - version "24.9.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== +jest@24.1.0: + version "24.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2" + integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A== dependencies: import-local "^2.0.0" - jest-cli "^24.9.0" + jest-cli "^24.1.0" -js-beautify@^1.10.0: +js-beautify@^1.10.2: version "1.10.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== @@ -6721,7 +6931,7 @@ js-tokens@^3.0.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.13.1, js-yaml@^3.9.0: +js-yaml@^3.13.1, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.13.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -6766,36 +6976,36 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" -jsdom@^15.2.1: - version "15.2.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== +jsdom@^13.0.0: + version "13.2.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a" + integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw== dependencies: abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" + acorn "^6.0.4" + acorn-globals "^4.3.0" array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" data-urls "^1.1.0" domexception "^1.0.1" - escodegen "^1.11.1" + escodegen "^1.11.0" html-encoding-sniffer "^1.0.2" - nwsapi "^2.2.0" + nwsapi "^2.0.9" parse5 "5.1.0" pn "^1.1.0" request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" + request-promise-native "^1.0.5" + saxes "^3.1.5" symbol-tree "^3.2.2" - tough-cookie "^3.0.1" + tough-cookie "^2.5.0" w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" + w3c-xmlserializer "^1.0.1" webidl-conversions "^4.0.2" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^7.0.0" - ws "^7.0.0" + ws "^6.1.2" xml-name-validator "^3.0.0" jsesc@^1.3.0: @@ -6838,6 +7048,11 @@ json-schema@0.2.3: resolved "https://nexus.ci.psu.edu/repository/npm-all/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7010,7 +7225,7 @@ leven@^3.1.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -7209,11 +7424,6 @@ lodash.clonedeep@^4.5.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://nexus.ci.psu.edu/repository/npm-all/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -7302,12 +7512,7 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -loglevel-plugin-prefix@^0.8.4: - version "0.8.4" - resolved "https://nexus.ci.psu.edu/repository/npm-all/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" - integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== - -loglevel@^1.6.3, loglevel@^1.6.4: +loglevel@^1.6.4: version "1.6.6" resolved "https://nexus.ci.psu.edu/repository/npm-all/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== @@ -7474,6 +7679,11 @@ material-schematics@^1.0.23: parse5 "^3.0.3" typescript "^2.5.2" +math-random@^1.0.1: + version "1.0.4" + resolved "https://nexus.ci.psu.edu/repository/npm-all/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + md5.js@^1.3.4: version "1.3.5" resolved "https://nexus.ci.psu.edu/repository/npm-all/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -7589,6 +7799,25 @@ methods@~1.1.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromatch@^2.3.11: + version "2.3.11" + resolved "https://nexus.ci.psu.edu/repository/npm-all/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://nexus.ci.psu.edu/repository/npm-all/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -7757,6 +7986,11 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0. dependencies: minimist "0.0.8" +mockdate@^2.0.5: + version "2.0.5" + resolved "https://nexus.ci.psu.edu/repository/npm-all/mockdate/-/mockdate-2.0.5.tgz#70c6abf9ed4b2dae65c81dfc170dd1a5cec53620" + integrity sha512-ST0PnThzWKcgSLyc+ugLVql45PvESt3Ul/wrdV/OPc/6Pr8dbLAIJsN1cIp41FLzbN+srVTNIRn+5Cju0nyV6A== + modify-values@^1.0.0: version "1.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -7863,7 +8097,7 @@ neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -ng-packagr@^5.1.0: +ng-packagr@^5.4.0: version "5.7.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/ng-packagr/-/ng-packagr-5.7.1.tgz#8e082e38e7b6089296bf0491f2e5b29122f8e08d" integrity sha512-NDAUcMtLyZnF3bP6JtC3ANpIQRclRDPilF7C0DsjQuIz1q0V3mT7f1PwV0jnRWy8iRpSZmJZr6AGl736gloHtQ== @@ -7896,6 +8130,13 @@ ng-packagr@^5.1.0: terser "^4.1.2" update-notifier "^3.0.0" +ngx-cookie@^4.1.2: + version "4.1.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/ngx-cookie/-/ngx-cookie-4.1.2.tgz#ab2fafc6ee7f23b7ad92f8427dc714894e60aa31" + integrity sha512-BU3q+116mSQZvf8WsnKDxyWFy10LtxSvZz1YIjD7pmaSFpiKdWmHTHn0qLgm3OoIL9TfInQ7Ij46rKJWPD+4Kw== + dependencies: + tslib "^1.9.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://nexus.ci.psu.edu/repository/npm-all/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8013,7 +8254,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -8172,7 +8413,7 @@ number-is-nan@^1.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.0.7, nwsapi@^2.2.0: +nwsapi@^2.0.7, nwsapi@^2.0.9: version "2.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== @@ -8236,6 +8477,14 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -8318,7 +8567,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8567,6 +8816,16 @@ parse-github-repo-url@^1.3.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://nexus.ci.psu.edu/repository/npm-all/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -8889,6 +9148,11 @@ prepend-http@^2.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +preserve@^0.2.0: + version "0.2.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + prettier@1.16.4: version "1.16.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" @@ -8899,17 +9163,7 @@ prettier@1.18.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -prettier@1.19.1: - version "1.19.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -pretty-bytes@^5.3.0: - version "5.3.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" - integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg== - -pretty-format@^24.0.0, pretty-format@^24.9.0: +pretty-format@^24.9.0: version "24.9.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -8934,6 +9188,11 @@ process@^0.11.10: resolved "https://nexus.ci.psu.edu/repository/npm-all/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress@^2.0.0: + version "2.0.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -9104,6 +9363,15 @@ ramda@0.24.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= +randomatic@^3.0.0: + version "3.1.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -9357,6 +9625,13 @@ regenerator-transform@^0.14.0: dependencies: private "^0.1.6" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://nexus.ci.psu.edu/repository/npm-all/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -9372,6 +9647,11 @@ regexp.prototype.flags@^1.2.0: dependencies: define-properties "^1.1.2" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^1.0.0: version "1.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -9442,7 +9722,7 @@ repeat-element@^1.1.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -9468,7 +9748,7 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" -request-promise-native@^1.0.5, request-promise-native@^1.0.7: +request-promise-native@^1.0.5: version "1.0.8" resolved "https://nexus.ci.psu.edu/repository/npm-all/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== @@ -9638,6 +9918,13 @@ right-pad@^1.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" integrity sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA= +rimraf@2.6.3: + version "2.6.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@3.0.0, rimraf@^3.0.0: version "3.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" @@ -9742,7 +10029,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@6.4.0: +rxjs@6.4.0, rxjs@~6.4.0: version "6.4.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== @@ -9756,7 +10043,7 @@ rxjs@^5.0.0-beta.11, rxjs@^5.5.2: dependencies: symbol-observable "1.0.1" -rxjs@^6.0.0, rxjs@^6.3.3, rxjs@^6.4.0, rxjs@~6.5.3: +rxjs@^6.0.0, rxjs@^6.3.3, rxjs@^6.4.0: version "6.5.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== @@ -9818,7 +10105,7 @@ sass@1.22.9: dependencies: chokidar ">=2.0.0 <4.0.0" -sass@^1.17.3, sass@^1.22.9: +sass@^1.17.3: version "1.23.7" resolved "https://nexus.ci.psu.edu/repository/npm-all/sass/-/sass-1.23.7.tgz#090254e006af1219d442f1bff31e139d5e085dff" integrity sha512-cYgc0fanwIpi0rXisGxl+/wadVQ/HX3RhpdRcjLdj2o2ye/sxUTpAxIhbmJy3PLQgRFbf6Pn8Jsrta2vdXcoOQ== @@ -9835,7 +10122,7 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://nexus.ci.psu.edu/repository/npm-all/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^3.1.9: +saxes@^3.1.5: version "3.1.11" resolved "https://nexus.ci.psu.edu/repository/npm-all/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== @@ -9866,30 +10153,6 @@ schema-utils@^2.0.0, schema-utils@^2.0.1: ajv "^6.10.2" ajv-keywords "^3.4.1" -scss-bundle@^3.0.2: - version "3.0.2" - resolved "https://nexus.ci.psu.edu/repository/npm-all/scss-bundle/-/scss-bundle-3.0.2.tgz#c6fd4d8738a938584070210beb9bd5eb69d87bbb" - integrity sha512-6OUFD+bD1ko/nrcXEGQ58NY/pTAQyj3LBfUyCpDeplcs8m8U7CWAfSuK49BrV5PEUGRXEh3oiETxqeG1vJSvrA== - dependencies: - "@types/archy" "^0.0.31" - "@types/debug" "^4.1.5" - "@types/fs-extra" "^8.0.0" - "@types/glob" "^7.1.1" - "@types/lodash.debounce" "^4.0.6" - "@types/sass" "^1.16.0" - archy "^1.0.0" - chalk "^2.4.2" - chokidar "^3.0.2" - commander "^3.0.0" - fs-extra "^8.1.0" - globs "^0.1.4" - lodash.debounce "^4.0.8" - loglevel "^1.6.3" - loglevel-plugin-prefix "^0.8.4" - pretty-bytes "^5.3.0" - sass "^1.22.9" - tslib "^1.10.0" - select-hose@^2.0.0: version "2.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -9938,7 +10201,7 @@ semver@5.4.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -semver@6.3.0, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -10083,6 +10346,14 @@ shellwords@^0.1.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +short-uuid@^3.1.1: + version "3.1.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/short-uuid/-/short-uuid-3.1.1.tgz#3ff427074b5fa7822c3793994d18a7a82e2f73a4" + integrity sha512-7dI69xtJYpTIbg44R6JSgrbDtZFuZ9vAwwmnF/L0PinykbFrhQ7V8omKsQcVw1TP0nYJ7uQp1PN6/aVMkzQFGQ== + dependencies: + any-base "^1.1.0" + uuid "^3.3.2" + sigmund@^1.0.1: version "1.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -10118,6 +10389,15 @@ slice-ansi@0.0.4: resolved "https://nexus.ci.psu.edu/repository/npm-all/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + smart-buffer@^4.1.0: version "4.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" @@ -10622,7 +10902,7 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@3.0.1: +strip-json-comments@3.0.1, strip-json-comments@^3.0.1: version "3.0.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== @@ -10704,6 +10984,16 @@ symbol-tree@^3.2.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^5.2.3: + version "5.4.6" + resolved "https://nexus.ci.psu.edu/repository/npm-all/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -10797,6 +11087,11 @@ text-extensions@^1.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-table@^0.2.0: + version "0.2.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -10915,7 +11210,7 @@ toidentifier@1.0.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@^2.3.3, tough-cookie@^2.3.4: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0: version "2.5.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -10923,15 +11218,6 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -10977,7 +11263,22 @@ tryer@^1.0.1: resolved "https://nexus.ci.psu.edu/repository/npm-all/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-jest@24.2.0, ts-jest@^24.0.0: +ts-jest@24.0.0: + version "24.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6" + integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +ts-jest@^24.0.0: version "24.2.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/ts-jest/-/ts-jest-24.2.0.tgz#7abca28c2b4b0a1fdd715cd667d65d047ea4e768" integrity sha512-Yc+HLyldlIC9iIK8xEN7tV960Or56N49MDP7hubCZUeI7EbIOTsas6rXCMB4kQjLACJ7eDOF4xWEO5qumpKsag== @@ -11004,16 +11305,24 @@ ts-loader@5.3.1: micromatch "^3.1.4" semver "^5.0.1" -ts-node@~8.5.4: - version "8.5.4" - resolved "https://nexus.ci.psu.edu/repository/npm-all/ts-node/-/ts-node-8.5.4.tgz#a152add11fa19c221d0b48962c210cf467262ab2" - integrity sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw== +ts-mocks@^2.6.0: + version "2.6.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/ts-mocks/-/ts-mocks-2.6.0.tgz#fc4aaaae9701d23af9a794fd2d6f952c8f7b6f0e" + integrity sha512-ZnAf04fPS4f8EEFKgh8TjbjY57PFxgmjoleCmFIc5P6dXlOGHJQYWQybwMJxf40mFqc1UZWMQn36z1zMsvQCKA== + +ts-node@~7.0.0: + version "7.0.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: - arg "^4.1.0" - diff "^4.0.1" + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" source-map-support "^0.5.6" - yn "^3.0.0" + yn "^2.0.0" tsconfig-paths-webpack-plugin@3.2.0: version "3.2.0" @@ -11034,7 +11343,7 @@ tsconfig-paths@^3.4.0: minimist "^1.2.0" strip-bom "^3.0.0" -tsickle@^0.37.1: +tsickle@^0.37.0: version "0.37.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09" integrity sha512-0GwgOJEnsmRsrONXCvcbAWY0CvdqF3UugPVoupUpA8Ul0qCPTuqqq0ou/hLqtKZOyyulzCP6MYRjb9/J1g9bJg== @@ -11044,26 +11353,25 @@ tslib@1.10.0, tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://nexus.ci.psu.edu/repository/npm-all/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslint@~5.20.1: - version "5.20.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== +tslint@~5.11.0: + version "5.11.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= dependencies: - "@babel/code-frame" "^7.0.0" + babel-code-frame "^6.22.0" builtin-modules "^1.1.1" chalk "^2.3.0" commander "^2.12.1" - diff "^4.0.1" + diff "^3.2.0" glob "^7.1.1" - js-yaml "^3.13.1" + js-yaml "^3.7.0" minimatch "^3.0.4" - mkdirp "^0.5.1" resolve "^1.3.2" semver "^5.3.0" tslib "^1.8.0" - tsutils "^2.29.0" + tsutils "^2.27.2" -tsutils@^2.29.0: +tsutils@^2.27.2: version "2.29.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== @@ -11122,7 +11430,7 @@ typedarray@^0.0.6: resolved "https://nexus.ci.psu.edu/repository/npm-all/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.5.3: +typescript@3.5.3, typescript@~3.5.3: version "3.5.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== @@ -11142,11 +11450,6 @@ typescript@~2.6.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" integrity sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q= -typescript@~3.4.5: - version "3.4.5" - resolved "https://nexus.ci.psu.edu/repository/npm-all/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" - integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== - uglify-js@^3.1.4: version "3.7.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/uglify-js/-/uglify-js-3.7.2.tgz#cb1a601e67536e9ed094a92dd1e333459643d3f9" @@ -11348,6 +11651,11 @@ uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2: resolved "https://nexus.ci.psu.edu/repository/npm-all/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://nexus.ci.psu.edu/repository/npm-all/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -11394,7 +11702,7 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -w3c-xmlserializer@^1.1.2: +w3c-xmlserializer@^1.0.1: version "1.1.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== @@ -11572,6 +11880,35 @@ webpack@4.39.2: watchpack "^1.6.0" webpack-sources "^1.4.1" +webpack@^4.18.1: + version "4.41.2" + resolved "https://nexus.ci.psu.edu/repository/npm-all/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" + integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.1" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + websocket-driver@>=0.5.1: version "0.7.3" resolved "https://nexus.ci.psu.edu/repository/npm-all/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" @@ -11726,6 +12063,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@1.0.3: + version "1.0.3" + resolved "https://nexus.ci.psu.edu/repository/npm-all/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^5.2.0: version "5.2.2" resolved "https://nexus.ci.psu.edu/repository/npm-all/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -11733,20 +12077,13 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.0.0, ws@^6.2.1: +ws@^6.0.0, ws@^6.1.2, ws@^6.2.1: version "6.2.1" resolved "https://nexus.ci.psu.edu/repository/npm-all/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== dependencies: async-limiter "~1.0.0" -ws@^7.0.0: - version "7.2.0" - resolved "https://nexus.ci.psu.edu/repository/npm-all/ws/-/ws-7.2.0.tgz#422eda8c02a4b5dba7744ba66eebbd84bcef0ec7" - integrity sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg== - dependencies: - async-limiter "^1.0.0" - xdg-basedir@^3.0.0: version "3.0.0" resolved "https://nexus.ci.psu.edu/repository/npm-all/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -11915,12 +12252,12 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" -yn@^3.0.0: - version "3.1.1" - resolved "https://nexus.ci.psu.edu/repository/npm-all/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yn@^2.0.0: + version "2.0.0" + resolved "https://nexus.ci.psu.edu/repository/npm-all/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= -zone.js@^0.10.2: - version "0.10.2" - resolved "https://nexus.ci.psu.edu/repository/npm-all/zone.js/-/zone.js-0.10.2.tgz#67ca084b3116fc33fc40435e0d5ea40a207e392e" - integrity sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg== +zone.js@^0.9.1: + version "0.9.1" + resolved "https://nexus.ci.psu.edu/repository/npm-all/zone.js/-/zone.js-0.9.1.tgz#e37c6e5c54c13fae4de26b5ffe8d8e9212da6d9b" + integrity sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==