From 80290ad83b502182351c6431f8bd73ebc2850527 Mon Sep 17 00:00:00 2001 From: pavolum Date: Wed, 10 Feb 2021 10:53:16 -0700 Subject: [PATCH] feat: npm based 'new bot' flow behind feature flag (#5029) * - Cloned creation flow - Put new creation flow behind a feature flag * added fetchTemplateV2 which grabs templates from public npm and NuGet feeds * minor feed changes * Adding passed feedUrl support for template fetch * initial implementation of template picker design * populate template description view with corresponding readMe pulled from npm and viewed as html * package instantiated on creation from npm [partial] * yeomen template generation working e2e for conversational core * Cleaned up old template flashing bug, changed runtime template * Adding featureflag data to ExtensionContext * clean up * Yeomen generator template working e2e with new runtime generator package * -Added ability for variable runtime command in appsettings -cleaned up var names * Clean up to ensure new creation flow does not affect legacy creation flow * Adding runtime template for C# adaptive runtime * Removing undoable template sideloading conditional since extensions cant access feature flag state * Adding path to yeomon repo to process.env * ensure yeomen env intialized .yo-repository dir in appData directory * Make dictionary for feeds that are called to populate template view. Clean up template tab useEffect. * removing unused code and comments. Fixed double telem bug. * moved template readMe into local component state as opposed to recoil app state * removing run command string manipulation code as this is now handled in the yeomen template * Making template feeds strongly typed and removing UI conditional * minor bug fix, creationFlow V1 mounts and loads V1 templates regardless of new creation FF. Adding conditional to prevent template load on mount. * grabbing templates when app loads * Adding back in PVA integration to new create flow * adding null check and removing commented code * Adding missing fields in creation flow UI to be used later with template creation * fix linting errors * removing unsed import * - moved yeomen env instanse to assetManager - fixed versioning for name validation regex * Put yeomen env creation behind feature flag * fix required fields * updates to make package manager work * Load yeomenEnv regardless of Feature Flag value * adjust azurepublish to work with new runtime format * Added additional error handling and cleaned up code * removing yeomen constructor params * fix repo instantiation * removing unneeded condtional * apply fix to exclude generated content from the schema merger * fix issue where package manager would reload feed unnecessarily * undoing autoformat changes * interface to type conversion and clean up * Moving server calls from asset controller to assetManager * removing package-lock.json * removing commented code * Added template versioning * Initial readme implementation * Fininshing readme change * removing auto format changes * Adding remaining telem * implementation of initial component unit test * added unit test ffor new fetchtemplate server endpoint * adding createProjAsync unit test * increase timeout for creation test * Fixing test expectation to account for undefined PVA variables * minor clean up * Fixed dir in which .yo-repository dir is generated * macked long runnning async creation call to isolate createProjV2 test * Adding test for template feed grabbing * moved controller function to service class as it is not an api endpoint * properly mocked createProjAsync for testing * removing unused references * Adding unit test for feed driven template instantiation with mocked yeomen lib to avoid test api calls * Adding test for fetch read me flow with mocked fetch * Adding feature flag considarations to contribution documentation * updating yarn.lock with latest output from yarn install * minor PR changes * Removing console.log that was used for testing * removing unused reference * Making PR changes - removing console.logs() - removing unneeded comments - removing package.json - changing string interpolation * fixing unit test Co-authored-by: Patrick Volum Co-authored-by: Ben Brown Co-authored-by: Chris Whitten --- CONTRIBUTING.md | 1 + .../CreateOptions/index.test.tsx | 51 + .../DefineConversation/index.test.tsx | 69 + .../components/CreationFlowV2/index.test.tsx | 101 ++ Composer/packages/client/package.json | 2 + .../components/CreationFlow/CreationFlow.tsx | 10 +- .../CreationFlow/v2/CreateOptions.tsx | 258 ++++ .../CreationFlow/v2/CreationFlow.tsx | 197 +++ .../CreationFlow/v2/DefineConversation.tsx | 368 +++++ .../CreationFlow/v2/TemplateDetailView.tsx | 17 + .../components/ImportModal/ImportModal.tsx | 1 + Composer/packages/client/src/constants.ts | 32 + Composer/packages/client/src/index.css | 2 +- .../packages/client/src/pages/home/Home.tsx | 24 +- .../client/src/recoilModel/atoms/appState.ts | 5 + .../src/recoilModel/dispatchers/project.ts | 19 + .../src/recoilModel/dispatchers/storage.ts | 21 + .../recoilModel/dispatchers/utils/project.ts | 2 + Composer/packages/client/src/router.tsx | 2 + Composer/packages/electron-server/src/main.ts | 1 + .../electron-server/src/utility/url.ts | 1 + .../lib/shared/src/featureFlagUtils/index.ts | 8 +- Composer/packages/server/package.json | 9 +- .../src/controllers/__tests__/asset.test.ts | 40 + .../src/controllers/__tests__/project.test.ts | 39 + .../packages/server/src/controllers/asset.ts | 52 + .../server/src/controllers/project.ts | 65 +- .../packages/server/src/locales/en-US.json | 30 + .../asset/__tests__/assetManager.test.ts | 72 + .../server/src/models/asset/assetManager.ts | 179 ++- .../server/src/models/bot/botProject.ts | 3 + Composer/packages/server/src/router/api.ts | 2 + .../packages/server/src/services/project.ts | 89 ++ Composer/packages/server/src/settings/env.ts | 1 + Composer/packages/server/src/utility/npm.ts | 23 +- .../packages/server/src/utility/project.ts | 2 +- Composer/packages/types/src/creation.ts | 24 + Composer/packages/types/src/featureFlags.ts | 7 +- Composer/packages/types/src/index.ts | 1 + Composer/packages/types/src/runtime.ts | 11 +- Composer/packages/types/src/telemetry.ts | 1 + Composer/yarn.lock | 1014 +++++++++++++- extensions/azurePublish/src/node/index.ts | 65 +- .../azurePublish/src/node/luisAndQnA.ts | 3 +- extensions/localPublish/src/index.ts | 8 +- .../packageManager/src/client/Library.tsx | 25 +- extensions/packageManager/src/node/index.ts | 24 +- extensions/packageManager/yarn.lock | 1226 +---------------- extensions/runtimes/src/index.ts | 172 +++ extensions/samples/src/index.ts | 10 +- 50 files changed, 2953 insertions(+), 1436 deletions(-) create mode 100644 Composer/packages/client/__tests__/components/CreationFlowV2/CreateOptions/index.test.tsx create mode 100644 Composer/packages/client/__tests__/components/CreationFlowV2/DefineConversation/index.test.tsx create mode 100644 Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx create mode 100644 Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx create mode 100644 Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx create mode 100644 Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx create mode 100644 Composer/packages/client/src/components/CreationFlow/v2/TemplateDetailView.tsx create mode 100644 Composer/packages/types/src/creation.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 694aaae0b8..22b2e31e87 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,7 @@ - Programatic testing for each change is a requirement. Comprehensive unit tests for every change is not. _"Write tests, not too many, mostly integration"_. We should be using [Jest](https://jestjs.io/) & [@testing-library/react](https://github.com/testing-library/react-testing-library) for this in the client. Code coverage benchmarks will be introduced and need to be met with each change (TBD). - Write code with Internationalization & Accessibility in mind. Every rendered string should be wrapped in an i18n API. Scrub through each UI change for keyboard-navigation and focus-indication. This will prevent most accessibility bugs. - Use `rebase` when merging changes into to the main branch. This can be done using the _“Squash and Merge”_ technique in the GitHub UI. Local branches will need to be updated using rebase as well. This will keep a clean commit history. Reach out to me if you need help understanding rebase. +- Features pushed behind a feature flag (regardless if the feature flag is hidden or not) need to follow all traditional PR requirements to the main branch. ### Forking diff --git a/Composer/packages/client/__tests__/components/CreationFlowV2/CreateOptions/index.test.tsx b/Composer/packages/client/__tests__/components/CreationFlowV2/CreateOptions/index.test.tsx new file mode 100644 index 0000000000..04e7ce6975 --- /dev/null +++ b/Composer/packages/client/__tests__/components/CreationFlowV2/CreateOptions/index.test.tsx @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { fireEvent } from '@botframework-composer/test-utils'; + +import { renderWithRecoil } from '../../../testUtils'; +import { CreateOptionsV2 } from '../../../../src/components/CreationFlow/v2/CreateOptions'; + +describe('', () => { + const handleDismissMock = jest.fn(); + const handleCreateNextMock = jest.fn(); + const handleFetchReadMeMock = jest.fn(); + const handleFetchTemplatesMock = jest.fn(); + + const templates = [ + { + description: 'conversational core template generator', + id: 'generator-conversational-core', + index: 0, + name: 'conversational-core', + package: { + packageName: 'generator-conversational-core', + packageSource: 'npm', + packageVersion: '1.0.9', + }, + }, + ]; + + const renderComponent = () => { + return renderWithRecoil( + + ); + }; + + it('should save conversational core template id', async () => { + const component = renderComponent(); + const conversationalCoreBot = await component.findByText('conversational-core'); + fireEvent.click(conversationalCoreBot); + const nextButton = await component.findByText('Next'); + fireEvent.click(nextButton); + expect(handleCreateNextMock).toBeCalledWith('generator-conversational-core'); + }); +}); diff --git a/Composer/packages/client/__tests__/components/CreationFlowV2/DefineConversation/index.test.tsx b/Composer/packages/client/__tests__/components/CreationFlowV2/DefineConversation/index.test.tsx new file mode 100644 index 0000000000..339bcdf9b9 --- /dev/null +++ b/Composer/packages/client/__tests__/components/CreationFlowV2/DefineConversation/index.test.tsx @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { fireEvent, act, waitFor } from '@botframework-composer/test-utils'; + +import { renderWithRecoil } from '../../../testUtils'; +import { StorageFolder } from '../../../../src/recoilModel/types'; +import { focusedStorageFolderState, storagesState } from '../../../../src/recoilModel'; +import DefineConversationV2 from '../../../../src/components/CreationFlow/v2/DefineConversation'; + +describe('', () => { + const onCurrentPathUpdateMock = jest.fn(); + const onSubmitMock = jest.fn(); + const onDismissMock = jest.fn(); + const createFolder = jest.fn(); + const updateFolder = jest.fn(); + let locationMock; + const focusedStorageFolder: StorageFolder = { + name: 'Desktop', + parent: '/test-folder', + writable: true, + type: 'folder', + path: '/test-folder/Desktop', + children: [ + { + name: 'EchoBot-0', + type: 'bot', + path: 'Desktop/EchoBot-11299', + lastModified: 'Wed Apr 22 2020 17:51:07 GMT-0700 (Pacific Daylight Time)', + size: 1, + }, + ], + }; + function renderComponent() { + return renderWithRecoil( + , + ({ set }) => { + set(focusedStorageFolderState, {} as StorageFolder); + set(storagesState, [{ id: 'default' }]); + } + ); + } + + it('should render the component', () => { + const component = renderComponent(); + expect(component.container).toBeDefined(); + }); + + it('does not allow submission when the name is invalid', async () => { + const component = renderComponent(); + const nameField = await component.getByTestId('NewDialogName'); + act(() => { + fireEvent.change(nameField, { target: { value: 'invalidName;' } }); + }); + + const node = await waitFor(() => component.getByTestId('SubmitNewBotBtn')); + expect(node).toBeDisabled(); + }); +}); diff --git a/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx b/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx new file mode 100644 index 0000000000..f6c7a448f0 --- /dev/null +++ b/Composer/packages/client/__tests__/components/CreationFlowV2/index.test.tsx @@ -0,0 +1,101 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { render, fireEvent, act } from '@botframework-composer/test-utils'; +import { createHistory, createMemorySource, LocationProvider } from '@reach/router'; +import { RecoilRoot } from 'recoil'; +import { getDefaultFeatureFlags } from '@bfc/shared'; + +import { + focusedStorageFolderState, + creationFlowStatusState, + dispatcherState, + featureFlagsState, +} from '../../../src/recoilModel'; +import { CreationFlowStatus } from '../../../src/constants'; +import CreationFlowV2 from '../../../src/components/CreationFlow/v2/CreationFlow'; + +describe('', () => { + let locationMock; + const createProjectMock = jest.fn(); + const initRecoilState = ({ set }) => { + set(dispatcherState, { + createNewBotV2: createProjectMock, + fetchStorages: jest.fn(), + fetchTemplateProjects: jest.fn(), + onboardingAddCoachMarkRef: jest.fn(), + fetchRecentProjects: jest.fn(), + fetchTemplates: jest.fn(), + setCreationFlowStatus: jest.fn(), + navTo: jest.fn(), + saveTemplateId: jest.fn(), + setCurrentPageMode: jest.fn(), + }); + set(creationFlowStatusState, CreationFlowStatus.NEW_FROM_TEMPLATE); + set(featureFlagsState, getDefaultFeatureFlags()); + set(focusedStorageFolderState, { + name: 'Desktop', + parent: '/test-folder', + writable: true, + children: [ + { + name: 'EchoBot-0', + type: 'bot', + path: 'Desktop/EchoBot-11299', + lastModified: 'Wed Apr 22 2020 17:51:07 GMT-0700 (Pacific Daylight Time)', + size: 1, + }, + ], + }); + }; + + function renderWithRouter(ui, { route = '', history = createHistory(createMemorySource(route)) } = {}) { + return { + ...render({ui}), + history, + }; + } + + beforeEach(() => { + createProjectMock.mockReset(); + }); + + it('should render the component', async () => { + const { + findByText, + history: { navigate }, + } = renderWithRouter( + + + + ); + + navigate('create/generator-conversational-core'); + const node = await findByText('OK'); + + act(() => { + fireEvent.click(node); + }); + + let expectedLocation = '/test-folder/Desktop'; + if (process.platform === 'win32') { + expectedLocation = '\\test-folder\\Desktop'; + } + expect(createProjectMock).toHaveBeenCalledWith({ + appLocale: 'en-US', + description: '', + location: expectedLocation, + name: 'generator_conversational_core_0', + schemaUrl: '', + templateId: 'generator-conversational-core', + templateVersion: '', + alias: undefined, + eTag: undefined, + preserveRoot: undefined, + qnqKbUrls: undefined, + templateDir: undefined, + urlSuffix: undefined, + }); + }); +}); diff --git a/Composer/packages/client/package.json b/Composer/packages/client/package.json index aa53ea8d0b..ac47b9c6b3 100644 --- a/Composer/packages/client/package.json +++ b/Composer/packages/client/package.json @@ -35,6 +35,7 @@ "@bfc/ui-plugin-prompts": "*", "@bfc/ui-plugin-select-dialog": "*", "@bfc/ui-plugin-select-skill-dialog": "*", + "@bfc/ui-shared": "*", "@botframework-composer/types": "*", "@emotion/core": "^10.0.27", "@geoffcox/react-splitter": "^2.0.3", @@ -60,6 +61,7 @@ "react-dev-utils": "^7.0.3", "react-dom": "16.13.1", "react-frame-component": "^4.0.2", + "react-markdown": "^5.0.3", "react-measure": "^2.3.0", "react-timeago": "^4.4.0", "recoil": "^0.0.13", diff --git a/Composer/packages/client/src/components/CreationFlow/CreationFlow.tsx b/Composer/packages/client/src/components/CreationFlow/CreationFlow.tsx index ffe6e8f765..6baf094ea1 100644 --- a/Composer/packages/client/src/components/CreationFlow/CreationFlow.tsx +++ b/Composer/packages/client/src/components/CreationFlow/CreationFlow.tsx @@ -7,8 +7,9 @@ import Path from 'path'; import React, { useEffect, useRef, Fragment } from 'react'; import { RouteComponentProps, Router, navigate } from '@reach/router'; import { useRecoilValue } from 'recoil'; +import { csharpFeedKey } from '@bfc/shared'; -import { CreationFlowStatus } from '../../constants'; +import { CreationFlowStatus, feedDictionary } from '../../constants'; import { dispatcherState, creationFlowStatusState, @@ -17,6 +18,7 @@ import { currentProjectIdState, userSettingsState, filteredTemplatesSelector, + featureFlagsState, } from '../../recoilModel'; import Home from '../../pages/home/Home'; import { useProjectIdCache } from '../../utils/hooks'; @@ -32,6 +34,8 @@ type CreationFlowProps = RouteComponentProps<{}>; const CreationFlow: React.FC = () => { const { fetchTemplates, + fetchTemplatesV2, + fetchRecentProjects, fetchStorages, fetchFolderItemsByPath, setCreationFlowStatus, @@ -39,7 +43,6 @@ const CreationFlow: React.FC = () => { updateCurrentPathForStorage, updateFolder, saveTemplateId, - fetchRecentProjects, openProject, createNewBot, saveProjectAs, @@ -48,6 +51,7 @@ const CreationFlow: React.FC = () => { } = useRecoilValue(dispatcherState); const templateProjects = useRecoilValue(filteredTemplatesSelector); + const featureFlags = useRecoilValue(featureFlagsState); const creationFlowStatus = useRecoilValue(creationFlowStatusState); const projectId = useRecoilValue(currentProjectIdState); const storages = useRecoilValue(storagesState); @@ -73,8 +77,8 @@ const CreationFlow: React.FC = () => { await fetchProjectById(cachedProjectId); } await fetchStorages(); - fetchTemplates(); fetchRecentProjects(); + featureFlags.NEW_CREATION_FLOW.enabled ? fetchTemplatesV2([feedDictionary[csharpFeedKey]]) : fetchTemplates(); }; useEffect(() => { diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx new file mode 100644 index 0000000000..e7c61ec3f3 --- /dev/null +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreateOptions.tsx @@ -0,0 +1,258 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** @jsx jsx */ +import { jsx, css } from '@emotion/core'; +import { useState, Fragment, useEffect, useMemo } from 'react'; +import find from 'lodash/find'; +import formatMessage from 'format-message'; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import { DialogFooter } from 'office-ui-fabric-react/lib/Dialog'; +import { ScrollablePane, ScrollbarVisibility } from 'office-ui-fabric-react/lib/ScrollablePane'; +import { Selection } from 'office-ui-fabric-react/lib/DetailsList'; +import { + DetailsList, + DetailsListLayoutMode, + SelectionMode, + CheckboxVisibility, + DetailsRow, +} from 'office-ui-fabric-react/lib/DetailsList'; +import { BotTemplate } from '@bfc/shared'; +import { DialogWrapper, DialogTypes } from '@bfc/ui-shared'; +import { NeutralColors } from '@uifabric/fluent-theme'; +import { RouteComponentProps } from '@reach/router'; +import { IPivotItemProps, Pivot, PivotItem } from 'office-ui-fabric-react/lib/Pivot'; +import { csharpFeedKey } from '@botframework-composer/types'; +import { useRecoilValue } from 'recoil'; + +import { DialogCreationCopy, EmptyBotTemplateId, feedDictionary, QnABotTemplateId } from '../../../constants'; +import { selectedTemplateReadMeState } from '../../../recoilModel'; +import TelemetryClient from '../../../telemetry/TelemetryClient'; + +import { TemplateDetailView } from './TemplateDetailView'; + +// -------------------- Styles -------------------- // + +const detailListContainer = css` + width: 50%; + height: 400px; + overflow: hidden; + float: left; + flex-grow: 1; +`; + +const templateDetailContainer = css` + width: 50%; + height: 400px; + overflow: auto; + flex-grow: 1; + float: left; +`; + +const pickerContainer = css` + position: relative; + height: 400px; + border: 1px solid #f3f2f1; +`; + +const rowDetails = (disabled) => { + return { + root: { + color: disabled ? NeutralColors.gray80 : NeutralColors.black, + selectors: { + '&:hover': { + background: disabled ? NeutralColors.white : NeutralColors.gray30, + color: disabled ? NeutralColors.gray80 : NeutralColors.black, + }, + '&.ms-DetailsRow.is-selected': { + background: disabled ? NeutralColors.white : NeutralColors.gray30, + color: disabled ? NeutralColors.gray80 : NeutralColors.black, + }, + }, + }, + }; +}; + +const rowTitle = (disabled) => { + return { + cellTitle: { + color: disabled ? NeutralColors.gray80 : NeutralColors.black, + selectors: { + ':hover': { + background: disabled ? NeutralColors.white : NeutralColors.gray30, + color: disabled ? NeutralColors.gray80 : NeutralColors.black, + }, + }, + }, + }; +}; + +const tableCell = css` + outline: none; + :focus { + outline: rgb(102, 102, 102) solid 1px; + } +`; + +const content = css` + outline: none; +`; + +const optionKeys = { + createFromScratch: 'createFromScratch', + createFromQnA: 'createFromQnA', + createFromTemplate: 'createFromTemplate', +}; + +// -------------------- CreateOptions -------------------- // +type CreateOptionsProps = { + templates: BotTemplate[]; + onDismiss: () => void; + onNext: (data: string) => void; + fetchTemplates: (feedUrls?: string[]) => Promise; + fetchReadMe: (moduleName: string) => {}; +} & RouteComponentProps<{}>; + +export function CreateOptionsV2(props: CreateOptionsProps) { + const [option] = useState(optionKeys.createFromTemplate); + const [disabled] = useState(false); + const { templates, onDismiss, onNext } = props; + const [currentTemplate, setCurrentTemplate] = useState(''); + const [emptyBotKey, setEmptyBotKey] = useState(''); + const [selectedFeed, setSelectedFeed] = useState<{ props: IPivotItemProps }>({ props: { itemKey: csharpFeedKey } }); + const readMe = useRecoilValue(selectedTemplateReadMeState); + + const selectedTemplate = useMemo(() => { + return new Selection({ + onSelectionChanged: () => { + const t = selectedTemplate.getSelection()[0] as BotTemplate; + if (t) { + setCurrentTemplate(t.id); + } + }, + }); + }, []); + + const handleJumpToNext = () => { + let routeToTemplate = emptyBotKey; + if (option === optionKeys.createFromTemplate) { + routeToTemplate = currentTemplate; + } + + if (option === optionKeys.createFromQnA) { + routeToTemplate = QnABotTemplateId; + } + + if (props.location && props.location.search) { + routeToTemplate += props.location.search; + } + + TelemetryClient.track('CreateNewBotProjectNextButton', { template: routeToTemplate }); + + onNext(routeToTemplate); + }; + + const tableColumns = [ + { + key: 'name', + name: formatMessage('Name'), + fieldName: 'name', + minWidth: 150, + maxWidth: 200, + isResizable: !disabled, + data: 'string', + styles: rowTitle(disabled), + onRender: (item) => ( +
+
+ {item.name} +
+
+ ), + }, + ]; + + const onRenderRow = (props) => { + if (!props) return null; + return ( + + ); + }; + + useEffect(() => { + if (templates.length > 1) { + const emptyBotTemplate = find(templates, ['id', EmptyBotTemplateId]); + if (emptyBotTemplate) { + setCurrentTemplate(emptyBotTemplate.id); + setEmptyBotKey(emptyBotTemplate.id); + } + } + }, [templates]); + + useEffect(() => { + if (selectedFeed?.props?.itemKey) { + props.fetchTemplates([feedDictionary[selectedFeed.props.itemKey]]); + } + }, [selectedFeed]); + + useEffect(() => { + if (currentTemplate) { + props.fetchReadMe(currentTemplate); + } + }, [currentTemplate]); + + return ( + + + { + if (item) { + setSelectedFeed(item); + } + }} + > + + +
+
+ + item.name} + isHeaderVisible={false} + items={templates} + layoutMode={DetailsListLayoutMode.justified} + selection={selectedTemplate} + selectionMode={disabled ? SelectionMode.none : SelectionMode.single} + onRenderRow={onRenderRow} + /> + +
+
+ +
+
+ + + + +
+
+ ); +} diff --git a/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx b/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx new file mode 100644 index 0000000000..75ba7f6fce --- /dev/null +++ b/Composer/packages/client/src/components/CreationFlow/v2/CreationFlow.tsx @@ -0,0 +1,197 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import Path from 'path'; + +import React, { useEffect, useRef, Fragment } from 'react'; +import { RouteComponentProps, Router, navigate } from '@reach/router'; +import { useRecoilValue } from 'recoil'; +import { BotTemplate } from '@bfc/shared'; + +import { CreationFlowStatus } from '../../../constants'; +import { + dispatcherState, + creationFlowStatusState, + storagesState, + focusedStorageFolderState, + currentProjectIdState, + userSettingsState, + templateProjectsState, +} from '../../../recoilModel'; +import Home from '../../../pages/home/Home'; +import { useProjectIdCache } from '../../../utils/hooks'; +import { ImportModal } from '../../ImportModal/ImportModal'; +import { OpenProject } from '../OpenProject'; +import TelemetryClient from '../../../telemetry/TelemetryClient'; + +import { CreateOptionsV2 } from './CreateOptions'; +import DefineConversationV2 from './DefineConversation'; + +type CreationFlowProps = RouteComponentProps<{}>; + +const CreationFlowV2: React.FC = () => { + const { + fetchTemplatesV2, + fetchStorages, + fetchFolderItemsByPath, + setCreationFlowStatus, + createFolder, + updateCurrentPathForStorage, + updateFolder, + saveTemplateId, + fetchRecentProjects, + openProject, + saveProjectAs, + fetchProjectById, + createNewBotV2, + fetchReadMe, + } = useRecoilValue(dispatcherState); + + const templateProjects = useRecoilValue(templateProjectsState); + const creationFlowStatus = useRecoilValue(creationFlowStatusState); + const projectId = useRecoilValue(currentProjectIdState); + const storages = useRecoilValue(storagesState); + const focusedStorageFolder = useRecoilValue(focusedStorageFolderState); + const { appLocale } = useRecoilValue(userSettingsState); + const cachedProjectId = useProjectIdCache(); + const currentStorageIndex = useRef(0); + const storage = storages[currentStorageIndex.current]; + const currentStorageId = storage ? storage.id : 'default'; + + useEffect(() => { + if (storages?.length) { + const storageId = storage.id; + const path = storage.path; + const formattedPath = Path.normalize(path); + fetchFolderItemsByPath(storageId, formattedPath); + } + }, [storages]); + + const fetchResources = async () => { + // fetchProject use `gotoSnapshot` which will wipe out all state value. + // so here make those methods call in sequence. + + if (!projectId && cachedProjectId) { + await fetchProjectById(cachedProjectId); + } + await fetchStorages(); + + fetchRecentProjects(); + }; + + useEffect(() => { + fetchResources(); + }, []); + + const updateCurrentPath = async (newPath, storageId) => { + if (!storageId) { + storageId = currentStorageId; + } + if (newPath) { + const formattedPath = Path.normalize(newPath); + updateCurrentPathForStorage(formattedPath, storageId); + } + }; + + const handleDismiss = () => { + setCreationFlowStatus(CreationFlowStatus.CLOSE); + navigate(`/home`); + }; + + const openBot = async (botFolder) => { + setCreationFlowStatus(CreationFlowStatus.CLOSE); + await openProject(botFolder, 'default', true, (projectId) => { + TelemetryClient.track('BotProjectOpened', { method: 'toolbar', projectId }); + }); + }; + + const handleCreateNew = async (formData, templateId: string, qnaKbUrls?: string[]) => { + const templateVersion = templateProjects.find((template: BotTemplate) => { + return template.id == templateId; + })?.package?.packageVersion; + const newBotData = { + templateId: templateId || '', + templateVersion: templateVersion || '', + name: formData.name, + description: formData.description, + location: formData.location, + schemaUrl: formData.schemaUrl, + appLocale, + qnaKbUrls, + templateDir: formData?.pvaData?.templateDir, + eTag: formData?.pvaData?.eTag, + urlSuffix: formData?.pvaData?.urlSuffix, + alias: formData?.pvaData?.alias, + preserveRoot: formData?.pvaData?.preserveRoot, + }; + TelemetryClient.track('CreateNewBotProjectStarted', { template: templateId }); + + createNewBotV2(newBotData); + }; + + const handleSaveAs = (formData) => { + saveProjectAs(projectId, formData.name, formData.description, formData.location); + }; + + const handleSubmit = async (formData, templateId: string) => { + handleDismiss(); + switch (creationFlowStatus) { + case CreationFlowStatus.SAVEAS: + handleSaveAs(formData); + break; + + default: + saveTemplateId(templateId); + await handleCreateNew(formData, templateId); + } + }; + + const handleCreateNext = async (data: string) => { + setCreationFlowStatus(CreationFlowStatus.NEW_FROM_TEMPLATE); + navigate(`./create/${data}`); + }; + + return ( + + + + + + + + + + + ); +}; + +export default CreationFlowV2; diff --git a/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx new file mode 100644 index 0000000000..80c51f4e1d --- /dev/null +++ b/Composer/packages/client/src/components/CreationFlow/v2/DefineConversation.tsx @@ -0,0 +1,368 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +//TODO: Remove Path module +import Path from 'path'; + +import { DialogFooter } from 'office-ui-fabric-react/lib/Dialog'; +import formatMessage from 'format-message'; +import { PrimaryButton, DefaultButton } from 'office-ui-fabric-react/lib/Button'; +import { Stack, StackItem } from 'office-ui-fabric-react/lib/Stack'; +import React, { Fragment, useEffect, useCallback, useMemo, useState } from 'react'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; +import { RouteComponentProps } from '@reach/router'; +import querystring from 'query-string'; +import { FontWeights } from '@uifabric/styling'; +import { DialogWrapper, DialogTypes } from '@bfc/ui-shared'; +import { useRecoilValue } from 'recoil'; +import { Dropdown } from 'office-ui-fabric-react/lib/Dropdown'; + +import { + DialogCreationCopy, + QnABotTemplateId, + nameRegexV2, + invalidNameCharRegex, + mockLanguageOptions, + runtimeOptions, + defaultPrimaryLanguage, + defaultRuntime, +} from '../../../constants'; +import { FieldConfig, useForm } from '../../../hooks/useForm'; +import { StorageFolder } from '../../../recoilModel/types'; +import { createNotification } from '../../../recoilModel/dispatchers/notification'; +import { ImportSuccessNotificationWrapper } from '../../ImportModal/ImportSuccessNotification'; +import { dispatcherState } from '../../../recoilModel'; +import { LocationSelectContent } from '../LocationSelectContent'; + +// -------------------- Styles -------------------- // + +const textFieldlabel = { + label: { + root: [ + { + fontWeight: FontWeights.semibold, + }, + ], + }, +}; + +const name = { + subComponentStyles: textFieldlabel, +}; + +const description = { + subComponentStyles: textFieldlabel, +}; + +const halfstack = { + root: [ + { + flexBasis: '50%', + }, + ], +}; + +const stackinput = { + root: [ + { + marginBottom: '1rem', + }, + ], +}; + +// -------------------- DefineConversation -------------------- // + +const MAXTRYTIMES = 10000; + +type DefineConversationFormData = { + name: string; + description: string; + schemaUrl: string; + primaryLanguage: string; + runtimeChoice: string; + location?: string; + templateVersion?: string; + + pvaData?: { + templateDir?: string; // location of the imported template + eTag?: string; // e tag used for content sync between composer and imported bot content + urlSuffix?: string; // url to deep link to after creation + alias?: string; // identifier that is used to track bots between imports + preserveRoot?: boolean; // identifier that is used to determine ay project file renames upon creation + }; +}; + +type DefineConversationProps = { + createFolder: (path: string, name: string) => void; + updateFolder: (path: string, oldName: string, newName: string) => void; + onSubmit: (formData: DefineConversationFormData, templateId: string) => void; + onDismiss: () => void; + onCurrentPathUpdate: (newPath?: string, storageId?: string) => void; + onGetErrorMessage?: (text: string) => void; + focusedStorageFolder: StorageFolder; +} & RouteComponentProps<{ + templateId: string; + location: string; +}>; + +const DefineConversationV2: React.FC = (props) => { + const { + onSubmit, + onDismiss, + onCurrentPathUpdate, + templateId, + focusedStorageFolder, + createFolder, + updateFolder, + } = props; + const files = focusedStorageFolder?.children ?? []; + const writable = focusedStorageFolder.writable; + + // template ID is populated by npm package name which needs to be formatted + const normalizeTemplateId = (templateId?: string) => { + if (templateId) { + return templateId.replace(invalidNameCharRegex, '_'); + } + }; + + const getDefaultName = () => { + let i = -1; + const bot = normalizeTemplateId(templateId); + let defaultName = ''; + do { + i++; + defaultName = `${bot}_${i}`; + } while ( + files.some((file) => { + return file.name.toLowerCase() === defaultName.toLowerCase(); + }) && + i < MAXTRYTIMES + ); + return defaultName; + }; + const { addNotification } = useRecoilValue(dispatcherState); + + const formConfig: FieldConfig = { + name: { + required: true, + validate: (value) => { + if (!value || !nameRegexV2.test(`${value}`)) { + // botName is used as used when generating runtime namespaces which cannot start with a number + if (value && !isNaN(+value.toString().charAt(0))) { + return formatMessage('Bot name cannot not start with a number'); + } else { + return formatMessage('Spaces and special characters are not allowed. Use letters, numbers, or _.'); + } + } + + const newBotPath = + focusedStorageFolder !== null && Object.keys(focusedStorageFolder as Record).length + ? Path.join(focusedStorageFolder.parent, focusedStorageFolder.name, `${value}`) + : ''; + if ( + files.some((bot) => { + return bot.path.toLowerCase() === newBotPath.toLowerCase(); + }) + ) { + return formatMessage('Duplicate name'); + } + }, + }, + description: { + required: false, + }, + primaryLanguage: { + required: false, + }, + runtimeChoice: { + required: false, + }, + schemaUrl: { + required: false, + }, + location: { + required: true, + defaultValue: + focusedStorageFolder !== null && Object.keys(focusedStorageFolder as Record).length + ? Path.join(focusedStorageFolder.parent, focusedStorageFolder.name) + : '', + }, + }; + const { formData, formErrors, hasErrors, updateField, updateForm, validateForm } = useForm(formConfig); + const [isImported, setIsImported] = useState(false); + + useEffect(() => { + if (props.location?.state) { + const { imported } = props.location.state; + setIsImported(imported); + } + }, [props.location?.state]); + + useEffect(() => { + const formData: DefineConversationFormData = { + name: getDefaultName(), + primaryLanguage: defaultPrimaryLanguage, + runtimeChoice: defaultRuntime, + description: '', + schemaUrl: '', + location: + focusedStorageFolder !== null && Object.keys(focusedStorageFolder as Record).length + ? Path.join(focusedStorageFolder.parent, focusedStorageFolder.name) + : '', + }; + if (props.location?.search) { + const decoded = decodeURIComponent(props.location.search); + const { name, description, schemaUrl } = querystring.parse(decoded); + if (description) { + formData.description = description as string; + } + + if (schemaUrl) { + formData.schemaUrl = schemaUrl as string; + } + + if (name) { + formData.name = name as string; + } else { + formData.name = getDefaultName(); + } + } + updateForm(formData); + }, [templateId]); + + useEffect(() => { + validateForm(); + }, [focusedStorageFolder]); + + const handleSubmit = useCallback( + (e) => { + e.preventDefault(); + if (hasErrors) { + return; + } + + // handle extra properties in the case of an imported bot project + const dataToSubmit = { + ...formData, + }; + if (props.location?.state) { + const { alias, eTag, imported, templateDir, urlSuffix } = props.location.state; + + if (imported) { + dataToSubmit.pvaData = { + templateDir: templateDir, + eTag: eTag, + urlSuffix: urlSuffix, + alias: alias, + preserveRoot: true, + }; + + // create a notification to indicate import success + const notification = createNotification({ + type: 'success', + title: '', + onRenderCardContent: ImportSuccessNotificationWrapper({ + importedToExisting: false, + }), + }); + addNotification(notification); + } + } + + onSubmit({ ...dataToSubmit }, templateId || ''); + }, + [hasErrors, formData] + ); + + const onCurrentPathUpdateWrap = (newPath: string, storageId?: string) => { + onCurrentPathUpdate(newPath, storageId); + updateField('location', newPath); + }; + + useEffect(() => { + const location = + focusedStorageFolder !== null && Object.keys(focusedStorageFolder as Record).length + ? Path.join(focusedStorageFolder.parent, focusedStorageFolder.name) + : ''; + updateField('location', location); + }, [focusedStorageFolder]); + + const locationSelectContent = useMemo(() => { + return ( + + ); + }, [focusedStorageFolder]); + const dialogCopy = isImported ? DialogCreationCopy.IMPORT_BOT_PROJECT : DialogCreationCopy.DEFINE_BOT_PROJECT; + + return ( + + +
+ + + + updateField('name', val)} + /> + + + updateField('description', val)} + /> + + + + + updateField('primaryLanguage', option?.key.toString())} + /> + + + updateField('runtimeChoice', option?.key.toString())} + /> + + + {locationSelectContent} + + + + +
+
+
+ ); +}; + +export default DefineConversationV2; diff --git a/Composer/packages/client/src/components/CreationFlow/v2/TemplateDetailView.tsx b/Composer/packages/client/src/components/CreationFlow/v2/TemplateDetailView.tsx new file mode 100644 index 0000000000..3cf4619a8b --- /dev/null +++ b/Composer/packages/client/src/components/CreationFlow/v2/TemplateDetailView.tsx @@ -0,0 +1,17 @@ +/* eslint-disable react/no-danger */ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** @jsx jsx */ +import { jsx } from '@emotion/core'; +import React from 'react'; +import ReactMarkdown from 'react-markdown'; + +type TemplateDetailViewProps = { + templateId: string; + readMe: string; +}; + +export const TemplateDetailView: React.FC = (props) => { + return {props.readMe}; +}; diff --git a/Composer/packages/client/src/components/ImportModal/ImportModal.tsx b/Composer/packages/client/src/components/ImportModal/ImportModal.tsx index 87fde8a45d..84c76b8048 100644 --- a/Composer/packages/client/src/components/ImportModal/ImportModal.tsx +++ b/Composer/packages/client/src/components/ImportModal/ImportModal.tsx @@ -70,6 +70,7 @@ export const ImportModal: React.FC = (props) => { templateDir, urlSuffix, }; + let creationUrl = `/projects/create/${encodeURIComponent(source)}`; const searchParams = new URLSearchParams(); diff --git a/Composer/packages/client/src/constants.ts b/Composer/packages/client/src/constants.ts index a316f15a22..cf1487cf7b 100644 --- a/Composer/packages/client/src/constants.ts +++ b/Composer/packages/client/src/constants.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +import { FeedName } from '@botframework-composer/types/src'; import formatMessage from 'format-message'; import { IDropdownOption } from 'office-ui-fabric-react/lib/Dropdown'; @@ -185,6 +186,12 @@ export const DialogCreationCopy = { subText: formatMessage('You can create a new bot from scratch with Composer, or start with a template.'), }; }, + get CREATE_NEW_BOT_V2() { + return { + title: formatMessage('Choose a template for your bot'), + subText: formatMessage("Microsoft's templates offer best practices for developing conversational bots"), + }; + }, get CREATE_NEW_SKILLBOT() { return { title: formatMessage('Create a skill in your bot'), @@ -353,6 +360,10 @@ export const QnABotTemplateId = 'QnASample'; export const nameRegex = /^[a-zA-Z0-9-_]+$/; +export const nameRegexV2 = /^[a-zA-Z0-9_]+$/; + +export const invalidNameCharRegex = /[^a-z^A-Z^0-9^_]/g; + export const authConfig = { // for web login clientId: process.env.WEBLOGIN_CLIENTID, @@ -379,3 +390,24 @@ export const triggerNotSupportedWarning = () => formatMessage( 'This trigger type is not supported by the RegEx recognizer. To ensure this trigger is fired, change the recognizer type.' ); + +export const feedDictionary: { [key in FeedName]: string } = { + firstPartyCsharp: + 'https://registry.npmjs.org/-/v1/search?text=conversationalcore&size=100&from=0&quality=0.65&popularity=0.98&maintenance=0.5', + firstPartyNode: '', +}; + +// TODO: replace language options with available languages pertinent to the selected template (issue #5554) +export const defaultPrimaryLanguage = 'english'; + +export const mockLanguageOptions: IDropdownOption[] = [ + { key: defaultPrimaryLanguage, text: 'English' }, + { key: 'spanish', text: 'Spanish' }, +]; + +export const defaultRuntime = 'azureWebApp'; + +export const runtimeOptions: IDropdownOption[] = [ + { key: defaultRuntime, text: 'Azure Web App' }, + { key: 'azureFunctions', text: 'Azure Functions' }, +]; diff --git a/Composer/packages/client/src/index.css b/Composer/packages/client/src/index.css index f55c0ec054..01d68e9e33 100644 --- a/Composer/packages/client/src/index.css +++ b/Composer/packages/client/src/index.css @@ -43,4 +43,4 @@ code { font-family: Segoe UI; font-weight: 200; src: url("./fonts/segoe-ui-light.woff2") format("woff2"); -} +} \ No newline at end of file diff --git a/Composer/packages/client/src/pages/home/Home.tsx b/Composer/packages/client/src/pages/home/Home.tsx index ec49550169..df953a439f 100644 --- a/Composer/packages/client/src/pages/home/Home.tsx +++ b/Composer/packages/client/src/pages/home/Home.tsx @@ -14,7 +14,12 @@ import { Toolbar, IToolbarItem } from '@bfc/ui-shared'; import { CreationFlowStatus } from '../../constants'; import { dispatcherState, botDisplayNameState, filteredTemplatesSelector } from '../../recoilModel'; -import { recentProjectsState, templateIdState, currentProjectIdState } from '../../recoilModel/atoms/appState'; +import { + recentProjectsState, + templateIdState, + currentProjectIdState, + featureFlagsState, +} from '../../recoilModel/atoms/appState'; import TelemetryClient from '../../telemetry/TelemetryClient'; import * as home from './styles'; @@ -69,6 +74,7 @@ const Home: React.FC = () => { setCreationFlowType, } = useRecoilValue(dispatcherState); + const featureFlags = useRecoilValue(featureFlagsState); const filteredTemplates = useRecoilValue(filteredTemplatesSelector); const onItemChosen = async (item) => { @@ -90,6 +96,12 @@ const Home: React.FC = () => { const addRef = useCallback((project) => onboardingAddCoachMarkRef({ project }), []); + const onClickNewBot = () => { + setCreationFlowType('Bot'); + setCreationFlowStatus(CreationFlowStatus.NEW); + featureFlags?.NEW_CREATION_FLOW?.enabled ? navigate(`v2/projects/create`) : navigate(`projects/create`); + }; + const toolbarItems: IToolbarItem[] = [ { type: 'action', @@ -99,11 +111,8 @@ const Home: React.FC = () => { iconName: 'CirclePlus', }, onClick: () => { - setCreationFlowType('Bot'); - setCreationFlowStatus(CreationFlowStatus.NEW); - navigate(`projects/create`); + onClickNewBot(); TelemetryClient.track('ToolbarButtonClicked', { name: 'new' }); - TelemetryClient.track('CreateNewBotProject', { method: 'toolbar' }); }, }, align: 'left', @@ -163,9 +172,8 @@ const Home: React.FC = () => { styles={home.newBotItem} title={addButton} onClick={() => { - TelemetryClient.track('CreateNewBotProject', { method: 'newCallToAction' }); - setCreationFlowStatus(CreationFlowStatus.NEW); - navigate('projects/create'); + onClickNewBot(); + TelemetryClient.track('CreateNewBotProject', { method: 'toolbar' }); }} /> diff --git a/Composer/packages/client/src/recoilModel/atoms/appState.ts b/Composer/packages/client/src/recoilModel/atoms/appState.ts index 8c97aacc36..848341b8ad 100644 --- a/Composer/packages/client/src/recoilModel/atoms/appState.ts +++ b/Composer/packages/client/src/recoilModel/atoms/appState.ts @@ -297,3 +297,8 @@ export const showAddSkillDialogModalState = atom({ key: getFullyQualifiedKey('showAddSkillDialogModal'), default: false, }); + +export const selectedTemplateReadMeState = atom({ + key: getFullyQualifiedKey('selectedTemplateReadMeState'), + default: '', +}); diff --git a/Composer/packages/client/src/recoilModel/dispatchers/project.ts b/Composer/packages/client/src/recoilModel/dispatchers/project.ts index 2adc557e8e..67de572e7e 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/project.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/project.ts @@ -30,6 +30,7 @@ import { currentProjectIdState, filePersistenceState, projectMetaDataState, + selectedTemplateReadMeState, settingsState, showCreateQnAFromUrlDialogState, } from '../atoms'; @@ -332,6 +333,7 @@ export const projectDispatcher = () => { set(botOpeningState, true); const { templateId, + templateVersion, name, description, location, @@ -347,6 +349,7 @@ export const projectDispatcher = () => { const response = await createNewBotFromTemplateV2( callbackHelpers, templateId, + templateVersion, name, description, location, @@ -528,6 +531,21 @@ export const projectDispatcher = () => { set(currentProjectIdState, projectId); }); + const fetchReadMe = useRecoilCallback((callbackHelpers: CallbackInterface) => async (moduleName: string) => { + try { + const response = await httpClient.get(`/assets/templateReadme`, { + params: { moduleName: encodeURIComponent(moduleName) }, + }); + + if (response.data) { + callbackHelpers.set(selectedTemplateReadMeState, response.data); + } + } catch (err) { + handleProjectFailure(callbackHelpers, err); + callbackHelpers.set(selectedTemplateReadMeState, ''); + } + }); + const setProjectError = useRecoilCallback((callbackHelpers: CallbackInterface) => (error) => { setError(callbackHelpers, error); }); @@ -553,5 +571,6 @@ export const projectDispatcher = () => { updateCreationMessage, setCurrentProjectId, setProjectError, + fetchReadMe, }; }; diff --git a/Composer/packages/client/src/recoilModel/dispatchers/storage.ts b/Composer/packages/client/src/recoilModel/dispatchers/storage.ts index 910739d578..0a471782a5 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/storage.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/storage.ts @@ -155,6 +155,26 @@ export const storageDispatcher = () => { } }); + const fetchTemplatesV2 = useRecoilCallback(({ set }: CallbackInterface) => async (feedUrls?: string[]) => { + try { + const response = await httpClient.post(`v2/assets/projectTemplates`, { + feedUrls: feedUrls, + getFirstPartyNpm: false, + }); + + const data = response?.data; + + if (data && Array.isArray(data) && data.length > 0) { + set(templateProjectsState, data); + } + } catch (err) { + set(applicationErrorState, { + message: err.message, + summary: formatMessage('Error fetching runtime templates'), + }); + } + }); + const fetchRuntimeTemplates = useRecoilCallback<[], Promise>( (callbackHelpers: CallbackInterface) => async () => { const { set } = callbackHelpers; @@ -206,6 +226,7 @@ export const storageDispatcher = () => { createFolder, updateFolder, fetchTemplates, + fetchTemplatesV2, fetchRuntimeTemplates, fetchFeatureFlags, toggleFeatureFlag, diff --git a/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts b/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts index f10334c999..80067f7445 100644 --- a/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts +++ b/Composer/packages/client/src/recoilModel/dispatchers/utils/project.ts @@ -547,6 +547,7 @@ export const createNewBotFromTemplate = async ( export const createNewBotFromTemplateV2 = async ( callbackHelpers, templateId: string, + templateVersion: string, name: string, description: string, location: string, @@ -560,6 +561,7 @@ export const createNewBotFromTemplateV2 = async ( const jobId = await httpClient.post(`/v2/projects`, { storageId: 'default', templateId, + templateVersion, name, description, location, diff --git a/Composer/packages/client/src/router.tsx b/Composer/packages/client/src/router.tsx index b2d027cf27..ceffd76cd0 100644 --- a/Composer/packages/client/src/router.tsx +++ b/Composer/packages/client/src/router.tsx @@ -38,6 +38,7 @@ const BotProjectSettings = React.lazy(() => import('./pages/botProject/BotProjec const Diagnostics = React.lazy(() => import('./pages/diagnostics/Diagnostics')); const Publish = React.lazy(() => import('./pages/publish/Publish')); const BotCreationFlowRouter = React.lazy(() => import('./components/CreationFlow/CreationFlow')); +const BotCreationFlowRouterV2 = React.lazy(() => import('./components/CreationFlow/v2/CreationFlow')); const FormDialogPage = React.lazy(() => import('./pages/form-dialog/FormDialogPage')); const Routes = (props) => { @@ -104,6 +105,7 @@ const Routes = (props) => { + diff --git a/Composer/packages/electron-server/src/main.ts b/Composer/packages/electron-server/src/main.ts index a7324a77fc..07d615fc22 100644 --- a/Composer/packages/electron-server/src/main.ts +++ b/Composer/packages/electron-server/src/main.ts @@ -75,6 +75,7 @@ async function createAppDataDir() { const localPublishPath: string = join(composerAppDataPath, 'hostedBots'); const azurePublishPath: string = join(composerAppDataPath, 'publishBots'); process.env.COMPOSER_APP_DATA = join(composerAppDataPath, 'data.json'); // path to the actual data file + process.env.TEMPLATE_GENERATOR_PATH = join(composerAppDataPath, '.yo-repository'); process.env.COMPOSER_EXTENSION_MANIFEST = join(composerAppDataPath, 'extensions.json'); process.env.COMPOSER_EXTENSION_DATA_DIR = join(composerAppDataPath, 'extension-data'); process.env.COMPOSER_REMOTE_EXTENSIONS_DIR = join(composerAppDataPath, 'extensions'); diff --git a/Composer/packages/electron-server/src/utility/url.ts b/Composer/packages/electron-server/src/utility/url.ts index 666b8c3ff8..f99889c154 100644 --- a/Composer/packages/electron-server/src/utility/url.ts +++ b/Composer/packages/electron-server/src/utility/url.ts @@ -27,6 +27,7 @@ export const parseDeepLinkUrl = (deeplinkUrl: string) => { if (!source || !payload) { throw new Error('bfcomposer://import must include a "source" and "payload" parameter.'); } + return `projects/import?source=${encodeURIComponent(source)}&payload=${encodeURIComponent(payload)}`; } diff --git a/Composer/packages/lib/shared/src/featureFlagUtils/index.ts b/Composer/packages/lib/shared/src/featureFlagUtils/index.ts index 9a87d5a7c6..1a364b6387 100644 --- a/Composer/packages/lib/shared/src/featureFlagUtils/index.ts +++ b/Composer/packages/lib/shared/src/featureFlagUtils/index.ts @@ -5,6 +5,12 @@ import formatMessage from 'format-message'; import { FeatureFlagMap } from '@botframework-composer/types'; export const getDefaultFeatureFlags = (): FeatureFlagMap => ({ + NEW_CREATION_FLOW: { + displayName: formatMessage('New Creation Experience'), + description: formatMessage('Component templates populated from npm feeds'), + isHidden: true, + enabled: false, + }, FORM_DIALOG: { displayName: formatMessage('Form dialogs'), description: formatMessage( @@ -18,7 +24,7 @@ export const getDefaultFeatureFlags = (): FeatureFlagMap => ({ displayName: formatMessage('Conversational Core Template'), description: formatMessage('Enable the new conversational core template built on the component model'), documentationLink: 'https://aka.ms/AAabzf9', - isHidden: false, + isHidden: true, enabled: false, }, ORCHESTRATOR: { diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 81ebc5fa33..452d526be6 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -48,11 +48,13 @@ "@types/morgan": "^1.7.35", "@types/node": "^11.9.6", "@types/rimraf": "^2.0.2", + "@types/yeoman-environment": "^2.10.2", "fs-extra": "7.0.1", "mock-fs": "^4.10.1", "nodemon": "^2.0.3", "source-map-explorer": "^2.4.2", - "ts-node": "^8.4.1" + "ts-node": "^8.4.1", + "jest-fetch-mock": "^3.0.3" }, "dependencies": { "@azure/msal-node": "^1.0.0-beta.1", @@ -101,13 +103,16 @@ "portfinder": "^1.0.28", "rimraf": "^3.0.2", "tar": "^6.0.5", + "through": "^2.3.8", + "trumpet": "^1.7.2", "ts-md5": "^1.2.7", "tslib": "^2.0.0", "unzip-stream": "^0.3.0", "uuid": "^8.3.0", "vscode-languageserver": "^5.3.0-next", "vscode-ws-jsonrpc": "^0.1.1", - "ws": "^5.0.0" + "ws": "^5.0.0", + "yeoman-environment": "^2.10.3" }, "resolutions": { "bl": "^4.0.3" diff --git a/Composer/packages/server/src/controllers/__tests__/asset.test.ts b/Composer/packages/server/src/controllers/__tests__/asset.test.ts index 85415fe0cd..8c72c9e41d 100644 --- a/Composer/packages/server/src/controllers/__tests__/asset.test.ts +++ b/Composer/packages/server/src/controllers/__tests__/asset.test.ts @@ -2,6 +2,7 @@ // Licensed under the MIT License. import { Request, Response } from 'express'; +import { enableFetchMocks } from 'jest-fetch-mock'; import { AssetController } from '../asset'; @@ -26,3 +27,42 @@ describe('get bot project templates', () => { expect(mockRes.status).toHaveBeenCalledWith(200); }); }); + +describe('getTemplateReadMe', () => { + let mockRes: any; + + beforeEach(() => { + mockRes = { + status: jest.fn().mockReturnThis(), + json: jest.fn().mockReturnThis(), + send: jest.fn().mockReturnThis(), + sendStatus: jest.fn().mockReturnThis(), + }; + + mockRes.status.mockClear(); + mockRes.json.mockClear(); + mockRes.send.mockClear(); + mockRes.sendStatus.mockClear(); + }); + + const mockReq = { + params: {}, + query: { moduleName: 'generator-conversational-core' }, + body: {}, + } as Request; + + const mockFetchResponse = { + id: 'generator-conversational-core', + _rev: '9-82a6c228b16649a143a49974b0adc022', + name: 'generator-conversational-core', + readme: '# Mock readme markdown', + }; + + enableFetchMocks(); + fetchMock.mockResponseOnce(JSON.stringify(mockFetchResponse)); + it('should return a readMe', async () => { + await AssetController.getTemplateReadMe(mockReq, mockRes); + expect(mockRes.status).toHaveBeenCalledWith(200); + expect(mockRes.json).toHaveBeenCalledWith('# Mock readme markdown'); + }); +}); diff --git a/Composer/packages/server/src/controllers/__tests__/project.test.ts b/Composer/packages/server/src/controllers/__tests__/project.test.ts index d647d77781..a8488ed667 100644 --- a/Composer/packages/server/src/controllers/__tests__/project.test.ts +++ b/Composer/packages/server/src/controllers/__tests__/project.test.ts @@ -172,6 +172,45 @@ describe('should get recent projects', () => { }); }); +describe('create a component model conversational core bot project', () => { + const newBotDir = Path.resolve(__dirname, '../../__mocks__/samplebots/'); + const name = 'newConversationalCoreBot'; + const mockReq = { + params: {}, + query: {}, + body: { + storageId: 'default', + location: newBotDir, + description: '', + name: name, + templateId: 'generator-conversational-core', + templateVersion: '1.0.9', + }, + } as Request; + + jest.mock('yeoman-environment', () => ({ + installLocalGenerators: jest.fn(() => { + console.log('in mock install local generators'); + }), + lookupLocalPackages: jest.fn(() => { + console.log('in mock lookupLocalPackages'); + }), + createEnv: jest.fn().mockImplementation(() => { + console.log('in mock create env'); + return { + lookupLocalPackages: jest.fn(), + }; + }), + })); + + it('should start to create a new project', async () => { + BotProjectService.createProjectAsync = jest.fn(); + + ProjectController.createProjectV2(mockReq, mockRes); + expect(mockRes.status).toHaveBeenCalledWith(202); + }); +}); + describe('create a Empty Bot project', () => { it('should create a new project', async () => { const newBotDir = Path.resolve(__dirname, '../../__mocks__/samplebots/'); diff --git a/Composer/packages/server/src/controllers/asset.ts b/Composer/packages/server/src/controllers/asset.ts index 51a9be8332..e80adebb53 100644 --- a/Composer/packages/server/src/controllers/asset.ts +++ b/Composer/packages/server/src/controllers/asset.ts @@ -2,8 +2,10 @@ // Licensed under the MIT License. import { Request, Response } from 'express'; +import { BotTemplateV2 } from '@bfc/shared'; import AssetService from '../services/asset'; +import { getNpmTemplates } from '../utility/npm'; async function getProjTemplates(req: Request, res: Response) { try { @@ -16,6 +18,56 @@ async function getProjTemplates(req: Request, res: Response) { } } +export async function getProjTemplatesV2(req: any, res: any) { + try { + let templates: BotTemplateV2[] = []; + + // Get FeedUrl + const { feedUrls, getFirstPartyNpm } = req.body; + + // Grab templates from FeedURls + if (feedUrls) { + const feedTemplates = await AssetService.manager.getCustomFeedTemplates(feedUrls); + templates = templates.concat(feedTemplates); + } + + if (getFirstPartyNpm) { + // Grab templates from public npm + templates = templates.concat(await getNpmTemplates()); + } + + // return templates + res.status(200).json(templates); + } catch (error) { + res.status(400).json({ + message: error instanceof Error ? error.message : error, + }); + } +} + +export async function getTemplateReadMe(req: any, res: any) { + try { + const moduleName = req.query?.moduleName; + + if (!moduleName) { + res.status(400).json({ + message: 'missing module name on request', + }); + } else { + const moduleURL = `https://registry.npmjs.org/${moduleName}`; + const response = await fetch(moduleURL); + const data = await response.json(); + res.status(200).json(data?.readme || ''); + } + } catch (error) { + res.status(400).json({ + message: error instanceof Error ? error.message : error, + }); + } +} + export const AssetController = { getProjTemplates: getProjTemplates, + getProjTemplatesV2: getProjTemplatesV2, + getTemplateReadMe: getTemplateReadMe, }; diff --git a/Composer/packages/server/src/controllers/project.ts b/Composer/packages/server/src/controllers/project.ts index 0a5fa8e37f..9651bb7670 100644 --- a/Composer/packages/server/src/controllers/project.ts +++ b/Composer/packages/server/src/controllers/project.ts @@ -4,7 +4,6 @@ import { Request, Response } from 'express'; import { Archiver } from 'archiver'; import { remove } from 'fs-extra'; -import formatMessage from 'format-message'; import { ExtensionContext } from '../models/extension/extensionContext'; import log from '../logger'; @@ -14,7 +13,7 @@ import { LocationRef } from '../models/bot/interface'; import { getSkillManifest } from '../models/bot/skillManager'; import StorageService from '../services/storage'; import settings from '../settings'; -import { ejectAndMerge, getLocationRef, getNewProjRef } from '../utility/project'; +import { getLocationRef, getNewProjRef } from '../utility/project'; import { BackgroundProcessManager } from '../services/backgroundProcessManager'; import { TelemetryService } from '../services/telemetry'; @@ -510,71 +509,11 @@ async function copyTemplateToExistingProject(req: Request, res: Response) { function createProjectV2(req: Request, res: Response) { const jobId = BackgroundProcessManager.startProcess(202, 'create', 'Creating Bot Project'); - createProjectAsync(req, jobId); + BotProjectService.createProjectAsync(req, jobId); res.status(202).json({ jobId: jobId, }); } -async function createProjectAsync(req: Request, jobId: string) { - let { templateId } = req.body; - const { - name, - description, - storageId, - location, - schemaUrl, - locale, - preserveRoot, - templateDir, - eTag, - alias, - } = req.body; - const user = await ExtensionContext.getUserFromRequest(req); - if (templateId === '') { - templateId = 'EmptyBot'; - } - - const locationRef = getLocationRef(location, storageId, name); - try { - // the template was downloaded remotely (via import) and will be used instead of an internal Composer template - const createFromRemoteTemplate = !!templateDir; - - await BotProjectService.cleanProject(locationRef); - BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Getting template')); - const newProjRef = await getNewProjRef(templateDir, templateId, locationRef, user, locale); - - const id = await BotProjectService.openProject(newProjRef, user); - // in the case of a remote template, we need to update the eTag and alias used by the import mechanism - createFromRemoteTemplate && BotProjectService.setProjectLocationData(id, { alias, eTag }); - const currentProject = await BotProjectService.getProjectById(id, user); - - // inject shared content into every new project. this comes from assets/shared - if (!createFromRemoteTemplate) { - await AssetService.manager.copyBoilerplate(currentProject.dataDir, currentProject.fileStorage); - } - - if (currentProject !== undefined) { - await ejectAndMerge(currentProject, jobId); - BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Initializing bot project')); - await currentProject.updateBotInfo(name, description, preserveRoot); - if (schemaUrl && !createFromRemoteTemplate) { - await currentProject.saveSchemaToProject(schemaUrl, locationRef.path); - } - await currentProject.init(); - - const project = currentProject.getProject(); - log('Project created successfully.'); - BackgroundProcessManager.updateProcess(jobId, 200, 'Created Successfully', { - id, - ...project, - }); - } - TelemetryService.trackEvent('CreateNewBotProjectCompleted', { template: templateId, status: 200 }); - } catch (err) { - BackgroundProcessManager.updateProcess(jobId, 500, err instanceof Error ? err.message : err, err); - TelemetryService.trackEvent('CreateNewBotProjectCompleted', { template: templateId, status: 500 }); - } -} export const ProjectController = { getProjectById, diff --git a/Composer/packages/server/src/locales/en-US.json b/Composer/packages/server/src/locales/en-US.json index b33e287d59..a8dd0cdf36 100644 --- a/Composer/packages/server/src/locales/en-US.json +++ b/Composer/packages/server/src/locales/en-US.json @@ -371,6 +371,9 @@ "bot_controller_319b408d": { "message": "Bot Controller" }, + "bot_files_created_986109df": { + "message": "Bot files created" + }, "bot_framework_composer_enables_developers_and_mult_ce0e42a9": { "message": "Bot Framework Composer enables developers and multi-disciplinary teams to build all kinds of conversational experiences, using the latest components from the Bot Framework: SDK, LG, LU, and declarative file formats, all without writing code." }, @@ -398,6 +401,9 @@ "bot_management_and_configurations_b7dadd69": { "message": "Bot management and configurations" }, + "bot_name_cannot_not_start_with_a_number_d70239": { + "message": "Bot name cannot not start with a number" + }, "bot_name_is_botname_a28c2d05": { "message": "Bot name is { botName }" }, @@ -479,6 +485,9 @@ "choose_a_location_for_your_new_bot_project_e979f2d5": { "message": "Choose a location for your new bot project." }, + "choose_a_template_for_your_bot_47ed06a8": { + "message": "Choose a template for your bot" + }, "choose_how_to_create_your_bot_a97f7b3e": { "message": "Choose how to create your bot" }, @@ -521,6 +530,9 @@ "component_stacktrace_e24b1983": { "message": "Component Stacktrace:" }, + "component_templates_populated_from_npm_feeds_d89351ef": { + "message": "Component templates populated from npm feeds" + }, "composer_cannot_yet_translate_your_bot_automatical_2d54081b": { "message": "Composer cannot yet translate your bot automatically.\nTo create a translation manually, Composer will create a copy of your bot’s content with the name of the additional language. This content can then be translated without affecting the original bot logic or flow and you can switch between languages to ensure the responses are correctly and appropriately translated." }, @@ -1130,6 +1142,9 @@ "error_event_c079b608": { "message": "Error event" }, + "error_fetching_runtime_templates_5e8a4701": { + "message": "Error fetching runtime templates" + }, "error_in_ui_schema_for_title_errormsg_options_7f3c22f2": { "message": "Error in UI schema for { title }: { errorMsg }\n{ options }" }, @@ -1805,6 +1820,9 @@ "microsoft_app_password_737ebc90": { "message": "Microsoft App Password" }, + "microsoft_s_templates_offer_best_practices_for_dev_87bec01c": { + "message": "Microsoft''s templates offer best practices for developing conversational bots" + }, "minimap_beb3be27": { "message": "Minimap" }, @@ -1901,6 +1919,9 @@ "new_13daf639": { "message": "New" }, + "new_creation_experience_29591aca": { + "message": "New Creation Experience" + }, "new_template_49e6f0f2": { "message": "New template" }, @@ -2153,6 +2174,9 @@ "previous_folder_e7eeb306": { "message": "previous folder" }, + "primary_language_96276a64": { + "message": "Primary Language" + }, "privacy_290109ea": { "message": "Privacy" }, @@ -2453,6 +2477,9 @@ "runtime_config_a2904ff9": { "message": "Runtime Config" }, + "runtime_type_f9e2419b": { + "message": "Runtime type" + }, "sample_phrases_5d78fa35": { "message": "Sample Phrases" }, @@ -2669,6 +2696,9 @@ "spaces_and_special_characters_are_not_allowed_use__48acec3c": { "message": "Spaces and special characters are not allowed. Use letters, numbers, -, or _." }, + "spaces_and_special_characters_are_not_allowed_use__9f354fe3": { + "message": "Spaces and special characters are not allowed. Use letters, numbers, or _." + }, "spaces_and_special_characters_are_not_allowed_use__d24a8636": { "message": "Spaces and special characters are not allowed. Use letters, numbers, -, or _, and begin the name with a letter." }, diff --git a/Composer/packages/server/src/models/asset/__tests__/assetManager.test.ts b/Composer/packages/server/src/models/asset/__tests__/assetManager.test.ts index c5932a5baa..c80fcf3243 100644 --- a/Composer/packages/server/src/models/asset/__tests__/assetManager.test.ts +++ b/Composer/packages/server/src/models/asset/__tests__/assetManager.test.ts @@ -2,6 +2,8 @@ // Licensed under the MIT License. import rimraf from 'rimraf'; +import { enableFetchMocks } from 'jest-fetch-mock'; +import { BotTemplateV2 } from '@bfc/shared'; import { ExtensionContext } from '../../../models/extension/extensionContext'; import { Path } from '../../../utility/path'; @@ -12,6 +14,22 @@ jest.mock('azure-storage', () => { return {}; }); +jest.mock('yeoman-environment', () => ({ + createEnv: jest.fn().mockImplementation(() => { + return { + lookupLocalPackages: jest.fn(), + installLocalGenerators: jest.fn().mockReturnValue(true), + run: jest.fn(), + }; + }), +})); + +jest.mock('fs-extra', () => { + return { + mkdirSync: jest.fn(), + }; +}); + jest.mock('../../../models/extension/extensionContext', () => { return { ExtensionContext: { @@ -92,4 +110,58 @@ describe('assetManager', () => { ).rejects.toThrowError(new Error('already have this folder, please give another name')); }); }); + + describe('getFeedContents', () => { + const mockFeedResponse = { + objects: [ + { + package: { + name: 'generator-conversational-core', + version: '1.0.3', + description: 'Preview conversational core package for TESTING ONLY', + keywords: ['conversationalcore', 'yeoman-generator'], + }, + }, + ], + }; + + enableFetchMocks(); + fetchMock.mockResponseOnce(JSON.stringify(mockFeedResponse)); + it('Get contents of a feed and return template array', async () => { + const assetManager = new AssetManager(); + const mockFeedUrl = + 'https://registry.npmjs.org/-/v1/search?text=conversationalcore&size=100&from=0&quality=0.65&popularity=0.98&maintenance=0.5'; + const templates = await assetManager.getCustomFeedTemplates([mockFeedUrl]); + expect(templates).toStrictEqual([ + { + id: 'generator-conversational-core', + name: 'generator-conversational-core', + description: 'Preview conversational core package for TESTING ONLY', + keywords: ['conversationalcore', 'yeoman-generator'], + package: { + packageName: 'generator-conversational-core', + packageSource: 'npm', + packageVersion: '1.0.3', + }, + }, + ] as BotTemplateV2[]); + }); + }); + + describe('copyRemoteProjectTemplateToV2', () => { + it('Should instantiate npm driven template and return new conv ref', async () => { + const mockLocRef = { path: '/path/to/npmbot', storageId: 'default' }; + const assetManager = new AssetManager(); + const newBotLocationRef = await assetManager.copyRemoteProjectTemplateToV2( + 'generator-conversational-core', + '1.0.3', + 'sampleConversationalCore', + mockLocRef + ); + expect(newBotLocationRef).toStrictEqual({ + path: '/path/to/npmbot/sampleConversationalCore', + storageId: 'default', + }); + }); + }); }); diff --git a/Composer/packages/server/src/models/asset/assetManager.ts b/Composer/packages/server/src/models/asset/assetManager.ts index 3d43b8b857..30dbb0d51f 100644 --- a/Composer/packages/server/src/models/asset/assetManager.ts +++ b/Composer/packages/server/src/models/asset/assetManager.ts @@ -2,14 +2,14 @@ // Licensed under the MIT License. import fs from 'fs'; -import path, { join } from 'path'; -import { exec } from 'child_process'; -import { promisify } from 'util'; +import path from 'path'; import find from 'lodash/find'; -import { UserIdentity, BotTemplate, FileExtensions } from '@bfc/extension'; -import { mkdirs, readFile } from 'fs-extra'; -import rimraf from 'rimraf'; +import { UserIdentity, FileExtensions, BotTemplateV2, FeedType } from '@bfc/extension'; +import { mkdirSync, readFile } from 'fs-extra'; +import yeoman from 'yeoman-environment'; +import Environment from 'yeoman-environment'; +import TerminalAdapter from 'yeoman-environment/lib/adapter'; import { ExtensionContext } from '../extension/extensionContext'; import log from '../../logger'; @@ -20,16 +20,21 @@ import { copyDir } from '../../utility/storage'; import StorageService from '../../services/storage'; import { IFileStorage } from '../storage/interface'; import { BotProject } from '../bot/botProject'; - -const execAsync = promisify(exec); -const removeDirAndFiles = promisify(rimraf); +import { templateGeneratorPath } from '../../settings/env'; export class AssetManager { public templateStorage: LocalDiskStorage; + public yeomanEnv: Environment; private _botProjectFileTemplate; constructor() { this.templateStorage = new LocalDiskStorage(); + this.yeomanEnv = yeoman.createEnv( + '', + { yeomanRepository: templateGeneratorPath }, + new TerminalAdapter({ console: console }) + ); + this.yeomanEnv.lookupLocalPackages(); } public get botProjectFileTemplate() { @@ -92,58 +97,88 @@ export class AssetManager { return ref; } - private async getRemoteTemplate(template: BotTemplate, destinationPath: string) { - // install package - if (template.package) { - const { stderr: initErr } = await execAsync(`dotnet new -i ${template.package.packageName}`); - if (initErr) { - throw new Error(initErr); + public async copyRemoteProjectTemplateToV2( + templateId: string, + templateVersion: string, + projectName: string, + ref: LocationRef, + user?: UserIdentity + ): Promise { + try { + // user storage maybe diff from template storage + const dstStorage = StorageService.getStorageClient(ref.storageId, user); + const dstDir = Path.resolve(ref.path); + if (await dstStorage.exists(dstDir)) { + log('Failed copying template to %s', dstDir); + throw new Error('already have this folder, please give another name'); } - const { stderr: initErr2 } = await execAsync(`dotnet new ${template.id}`, { - cwd: destinationPath, - }); - if (initErr2) { - throw new Error(initErr2); + + mkdirSync(dstDir, { recursive: true }); + + // find selected template + const npmPackageName = templateId; + const generatorName = npmPackageName.toLowerCase().replace('generator-', ''); + + const remoteTemplateAvailable = await this.installRemoteTemplate(generatorName, npmPackageName, templateVersion); + + if (remoteTemplateAvailable) { + await this.instantiateRemoteTemplate(generatorName, dstDir, projectName); + } else { + throw new Error(`error hit when installing remote template`); } - } else { - throw new Error('selected template has no local or external address'); + + ref.path = `${ref.path}/${projectName}`; + + return ref; + } catch (err) { + throw new Error(`error hit when instantiating remote template: ${err?.message}`); + } + } + + private async installRemoteTemplate( + generatorName: string, + npmPackageName: string, + templateVersion: string + ): Promise { + this.yeomanEnv.cwd = templateGeneratorPath; + try { + log('Installing generator', npmPackageName); + templateVersion = templateVersion ? templateVersion : '*'; + await this.yeomanEnv.installLocalGenerators({ [npmPackageName]: templateVersion }); + + log('Looking up local packages'); + await this.yeomanEnv.lookupLocalPackages(); + return true; + } catch { + return false; } } + private async instantiateRemoteTemplate( + generatorName: string, + dstDir: string, + projectName: string + ): Promise { + this.yeomanEnv.cwd = dstDir; + + log('About to instantiate a template!', dstDir, generatorName, projectName); + await this.yeomanEnv.run([generatorName, projectName], {}, () => { + log('Template successfully instantiated', dstDir, generatorName, projectName); + }); + return true; + } + private async copyDataFilesTo(templateId: string, dstDir: string, dstStorage: IFileStorage, locale?: string) { const template = find(ExtensionContext.extensions.botTemplates, { id: templateId }); if (template === undefined || (template.path === undefined && template.package === undefined)) { throw new Error(`no such template with id ${templateId}`); } - let templateSrcPath = template.path; - const isHostedTemplate = !templateSrcPath; - if (isHostedTemplate) { - // create empty temp directory on server for holding externally hosted template src - const baseDir = process.env.COMPOSER_TEMP_DIR as string; - templateSrcPath = join(baseDir, 'feedBasedTemplates'); - if (fs.existsSync(templateSrcPath)) { - await removeDirAndFiles(templateSrcPath); - } - await mkdirs(templateSrcPath, (err) => { - if (err) { - throw new Error('Error creating temp directory for external template storage'); - } - }); - await this.getRemoteTemplate(template, templateSrcPath); - } + const templateSrcPath = template.path; if (templateSrcPath) { // copy Composer data files await copyDir(templateSrcPath, this.templateStorage, dstDir, dstStorage); - - if (isHostedTemplate) { - try { - await removeDirAndFiles(templateSrcPath); - } catch (err) { - throw new Error('Issue deleting temp generated file for external template assets'); - } - } } // if we have a locale override, copy those files over too @@ -234,4 +269,56 @@ export class AssetManager { } } } + + private getFeedType(): FeedType { + // TODO: parse through data to detect for npm or nuget package schema and return respecive result + return 'npm'; + } + + private async getFeedContents(feedUrl: string): Promise { + try { + const res = await fetch(feedUrl); + const data = await res.json(); + const feedType = this.getFeedType(); + if (feedType === 'npm') { + return data.objects.map((result) => { + const { name, version, description = '', keywords = [] } = result.package; + + return { + id: name, + name: name, + description: description, + keywords: keywords, + package: { + packageName: name, + packageSource: 'npm', + packageVersion: version, + }, + } as BotTemplateV2; + }); + } else if (feedType === 'nuget') { + // TODO: handle nuget processing + } else { + return []; + } + } catch (error) { + return null; + } + } + + public async getCustomFeedTemplates(feedUrls: string[]): Promise { + let templates: BotTemplateV2[] = []; + const invalidFeedUrls: string[] = []; + + for (const feed of feedUrls) { + const feedTemplates = await this.getFeedContents(feed); + if (feedTemplates === null) { + invalidFeedUrls.push(feed); + } else if (feedTemplates && Array.isArray(feedTemplates) && feedTemplates.length > 0) { + templates = templates.concat(feedTemplates); + } + } + + return templates; + } } diff --git a/Composer/packages/server/src/models/bot/botProject.ts b/Composer/packages/server/src/models/bot/botProject.ts index 6a7d4c7334..1dcd01031f 100644 --- a/Composer/packages/server/src/models/bot/botProject.ts +++ b/Composer/packages/server/src/models/bot/botProject.ts @@ -205,6 +205,7 @@ export class BotProject implements IBotProject { // Resolve relative path for custom runtime if the path is relative if (settings?.runtime?.customRuntime && settings.runtime.path && !Path.isAbsolute(settings.runtime.path)) { const absolutePath = Path.resolve(this.dir, 'settings', settings.runtime.path); + if (fs.existsSync(absolutePath)) { settings.runtime.path = absolutePath; await this.updateEnvSettings(settings); @@ -796,6 +797,8 @@ export class BotProject implements IBotProject { pattern, '!(generated/**)', '!(runtime/**)', + '!(bin/**)', + '!(obj/**)', '!(scripts/**)', '!(settings/appsettings.json)', '!(**/luconfig.json)', diff --git a/Composer/packages/server/src/router/api.ts b/Composer/packages/server/src/router/api.ts index 9d57054dfc..66d2475c60 100644 --- a/Composer/packages/server/src/router/api.ts +++ b/Composer/packages/server/src/router/api.ts @@ -87,6 +87,8 @@ router.post('/runtime/eject/:projectId/:template', EjectController.eject); //assets router.get('/assets/projectTemplates', AssetController.getProjTemplates); +router.post('/v2/assets/projectTemplates', AssetController.getProjTemplatesV2); +router.get('/assets/templateReadme', AssetController.getTemplateReadMe); router.use('/assets/locales/', express.static(path.join(__dirname, '..', '..', 'src', 'locales'))); diff --git a/Composer/packages/server/src/services/project.ts b/Composer/packages/server/src/services/project.ts index 85eeb4a829..cec7d40375 100644 --- a/Composer/packages/server/src/services/project.ts +++ b/Composer/packages/server/src/services/project.ts @@ -8,14 +8,21 @@ import { luImportResolverGenerator, ResolverResource } from '@bfc/shared'; import extractMemoryPaths from '@bfc/indexers/lib/dialogUtils/extractMemoryPaths'; import { UserIdentity } from '@bfc/extension'; import { ensureDir, existsSync, remove } from 'fs-extra'; +import { Request } from 'express'; +import formatMessage from 'format-message'; +import AssetService from '../services/asset'; import { BotProject } from '../models/bot/botProject'; import { LocationRef } from '../models/bot/interface'; import { Store } from '../store/store'; import log from '../logger'; +import { ExtensionContext } from '../models/extension/extensionContext'; +import { getLocationRef, getNewProjRef, ejectAndMerge } from '../utility/project'; import StorageService from './storage'; import { Path } from './../utility/path'; +import { BackgroundProcessManager } from './backgroundProcessManager'; +import { TelemetryService } from './telemetry'; const MAX_RECENT_BOTS = 7; @@ -398,4 +405,86 @@ export class BotProjectService { throw new Error(`Failed to backup project ${project.id}: ${e}`); } }; + + public static async createProjectAsync(req: Request, jobId: string) { + const { + templateId, + templateVersion, + name, + description, + storageId, + location, + preserveRoot, + templateDir, + eTag, + alias, + locale, + schemaUrl, + } = req.body; + // get user from request + const user = await ExtensionContext.getUserFromRequest(req); + + const createFromPva = !!templateDir; + + // populate template if none was passed + if (templateId === '') { + // TODO: Replace with default template once one is determined + throw Error('empty templateID passed'); + } + + // location to store the bot project + const locationRef = getLocationRef(location, storageId, name); + try { + await BotProjectService.cleanProject(locationRef); + + // Update status for polling + BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Getting template')); + + const newProjRef = createFromPva + ? await getNewProjRef(templateDir, templateId, locationRef, user, locale) + : await AssetService.manager.copyRemoteProjectTemplateToV2( + templateId, + templateVersion, + name, + locationRef, + user + ); + + BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Bot files created')); + + const id = await BotProjectService.openProject(newProjRef, user); + + // in the case of PVA, we need to update the eTag and alias used by the import mechanism + createFromPva && BotProjectService.setProjectLocationData(id, { alias, eTag }); + + const currentProject = await BotProjectService.getProjectById(id, user); + + // inject shared content into every new project. this comes from assets/shared + !createFromPva && + (await AssetService.manager.copyBoilerplate(currentProject.dataDir, currentProject.fileStorage)); + + if (currentProject !== undefined) { + !createFromPva && (await ejectAndMerge(currentProject, jobId)); + BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Initializing bot project')); + await currentProject.updateBotInfo(name, description, preserveRoot); + + if (schemaUrl && !createFromPva) { + await currentProject.saveSchemaToProject(schemaUrl, locationRef.path); + } + + await currentProject.init(); + + const project = currentProject.getProject(); + log('Project created successfully.'); + BackgroundProcessManager.updateProcess(jobId, 200, 'Created Successfully', { + id, + ...project, + }); + } + TelemetryService.trackEvent('CreateNewBotProjectCompleted', { template: templateId, status: 200 }); + } catch (err) { + BackgroundProcessManager.updateProcess(jobId, 500, err instanceof Error ? err.message : err, err); + TelemetryService.trackEvent('CreateNewBotProjectCompleted', { template: templateId, status: 500 }); + } + } } diff --git a/Composer/packages/server/src/settings/env.ts b/Composer/packages/server/src/settings/env.ts index 4afa45af3a..2dc5fc176d 100644 --- a/Composer/packages/server/src/settings/env.ts +++ b/Composer/packages/server/src/settings/env.ts @@ -44,6 +44,7 @@ export const environment = process.env.NODE_ENV || 'development'; export const botsFolder = folder; export const botEndpoint = process.env.BOT_ENDPOINT || 'http://localhost:3979'; export const appDataPath = process.env.COMPOSER_APP_DATA || Path.resolve(__dirname, '../../data.json'); +export const templateGeneratorPath = process.env.TEMPLATE_GENERATOR_PATH || resolveFromRoot('.yo-repository'); export const runtimeFolder = process.env.COMPOSER_RUNTIME_FOLDER || resolveFromRoot('../runtime'); export const runtimeFrameworkVersion = process.env.COMPOSER_RUNTIME_VERSION || 'netcoreapp3.1'; export const extensionManifestPath = diff --git a/Composer/packages/server/src/utility/npm.ts b/Composer/packages/server/src/utility/npm.ts index b087d7ed57..5681497fff 100644 --- a/Composer/packages/server/src/utility/npm.ts +++ b/Composer/packages/server/src/utility/npm.ts @@ -6,7 +6,7 @@ import { promisify } from 'util'; import { mkdir, remove } from 'fs-extra'; import fetch from 'node-fetch'; import tar from 'tar'; -import { ExtensionSearchResult } from '@botframework-composer/types'; +import { BotTemplateV2, ExtensionSearchResult } from '@botframework-composer/types'; import logger from '../logger'; @@ -14,13 +14,30 @@ const streamPipeline = promisify(require('stream').pipeline); const log = logger.extend('extension-manager:npm'); +export async function getNpmTemplates(): Promise { + const publicNpmTemplatePackages = await search('', ['bot']); + const templates: BotTemplateV2[] = publicNpmTemplatePackages.map((value) => { + return { + id: value.id, + name: value.id, + description: value.description, + package: { + packageName: value.id, + packageSource: 'npm', + }, + } as BotTemplateV2; + }); + return templates; +} + // eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function search(query = ''): Promise { +export async function search(query = '', keywords = ['botframework-composer']): Promise { try { log('Searching for %s', query); const queryString = query.replace(' ', '+'); + const keyWordString = keywords.join('+'); const res = await fetch( - `https://registry.npmjs.org/-/v1/search?text=${queryString}+keywords:botframework-composer&size=100&from=0&quality=0.65&popularity=0.98&maintenance=0.5` + `https://registry.npmjs.org/-/v1/search?text=${queryString}+keywords:${keyWordString}&size=100&from=0&quality=0.65&popularity=0.98&maintenance=0.5` ); const data = await res.json(); diff --git a/Composer/packages/server/src/utility/project.ts b/Composer/packages/server/src/utility/project.ts index 802d0477c7..b5c84de39d 100644 --- a/Composer/packages/server/src/utility/project.ts +++ b/Composer/packages/server/src/utility/project.ts @@ -72,7 +72,7 @@ export async function ejectAndMerge(currentProject: BotProject, jobId: string) { BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Building runtime')); await runtime.build(runtimePath, currentProject); - const manifestFile = runtime.identifyManifest(runtimePath); + const manifestFile = runtime.identifyManifest(currentProject.dataDir, currentProject.name); // run the merge command to merge all package dependencies from the template to the bot project BackgroundProcessManager.updateProcess(jobId, 202, formatMessage('Merging Packages')); diff --git a/Composer/packages/types/src/creation.ts b/Composer/packages/types/src/creation.ts new file mode 100644 index 0000000000..352bb5411a --- /dev/null +++ b/Composer/packages/types/src/creation.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export type BotTemplateV2 = { + id: string; + name: string; + description: string; + /* keywords for further grouping and search secenario */ + keywords?: string[]; + /* list of supported runtime versions */ + support?: string[]; + package?: { + packageName: string; + packageSource: FeedType; + packageVersion?: string; + }; + index?: number; +}; + +export const csharpFeedKey = 'firstPartyCsharp'; +export const nodeFeedKey = 'firstPartyNode'; +export const defaultFeeds = [nodeFeedKey, csharpFeedKey] as const; +export type FeedName = typeof defaultFeeds[number]; +export type FeedType = 'npm' | 'nuget'; diff --git a/Composer/packages/types/src/featureFlags.ts b/Composer/packages/types/src/featureFlags.ts index a3cf677132..5210e37a7c 100644 --- a/Composer/packages/types/src/featureFlags.ts +++ b/Composer/packages/types/src/featureFlags.ts @@ -14,6 +14,11 @@ export type FeatureFlag = { enabled: boolean; }; -export type FeatureFlagKey = 'FORM_DIALOG' | 'REMOTE_TEMPLATE_CREATION_EXPERIENCE' | 'ORCHESTRATOR' | 'PACKAGE_MANAGER'; +export type FeatureFlagKey = + | 'FORM_DIALOG' + | 'REMOTE_TEMPLATE_CREATION_EXPERIENCE' + | 'ORCHESTRATOR' + | 'PACKAGE_MANAGER' + | 'NEW_CREATION_FLOW'; export type FeatureFlagMap = Record; diff --git a/Composer/packages/types/src/index.ts b/Composer/packages/types/src/index.ts index 6cd30a074d..0972541e98 100644 --- a/Composer/packages/types/src/index.ts +++ b/Composer/packages/types/src/index.ts @@ -19,3 +19,4 @@ export * from './shell'; export * from './telemetry'; export * from './user'; export * from './featureFlags'; +export * from './creation'; diff --git a/Composer/packages/types/src/runtime.ts b/Composer/packages/types/src/runtime.ts index 96ba01977c..38be3cd8be 100644 --- a/Composer/packages/types/src/runtime.ts +++ b/Composer/packages/types/src/runtime.ts @@ -59,11 +59,16 @@ export type RuntimeTemplate = { run: (project: IBotProject, localDisk?: any) => Promise; - installComponent: (runtimePath: string, componentName: string, version: string) => Promise; + installComponent: ( + runtimePath: string, + componentName: string, + version: string, + project: IBotProject + ) => Promise; - uninstallComponent: (runtimePath: string, componentName: string) => Promise; + uninstallComponent: (runtimePath: string, componentName: string, project: IBotProject) => Promise; - identifyManifest: (runtimePath: string) => string; + identifyManifest: (runtimePath: string, projName?: string) => string; /** build for deploy method */ buildDeploy: ( diff --git a/Composer/packages/types/src/telemetry.ts b/Composer/packages/types/src/telemetry.ts index 524400c6f8..2519251a6d 100644 --- a/Composer/packages/types/src/telemetry.ts +++ b/Composer/packages/types/src/telemetry.ts @@ -51,6 +51,7 @@ type BotProjectEvents = { CreateNewBotProject: { method: 'toolbar' | 'newCallToAction' | 'luisCallToAction' }; CreateNewBotProjectNextButton: { template: string }; CreateNewBotProjectFromExample: { template: string }; + CreateNewBotProjectStarted: { template: string }; CreateNewBotProjectCompleted: { template: string; status: number }; BotProjectOpened: { method: 'toolbar' | 'callToAction' | 'list'; projectId?: string }; StartAllBotsButtonClicked: undefined; diff --git a/Composer/yarn.lock b/Composer/yarn.lock index da42304285..a1807a6496 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -3772,15 +3772,25 @@ dependencies: "@types/express" "*" +"@types/debug@*", "@types/debug@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + "@types/debug@^4.1.2": version "4.1.2" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.2.tgz#84824e9259fc583dd9385635738359c9582f7f82" integrity sha512-jkf6UiWUjcOqdQbatbvOm54/YbCdjt3JjiAzT/9KS2XtMmOkYHdKsI5u8fulhbuTUuiqNBfa6J5GSDiwjK+zLA== -"@types/debug@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== +"@types/diff@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.0.tgz#eb71e94feae62548282c4889308a3dfb57e36020" + integrity sha512-jrm2K65CokCCX4NmowtA+MfXyuprZC13jbRuwprs6/04z/EcFg/MCwYdsHn+zgV4CQBiATiI7AEq7y1sZCtWKA== + +"@types/ejs@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.0.5.tgz#95a3a1c3d9603eba80fe67ff56da1ba275ef2eda" + integrity sha512-k4ef69sS4sIqAPW9GoBnN+URAON2LeL1H0duQvL4RgdEBna19/WattYSA1qYqvbVEDRTSWzOw56tCLhC/m/IOw== "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" @@ -3792,6 +3802,11 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/expect@^1.20.4": + version "1.20.4" + resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5" + integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== + "@types/express-jwt@0.0.42": version "0.0.42" resolved "https://registry.yarnpkg.com/@types/express-jwt/-/express-jwt-0.0.42.tgz#4f04e1fadf9d18725950dc041808a4a4adf7f5ae" @@ -3898,6 +3913,14 @@ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.6.1.tgz#367744a6c04b833383f497f647cc3690b0cd4055" integrity sha512-s+RHKSGc3r0m3YEE2UXomJYrpQaY9cDmNDLU2XvG1/LAZsQ7y8emYkTLfcw/ByDtcsTyRQKwr76Bj4PkN2hfWg== +"@types/inquirer@*": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.1.tgz#1f231224e7df11ccfaf4cf9acbcc3b935fea292d" + integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g== + dependencies: + "@types/through" "*" + rxjs "^6.4.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -3946,6 +3969,11 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" +"@types/json-schema@*": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" @@ -3988,6 +4016,33 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" integrity sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w== +"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" + integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + dependencies: + "@types/unist" "*" + +"@types/mem-fs-editor@*": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/mem-fs-editor/-/mem-fs-editor-7.0.0.tgz#e6576e0f66e20055481b2cdbf193457f1a2c4e65" + integrity sha512-fTwoRtwv7YYLnzZmkOOzlrCZBJQssUcBCHxy7y52iUyxkqVxXCDOSis9yQbanOMYHnijIEtkIhep8YTMeAuVDw== + dependencies: + "@types/ejs" "*" + "@types/glob" "*" + "@types/json-schema" "*" + "@types/mem-fs" "*" + "@types/node" "*" + "@types/vinyl" "*" + +"@types/mem-fs@*": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/mem-fs/-/mem-fs-1.1.2.tgz#e7e4cc741225dea109b5f3ceb519b45f353e1393" + integrity sha512-tt+4IoDO8/wmtaP2bHnB91c8AnzYtR9MK6NxfcZY9E3XgtmzOiFMeSXu3EZrBeevd0nJ87iGoUiFDGsb9QUvew== + dependencies: + "@types/node" "*" + "@types/vinyl" "*" + "@types/mime@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" @@ -4250,6 +4305,18 @@ "@types/testing-library__dom" "*" pretty-format "^25.1.0" +"@types/text-table@*": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/text-table/-/text-table-0.2.1.tgz#39c4d4a058a82f677392dfd09976e83d9b4c9264" + integrity sha512-dchbFCWfVgUSWEvhOkXGS7zjm+K7jCUvGrQkAHPk2Fmslfofp4HQTH2pqnQ3Pw5GPYv0zWa2AQjKtsfZThuemQ== + +"@types/through@*": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" + integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== + dependencies: + "@types/node" "*" + "@types/tunnel@0.0.0": version "0.0.0" resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.0.tgz#c2a42943ee63c90652a5557b8c4e56cda77f944e" @@ -4271,7 +4338,7 @@ dependencies: source-map "^0.6.1" -"@types/unist@*", "@types/unist@^2.0.0": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== @@ -4293,6 +4360,14 @@ "@types/unist" "*" "@types/vfile-message" "*" +"@types/vinyl@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.4.tgz#9a7a8071c8d14d3a95d41ebe7135babe4ad5995a" + integrity sha512-2o6a2ixaVI2EbwBPg1QYLGQoHK56p/8X/sGfKbFC8N6sY9lfjsMf/GprtkQkSya0D4uRiutRZ2BWj7k3JvLsAQ== + dependencies: + "@types/expect" "^1.20.4" + "@types/node" "*" + "@types/vscode@^1.40.0": version "1.52.0" resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.52.0.tgz#61917968dd403932127fc4004a21fd8d69e4f61c" @@ -4381,6 +4456,31 @@ dependencies: "@types/node" "*" +"@types/yeoman-environment@*", "@types/yeoman-environment@^2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@types/yeoman-environment/-/yeoman-environment-2.10.2.tgz#008b4f7a350ff8fb2be7ad7dda2580ead048ee76" + integrity sha512-Vz0qYnsUkTdH15nYo1OKax6wODQvPk6OKnbr3ATWRFizMTn6FhtoInuOIxVELK9swdqhAOF1goSdWhid0HmJkg== + dependencies: + "@types/diff" "*" + "@types/inquirer" "*" + "@types/mem-fs" "*" + "@types/text-table" "*" + "@types/yeoman-generator" "*" + chalk "^4.1.0" + rxjs ">=6.4.0" + +"@types/yeoman-generator@*": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@types/yeoman-generator/-/yeoman-generator-4.11.3.tgz#3b4c0040cf0c28237dd9f535a15c620d3f68c5f4" + integrity sha512-bZRBRahUEs10YhPC4zTKwX5h1mfoFT4Qvav+z0WyT37SgKK9IgIozn8/k6IF9h9PNkxpAhFcER5llwdzCyFZnw== + dependencies: + "@types/debug" "*" + "@types/ejs" "*" + "@types/inquirer" "*" + "@types/mem-fs-editor" "*" + "@types/yeoman-environment" "*" + rxjs ">=6.4.0" + "@typescript-eslint/eslint-plugin@2.34.0": version "2.34.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" @@ -4852,6 +4952,14 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +JSONStream@^1.2.1, JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" @@ -6002,6 +6110,11 @@ binary@^0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" +binaryextensions@^2.1.2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22" + integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg== + bindings@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" @@ -6718,6 +6831,21 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -6949,6 +7077,14 @@ cli-table3@~0.6.0: optionalDependencies: colors "^1.1.2" +cli-table@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.4.tgz#5b37fd723751f1a6e9e70d55953a75e16eab958e" + integrity sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA== + dependencies: + chalk "^2.4.1" + string-width "^4.2.0" + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -6989,6 +7125,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -7025,6 +7166,11 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -7036,6 +7182,15 @@ clone-deep@^0.2.4: lazy-cache "^1.0.3" shallow-clone "^0.1.2" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -7043,11 +7198,25 @@ clone-response@1.0.2, clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -clone@^2.1.2: +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + cls-hooked@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908" @@ -7621,6 +7790,13 @@ cross-env@^6.0.3: dependencies: cross-spawn "^7.0.0" +cross-fetch@^3.0.4: + version "3.0.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" + integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== + dependencies: + node-fetch "2.6.1" + cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -7867,6 +8043,13 @@ css@^2.2.4: source-map-resolve "^0.5.2" urix "^0.1.0" +cssauron@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= + dependencies: + through X.X.X + cssdb@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -8567,6 +8750,11 @@ damerau-levenshtein@^1.0.4: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" integrity sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ= +dargs@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-6.1.0.tgz#1f3b9b56393ecf8caa7cbfd6c31496ffcfb9b272" + integrity sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -8598,6 +8786,11 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= +dateformat@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + dayjs@^1.10.3: version "1.10.4" resolved "https://botbuilder.myget.org/F/botbuilder-v4-js-daily/npm/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" @@ -8638,7 +8831,7 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.3.0: +debug@^4.0.0, debug@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -8869,7 +9062,7 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff@3.5.0: +diff@3.5.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -8896,7 +9089,7 @@ dir-glob@2.0.0: arrify "^1.0.1" path-type "^3.0.0" -dir-glob@^2.2.1: +dir-glob@^2.2.1, dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== @@ -8989,6 +9182,15 @@ dom-serializer@0: domelementtype "^1.3.0" entities "^1.1.1" +dom-serializer@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" + integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + entities "^2.0.0" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -8999,6 +9201,11 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +domelementtype@^2.0.1, domelementtype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -9013,6 +9220,20 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" + integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== + dependencies: + domelementtype "^2.1.0" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -9029,6 +9250,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3" + integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + dot-prop@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" @@ -9086,6 +9316,15 @@ download-package-tarball@^1.0.0: then-read-json "^1.0.3" then-tmp "^1.0.0" +download-stats@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/download-stats/-/download-stats-0.3.4.tgz#67ea0c32f14acd9f639da704eef509684ba2dae7" + integrity sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA== + dependencies: + JSONStream "^1.2.1" + lazy-cache "^2.0.1" + moment "^2.15.1" + download-tarball@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/download-tarball/-/download-tarball-1.1.0.tgz#2ac42353158b41f66d42c79a4fd8fcac42c90547" @@ -9099,6 +9338,13 @@ download-tarball@^1.0.0: pump "^1.0.1" tar-fs "^1.13.0" +duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -9139,6 +9385,14 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" +editions@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.3.1.tgz#3bc9962f1978e801312fbd0aebfed63b49bfe698" + integrity sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA== + dependencies: + errlop "^2.0.0" + semver "^6.3.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -9339,11 +9593,21 @@ entities@^1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +errlop@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" + integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== + errno@^0.1.3: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -9358,6 +9622,13 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error@^7.0.2: + version "7.2.1" + resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA== + dependencies: + string-template "~0.2.1" + es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" @@ -10599,6 +10870,13 @@ findup-sync@^3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + integrity sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA= + dependencies: + readable-stream "^2.0.2" + fix-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fix-path/-/fix-path-3.0.0.tgz#c6b82fd5f5928e520b392a63565ebfef0ddf037e" @@ -11079,11 +11357,26 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gh-got@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-5.0.0.tgz#ee95be37106fd8748a96f8d1db4baea89e1bfa8a" + integrity sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo= + dependencies: + got "^6.2.0" + is-plain-obj "^1.1.0" + github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= +github-username@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/github-username/-/github-username-3.0.0.tgz#0a772219b3130743429f2456d0bdd3db55dce7b1" + integrity sha1-CnciGbMTB0NCnyRW0L3T21Xc57E= + dependencies: + gh-got "^5.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -11279,7 +11572,7 @@ globby@*: pify "^4.0.1" slash "^2.0.0" -globby@8.0.2: +globby@8.0.2, globby@^8.0.1: version "8.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== @@ -11341,7 +11634,21 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -got@^6.3.0: +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^6.2.0, got@^6.3.0: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= @@ -11420,6 +11727,13 @@ graphlib@^2.1.7: dependencies: lodash "^4.17.5" +grouped-queue@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-1.1.0.tgz#63e3f9ca90af952269d1d40879e41221eacc74cb" + integrity sha512-rZOFKfCqLhsu5VqjBjEWiwrYqJR07KxIkH4mLZlNlGDfntbb4FbMyGFP14TlvRPrU9S3Hnn/sgxbC5ZeN0no3Q== + dependencies: + lodash "^4.17.15" + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -11757,6 +12071,40 @@ html-minifier@^4.0.0: relateurl "^0.2.7" uglify-js "^3.5.1" +html-select@^2.3.5: + version "2.3.24" + resolved "https://registry.yarnpkg.com/html-select/-/html-select-2.3.24.tgz#46ad6d712e732cf31c6739d5d0110a5fabf17585" + integrity sha1-Rq1tcS5zLPMcZznV0BEKX6vxdYU= + dependencies: + cssauron "^1.1.0" + duplexer2 "~0.0.2" + inherits "^2.0.1" + minimist "~0.0.8" + readable-stream "^1.0.27-1" + split "~0.3.0" + stream-splicer "^1.2.0" + through2 "^1.0.0" + +html-to-react@^1.3.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.5.tgz#59091c11021d1ef315ef738460abb6a4a41fe1ce" + integrity sha512-KONZUDFPg5OodWaQu2ymfkDmU0JA7zB1iPfvyHehTmMUZnk0DS7/TyCMTzsLH6b4BvxX15g88qZCXFhJWktsmA== + dependencies: + domhandler "^3.3.0" + htmlparser2 "^5.0" + lodash.camelcase "^4.3.0" + ramda "^0.27.1" + +html-tokenize@^1.1.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/html-tokenize/-/html-tokenize-1.2.5.tgz#7e5ba99ecb51ef906ec9a7fcdee6ca3267c7897e" + integrity sha1-flupnstR75Buyaf83ubKMmfHiX4= + dependencies: + inherits "~2.0.1" + minimist "~0.0.8" + readable-stream "~1.0.27-1" + through2 "~0.4.1" + html-webpack-plugin@4.0.0-beta.8: version "4.0.0-beta.8" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.8.tgz#d9a8d4322d8cf310f1568f6f4f585a80df0ad378" @@ -11794,6 +12142,16 @@ htmlparser2@^3.3.0: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^5.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.3.0" + domutils "^2.4.2" + entities "^2.0.0" + http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" @@ -12090,6 +12448,11 @@ indexes-of@^1.0.1: resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -12113,7 +12476,7 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@^2.0.4: +inherits@^2.0.0, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -12180,6 +12543,25 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + intercept-stdout@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/intercept-stdout/-/intercept-stdout-0.1.2.tgz#126abf1fae6c509a428a98c61a631559042ae9fd" @@ -12273,6 +12655,19 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -12350,6 +12745,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-deflate@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" @@ -12448,6 +12848,11 @@ is-gzip@^1.0.0: resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" integrity sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-installed-globally@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.1.tgz#679afef819347a72584617fd19497f010b8ed35f" @@ -12560,6 +12965,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.1, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -12626,6 +13036,13 @@ is-root@2.0.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019" integrity sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg== +is-scoped@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" + integrity sha1-RJypgpnnEwOCViieyytUDcQ3yzA= + dependencies: + scoped-regex "^1.0.0" + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -12660,6 +13077,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + is-what@^3.3.1: version "3.11.2" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.11.2.tgz#4ca0c91b236acea48dd6af0a072d6a84aec7a1d4" @@ -12692,7 +13114,7 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: +isarray@0.0.1, isarray@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= @@ -12702,7 +13124,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^4.0.6: +isbinaryfile@^4.0.0, isbinaryfile@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== @@ -12781,6 +13203,15 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +istextorbinary@^2.5.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.6.0.tgz#60776315fb0fa3999add276c02c69557b9ca28ab" + integrity sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA== + dependencies: + binaryextensions "^2.1.2" + editions "^2.2.0" + textextensions "^2.5.0" + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -12941,6 +13372,14 @@ jest-environment-node@^26.0.1: jest-mock "^26.0.1" jest-util "^26.0.1" +jest-fetch-mock@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" + integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== + dependencies: + cross-fetch "^3.0.4" + promise-polyfill "^8.1.3" + jest-get-type@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" @@ -13486,6 +13925,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + jsonparse@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd" @@ -13636,6 +14080,13 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= +lazy-cache@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ= + dependencies: + set-getter "^0.1.0" + lazy-val@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" @@ -13881,6 +14332,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -14233,6 +14689,29 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdast-add-list-metadata@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" + integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== + dependencies: + unist-util-visit-parents "1.1.2" + +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdn-data@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" @@ -14253,6 +14732,49 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem-fs-editor@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-6.0.0.tgz#d63607cf0a52fe6963fc376c6a7aa52db3edabab" + integrity sha512-e0WfJAMm8Gv1mP5fEq/Blzy6Lt1VbLg7gNnZmZak7nhrBTibs+c6nQ4SKs/ZyJYHS1mFgDJeopsLAv7Ow0FMFg== + dependencies: + commondir "^1.0.1" + deep-extend "^0.6.0" + ejs "^2.6.1" + glob "^7.1.4" + globby "^9.2.0" + isbinaryfile "^4.0.0" + mkdirp "^0.5.0" + multimatch "^4.0.0" + rimraf "^2.6.3" + through2 "^3.0.1" + vinyl "^2.2.0" + +mem-fs-editor@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-7.1.0.tgz#2a16f143228df87bf918874556723a7ee73bfe88" + integrity sha512-BH6QEqCXSqGeX48V7zu+e3cMwHU7x640NB8Zk8VNvVZniz+p4FK60pMx/3yfkzo6miI6G3a8pH6z7FeuIzqrzA== + dependencies: + commondir "^1.0.1" + deep-extend "^0.6.0" + ejs "^3.1.5" + glob "^7.1.4" + globby "^9.2.0" + isbinaryfile "^4.0.0" + mkdirp "^1.0.0" + multimatch "^4.0.0" + rimraf "^3.0.0" + through2 "^3.0.2" + vinyl "^2.2.1" + +mem-fs@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.2.0.tgz#5f29b2d02a5875cd14cd836c388385892d556cde" + integrity sha512-b8g0jWKdl8pM0LqAPdK9i8ERL7nYrzmJfRhxMiWH2uYdfYnb7uXnmwVb0ZGe7xyEl4lj+nLIU3yf4zPUT+XsVQ== + dependencies: + through2 "^3.0.0" + vinyl "^2.0.1" + vinyl-file "^3.0.0" + mem@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025" @@ -14329,6 +14851,14 @@ metric-lcs@^0.1.2: resolved "https://registry.yarnpkg.com/metric-lcs/-/metric-lcs-0.1.2.tgz#87913f149410e39c7c5a19037512814eaf155e11" integrity sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA== +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -14485,6 +15015,11 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@~0.0.8: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -14580,7 +15115,7 @@ mkdirp-then@^1.2.0: any-promise "^1.1.0" mkdirp "^0.5.0" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.2, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.2, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@^1.0.0, mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -14621,7 +15156,7 @@ moment-timezone@*, moment-timezone@^0.5.28: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== -moment@^2.25.1, moment@^2.27.0: +moment@^2.15.1, moment@^2.24.0, moment@^2.25.1, moment@^2.27.0: version "2.29.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== @@ -14699,6 +15234,17 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +multimatch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" + integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + multimatch@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -15106,6 +15652,18 @@ normalize-url@^4.1.0, normalize-url@^4.5.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== +npm-api@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-api/-/npm-api-1.0.1.tgz#3def9b51afedca57db14ca0c970d92442d21c9c5" + integrity sha512-4sITrrzEbPcr0aNV28QyOmgn6C9yKiF8k92jn4buYAK8wmA5xo1qL3II5/gT1r7wxbXBflSduZ2K3FbtOrtGkA== + dependencies: + JSONStream "^1.3.5" + clone-deep "^4.0.1" + download-stats "^0.3.4" + moment "^2.24.0" + node-fetch "^2.6.0" + paged-request "^2.0.1" + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -15236,6 +15794,11 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -15710,6 +16273,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.1.0.tgz#c1a0f1030e97de018bb2c718929d2af59463e505" integrity sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA== +p-try@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-5.0.0.tgz#a7dbe2725edcc7dc9bcee627672275e323882433" @@ -15730,6 +16298,13 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" +paged-request@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/paged-request/-/paged-request-2.0.2.tgz#4d621a08b8d6bee4440a0a92112354eeece5b5b0" + integrity sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag== + dependencies: + axios "^0.21.1" + pako@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -15771,6 +16346,18 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -16001,7 +16588,7 @@ picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== -pify@^2.0.0, pify@^2.2.0: +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -16849,6 +17436,11 @@ pretty-bytes@^5.1.0, pretty-bytes@^5.4.1: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.4.1.tgz#cd89f79bbcef21e3d21eb0da68ffe93f803e884b" integrity sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA== +pretty-bytes@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e" + integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA== + pretty-error@^2.0.2, pretty-error@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -16912,6 +17504,11 @@ private@^0.1.6, private@^0.1.8: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +process-nextick-args@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -16942,6 +17539,11 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-polyfill@^8.1.3: + version "8.2.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.0.tgz#367394726da7561457aba2133c9ceefbd6267da0" + integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g== + promise@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.2.tgz#9dcd0672192c589477d56891271bdc27547ae9f0" @@ -17166,6 +17768,11 @@ raf@3.4.1: dependencies: performance-now "^2.1.0" +ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + ramda@~0.26.1: version "0.26.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" @@ -17367,6 +17974,22 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-markdown@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac" + integrity sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w== + dependencies: + "@types/mdast" "^3.0.3" + "@types/unist" "^2.0.3" + html-to-react "^1.3.4" + mdast-add-list-metadata "1.0.1" + prop-types "^15.7.2" + react-is "^16.8.6" + remark-parse "^9.0.0" + unified "^9.0.0" + unist-util-visit "^2.0.0" + xtend "^4.0.1" + react-measure@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/react-measure/-/react-measure-2.3.0.tgz#75835d39abec9ae13517f35a819c160997a7a44e" @@ -17412,6 +18035,14 @@ react@16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +read-chunk@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca" + integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ== + dependencies: + pify "^4.0.1" + with-open-file "^0.1.6" + read-config-file@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.0.0.tgz#224b5dca6a5bdc1fb19e63f89f342680efdb9299" @@ -17431,6 +18062,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-5.0.0.tgz#b6a6741cb144ed3610554f40162aa07a6db621b8" + integrity sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg== + dependencies: + find-up "^3.0.0" + read-pkg "^5.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -17458,7 +18097,7 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -read-pkg@^5.2.0: +read-pkg@^5.0.0, read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== @@ -17489,7 +18128,7 @@ read-text-file@^1.1.0, read-text-file@~1.1.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: +readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.27-1, readable-stream@^1.1.13-1, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -17499,7 +18138,16 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.3.0: +"readable-stream@2 || 3", readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -17521,16 +18169,7 @@ readable-stream@^3.0.6, readable-stream@^3.1.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: +readable-stream@~1.0.17, readable-stream@~1.0.27-1, readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= @@ -17552,6 +18191,13 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" +readable-wrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff" + integrity sha1-O1ohHGMeEjA6VJkcgGwX564ga/8= + dependencies: + readable-stream "^1.1.13-1" + readdir-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.0.0.tgz#a495436934bbe57be6a68039d16e8946621eb8c5" @@ -17832,6 +18478,13 @@ relateurl@0.2.x, relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -17863,6 +18516,11 @@ replace-ext@1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -18185,6 +18843,11 @@ run-async@^0.1.0: dependencies: once "^1.3.0" +run-async@^2.0.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -18219,7 +18882,7 @@ rx-lite@^3.1.2: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= -rxjs@^6.1.0, rxjs@^6.5.5: +rxjs@>=6.4.0, rxjs@^6.1.0, rxjs@^6.5.5, rxjs@^6.6.0: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -18344,6 +19007,11 @@ schema-utils@^2.6.6: ajv "^6.12.2" ajv-keywords "^3.4.1" +scoped-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" + integrity sha1-o0a7Gs1CB65wvXwMfKnlZra63bg= + seedrandom@~3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" @@ -18498,6 +19166,13 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y= + dependencies: + to-object-path "^0.3.0" + set-value@^0.4.3, set-value@^2.0.0, set-value@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/set-value/-/set-value-3.0.2.tgz#74e8ecd023c33d0f77199d415409a40f21e61b90" @@ -18538,6 +19213,13 @@ shallow-clone@^0.1.2: lazy-cache "^0.2.3" mixin-object "^2.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -18602,6 +19284,15 @@ shelljs@^0.7.5: interpret "^1.0.0" rechoir "^0.6.2" +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -18933,6 +19624,13 @@ split@^1.0.1: dependencies: through "2" +split@~0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= + dependencies: + through "2" + sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -19040,6 +19738,18 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-splicer@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661" + integrity sha1-PARBvhW5v04iYnXm3IOWR0VUZmE= + dependencies: + indexof "0.0.1" + inherits "^2.0.1" + isarray "~0.0.1" + readable-stream "^1.1.13-1" + readable-wrap "^1.0.0" + through2 "^1.0.0" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -19063,6 +19773,11 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -19207,6 +19922,28 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom-buf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" + integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= + dependencies: + is-utf8 "^0.2.1" + +strip-bom-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" + integrity sha1-+H217yYT9paKpUWr/h7HKLaoKco= + dependencies: + first-chunk-stream "^2.0.0" + strip-bom "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -19645,6 +20382,11 @@ text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +textextensions@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4" + integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ== + then-read-json@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/then-read-json/-/then-read-json-1.0.3.tgz#9a0fa4ccda5d77bb3489c7912908ccda4c4742e0" @@ -19690,6 +20432,14 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + integrity sha1-CEfLxESfNAVXTb3M2buEG4OsNUU= + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@^2.0.1, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -19698,7 +20448,23 @@ through2@^2.0.1, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@^2.3.6: +through2@^3.0.0, through2@^3.0.1, through2@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== + dependencies: + inherits "^2.0.4" + readable-stream "2 || 3" + +through2@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s= + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -19892,6 +20658,18 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24" integrity sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw== +trumpet@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/trumpet/-/trumpet-1.7.2.tgz#b02c69e465d171f55e44924bf9b5bdd20974c830" + integrity sha1-sCxp5GXRcfVeRJJL+bW90gl0yDA= + dependencies: + duplexer2 "~0.0.2" + html-select "^2.3.5" + html-tokenize "^1.1.1" + inherits "^2.0.0" + readable-stream "^1.0.27-1" + through2 "^1.0.0" + truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -20201,6 +20979,18 @@ unified@^7.0.2: vfile "^3.0.0" x-is-string "^0.1.0" +unified@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -20242,11 +21032,45 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-util-is@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" + integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== + unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ== +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" + integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -20275,6 +21099,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -20613,6 +21442,14 @@ vfile-message@^1.0.0: dependencies: unist-util-stringify-position "^1.1.1" +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile@^3.0.0, vfile@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" @@ -20623,6 +21460,39 @@ vfile@^3.0.0, vfile@^3.0.1: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vinyl-file@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-3.0.0.tgz#b104d9e4409ffa325faadd520642d0a3b488b365" + integrity sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U= + dependencies: + graceful-fs "^4.1.2" + pify "^2.3.0" + strip-bom-buf "^1.0.0" + strip-bom-stream "^2.0.0" + vinyl "^2.0.1" + +vinyl@^2.0.1, vinyl@^2.2.0, vinyl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -21129,6 +21999,15 @@ window-size@^1.1.0: define-property "^1.0.0" is-number "^3.0.0" +with-open-file@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729" + integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA== + dependencies: + p-finally "^1.0.0" + p-try "^2.1.0" + pify "^4.0.1" + 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" @@ -21494,11 +22373,23 @@ xregexp@^4.3.0: dependencies: "@babel/runtime-corejs3" "^7.8.3" +"xtend@>=4.0.0 <4.1.0-0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + y18n@^3.2.1, "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0, y18n@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" @@ -21655,6 +22546,65 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yeoman-environment@^2.10.3, yeoman-environment@^2.9.5: + version "2.10.3" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.10.3.tgz#9d8f42b77317414434cc0e51fb006a4bdd54688e" + integrity sha512-pLIhhU9z/G+kjOXmJ2bPFm3nejfbH+f1fjYRSOteEXDBrv1EoJE/e+kuHixSXfCYfTkxjYsvRaDX+1QykLCnpQ== + dependencies: + chalk "^2.4.1" + debug "^3.1.0" + diff "^3.5.0" + escape-string-regexp "^1.0.2" + execa "^4.0.0" + globby "^8.0.1" + grouped-queue "^1.1.0" + inquirer "^7.1.0" + is-scoped "^1.0.0" + lodash "^4.17.10" + log-symbols "^2.2.0" + mem-fs "^1.1.0" + mem-fs-editor "^6.0.0" + npm-api "^1.0.0" + semver "^7.1.3" + strip-ansi "^4.0.0" + text-table "^0.2.0" + untildify "^3.0.3" + yeoman-generator "^4.8.2" + +yeoman-generator@^4.8.2: + version "4.13.0" + resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-4.13.0.tgz#a6caeed8491fceea1f84f53e31795f25888b4672" + integrity sha512-f2/5N5IR3M2Ozm+QocvZQudlQITv2DwI6Mcxfy7R7gTTzaKgvUpgo/pQMJ+WQKm0KN0YMWCFOZpj0xFGxevc1w== + dependencies: + async "^2.6.2" + chalk "^2.4.2" + cli-table "^0.3.1" + cross-spawn "^6.0.5" + dargs "^6.1.0" + dateformat "^3.0.3" + debug "^4.1.1" + diff "^4.0.1" + error "^7.0.2" + find-up "^3.0.0" + github-username "^3.0.0" + istextorbinary "^2.5.1" + lodash "^4.17.11" + make-dir "^3.0.0" + mem-fs-editor "^7.0.1" + minimist "^1.2.5" + pretty-bytes "^5.2.0" + read-chunk "^3.2.0" + read-pkg-up "^5.0.0" + rimraf "^2.6.3" + run-async "^2.0.0" + semver "^7.2.1" + shelljs "^0.8.4" + text-table "^0.2.0" + through2 "^3.0.1" + optionalDependencies: + grouped-queue "^1.1.0" + yeoman-environment "^2.9.5" + yn@3.1.1, yn@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" diff --git a/extensions/azurePublish/src/node/index.ts b/extensions/azurePublish/src/node/index.ts index 8a75e4173e..00d1c73baf 100644 --- a/extensions/azurePublish/src/node/index.ts +++ b/extensions/azurePublish/src/node/index.ts @@ -176,37 +176,48 @@ export default async (composer: IExtensionRegistration): Promise => { try { // point to the declarative assets (possibly in remote storage) const botFiles = project.getProject().files; - const botFolder = this.getBotFolder(resourcekey, this.mode); - const runtimeFolder = this.getRuntimeFolder(resourcekey); - // clean up from any previous deploys - await this.cleanup(resourcekey); - - // create the temporary folder to contain this project - mkdirSync(runtimeFolder, { recursive: true }); - - // create the ComposerDialogs/ folder - mkdirSync(botFolder, { recursive: true }); - - let manifestPath; - for (const file of botFiles) { - const pattern = /manifests\/[0-9A-z-]*.json/; - if (file.relativePath.match(pattern)) { - manifestPath = path.dirname(file.path); + if (runtime.key === 'csharp-azurewebapp-v2') { + const buildFolder = this.getProjectFolder(resourcekey, this.mode) + + // clean up from any previous deploys + await this.cleanup(resourcekey); + + // copy bot and runtime into projFolder + await copy(srcTemplate, buildFolder); + } else { + const botFolder = this.getBotFolder(resourcekey, this.mode); + const runtimeFolder = this.getRuntimeFolder(resourcekey); + + // clean up from any previous deploys + await this.cleanup(resourcekey); + + // create the temporary folder to contain this project + mkdirSync(runtimeFolder, { recursive: true }); + + // create the ComposerDialogs/ folder + mkdirSync(botFolder, { recursive: true }); + + let manifestPath; + for (const file of botFiles) { + const pattern = /manifests\/[0-9A-z-]*.json/; + if (file.relativePath.match(pattern)) { + manifestPath = path.dirname(file.path); + } + // save bot files + const filePath = path.resolve(botFolder, file.relativePath); + if (!(await pathExists(path.dirname(filePath)))) { + mkdirSync(path.dirname(filePath), { recursive: true }); + } + writeFileSync(filePath, file.content); } - // save bot files - const filePath = path.resolve(botFolder, file.relativePath); - if (!(await pathExists(path.dirname(filePath)))) { - mkdirSync(path.dirname(filePath), { recursive: true }); - } - writeFileSync(filePath, file.content); - } - // save manifest - runtime.setSkillManifest(runtimeFolder, project.fileStorage, manifestPath, project.fileStorage, this.mode); + // save manifest + runtime.setSkillManifest(runtimeFolder, project.fileStorage, manifestPath, project.fileStorage, this.mode); - // copy bot and runtime into projFolder - await copy(srcTemplate, runtimeFolder); + // copy bot and runtime into projFolder + await copy(srcTemplate, runtimeFolder); + } } catch (error) { throw createCustomizeError(AzurePublishErrors.INITIALIZE_ERROR, `Error during init publish folder, ${error.message}`); diff --git a/extensions/azurePublish/src/node/luisAndQnA.ts b/extensions/azurePublish/src/node/luisAndQnA.ts index 87fe90fe3a..823bd325a8 100644 --- a/extensions/azurePublish/src/node/luisAndQnA.ts +++ b/extensions/azurePublish/src/node/luisAndQnA.ts @@ -12,8 +12,7 @@ import { AzurePublishErrors } from './utils/errorHandler'; import {BotProjectDeployLoggerType} from './types'; const readdir: any = promisify(fs.readdir); - -const botPath = (projPath: string) => path.join(projPath, 'ComposerDialogs') +const botPath = (projPath: string) => path.join(projPath) // there should not be a need to specify the sub directory type QnaConfigType = { subscriptionKey: string; diff --git a/extensions/localPublish/src/index.ts b/extensions/localPublish/src/index.ts index f00531b5b7..1f8ffe23c6 100644 --- a/extensions/localPublish/src/index.ts +++ b/extensions/localPublish/src/index.ts @@ -343,11 +343,11 @@ class LocalPublisher implements PublishPlugin { }; private startBot = async (botId: string, port: number, settings: any, project: any): Promise => { - let customerRuntimePath = settings.runtime.path; - if (customerRuntimePath && !path.isAbsolute(customerRuntimePath)) { - customerRuntimePath = path.resolve(project.dir, customerRuntimePath); + let customRuntimePath = settings.runtime.path; + if (customRuntimePath && !path.isAbsolute(customRuntimePath)) { + customRuntimePath = path.resolve(project.dir, customRuntimePath); } - const botDir = settings.runtime?.customRuntime === true ? customerRuntimePath : this.getBotRuntimeDir(botId); + const botDir = settings.runtime?.customRuntime === true ? customRuntimePath : this.getBotRuntimeDir(botId); const commandAndArgs = settings.runtime?.customRuntime === true diff --git a/extensions/packageManager/src/client/Library.tsx b/extensions/packageManager/src/client/Library.tsx index 663e688e46..e386a7e45d 100644 --- a/extensions/packageManager/src/client/Library.tsx +++ b/extensions/packageManager/src/client/Library.tsx @@ -41,6 +41,7 @@ const Library: React.FC = () => { const [ejectedRuntime, setEjectedRuntime] = useState(false); const [availableLibraries, updateAvailableLibraries] = useState(undefined); const [installedComponents, updateInstalledComponents] = useState([]); + const [isLoadingInstalled, setIsLoadingInstalled] = useState(false); const [recentlyUsed, setRecentlyUsed] = useState([]); const [runtimeLanguage, setRuntimeLanguage] = useState('c#'); const [feeds, updateFeeds] = useState([]); @@ -294,16 +295,20 @@ const Library: React.FC = () => { }; const getInstalledLibraries = async () => { - try { - updateInstalledComponents([]); - const response = await getInstalledComponentsAPI(currentProjectId); - updateInstalledComponents(response.data.components); - } catch (err) { - setApplicationLevelError({ - status: err.response.status, - message: err.response && err.response.data.message ? err.response.data.message : err, - summary: strings.libraryError, - }); + if (!isLoadingInstalled) { + setIsLoadingInstalled(true); + try { + updateInstalledComponents([]); + const response = await getInstalledComponentsAPI(currentProjectId); + updateInstalledComponents(response.data.components); + } catch (err) { + setApplicationLevelError({ + status: err.response.status, + message: err.response && err.response.data.message ? err.response.data.message : err, + summary: strings.libraryError, + }); + } + setIsLoadingInstalled(false); } }; diff --git a/extensions/packageManager/src/node/index.ts b/extensions/packageManager/src/node/index.ts index 2288187614..19740fdb2d 100644 --- a/extensions/packageManager/src/node/index.ts +++ b/extensions/packageManager/src/node/index.ts @@ -162,11 +162,11 @@ export default async (composer: IExtensionRegistration): Promise => { } if (currentProject.settings?.runtime?.customRuntime && runtimePath) { - const manifestFile = runtime.identifyManifest(runtimePath); + const manifestFile = runtime.identifyManifest(runtimePath, currentProject.name); const dryrun = new SchemaMerger( - [manifestFile], - '', + [manifestFile,'!**/imported/**','!**/generated/**'], + path.join(currentProject.dataDir, 'schemas/sdk'), path.join(currentProject.dataDir, 'dialogs/imported'), true, // copy only? true = dry run false, // verbosity: true = verbose @@ -218,13 +218,13 @@ export default async (composer: IExtensionRegistration): Promise => { if (packageName && runtimePath) { try { // Call the runtime's component install mechanism. - const installOutput = await runtime.installComponent(runtimePath, packageName, version); + const installOutput = await runtime.installComponent(runtimePath, packageName, version, currentProject); - const manifestFile = runtime.identifyManifest(runtimePath); + const manifestFile = runtime.identifyManifest(runtimePath, currentProject.name); // call do a dry run on the dialog merge const dryrun = new SchemaMerger( - [manifestFile], + [manifestFile,'!**/imported/**','!**/generated/**'], path.join(currentProject.dataDir, 'schemas/sdk'), path.join(currentProject.dataDir, 'dialogs/imported'), true, // copy only? true = dry run @@ -252,7 +252,7 @@ export default async (composer: IExtensionRegistration): Promise => { }); } else { const realMerge = new SchemaMerger( - [manifestFile], + [manifestFile,'!**/imported/**','!**/generated/**'], path.join(currentProject.dataDir, 'schemas/sdk'), path.join(currentProject.dataDir, 'dialogs/imported'), false, // copy only? true = dry run @@ -285,7 +285,7 @@ export default async (composer: IExtensionRegistration): Promise => { } catch (err) { composer.log('Error in import', { message: err.message }); try { - await runtime.uninstallComponent(runtimePath, packageName); + await runtime.uninstallComponent(runtimePath, packageName, currentProject); } catch (err) { composer.log('Error uninstalling', err); } @@ -293,7 +293,7 @@ export default async (composer: IExtensionRegistration): Promise => { if (packageName.match(/.*\/.*/)) { const [user, realPackageName] = packageName.split(/\//); if (!user.match(/^@/)) { - await runtime.uninstallComponent(runtimePath, realPackageName); + await runtime.uninstallComponent(runtimePath, realPackageName, currentProject); } } res.status(500).json({ success: false, message: err.message }); @@ -325,13 +325,13 @@ export default async (composer: IExtensionRegistration): Promise => { const packageName = req.body.package; if (packageName && runtimePath) { try { - const output = await runtime.uninstallComponent(runtimePath, packageName); + const output = await runtime.uninstallComponent(runtimePath, packageName, currentProject); - const manifestFile = runtime.identifyManifest(runtimePath); + const manifestFile = runtime.identifyManifest(runtimePath, currentProject.name); // call do a dry run on the dialog merge const merger = new SchemaMerger( - [manifestFile], + [manifestFile,'!**/imported/**','!**/generated/**'], path.join(currentProject.dataDir, 'schemas/sdk'), path.join(currentProject.dataDir, 'dialogs/imported'), false, // copy only? true = dry run diff --git a/extensions/packageManager/yarn.lock b/extensions/packageManager/yarn.lock index f27053e320..1984b2fd1a 100644 --- a/extensions/packageManager/yarn.lock +++ b/extensions/packageManager/yarn.lock @@ -39,21 +39,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/runtime-corejs3@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.5.tgz#ffee91da0eb4c6dae080774e94ba606368e414f4" - integrity sha512-roGr54CsTmNPPzZoCP1AmDXuBoNao7tnSA83TXTwt+UK5QVyh1DIJnrgYRPWKCF2flqZQXwa7Yr8v7VmLzF0YQ== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.4.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740" @@ -481,11 +466,6 @@ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/express-serve-static-core@*": version "4.17.13" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" @@ -512,11 +492,6 @@ dependencies: "@types/node" "*" -"@types/json-schema@^7.0.3": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== - "@types/lru-cache@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" @@ -587,49 +562,6 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== - dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== - dependencies: - debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - "@uifabric/fluent-theme@^7.1.4": version "7.3.29" resolved "https://registry.yarnpkg.com/@uifabric/fluent-theme/-/fluent-theme-7.3.29.tgz#1a64a3a78bd7c6419ea784b32d0967b3f4b7c2b3" @@ -875,21 +807,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -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: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -900,7 +822,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -915,13 +837,6 @@ ansi-escapes@^3.1.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -944,7 +859,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -994,14 +909,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1017,17 +924,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-includes@^3.0.3, array-includes@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1038,15 +934,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -1070,16 +957,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -1124,11 +1001,6 @@ axios@^0.21.1: dependencies: follow-redirects "^1.10.0" -axobject-query@^2.0.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== - babel-plugin-emotion@^10.0.27: version "10.0.33" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz#ce1155dcd1783bbb9286051efee53f4e2be63e03" @@ -1376,14 +1248,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -1425,19 +1289,6 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -1524,13 +1375,6 @@ clean-stack@^3.0.0: dependencies: escape-string-regexp "4.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-ux@~4.9.3: version "4.9.3" resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-4.9.3.tgz#4c3e070c1ea23eef010bbdb041192e0661be84ce" @@ -1558,11 +1402,6 @@ cli-ux@~4.9.3: treeify "^1.1.0" tslib "^1.9.3" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1618,7 +1457,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -commander@^2.11.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -1677,11 +1516,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - continuation-local-storage@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb" @@ -1714,11 +1548,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-pure@^3.0.0: - version "3.8.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.2.tgz#286f885c0dac1cdcd6d78397392abc25ddeca225" - integrity sha512-v6zfIQqL/pzTVAbZvYUozsxNfxcFb6Ks3ZfEbuneJl3FW9Jb8F6vLWB6f+qTmAu72msUdyb84V8d/yBFf7FNnw== - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1735,11 +1564,6 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -crc32@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/crc32/-/crc32-0.2.2.tgz#7ad220d6ffdcd119f9fc127a7772cacea390a4ba" - integrity sha1-etIg1v/c0Rn5/BJ6d3LKzqOQpLo= - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -1782,15 +1606,6 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1823,11 +1638,6 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -damerau-levenshtein@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== - data-uri-to-buffer@3: version "3.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" @@ -1852,20 +1662,13 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^4.0.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1876,18 +1679,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1951,28 +1742,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -2008,7 +1777,7 @@ emitter-listener@^1.0.1, emitter-listener@^1.1.1: dependencies: shimmer "^1.2.0" -emoji-regex@^7.0.1, emoji-regex@^7.0.2: +emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== @@ -2046,57 +1815,13 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escape-string-regexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2107,135 +1832,6 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-config-prettier@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== - dependencies: - get-stdin "^6.0.0" - -eslint-import-resolver-node@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-cypress@2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.1.tgz#a945e2774b88211e2c706a059d431e262b5c2862" - integrity sha512-MxMYoReSO5+IZMGgpBZHHSx64zYPSPTpXDwsgW7ChlJTF/sA+obqRbHplxD6sBStE+g4Mi0LCLkG4t9liu//mQ== - dependencies: - globals "^11.12.0" - -eslint-plugin-emotion@10.0.27: - version "10.0.27" - resolved "https://registry.yarnpkg.com/eslint-plugin-emotion/-/eslint-plugin-emotion-10.0.27.tgz#577a4265cc679f7bb826437a92fb9d709928e0a7" - integrity sha512-0IG9KWmyQTAWZNM4WoGjFbdre1Xq6uMp2jYOSHvh3ZNcDfOjOLXeH3ky1MuWZlbWIHxz/Ed5DMGlJAeKnd26VA== - -eslint-plugin-format-message@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-format-message/-/eslint-plugin-format-message-6.2.3.tgz#737f1b02d6de4c915c1356f6a340bd759c4a80fc" - integrity sha512-nbGDsHe/d7KHUJbskovkFHDcZEsvC7lcSsYaRvnvO+z7Ql9a/u9AI+glqn63K3MZLLdmIxxPTVGkktDMWJII4w== - dependencies: - format-message "^6.2.3" - format-message-estree-util "^6.1.0" - format-message-generate-id "^6.2.3" - format-message-parse "^6.2.3" - lookup-closest-locale "^6.2.0" - -eslint-plugin-import@2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" - integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== - dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.0" - read-pkg-up "^2.0.0" - resolve "^1.12.0" - -eslint-plugin-jsx-a11y@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz#b872a09d5de51af70a97db1eea7dc933043708aa" - integrity sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg== - dependencies: - "@babel/runtime" "^7.4.5" - aria-query "^3.0.0" - array-includes "^3.0.3" - ast-types-flow "^0.0.7" - axobject-query "^2.0.2" - damerau-levenshtein "^1.0.4" - emoji-regex "^7.0.2" - has "^1.0.3" - jsx-ast-utils "^2.2.1" - -eslint-plugin-lodash@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-lodash/-/eslint-plugin-lodash-7.1.0.tgz#5ad9bf1240a01c6c3f94e956213e2d6422af3192" - integrity sha512-BRkEI/+ZjmeDCM1DfzR+NVwYkC/+ChJhaOSm3Xm7rer/fs89TKU6AMtkQiDdqQel1wZ4IJM+B6hlep9xwVKaMQ== - -eslint-plugin-notice@0.9.10: - version "0.9.10" - resolved "https://registry.yarnpkg.com/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz#89cf6377bf1c004a219c4e541321ea9125b408c8" - integrity sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ== - dependencies: - find-root "^1.1.0" - lodash "^4.17.15" - metric-lcs "^0.1.2" - -eslint-plugin-prettier@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" - integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-react-hooks@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.2.tgz#03700ca761eacc1b6436074c456f90a8e331ff28" - integrity sha512-kAMRjNztrLW1rK+81X1NwMB2LqG+nc7Q8AibnG8/VyWhQK8SP6JotCFG+HL4u1EjziplxVz4jARdR8gGk8pLDA== - -eslint-plugin-react@7.20.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3" - integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA== - dependencies: - array-includes "^3.1.1" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.1" - object.fromentries "^2.0.2" - object.values "^1.1.1" - prop-types "^15.7.2" - resolve "^1.15.1" - string.prototype.matchall "^4.0.2" - xregexp "^4.3.0" - -eslint-plugin-security@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" - integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== - dependencies: - safe-regex "^1.1.0" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -2244,90 +1840,12 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.0.0.tgz#c35dfd04a4372110bd78c69a8d79864273919a08" - integrity sha512-qY1cwdOxMONHJfGqw52UOpZDeqXy8xmD0u8CT6jIstil72jkhURC704W8CFyTPDPllz4z4lu0Ql1+07PG/XdIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.1.0" - espree "^7.0.0" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.14" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.0.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - esprima@^4.0.0, 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== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -2339,16 +1857,11 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - events@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" @@ -2402,15 +1915,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -2435,11 +1939,6 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - fast-glob@^3.1.1: version "3.2.4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" @@ -2457,11 +1956,6 @@ 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: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - fastq@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" @@ -2474,20 +1968,6 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/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-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -2529,13 +2009,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2553,20 +2026,6 @@ 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://registry.yarnpkg.com/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.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -2592,25 +2051,11 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -format-message-estree-util@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/format-message-estree-util/-/format-message-estree-util-6.1.0.tgz#4e87989e667d74ce5cc5b18922508e31f39d746d" - integrity sha512-z8nZdDI3vQdYVARVBVFebKSUEEZhw3/sgD8F+PneLT7TGBKt3QpeSQ8g2yUoQrj9saoR2fYbpXeaQ8qnjg013Q== - format-message-formats@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/format-message-formats/-/format-message-formats-6.2.0.tgz#231c2a3d2806e3200331c7aa06430cb403f58792" integrity sha512-QP0dl1O9P3fDCG5klj101nfizgiWiv0T+DMNBqwi25FvB1LIenQQW4PpULk5zO5PiOSvmMu5pW4HS542kJRAww== -format-message-generate-id@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/format-message-generate-id/-/format-message-generate-id-6.2.3.tgz#691b0449eb0f21de9dc78707e142b85346062569" - integrity sha512-ZGZmjIBG7+Bv2i5TedI0n6ds05kFTa8eqBgkgrgS+LRRM83wz/0T/3iKAvL8GY5QM9Do32txEuI7B8D5HVqASw== - dependencies: - crc32 "^0.2.2" - format-message-parse "^6.2.3" - format-message-print "^6.2.3" - format-message-interpret@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/format-message-interpret/-/format-message-interpret-6.2.3.tgz#ee72fe924102c7d3f0c2d12797f53d8d93795810" @@ -2624,11 +2069,6 @@ format-message-parse@^6.2.3: resolved "https://registry.yarnpkg.com/format-message-parse/-/format-message-parse-6.2.3.tgz#1393d9e2bc598603a36be992379781a78d1b6c08" integrity sha512-ZSL3nZ0zaDktDAGwkoGJ439rS9ZfTcMOrWAVav9BOAoKs0qE2Ozal2H6vVJOuIdDhwaJuFqvJ7fdRSE+qR5oNg== -format-message-print@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/format-message-print/-/format-message-print-6.2.3.tgz#7a74eadd207de345118ac23324bac90e25246e17" - integrity sha512-mC3mel5jwDP4v5y6GrxaxZrgCNaF1QDSKJf6kYrHiJOWQT8Ykm7yaOcsS6UcHT99TPAtrwg8ATSx1K4/SxSvqA== - format-message@^6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/format-message/-/format-message-6.2.3.tgz#5cb50a664180299c562f5a75083c8476b4157cb4" @@ -2725,35 +2165,11 @@ ftp@^0.3.10: readable-stream "1.1.x" xregexp "2.0.0" -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/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://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" - integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - get-uri@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" @@ -2779,14 +2195,14 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -2834,18 +2250,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.12.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globby@^11.0.0, globby@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" @@ -2873,16 +2277,6 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2914,13 +2308,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -2954,11 +2341,6 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -2969,13 +2351,6 @@ hyperlinker@^1.0.0: resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -2986,24 +2361,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - import-fresh@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -3068,34 +2430,6 @@ ini@^1.3.4, ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" - integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== - dependencies: - es-abstract "^1.17.0-next.1" - has "^1.0.3" - side-channel "^1.0.2" - interpret@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -3139,18 +2473,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -3165,11 +2487,6 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -3234,11 +2551,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3258,25 +2570,6 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3377,11 +2670,6 @@ json-schema@^0.2.5: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.5.tgz#97997f50972dd0500214e208c407efa4b5d7063b" integrity sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ== -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -3405,14 +2693,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" - integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== - dependencies: - array-includes "^3.1.1" - object.assign "^4.1.0" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3437,29 +2717,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -3474,14 +2736,6 @@ loader-utils@^1.0.2, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -3510,7 +2764,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.4: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -3534,13 +2788,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -3591,11 +2838,6 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metric-lcs@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/metric-lcs/-/metric-lcs-0.1.2.tgz#87913f149410e39c7c5a19037512814eaf155e11" - integrity sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA== - micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3631,11 +2873,6 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -3731,11 +2968,6 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" @@ -3758,11 +2990,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -3807,16 +3034,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -3843,16 +3060,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0, object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -3860,36 +3067,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.entries@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - -object.fromentries@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.3.tgz#13cefcffa702dc67750314a3305e8cb3fad1d072" - integrity sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -3897,16 +3074,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" - office-ui-fabric-react@7.71.0: version "7.71.0" resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.71.0.tgz#df28680e21ad0b6cae58ad4cab0f1b28179dadff" @@ -3949,47 +3116,16 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - os@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/os/-/os-0.1.1.tgz#208845e89e193ad4d971474b93947736a56d13f3" integrity sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M= -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3997,13 +3133,6 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -4011,11 +3140,6 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4053,13 +3177,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" @@ -4126,11 +3243,6 @@ path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -4141,13 +3253,6 @@ path-to-regexp@^6.1.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -4182,23 +3287,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -4211,23 +3304,6 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -4238,11 +3314,6 @@ process@^0.11.1, process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -4363,23 +3434,6 @@ react@^16.13.0: object-assign "^4.1.1" prop-types "^15.6.2" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -4448,19 +3502,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -4516,14 +3557,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.15.1: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - resolve@^1.12.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -4531,14 +3564,6 @@ resolve@^1.12.0: dependencies: path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -4549,13 +3574,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -4578,11 +3596,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" @@ -4595,13 +3608,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -4619,7 +3625,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4651,7 +3657,7 @@ seedrandom@~3.0.5: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4661,13 +3667,6 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" @@ -4715,56 +3714,21 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - shimmer@^1.1.0, shimmer@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== -side-channel@^1.0.2, side-channel@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/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" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4834,32 +3798,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== - split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -4950,35 +3888,6 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz#24243399bc31b0a49d19e2b74171a15653ec996a" - integrity sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has-symbols "^1.0.1" - internal-slot "^1.0.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.3" - -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -5019,16 +3928,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-json-comments@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -5043,13 +3942,6 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" @@ -5058,16 +3950,6 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/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://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -5109,11 +3991,6 @@ terser@^4.1.2: source-map "~0.6.1" source-map-support "~0.5.12" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -5122,11 +3999,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - timers-browserify@^2.0.4: version "2.0.11" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" @@ -5134,13 +4006,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -5199,7 +4064,7 @@ ts-loader@^8.0.0: micromatch "^4.0.0" semver "^6.0.0" -tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.7.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -5209,35 +4074,11 @@ tslib@^2.0.0, tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== -tsutils@^3.17.1: - version "3.19.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.19.1.tgz#d8566e0c51c82f32f9c25a4d367cd62409a547a9" - integrity sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw== - dependencies: - tslib "^1.8.1" - tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5346,24 +4187,11 @@ util@^0.11.0: dependencies: inherits "2.0.3" -v8-compile-cache@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" - integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== - v8-compile-cache@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - validate.io-array@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" @@ -5483,13 +4311,6 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - widest-line@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -5504,11 +4325,6 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -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== - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -5548,13 +4364,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - xml2js@^0.4.19: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -5573,13 +4382,6 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= -xregexp@^4.3.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.4.1.tgz#c84a88fa79e9ab18ca543959712094492185fe65" - integrity sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag== - dependencies: - "@babel/runtime-corejs3" "^7.12.1" - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" diff --git a/extensions/runtimes/src/index.ts b/extensions/runtimes/src/index.ts index 64f2851843..02c3778738 100644 --- a/extensions/runtimes/src/index.ts +++ b/extensions/runtimes/src/index.ts @@ -308,4 +308,176 @@ export default async (composer: any): Promise => { mode = 'azurewebapp' ) => {}, }); + + composer.addRuntimeTemplate({ + key: 'csharp-azurewebapp-v2', + name: 'C#', + startCommand: 'dotnet run', + path: dotnetTemplatePath, + build: async (runtimePath: string, _project: any) => { + composer.log(`BUILD THIS C# PROJECT! at ${runtimePath}...`); + composer.log('Run dotnet user-secrets init...'); + + // TODO: capture output of this and store it somewhere useful + const { stderr: initErr } = await execAsync(`dotnet user-secrets init --project ${_project.name}.csproj`, { + cwd: runtimePath, + }); + if (initErr) { + throw new Error(initErr); + } + + composer.log('Run dotnet build...'); + const { stderr: buildErr } = await execAsync(`dotnet build ${_project.name}.csproj`, { cwd: runtimePath }); + if (buildErr) { + throw new Error(buildErr); + } + composer.log('FINISHED BUILDING!'); + }, + installComponent: async (runtimePath: string, packageName: string, version: string, _project: any): Promise => { + // run dotnet install on the project + composer.log(`EXECUTE: dotnet add ${_project.name}.csproj package ${packageName}${version ? ' --version=' + version : ''} `); + const { stderr: installError, stdout: installOutput } = await execAsync( + `dotnet add ${_project.name}.csproj package ${packageName}${version ? ' --version=' + version : ''}`, + { + cwd: path.join(runtimePath), + } + ); + if (installError) { + throw new Error(installError); + } + return installOutput; + }, + uninstallComponent: async (runtimePath: string, packageName: string, _project: any): Promise => { + // run dotnet install on the project + composer.log(`EXECUTE: dotnet remove ${_project.name}.csproj package ${packageName}`); + const { stderr: installError, stdout: installOutput } = await execAsync(`dotnet remove ${_project.name}.csproj package ${packageName}`, { + cwd: path.join(runtimePath), + }); + if (installError) { + throw new Error(installError); + } + return installOutput; + }, + identifyManifest: (runtimePath: string, projName?: string): string => { + return path.join(runtimePath, `${projName}.csproj`); + }, + run: async (project: any, localDisk: IFileStorage) => { + composer.log('RUN THIS C# PROJECT!'); + }, + buildDeploy: async (runtimePath: string, project: any, settings: any, profileName: string): Promise => { + composer.log('BUILD FOR DEPLOY TO AZURE!'); + + // find publishing profile in list + const profile = project.settings.publishTargets.find((p) => p.name === profileName); + // if (profile.type === 'azurePublish') { + // csproj = 'Microsoft.BotFramework.Composer.WebApp.csproj'; + // } else if (profile.type === 'azureFunctionsPublish') { + // csproj = 'Microsoft.BotFramework.Composer.Functions.csproj'; + // } + const csproj = `${ project.name }.csproj`; + const publishFolder = path.join(runtimePath, 'bin', 'release', 'publishTarget'); + const deployFilePath = path.join(runtimePath, '.deployment'); + const dotnetProjectPath = path.join(runtimePath, csproj); + + // Check for existing .deployment file, if missing, write it. + if (!(await fs.pathExists(deployFilePath))) { + const data = `[config]\nproject = ${csproj}`; + + await fs.writeFile(deployFilePath, data); + } + + // do the dotnet publish + try { + const configuration = JSON.parse(profile.configuration); + const runtimeIdentifier = configuration.runtimeIdentifier; + + // Don't set self-contained and runtimeIdentifier for AzureFunctions. + // let buildCommand = `dotnet publish "${dotnetProjectPath}" -c release -o "${publishFolder}" -v q`; + + // if (profile.type === 'azurePublish') + // { + // if runtime identifier set, make dotnet runtime to self contained, default runtime identifier is win-x64, please refer to https://docs.microsoft.com/en-us/dotnet/core/rid-catalog + let buildCommand = `dotnet publish "${dotnetProjectPath}" -c release -o "${publishFolder}" -v q --self-contained true -r ${runtimeIdentifier ?? 'win-x64'}`; + // } + const { stdout, stderr } = await execAsync( + buildCommand, + { + cwd: runtimePath, + } + ); + composer.log('OUTPUT FROM BUILD', stdout); + if (stderr) { + composer.log('ERR FROM BUILD: ', stderr); + } + } catch (err) { + composer.log('Error doing dotnet publish', err); + throw err; + return; + } + // Then, copy the declarative assets into the build artifacts folder. + // const remoteBotPath = path.join(publishFolder, 'ComposerDialogs'); + // const localBotPath = path.join(runtimePath, 'ComposerDialogs'); + // await fs.copy(localBotPath, remoteBotPath, { + // overwrite: true, + // recursive: true, + // }); + + // write settings to disk in the appropriate location + const settingsPath = path.join(publishFolder, 'settings', 'appsettings.json'); + if (!(await fs.pathExists(path.dirname(settingsPath)))) { + await fs.mkdirp(path.dirname(settingsPath)); + } + await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2)); + + // return the location of the build artifiacts + return publishFolder; + }, + eject: async (project, localDisk: IFileStorage, isReplace: boolean) => { + const sourcePath = dotnetTemplatePath; + const destPath = path.join(project.dir, 'runtime'); + if ((await project.fileStorage.exists(destPath)) && isReplace) { + // remove runtime folder + await removeDirAndFiles(destPath); + } + if (!(await project.fileStorage.exists(destPath))) { + // used to read bot project template from source (bundled in plugin) + await copyDir(sourcePath, localDisk, destPath, project.fileStorage); + const schemaDstPath = path.join(project.dir, 'schemas'); + const schemaSrcPath = path.join(sourcePath, 'azurewebapp/Schemas'); + const customSchemaExists = fs.existsSync(schemaDstPath); + const pathsToExclude: Set = new Set(); + if (customSchemaExists) { + const sdkExcludePath = await localDisk.glob('sdk.schema', schemaSrcPath); + if (sdkExcludePath.length > 0) { + pathsToExclude.add(path.join(schemaSrcPath, sdkExcludePath[0])); + } + } + await copyDir(schemaSrcPath, localDisk, schemaDstPath, project.fileStorage, pathsToExclude); + const schemaFolderInRuntime = path.join(destPath, 'azurewebapp/Schemas'); + await removeDirAndFiles(schemaFolderInRuntime); + return path.relative(project.dir, destPath); + } + throw new Error(`Runtime already exists at ${destPath}`); + }, + setSkillManifest: async ( + dstRuntimePath: string, + dstStorage: IFileStorage, + srcManifestDir: string, + srcStorage: IFileStorage, + mode = 'azurewebapp' // set default as azurewebapp + ) => { + // update manifst into runtime wwwroot + if (mode === 'azurewebapp') { + const manifestDstDir = path.resolve(dstRuntimePath, 'azurewebapp', 'wwwroot', 'manifests'); + + if (await fs.pathExists(manifestDstDir)) { + await removeDirAndFiles(manifestDstDir); + } + + if (await fs.pathExists(srcManifestDir)) { + await copyDir(srcManifestDir, srcStorage, manifestDstDir, dstStorage); + } + } + }, + }); }; diff --git a/extensions/samples/src/index.ts b/extensions/samples/src/index.ts index c689305be1..86200412de 100644 --- a/extensions/samples/src/index.ts +++ b/extensions/samples/src/index.ts @@ -133,10 +133,10 @@ const boilerplates = getBoilerplates(); export default async (composer: any): Promise => { // register this publishing method with Composer for (const template of samples) { - await composer.addBotTemplate(template); - } + await composer.addBotTemplate(template); + } - for (const template of boilerplates) { - await composer.addBaseTemplate(template); - } + for (const template of boilerplates) { + await composer.addBaseTemplate(template); + } };