diff --git a/.vscode/launch.json b/.vscode/launch.json index 01137e28b..0fb28bc3c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -79,6 +79,8 @@ "args": [ "--require", "reflect-metadata/Reflect", + "--require", + "ignore-styles", "--no-timeouts", "--colors", "**/${fileBasenameNoExtension}.js" diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index abe0caa88..9977146d3 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -4,7 +4,7 @@ "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { - "prepare": "yarn download-cli && yarn download-fwuploader && yarn download-ls && yarn clean && yarn download-examples && yarn build", + "prepare": "yarn download-cli && yarn download-fwuploader && yarn download-ls && yarn clean && yarn download-examples && yarn build && yarn test", "clean": "rimraf lib", "download-cli": "node ./scripts/download-cli.js", "download-fwuploader": "node ./scripts/download-fwuploader.js", @@ -101,6 +101,7 @@ "protoc": "^1.0.4", "shelljs": "^0.8.3", "sinon": "^9.0.1", + "typemoq": "^2.1.0", "uuid": "^3.2.1", "yargs": "^11.1.0" }, @@ -109,7 +110,8 @@ }, "mocha": { "require": [ - "reflect-metadata/Reflect" + "reflect-metadata/Reflect", + "ignore-styles" ], "reporter": "spec", "colors": true, diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 0ea3a786a..028ff657d 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -165,8 +165,9 @@ import { MonacoTextModelService as TheiaMonacoTextModelService } from '@theia/mo import { MonacoTextModelService } from './theia/monaco/monaco-text-model-service'; import { ResponseServiceImpl } from './response-service-impl'; import { - ResponseServicePath, ResponseService, + ResponseServiceArduino, + ResponseServicePath, } from '../common/protocol/response-service'; import { NotificationCenter } from './notification-center'; import { @@ -617,7 +618,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); return responseService; }); + bind(ResponseService).toService(ResponseServiceImpl); + bind(ResponseServiceArduino).toService(ResponseServiceImpl); bind(NotificationCenter).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(NotificationCenter); diff --git a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts index 63dc6f2b0..61a5c26e3 100644 --- a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts +++ b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts @@ -7,10 +7,9 @@ import { Board, } from '../../common/protocol/boards-service'; import { BoardsServiceProvider } from './boards-service-provider'; -import { BoardsListWidgetFrontendContribution } from './boards-widget-frontend-contribution'; import { BoardsConfig } from './boards-config'; -import { Installable } from '../../common/protocol'; -import { ResponseServiceImpl } from '../response-service-impl'; +import { Installable, ResponseServiceArduino } from '../../common/protocol'; +import { BoardsListWidgetFrontendContribution } from './boards-widget-frontend-contribution'; /** * Listens on `BoardsConfig.Config` changes, if a board is selected which does not @@ -27,8 +26,8 @@ export class BoardsAutoInstaller implements FrontendApplicationContribution { @inject(BoardsServiceProvider) protected readonly boardsServiceClient: BoardsServiceProvider; - @inject(ResponseServiceImpl) - protected readonly responseService: ResponseServiceImpl; + @inject(ResponseServiceArduino) + protected readonly responseService: ResponseServiceArduino; @inject(BoardsListWidgetFrontendContribution) protected readonly boardsManagerFrontendContribution: BoardsListWidgetFrontendContribution; @@ -106,7 +105,7 @@ export class BoardsAutoInstaller implements FrontendApplicationContribution { }); return; } - if (answer) { + if (answer === 'Install Manually') { this.boardsManagerFrontendContribution .openView({ reveal: true }) .then((widget) => diff --git a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts index e955d8b93..79eed21e4 100644 --- a/arduino-ide-extension/src/browser/contributions/add-zip-library.ts +++ b/arduino-ide-extension/src/browser/contributions/add-zip-library.ts @@ -4,8 +4,11 @@ import URI from '@theia/core/lib/common/uri'; import { ConfirmDialog } from '@theia/core/lib/browser/dialogs'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { ArduinoMenus } from '../menu/arduino-menus'; -import { ResponseServiceImpl } from '../response-service-impl'; -import { Installable, LibraryService } from '../../common/protocol'; +import { + Installable, + LibraryService, + ResponseServiceArduino, +} from '../../common/protocol'; import { SketchContribution, Command, @@ -18,8 +21,8 @@ export class AddZipLibrary extends SketchContribution { @inject(EnvVariablesServer) protected readonly envVariableServer: EnvVariablesServer; - @inject(ResponseServiceImpl) - protected readonly responseService: ResponseServiceImpl; + @inject(ResponseServiceArduino) + protected readonly responseService: ResponseServiceArduino; @inject(LibraryService) protected readonly libraryService: LibraryService; diff --git a/arduino-ide-extension/src/browser/response-service-impl.ts b/arduino-ide-extension/src/browser/response-service-impl.ts index 7a62e407e..8690e77b8 100644 --- a/arduino-ide-extension/src/browser/response-service-impl.ts +++ b/arduino-ide-extension/src/browser/response-service-impl.ts @@ -3,13 +3,13 @@ import { Emitter } from '@theia/core/lib/common/event'; import { OutputContribution } from '@theia/output/lib/browser/output-contribution'; import { OutputChannelManager } from '@theia/output/lib/common/output-channel'; import { - ResponseService, OutputMessage, ProgressMessage, + ResponseServiceArduino, } from '../common/protocol/response-service'; @injectable() -export class ResponseServiceImpl implements ResponseService { +export class ResponseServiceImpl implements ResponseServiceArduino { @inject(OutputContribution) protected outputContribution: OutputContribution; @@ -17,8 +17,13 @@ export class ResponseServiceImpl implements ResponseService { protected outputChannelManager: OutputChannelManager; protected readonly progressDidChangeEmitter = new Emitter(); + readonly onProgressDidChange = this.progressDidChangeEmitter.event; + clearArduinoChannel(): void { + this.outputChannelManager.getChannel('Arduino').clear(); + } + appendToOutput(message: OutputMessage): void { const { chunk } = message; const channel = this.outputChannelManager.getChannel('Arduino'); @@ -26,10 +31,6 @@ export class ResponseServiceImpl implements ResponseService { channel.append(chunk); } - clearArduinoChannel(): void { - this.outputChannelManager.getChannel('Arduino').clear(); - } - reportProgress(progress: ProgressMessage): void { this.progressDidChangeEmitter.fire(progress); } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index c7b7c33c3..18cb0723d 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx @@ -11,7 +11,7 @@ import { SearchBar } from './search-bar'; import { ListWidget } from './list-widget'; import { ComponentList } from './component-list'; import { ListItemRenderer } from './list-item-renderer'; -import { ResponseServiceImpl } from '../../response-service-impl'; +import { ResponseServiceArduino } from '../../../common/protocol'; export class FilterableListContainer< T extends ArduinoComponent @@ -153,7 +153,7 @@ export namespace FilterableListContainer { readonly resolveFocus: (element: HTMLElement | undefined) => void; readonly filterTextChangeEvent: Event; readonly messageService: MessageService; - readonly responseService: ResponseServiceImpl; + readonly responseService: ResponseServiceArduino; readonly install: ({ item, progressId, diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 5dedf6137..e6f4836b0 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -12,11 +12,11 @@ import { Installable, Searchable, ArduinoComponent, + ResponseServiceArduino, } from '../../../common/protocol'; import { FilterableListContainer } from './filterable-list-container'; import { ListItemRenderer } from './list-item-renderer'; import { NotificationCenter } from '../../notification-center'; -import { ResponseServiceImpl } from '../../response-service-impl'; @injectable() export abstract class ListWidget< @@ -28,8 +28,8 @@ export abstract class ListWidget< @inject(CommandService) protected readonly commandService: CommandService; - @inject(ResponseServiceImpl) - protected readonly responseService: ResponseServiceImpl; + @inject(ResponseServiceArduino) + protected readonly responseService: ResponseServiceArduino; @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; diff --git a/arduino-ide-extension/src/common/protocol/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index 7375e6124..206039408 100644 --- a/arduino-ide-extension/src/common/protocol/installable.ts +++ b/arduino-ide-extension/src/common/protocol/installable.ts @@ -7,7 +7,7 @@ import { import { naturalCompare } from './../utils'; import { ArduinoComponent } from './arduino-component'; import { MessageService } from '@theia/core'; -import { ResponseServiceImpl } from '../../browser/response-service-impl'; +import { ResponseServiceArduino } from './response-service'; export interface Installable { /** @@ -44,7 +44,7 @@ export namespace Installable { >(options: { installable: Installable; messageService: MessageService; - responseService: ResponseServiceImpl; + responseService: ResponseServiceArduino; item: T; version: Installable.Version; }): Promise { @@ -66,7 +66,7 @@ export namespace Installable { >(options: { installable: Installable; messageService: MessageService; - responseService: ResponseServiceImpl; + responseService: ResponseServiceArduino; item: T; }): Promise { const { item } = options; @@ -86,7 +86,7 @@ export namespace Installable { export async function doWithProgress(options: { run: ({ progressId }: { progressId: string }) => Promise; messageService: MessageService; - responseService: ResponseServiceImpl; + responseService: ResponseServiceArduino; progressText: string; }): Promise { return withProgress( diff --git a/arduino-ide-extension/src/common/protocol/response-service.ts b/arduino-ide-extension/src/common/protocol/response-service.ts index 9d843a458..8a31877ab 100644 --- a/arduino-ide-extension/src/common/protocol/response-service.ts +++ b/arduino-ide-extension/src/common/protocol/response-service.ts @@ -1,3 +1,5 @@ +import { Event } from '@theia/core/lib/common/event'; + export interface OutputMessage { readonly chunk: string; readonly severity?: 'error' | 'warning' | 'info'; // Currently not used! @@ -21,3 +23,9 @@ export interface ResponseService { appendToOutput(message: OutputMessage): void; reportProgress(message: ProgressMessage): void; } + +export const ResponseServiceArduino = Symbol('ResponseServiceArduino'); +export interface ResponseServiceArduino extends ResponseService { + onProgressDidChange: Event; + clearArduinoChannel: () => void; +} diff --git a/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts b/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts new file mode 100644 index 000000000..efd75e943 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/boards-auto-installer.test.ts @@ -0,0 +1,247 @@ +import { enableJSDOM } from '@theia/core/lib/browser/test/jsdom'; +const disableJSDOM = enableJSDOM(); + +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; +import { ApplicationProps } from '@theia/application-package/lib/application-props'; +FrontendApplicationConfigProvider.set({ + ...ApplicationProps.DEFAULT.frontend.config, +}); + +import { MessageService } from '@theia/core'; +import { BoardsServiceProvider } from '../../browser/boards/boards-service-provider'; +import { BoardsListWidgetFrontendContribution } from '../../browser/boards/boards-widget-frontend-contribution'; +import { + Board, + BoardsPackage, + BoardsService, + Port, + ResponseServiceArduino, +} from '../../common/protocol'; +import { IMock, It, Mock, Times } from 'typemoq'; +import { Container, ContainerModule } from 'inversify'; +import { BoardsAutoInstaller } from '../../browser/boards/boards-auto-installer'; +import { BoardsConfig } from '../../browser/boards/boards-config'; +import { tick } from '../utils'; +import { ListWidget } from '../../browser/widgets/component-list/list-widget'; + +disableJSDOM(); + +const aBoard: Board = { + fqbn: 'some:board:fqbn', + name: 'Some Arduino Board', + port: { address: '/lol/port1234', protocol: 'serial' }, +}; +const aPort: Port = { + address: aBoard.port!.address, + protocol: aBoard.port!.protocol, +}; +const aBoardConfig: BoardsConfig.Config = { + selectedBoard: aBoard, + selectedPort: aPort, +}; +const aPackage: BoardsPackage = { + author: 'someAuthor', + availableVersions: ['some.ver.sion', 'some.other.version'], + boards: [aBoard], + deprecated: false, + description: 'Some Arduino Board, Some Other Arduino Board', + id: 'some:arduinoCoreId', + installable: true, + moreInfoLink: 'http://www.some-url.lol/', + name: 'Some Arduino Package', + summary: 'Boards included in this package:', +}; + +const anInstalledPackage: BoardsPackage = { + ...aPackage, + installedVersion: 'some.ver.sion', +}; + +describe('BoardsAutoInstaller', () => { + let subject: BoardsAutoInstaller; + let messageService: IMock; + let boardsService: IMock; + let boardsServiceClient: IMock; + let responseService: IMock; + let boardsManagerFrontendContribution: IMock; + let boardsManagerWidget: IMock>; + + let testContainer: Container; + + beforeEach(() => { + testContainer = new Container(); + messageService = Mock.ofType(); + boardsService = Mock.ofType(); + boardsServiceClient = Mock.ofType(); + responseService = Mock.ofType(); + boardsManagerFrontendContribution = + Mock.ofType(); + boardsManagerWidget = Mock.ofType>(); + + boardsManagerWidget.setup((b) => + b.refresh(aPackage.name.toLocaleLowerCase()) + ); + + boardsManagerFrontendContribution + .setup((b) => b.openView({ reveal: true })) + .returns(async () => boardsManagerWidget.object); + + messageService + .setup((m) => m.showProgress(It.isAny(), It.isAny())) + .returns(async () => ({ + cancel: () => null, + id: '', + report: () => null, + result: Promise.resolve(''), + })); + + responseService + .setup((r) => r.onProgressDidChange(It.isAny())) + .returns(() => ({ dispose: () => null })); + + const module = new ContainerModule((bind) => { + bind(BoardsAutoInstaller).toSelf(); + bind(MessageService).toConstantValue(messageService.object); + bind(BoardsService).toConstantValue(boardsService.object); + bind(BoardsServiceProvider).toConstantValue(boardsServiceClient.object); + bind(ResponseServiceArduino).toConstantValue(responseService.object); + bind(BoardsListWidgetFrontendContribution).toConstantValue( + boardsManagerFrontendContribution.object + ); + }); + + testContainer.load(module); + subject = testContainer.get(BoardsAutoInstaller); + }); + + context('when it starts', () => { + it('should register to the BoardsServiceClient in order to check the packages every a new board is plugged in', () => { + subject.onStart(); + boardsServiceClient.verify( + (b) => b.onBoardsConfigChanged(It.isAny()), + Times.once() + ); + }); + + context('and it checks the installable packages', () => { + context(`and a port and a board a selected`, () => { + beforeEach(() => { + boardsServiceClient + .setup((b) => b.boardsConfig) + .returns(() => aBoardConfig); + }); + context('if no package for the board is already installed', () => { + context('if a candidate package for the board is found', () => { + beforeEach(() => { + boardsService + .setup((b) => b.search(It.isValue({}))) + .returns(async () => [aPackage]); + }); + it('should show a notification suggesting to install that package', async () => { + messageService + .setup((m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) + ) + .returns(() => Promise.resolve('Install Manually')); + subject.onStart(); + await tick(); + messageService.verify( + (m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), + Times.once() + ); + }); + context(`if the answer to the message is 'Yes'`, () => { + beforeEach(() => { + messageService + .setup((m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) + ) + .returns(() => Promise.resolve('Yes')); + }); + it('should install the package', async () => { + subject.onStart(); + + await tick(); + + messageService.verify( + (m) => m.showProgress(It.isAny(), It.isAny()), + Times.once() + ); + }); + }); + context( + `if the answer to the message is 'Install Manually'`, + () => { + beforeEach(() => { + messageService + .setup((m) => + m.info( + It.isAnyString(), + It.isAnyString(), + It.isAnyString() + ) + ) + .returns(() => Promise.resolve('Install Manually')); + }); + it('should open the boards manager widget', () => { + subject.onStart(); + }); + } + ); + }); + context('if a candidate package for the board is not found', () => { + beforeEach(() => { + boardsService + .setup((b) => b.search(It.isValue({}))) + .returns(async () => []); + }); + it('should do nothing', async () => { + subject.onStart(); + await tick(); + messageService.verify( + (m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), + Times.never() + ); + }); + }); + }); + context( + 'if one of the packages for the board is already installed', + () => { + beforeEach(() => { + boardsService + .setup((b) => b.search(It.isValue({}))) + .returns(async () => [aPackage, anInstalledPackage]); + messageService + .setup((m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()) + ) + .returns(() => Promise.resolve('Yes')); + }); + it('should do nothing', async () => { + subject.onStart(); + await tick(); + messageService.verify( + (m) => + m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), + Times.never() + ); + }); + } + ); + }); + context('and there is no selected board or port', () => { + it('should do nothing', async () => { + subject.onStart(); + await tick(); + messageService.verify( + (m) => m.info(It.isAnyString(), It.isAnyString(), It.isAnyString()), + Times.never() + ); + }); + }); + }); + }); +}); diff --git a/arduino-ide-extension/src/test/utils.ts b/arduino-ide-extension/src/test/utils.ts new file mode 100644 index 000000000..799081227 --- /dev/null +++ b/arduino-ide-extension/src/test/utils.ts @@ -0,0 +1,3 @@ +export function tick(): Promise { + return new Promise((res) => setTimeout(res, 1)); +} diff --git a/package.json b/package.json index 4c60c4b00..404e94ee3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "node": ">=12.14.1 <13" }, "devDependencies": { + "@types/jsdom": "^11.0.4", + "@types/sinon": "^2.3.5", "@theia/cli": "next", "@typescript-eslint/eslint-plugin": "^4.27.0", "@typescript-eslint/parser": "^4.27.0", @@ -21,12 +23,15 @@ "eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-unused-imports": "^1.1.1", "husky": "^6.0.0", + "ignore-styles": "^5.0.1", "lerna": "^3.20.2", "lint-staged": "^11.0.0", "prettier": "^2.3.1", + "reflect-metadata": "^0.1.10", "rimraf": "^2.6.1", "semver": "^7.3.2", - "typescript": "^3.9.2" + "typescript": "^3.9.2", + "jsdom": "^11.5.1" }, "scripts": { "prepare": "cross-env THEIA_ELECTRON_SKIP_REPLACE_FFMPEG=1 lerna run prepare && yarn download:plugins", diff --git a/yarn.lock b/yarn.lock index 058b76d20..8f4fd61eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2786,6 +2786,16 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.6.tgz#7f10c926aa41e189a2755c4c7fcf8e4573bd7ac1" integrity sha512-cK4XqrLvP17X6c0C8n4iTbT59EixqyXL3Fk8/Rsk4dF3oX4dg70gYUXrXVUUHpnsGMPNlTQMqf+TVmNPX6FmSQ== +"@types/jsdom@^11.0.4": + version "11.12.0" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-11.12.0.tgz#00ddc6f0a1b04c2f5ff6fb23eb59360ca65f12ae" + integrity sha512-XHMNZFQ0Ih3A4/NTWAO15+OsQafPKnQCanN0FYGbsTM/EoI5EoEAvvkF51/DQC2BT5low4tomp7k2RLMlriA5Q== + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^4.0.0" + "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -3059,6 +3069,11 @@ "@types/mime" "^1" "@types/node" "*" +"@types/sinon@^2.3.5": + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.7.tgz#e92c2fed3297eae078d78d1da032b26788b4af86" + integrity sha512-w+LjztaZbgZWgt/y/VMP5BUAWLtSyoIJhXyW279hehLPyubDoBNwvhcj3WaSptcekuKYeTCVxrq60rdLc6ImJA== + "@types/sinon@^7.5.2": version "7.5.2" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.2.tgz#5e2f1d120f07b9cda07e5dedd4f3bf8888fccdb9" @@ -3418,6 +3433,11 @@ JSONStream@^1.0.4, JSONStream@^1.2.1, JSONStream@^1.3.4, JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -3438,12 +3458,30 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn@^6.4.1: +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + +acorn@^6.0.1, acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== @@ -3927,6 +3965,11 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -5118,6 +5161,11 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -5707,6 +5755,11 @@ circular-dependency-plugin@^5.0.0: resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -6524,6 +6577,18 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + csstype@^2.5.7: version "2.6.16" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.16.tgz#544d69f547013b85a40d15bff75db38f34fe9c39" @@ -6570,6 +6635,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-fns@^1.27.2: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -6746,6 +6820,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@*: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -6955,6 +7034,13 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + dompurify@^2.0.11: version "2.2.7" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.7.tgz#a5f055a2a471638680e779bd08fc334962d11fd8" @@ -7376,6 +7462,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.9.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" @@ -7522,7 +7620,7 @@ esprima@^2.6.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7546,7 +7644,7 @@ esrecurse@^4.1.0, esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -7889,7 +7987,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -9281,6 +9379,13 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-tag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed" @@ -9457,6 +9562,11 @@ ignore-loader@^0.1.2: resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" integrity sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM= +ignore-styles@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-styles/-/ignore-styles-5.0.1.tgz#b49ef2274bdafcd8a4880a966bfe38d1a0bf4671" + integrity sha1-tJ7yJ0va/NikiAqWa/440aC/RnE= + ignore-walk@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" @@ -10334,6 +10444,38 @@ jscodeshift@^0.5.0: temp "^0.8.1" write-file-atomic "^1.2.0" +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -10550,6 +10692,11 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + lerna@^3.20.2: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -10605,6 +10752,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + line-height@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" @@ -12156,6 +12311,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -12349,6 +12509,18 @@ optimist@~0.3.5: dependencies: wordwrap "~0.0.2" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -12712,6 +12884,11 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" +parse5@4.0.0, parse5@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -12917,6 +13094,11 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -13201,6 +13383,11 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" +postinstall-build@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postinstall-build/-/postinstall-build-5.0.3.tgz#238692f712a481d8f5bc8960e94786036241efc7" + integrity sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg== + prebuild-install@^5.2.4: version "5.3.6" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.6.tgz#7c225568d864c71d89d07f8796042733a3f54291" @@ -13247,6 +13434,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -14156,7 +14348,23 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -request@^2.45.0, request@^2.82.0, request@^2.86.0, request@^2.88.0, request@^2.88.2: +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.45.0, request@^2.82.0, request@^2.86.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -14996,6 +15204,11 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -15399,6 +15612,11 @@ symbol-observable@^0.2.2: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + table@^6.0.9: version "6.7.1" resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" @@ -15709,7 +15927,7 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -15832,6 +16050,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -15902,6 +16127,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typemoq@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/typemoq/-/typemoq-2.1.0.tgz#4452ce360d92cf2a1a180f0c29de2803f87af1e8" + integrity sha512-DtRNLb7x8yCTv/KHlwes+NI+aGb4Vl1iPC63Hhtcvk1DpxSAZzKWQv0RQFY0jX2Uqj0SDBNl8Na4e6MV6TNDgw== + dependencies: + circular-json "^0.3.1" + lodash "^4.17.4" + postinstall-build "^5.0.1" + typeof-article@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af" @@ -16377,6 +16611,13 @@ vscode-ws-jsonrpc@^0.2.0: dependencies: vscode-jsonrpc "^5.0.0" +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + warning-symbol@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/warning-symbol/-/warning-symbol-0.1.0.tgz#bb31dd11b7a0f9d67ab2ed95f457b65825bbad21" @@ -16487,6 +16728,27 @@ webpack@^4.0.0: watchpack "^1.7.4" webpack-sources "^1.4.1" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -16569,7 +16831,7 @@ with-open-file@^0.1.6: p-try "^2.1.0" pify "^4.0.1" -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -16699,6 +16961,13 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" +ws@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + ws@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -16729,6 +16998,11 @@ xdg-trashdir@^2.1.1: user-home "^2.0.0" xdg-basedir "^2.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"