From 857f5818ef17e5f26811965c6f6b685a0611b164 Mon Sep 17 00:00:00 2001 From: Soroush Date: Mon, 22 Jun 2020 14:40:31 -0700 Subject: [PATCH 1/6] issues#3309 --- .../client/src/components/NavTree/index.tsx | 2 + .../client/src/pages/setting/index.tsx | 37 ++++++++++++++----- .../client/src/pages/setting/router.tsx | 35 +++++++----------- Composer/packages/client/src/router.tsx | 5 +-- .../packages/client/src/utils/pageLinks.ts | 15 ++------ 5 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Composer/packages/client/src/components/NavTree/index.tsx b/Composer/packages/client/src/components/NavTree/index.tsx index 1dd3dfb8fe..b21dcefce0 100644 --- a/Composer/packages/client/src/components/NavTree/index.tsx +++ b/Composer/packages/client/src/components/NavTree/index.tsx @@ -17,6 +17,7 @@ export interface INavTreeItem { name: string; ariaLabel?: string; url: string; + disabled?: boolean; } interface INavTreeProps { @@ -57,6 +58,7 @@ const NavTree: React.FC = (props) => { href={item.url} styles={isSelected ? itemSelected : itemNotSelected} text={item.name} + disabled={item.disabled} onClick={(e) => { e.preventDefault(); navigateTo(item.url); diff --git a/Composer/packages/client/src/pages/setting/index.tsx b/Composer/packages/client/src/pages/setting/index.tsx index 0d1f81bb1b..97c585fc4f 100644 --- a/Composer/packages/client/src/pages/setting/index.tsx +++ b/Composer/packages/client/src/pages/setting/index.tsx @@ -3,7 +3,7 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import { useContext, useMemo } from 'react'; +import { useContext, useMemo, useEffect } from 'react'; import formatMessage from 'format-message'; import { RouteComponentProps } from '@reach/router'; import { FontIcon } from 'office-ui-fabric-react/lib/Icon'; @@ -16,25 +16,44 @@ import { navigateTo } from '../../utils'; import { Page } from '../../components/Page'; import { INavTreeItem } from '../../components/NavTree'; -import Routes from './router'; +import { SettingsRoutes } from './router'; +import { useLocation } from '../../utils/hooks'; const SettingPage: React.FC> = () => { const { state, actions } = useContext(StoreContext); const { projectId } = state; - const makeProjectLink = (id: string, path: string) => { - return `/bot/${id}/settings/${path}`; + + const { navigate } = useLocation(); + + // If no project is open and user tries to access a bot-scoped settings (e.g., browser history, deep link) + // Redirect them to the default settings route that is not bot-scoped + useEffect(() => { + if (!projectId && location.pathname.indexOf('/settings/bot/') !== -1) { + navigate('/settings/application'); + } + }, [projectId]); + + const makeProjectLink = (path: string, id?: string) => { + return id ? `/settings/bot/${id}/${path}` : `/settings/${path}`; }; const settingLabels = { botSettings: formatMessage('Bot Settings'), appSettings: formatMessage('App Settings'), runtime: formatMessage('Runtime Config'), + about: formatMessage('About'), }; const links: INavTreeItem[] = [ - { id: 'dialog-settings', name: settingLabels.botSettings, url: makeProjectLink(projectId, 'dialog-settings') }, - { id: 'preferences', name: settingLabels.appSettings, url: makeProjectLink(projectId, 'preferences') }, - { id: 'runtime', name: settingLabels.runtime, url: makeProjectLink(projectId, 'runtime') }, + { + id: 'dialog-settings', + name: settingLabels.botSettings, + url: makeProjectLink('dialog-settings', projectId), + disabled: !projectId, + }, + { id: 'application', name: settingLabels.appSettings, url: makeProjectLink('application') }, + { id: 'runtime', name: settingLabels.runtime, url: makeProjectLink('runtime', projectId), disabled: !projectId }, + { id: 'about', name: settingLabels.about, url: makeProjectLink('about') }, // { key: '/settings/publish', name: settingLabels.publish, url: '' }, @@ -134,7 +153,7 @@ const SettingPage: React.FC> = () => { return page.name; } - return settingLabels.botSettings; + return settingLabels.appSettings; }, [location.pathname]); return ( @@ -145,7 +164,7 @@ const SettingPage: React.FC> = () => { title={title} toolbarItems={toolbarItems} > - + ); }; diff --git a/Composer/packages/client/src/pages/setting/router.tsx b/Composer/packages/client/src/pages/setting/router.tsx index a403c1b589..2caae34735 100644 --- a/Composer/packages/client/src/pages/setting/router.tsx +++ b/Composer/packages/client/src/pages/setting/router.tsx @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import React from 'react'; +import * as React from 'react'; import { Router, Redirect } from '@reach/router'; import { ErrorBoundary } from '../../components/ErrorBoundary'; @@ -9,25 +9,16 @@ import { ErrorBoundary } from '../../components/ErrorBoundary'; import { DialogSettings } from './dialog-settings'; import { AppSettings } from './app-settings'; import { RuntimeSettings } from './runtime-settings'; +import { About } from '../about'; -const getRedirect = () => { - const { pathname } = location; - - const path = pathname.endsWith('/') ? pathname.substring(0, pathname.length - 1) : pathname; - return `${path}/dialog-settings`; -}; - -const Routes = () => { - return ( - - - - - - - - - ); -}; - -export default Routes; +export const SettingsRoutes = () => ( + + + + + + + + + +); diff --git a/Composer/packages/client/src/router.tsx b/Composer/packages/client/src/router.tsx index d0c1edb01a..b4949ad421 100644 --- a/Composer/packages/client/src/router.tsx +++ b/Composer/packages/client/src/router.tsx @@ -5,9 +5,7 @@ import { jsx, css } from '@emotion/core'; import React, { useContext, useEffect, Suspense } from 'react'; import { Router, Redirect, RouteComponentProps } from '@reach/router'; - import { resolveToBasePath } from './utils/fileUtil'; -import { About } from './pages/about'; import { data } from './styles'; import { NotFound } from './components/NotFound'; import { BASEPATH } from './constants'; @@ -45,7 +43,6 @@ const Routes = (props) => { - @@ -53,9 +50,9 @@ const Routes = (props) => { + - diff --git a/Composer/packages/client/src/utils/pageLinks.ts b/Composer/packages/client/src/utils/pageLinks.ts index dd1eea51e5..742231b615 100644 --- a/Composer/packages/client/src/utils/pageLinks.ts +++ b/Composer/packages/client/src/utils/pageLinks.ts @@ -54,13 +54,6 @@ export const topLinks = (projectId: string, openedDialogId: string) => { exact: true, disabled: !botLoaded, }, - { - to: `/bot/${projectId}/settings/`, - iconName: 'Settings', - labelName: formatMessage('Settings'), - exact: false, - disabled: !botLoaded, - }, ]; if (process.env.COMPOSER_AUTH_PROVIDER === 'abs-h') { @@ -72,10 +65,10 @@ export const topLinks = (projectId: string, openedDialogId: string) => { export const bottomLinks = [ { - to: '/about', - iconName: 'info', - labelName: formatMessage('About'), - exact: true, + to: `/settings`, + iconName: 'Settings', + labelName: formatMessage('Settings'), + exact: false, disabled: false, }, ]; From cf36e4ca7cfa3545da7b092be362a907fdbe98a5 Mon Sep 17 00:00:00 2001 From: Soroush Date: Mon, 22 Jun 2020 15:08:47 -0700 Subject: [PATCH 2/6] fixes lints --- Composer/packages/client/src/components/NavTree/index.tsx | 2 +- Composer/packages/client/src/pages/setting/index.tsx | 2 +- Composer/packages/client/src/pages/setting/router.tsx | 2 +- Composer/packages/client/src/router.tsx | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Composer/packages/client/src/components/NavTree/index.tsx b/Composer/packages/client/src/components/NavTree/index.tsx index b21dcefce0..81577d6148 100644 --- a/Composer/packages/client/src/components/NavTree/index.tsx +++ b/Composer/packages/client/src/components/NavTree/index.tsx @@ -55,10 +55,10 @@ const NavTree: React.FC = (props) => { return ( { e.preventDefault(); navigateTo(item.url); diff --git a/Composer/packages/client/src/pages/setting/index.tsx b/Composer/packages/client/src/pages/setting/index.tsx index 97c585fc4f..9deec4f1fe 100644 --- a/Composer/packages/client/src/pages/setting/index.tsx +++ b/Composer/packages/client/src/pages/setting/index.tsx @@ -15,9 +15,9 @@ import { OpenConfirmModal } from '../../components/Modal/Confirm'; import { navigateTo } from '../../utils'; import { Page } from '../../components/Page'; import { INavTreeItem } from '../../components/NavTree'; +import { useLocation } from '../../utils/hooks'; import { SettingsRoutes } from './router'; -import { useLocation } from '../../utils/hooks'; const SettingPage: React.FC> = () => { const { state, actions } = useContext(StoreContext); diff --git a/Composer/packages/client/src/pages/setting/router.tsx b/Composer/packages/client/src/pages/setting/router.tsx index 2caae34735..32f5c59ed3 100644 --- a/Composer/packages/client/src/pages/setting/router.tsx +++ b/Composer/packages/client/src/pages/setting/router.tsx @@ -5,11 +5,11 @@ import * as React from 'react'; import { Router, Redirect } from '@reach/router'; import { ErrorBoundary } from '../../components/ErrorBoundary'; +import { About } from '../about'; import { DialogSettings } from './dialog-settings'; import { AppSettings } from './app-settings'; import { RuntimeSettings } from './runtime-settings'; -import { About } from '../about'; export const SettingsRoutes = () => ( diff --git a/Composer/packages/client/src/router.tsx b/Composer/packages/client/src/router.tsx index b4949ad421..c97f3c7337 100644 --- a/Composer/packages/client/src/router.tsx +++ b/Composer/packages/client/src/router.tsx @@ -5,6 +5,7 @@ import { jsx, css } from '@emotion/core'; import React, { useContext, useEffect, Suspense } from 'react'; import { Router, Redirect, RouteComponentProps } from '@reach/router'; + import { resolveToBasePath } from './utils/fileUtil'; import { data } from './styles'; import { NotFound } from './components/NotFound'; From 0aa295a925acd4a847fdcc6e0ac332e15e835f24 Mon Sep 17 00:00:00 2001 From: Soroush Date: Mon, 22 Jun 2020 21:30:30 -0700 Subject: [PATCH 3/6] Default to bot settings if no route cache --- .../cypress/integration/Onboarding.spec.ts | 2 +- .../client/src/pages/setting/index.tsx | 20 +++++++++---------- .../client/src/pages/setting/router.tsx | 10 +++++++--- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Composer/cypress/integration/Onboarding.spec.ts b/Composer/cypress/integration/Onboarding.spec.ts index 6406a0e0c0..f874e633c7 100644 --- a/Composer/cypress/integration/Onboarding.spec.ts +++ b/Composer/cypress/integration/Onboarding.spec.ts @@ -8,7 +8,7 @@ context('Onboarding', () => { //enable onboarding setting cy.visitPage('Settings'); - cy.findByText('App Settings').click(); + cy.findByText('Application Settings').click(); cy.findByLabelText('Onboarding').click(); cy.visitPage('Design'); }); diff --git a/Composer/packages/client/src/pages/setting/index.tsx b/Composer/packages/client/src/pages/setting/index.tsx index 9deec4f1fe..eb4768927a 100644 --- a/Composer/packages/client/src/pages/setting/index.tsx +++ b/Composer/packages/client/src/pages/setting/index.tsx @@ -19,6 +19,10 @@ import { useLocation } from '../../utils/hooks'; import { SettingsRoutes } from './router'; +const getProjectLink = (path: string, id?: string) => { + return id ? `/settings/bot/${id}/${path}` : `/settings/${path}`; +}; + const SettingPage: React.FC> = () => { const { state, actions } = useContext(StoreContext); const { projectId } = state; @@ -33,13 +37,9 @@ const SettingPage: React.FC> = () => { } }, [projectId]); - const makeProjectLink = (path: string, id?: string) => { - return id ? `/settings/bot/${id}/${path}` : `/settings/${path}`; - }; - const settingLabels = { botSettings: formatMessage('Bot Settings'), - appSettings: formatMessage('App Settings'), + appSettings: formatMessage('Application Settings'), runtime: formatMessage('Runtime Config'), about: formatMessage('About'), }; @@ -48,12 +48,12 @@ const SettingPage: React.FC> = () => { { id: 'dialog-settings', name: settingLabels.botSettings, - url: makeProjectLink('dialog-settings', projectId), + url: getProjectLink('dialog-settings', projectId), disabled: !projectId, }, - { id: 'application', name: settingLabels.appSettings, url: makeProjectLink('application') }, - { id: 'runtime', name: settingLabels.runtime, url: makeProjectLink('runtime', projectId), disabled: !projectId }, - { id: 'about', name: settingLabels.about, url: makeProjectLink('about') }, + { id: 'application', name: settingLabels.appSettings, url: getProjectLink('application') }, + { id: 'runtime', name: settingLabels.runtime, url: getProjectLink('runtime', projectId), disabled: !projectId }, + { id: 'about', name: settingLabels.about, url: getProjectLink('about') }, // { key: '/settings/publish', name: settingLabels.publish, url: '' }, @@ -164,7 +164,7 @@ const SettingPage: React.FC> = () => { title={title} toolbarItems={toolbarItems} > - + ); }; diff --git a/Composer/packages/client/src/pages/setting/router.tsx b/Composer/packages/client/src/pages/setting/router.tsx index 32f5c59ed3..66b0d14acc 100644 --- a/Composer/packages/client/src/pages/setting/router.tsx +++ b/Composer/packages/client/src/pages/setting/router.tsx @@ -11,14 +11,18 @@ import { DialogSettings } from './dialog-settings'; import { AppSettings } from './app-settings'; import { RuntimeSettings } from './runtime-settings'; -export const SettingsRoutes = () => ( +export const SettingsRoutes = React.memo(({ projectId }: { projectId: string }) => ( - + -); +)); From d727cd229888f481b668b920c24f21036db35519 Mon Sep 17 00:00:00 2001 From: Soroush Date: Wed, 24 Jun 2020 15:15:23 -0700 Subject: [PATCH 4/6] fix: #3485 --- .vscode/settings.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0c35c861eb..007e3e5842 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,16 @@ { + "files.trimTrailingWhitespace": true, "files.associations": { "*.dialog": "json", "*.botproj": "json", "*.schema": "json" }, + "files.exclude": { + "**/.git": true, + "**/.DS_Store": true, + "**/node_modules": true, + "**/build": true + }, "eslint.enable": true, "eslint.packageManager": "yarn", "eslint.validate": [ @@ -14,6 +21,7 @@ ], "eslint.workingDirectories": ["./Composer"], "typescript.tsdk": "./Composer/node_modules/typescript/lib", + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.codeActionsOnSave": { "source.fixAll.eslint": true } From 904c3b41b62e0b415a85f98145fc3ebe9fffb3c0 Mon Sep 17 00:00:00 2001 From: Soroush Date: Thu, 25 Jun 2020 14:26:40 -0700 Subject: [PATCH 5/6] fix: #3486 Debug/Fix HMR support --- Composer/packages/client/package.json | 1 + Composer/packages/client/src/index.tsx | 36 ++++++++++++++++++++------ Composer/yarn.lock | 6 ++++- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Composer/packages/client/package.json b/Composer/packages/client/package.json index 58ecdd7350..82b8aabd0c 100644 --- a/Composer/packages/client/package.json +++ b/Composer/packages/client/package.json @@ -73,6 +73,7 @@ "@types/reach__router": "^1.2.4", "@types/react": "16.9.23", "@types/react-dom": "16.9.5", + "@types/webpack-env": "^1.15.2", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.1.0", "babel-loader": "8.0.5", diff --git a/Composer/packages/client/src/index.tsx b/Composer/packages/client/src/index.tsx index 3eac7ed9b3..94bf8cba05 100644 --- a/Composer/packages/client/src/index.tsx +++ b/Composer/packages/client/src/index.tsx @@ -11,6 +11,8 @@ import './index.css'; import { App } from './App'; import { StoreProvider } from './store'; +const appHostElm = document.getElementById('root'); + formatMessage.setup({ missingTranslation: 'ignore', }); @@ -20,11 +22,29 @@ const emotionCache = createCache({ nonce: window.__nonce__, }); -ReactDOM.render( - - - - - , - document.getElementById('root') -); +/** + * Renders the React App module. + */ +const renderApp = (AppComponent: typeof App) => { + ReactDOM.render( + + + + + , + appHostElm + ); +}; + +// Rendering the App for the first time. +renderApp(App); + +/** + * Re-render updated App Module when hot module notifies a change. + */ +if (module.hot) { + module.hot.accept('./App', () => { + const NextApp = require<{ App: typeof App }>('./App').App; + renderApp(NextApp); + }); +} diff --git a/Composer/yarn.lock b/Composer/yarn.lock index d516656187..2f7e19552c 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -3974,6 +3974,11 @@ resolved "https://botbuilder.myget.org/F/botbuilder-declarative/npm/@types/vscode/-/@types/vscode-1.40.0.tgz#47d19e9e32da512c986f579fe6afbc8d3e6e0c55" integrity sha1-R9GenjLaUSyYb1ef5q+8jT5uDFU= +"@types/webpack-env@^1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" + integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== + "@types/webpack-sources@*": version "0.1.5" resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" @@ -5499,7 +5504,6 @@ boolean@^3.0.0: botbuilder-lg@4.10.0-preview-135858: version "4.10.0-preview-135858" - uid b0a96755d854ec17830b52a8f89beca31dd73b3f resolved "https://botbuilder.myget.org/F/botbuilder-v4-js-daily/npm/botbuilder-lg/-/botbuilder-lg-4.10.0-preview-135858.tgz#b0a96755d854ec17830b52a8f89beca31dd73b3f" dependencies: adaptive-expressions "4.10.0-preview-135858" From 036b78093c925f90fc0e8081bb4bee5364e49bb8 Mon Sep 17 00:00:00 2001 From: Soroush Date: Wed, 1 Jul 2020 12:17:08 -0700 Subject: [PATCH 6/6] webpack bundle analyzer --- .../packages/client/config/webpack.config.js | 6 + Composer/packages/client/package.json | 3 +- Composer/yarn.lock | 148 +++++++++++++++--- 3 files changed, 137 insertions(+), 20 deletions(-) diff --git a/Composer/packages/client/config/webpack.config.js b/Composer/packages/client/config/webpack.config.js index cbf2051ab8..4014117ae6 100644 --- a/Composer/packages/client/config/webpack.config.js +++ b/Composer/packages/client/config/webpack.config.js @@ -17,6 +17,7 @@ const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeM const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent'); const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const getClientEnvironment = require('./env'); const paths = require('./paths'); @@ -492,6 +493,11 @@ module.exports = function (webpackEnv) { new RegExp('/[^/]+\\.[^/]+$'), ], }), + // Generate static visualization of the bundle + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + }), ].filter(Boolean), // Some libraries import Node modules but don't use them in the browser. // Tell Webpack to provide empty mocks for them so importing them works. diff --git a/Composer/packages/client/package.json b/Composer/packages/client/package.json index 9443d501df..0899312c37 100644 --- a/Composer/packages/client/package.json +++ b/Composer/packages/client/package.json @@ -53,7 +53,8 @@ "react-dom": "16.13.0", "react-frame-component": "^4.0.2", "react-timeago": "^4.4.0", - "styled-components": "^4.1.3" + "styled-components": "^4.1.3", + "webpack-bundle-analyzer": "^3.8.0" }, "browserslist": [ ">0.2%", diff --git a/Composer/yarn.lock b/Composer/yarn.lock index b655045905..613e1dff3f 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -5375,6 +5375,16 @@ bfj@6.1.1: hoopy "^0.1.2" tryer "^1.0.0" +bfj@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" + integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== + dependencies: + bluebird "^3.5.5" + check-types "^8.0.3" + hoopy "^0.1.4" + tryer "^1.0.1" + big-integer@^1.6.48: version "1.6.48" resolved "https://botbuilder.myget.org/F/botbuilder-v4-js-daily/npm/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" @@ -6094,6 +6104,11 @@ check-types@^7.3.0: resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== +check-types@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" + integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== + chokidar@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" @@ -6500,7 +6515,7 @@ commander@4.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== -commander@^2.20.0, commander@~2.20.3: +commander@^2.18.0, commander@^2.20.0, commander@~2.20.3: 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== @@ -8361,6 +8376,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +ejs@^2.6.1: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + ejs@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" @@ -8455,7 +8475,7 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -elliptic@^6.0.0, elliptic@^6.5.3: +elliptic@^6.0.0: version "6.5.3" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha1-y1nrLv2vc6C9eMzXAVpirW4Pk9Y= @@ -9064,7 +9084,7 @@ express-session@^1.17.0: safe-buffer "5.2.0" uid-safe "~2.1.5" -express@^4.15.2, express@^4.17.1: +express@^4.15.2, express@^4.16.3, express@^4.17.1: version "4.17.1" resolved "https://botbuilder.myget.org/F/botbuilder-declarative/npm/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= @@ -9372,7 +9392,7 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" -filesize@3.6.1: +filesize@3.6.1, filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== @@ -10221,7 +10241,7 @@ gzip-size@5.0.0: duplexer "^0.1.1" pify "^3.0.0" -gzip-size@^5.1.1: +gzip-size@^5.0.0, gzip-size@^5.1.1: version "5.1.1" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ= @@ -10412,7 +10432,7 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hoopy@^0.1.2: +hoopy@^0.1.2, hoopy@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== @@ -10996,6 +11016,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-buffer@^2.0.0, is-buffer@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" @@ -11233,7 +11258,7 @@ 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-object@^2.0.1, is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, 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" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -12151,7 +12176,33 @@ killable@^1.0.1: resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== -kind-of@^2.0.1, kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^4.0.0, kind-of@^5.0.0, kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +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" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= @@ -12576,7 +12627,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5: +lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5: version "4.17.15" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg= @@ -13017,6 +13068,11 @@ minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + minimist@1.2.5, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -13097,7 +13153,14 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.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.1: +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1: version "0.5.5" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= @@ -13751,6 +13814,11 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + opn@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" @@ -16474,7 +16542,17 @@ serialize-error@^5.0.0: dependencies: type-fest "^0.8.0" -serialize-javascript@^1.7.0, serialize-javascript@^2.1.2, serialize-javascript@^3.1.0: +serialize-javascript@^1.7.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" + integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serialize-javascript@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== @@ -16519,12 +16597,25 @@ 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-value@^0.4.3, set-value@^2.0.0, set-value@^3.0.2: - version "3.0.2" - resolved "https://botbuilder.myget.org/F/botframework-cli/npm/set-value/-/set-value-3.0.2.tgz#74e8ecd023c33d0f77199d415409a40f21e61b90" - integrity sha1-dOjs0CPDPQ93GZ1BVAmkDyHmG5A= +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: - is-plain-object "^2.0.4" + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" @@ -16920,7 +17011,7 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -split-string@^3.0.2: +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" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== @@ -17786,7 +17877,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -tryer@^1.0.0: +tryer@^1.0.0, tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== @@ -18565,6 +18656,25 @@ webidl-conversions@^6.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webpack-bundle-analyzer@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16" + integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + webpack-cli@^3.3.11: version "3.3.11" resolved "https://botbuilder.myget.org/F/botframework-cli/npm/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" @@ -19034,7 +19144,7 @@ ws@^5.0.0: dependencies: async-limiter "~1.0.0" -ws@^6.2.1: +ws@^6.0.0, ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==