diff --git a/Composer/.eslintrc.js b/Composer/.eslintrc.js index e4ca61f48e..089910bddf 100644 --- a/Composer/.eslintrc.js +++ b/Composer/.eslintrc.js @@ -1,51 +1,78 @@ module.exports = { - extends: ['eslint:recommended', 'plugin:prettier/recommended'], - plugins: ['import', 'notice'], + extends: [ + 'eslint:recommended', + 'plugin:prettier/recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/recommended-requiring-type-checking', + 'plugin:@typescript-eslint/eslint-recommended', + 'prettier/@typescript-eslint', + ], + plugins: ['import', 'notice', 'security'], env: { browser: true, es6: true, node: true, }, rules: { + '@typescript-eslint/ban-ts-ignore': 'warn', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/no-use-before-define': 'warn', + // eslint rules 'no-dupe-class-members': 'off', - 'no-undef': 'off', // ts compiler catches this 'prefer-const': 'error', 'no-var': 'error', 'no-console': 'warn', 'dot-notation': 'error', yoda: 'error', - eqeqeq: 'warn', + // eqeqeq: 'error', // plugin: import 'import/first': 'error', 'import/order': ['error', { 'newlines-between': 'always' }], + + // security + 'security/detect-buffer-noassert': 'error', + 'security/detect-child-process': 'error', + 'security/detect-disable-mustache-escape': 'error', + 'security/detect-eval-with-expression': 'error', + 'security/detect-new-buffer': 'error', + 'security/detect-no-csrf-before-method-override': 'error', + 'security/detect-non-literal-fs-filename': 'error', + 'security/detect-non-literal-regexp': 'error', + 'security/detect-non-literal-require': 'error', + 'security/detect-object-injection': 'off', + 'security/detect-possible-timing-attacks': 'error', + 'security/detect-pseudoRandomBytes': 'error', + 'security/detect-unsafe-regex': 'error', + }, + parserOptions: { + // temp fix for https://github.com/typescript-eslint/typescript-eslint/issues/864 + createDefaultProgram: true, }, overrides: [ - { - files: ['**/*.+(ts|tsx)'], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'prettier'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], - '@typescript-eslint/no-explicit-any': ['warn'], - }, - }, - { - files: ['**/*.+(js|jsx)'], - parser: 'babel-eslint', - }, { files: ['**/*.+(test|spec).+(js|jsx|ts|tsx)'], env: { jest: true, }, rules: { - 'typescript/class-name-casing': 'off', - 'typescript/no-explicit-any': 'off', '@typescript-eslint/no-object-literal-type-assertion': 'off', + + 'security/detect-buffer-noassert': 'off', + 'security/detect-child-process': 'off', + 'security/detect-disable-mustache-escape': 'off', + 'security/detect-eval-with-expression': 'off', + 'security/detect-new-buffer': 'off', + 'security/detect-no-csrf-before-method-override': 'off', + 'security/detect-non-literal-fs-filename': 'off', + 'security/detect-non-literal-regexp': 'off', + 'security/detect-non-literal-require': 'off', + 'security/detect-object-injection': 'off', + 'security/detect-possible-timing-attacks': 'off', + 'security/detect-pseudoRandomBytes': 'off', + 'security/detect-unsafe-regex': 'off', }, }, ], diff --git a/Composer/.eslintrc.react.js b/Composer/.eslintrc.react.js index 67e9f418a9..e6b9ee820e 100644 --- a/Composer/.eslintrc.react.js +++ b/Composer/.eslintrc.react.js @@ -3,7 +3,7 @@ module.exports = { plugins: ['react-hooks', 'format-message'], settings: { react: { - version: 'detect', + version: '16.9.0', }, }, parserOptions: { @@ -14,16 +14,17 @@ module.exports = { }, }, rules: { - 'react/no-deprecated': 'warn', - 'react/display-name': 'off', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'off', - - 'react/prop-types': 'warn', - 'format-message/literal-pattern': 'error', 'format-message/no-invalid-pattern': 'error', 'format-message/no-missing-params': ['error', { allowNonLiteral: false }], + + 'react-hooks/exhaustive-deps': 'off', + 'react-hooks/rules-of-hooks': 'error', + + 'react/display-name': 'off', + 'react/no-danger': 'error', + 'react/no-deprecated': 'warn', + 'react/prop-types': 'warn', }, overrides: [ { @@ -37,6 +38,7 @@ module.exports = { rules: { 'react/display-name': 'off', 'react/prop-types': 'off', + 'react/no-danger': 'off', }, }, ], diff --git a/Composer/Dockerfile b/Composer/Dockerfile index c14a873683..aa3010f6d2 100644 --- a/Composer/Dockerfile +++ b/Composer/Dockerfile @@ -13,7 +13,6 @@ COPY packages/lib/code-editor/package.json ./packages/lib/code-editor/ COPY packages/lib/shared/package.json ./packages/lib/shared/ COPY packages/extensions/package.json ./packages/extensions/ COPY packages/extensions/obiformeditor/package.json ./packages/extensions/obiformeditor/ -COPY packages/extensions/sample-json-editor/package.json ./packages/extensions/sample-json-editor/ COPY packages/extensions/visual-designer/package.json ./packages/extensions/visual-designer/ # run yarn install as a distinct layer diff --git a/Composer/jest.config.js b/Composer/jest.config.js index b7e2a816da..22c7c202fd 100644 --- a/Composer/jest.config.js +++ b/Composer/jest.config.js @@ -40,7 +40,6 @@ module.exports = { '/packages/server', '/packages/extensions/obiformeditor', '/packages/extensions/visual-designer', - '/packages/extensions/sample-json-editor', '/packages/lib/code-editor', '/packages/lib/component-scaffold', '/packages/lib/shared', diff --git a/Composer/package.json b/Composer/package.json index 5ea9195300..bc5dcab590 100644 --- a/Composer/package.json +++ b/Composer/package.json @@ -58,11 +58,24 @@ "@babel/preset-env": "7.3.0", "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.3.3", + "@typescript-eslint/eslint-plugin": "2.3.3", + "@typescript-eslint/parser": "2.3.3", "babel-jest": "24.0.0", "concurrently": "^4.1.0", "cypress": "3.4.0", - "cypress-testing-library": "^3.0.1", "cypress-plugin-tab": "^1.0.1", + "cypress-testing-library": "^3.0.1", + "eslint": "^5.15.1", + "eslint-config-prettier": "^4.1.0", + "eslint-plugin-format-message": "^6.2.3", + "eslint-plugin-import": "^2.16.0", + "eslint-plugin-jsx-a11y": "6.1.2", + "eslint-plugin-notice": "^0.7.8", + "eslint-plugin-prettier": "^3.0.1", + "eslint-plugin-react": "7.12.4", + "eslint-plugin-react-hooks": "^1.6.0", + "eslint-plugin-security": "^1.4.0", + "eslint-plugin-typescript": "^0.14.0", "husky": "^1.3.1", "jest": "24.0.0", "jest-dom": "^3.1.3", @@ -75,6 +88,7 @@ "react-testing-library": "^6.0.2", "rimraf": "^2.6.3", "start-server-and-test": "^1.9.0", + "typescript": "3.6.4", "wsrun": "^3.6.4" } -} \ No newline at end of file +} diff --git a/Composer/packages/client/.eslintrc.js b/Composer/packages/client/.eslintrc.js index 8cc1ea5d78..5a86f04754 100644 --- a/Composer/packages/client/.eslintrc.js +++ b/Composer/packages/client/.eslintrc.js @@ -1,3 +1,7 @@ module.exports = { extends: '../../.eslintrc.react.js', + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, }; diff --git a/Composer/packages/client/package.json b/Composer/packages/client/package.json index 6c8c6ed6cd..05cd3abdd1 100644 --- a/Composer/packages/client/package.json +++ b/Composer/packages/client/package.json @@ -22,13 +22,8 @@ "css-loader": "1.0.0", "dotenv": "6.0.0", "dotenv-expand": "4.2.0", - "eslint": "5.12.0", "eslint-config-react-app": "^3.0.7", "eslint-loader": "2.1.1", - "eslint-plugin-flowtype": "2.50.1", - "eslint-plugin-import": "2.14.0", - "eslint-plugin-jsx-a11y": "6.1.2", - "eslint-plugin-react": "7.12.4", "file-loader": "2.0.0", "fork-ts-checker-webpack-plugin-alt": "0.4.14", "format-message": "^6.2.1", @@ -102,21 +97,10 @@ "@types/reach__router": "^1.2.4", "@types/react": "16.9.0", "@types/react-dom": "16.9.0", - "@typescript-eslint/eslint-plugin": "^1.13.0", - "@typescript-eslint/parser": "^1.13.0", "babel-jest": "24.0.0", "babel-plugin-emotion": "^10.0.7", - "eslint": "^5.15.1", - "eslint-config-prettier": "^4.1.0", - "eslint-plugin-format-message": "^6.2.3", - "eslint-plugin-import": "^2.16.0", - "eslint-plugin-notice": "^0.7.8", - "eslint-plugin-prettier": "^3.0.1", - "eslint-plugin-react-hooks": "^1.6.0", - "eslint-plugin-typescript": "^0.14.0", "jest": "24.0.0", "jest-dom": "^3.2.2", - "react-testing-library": "^6.0.1", - "typescript": "^3.5.1" + "react-testing-library": "^6.0.1" } } diff --git a/Composer/packages/client/src/ShellApi.ts b/Composer/packages/client/src/ShellApi.ts index d7e4fc976f..935a129c5d 100644 --- a/Composer/packages/client/src/ShellApi.ts +++ b/Composer/packages/client/src/ShellApi.ts @@ -38,7 +38,7 @@ const FORM_EDITOR = 'FormEditor'; const isEventSourceValid = event => { const sourceWindowName = event.source.name; - return [VISUAL_EDITOR, FORM_EDITOR].indexOf(sourceWindowName) !== -1; + return [VISUAL_EDITOR, FORM_EDITOR].includes(sourceWindowName); }; const useDebouncedFunc = (fn, delay = 750) => useRef(debounce(fn, delay)).current; diff --git a/Composer/packages/client/src/components/ErrorBoundary/index.tsx b/Composer/packages/client/src/components/ErrorBoundary/index.tsx index 73bb9831c5..f4353ac252 100644 --- a/Composer/packages/client/src/components/ErrorBoundary/index.tsx +++ b/Composer/packages/client/src/components/ErrorBoundary/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/unbound-method */ /* eslint-disable no-console */ import React, { Component } from 'react'; import formatMessage from 'format-message'; diff --git a/Composer/packages/client/src/components/ProjectTree/index.tsx b/Composer/packages/client/src/components/ProjectTree/index.tsx index a0d009a994..27b1799ba7 100644 --- a/Composer/packages/client/src/components/ProjectTree/index.tsx +++ b/Composer/packages/client/src/components/ProjectTree/index.tsx @@ -60,7 +60,7 @@ export function createGroup( let position = 0; const result = dialogs .filter(dialog => { - return dialog.displayName.toLowerCase().indexOf(filter.toLowerCase()) > -1; + return dialog.displayName.toLowerCase().includes(filter.toLowerCase()); }) .reduce( (result: { items: any[]; groups: IGroup[] }, dialog) => { @@ -124,7 +124,7 @@ export const ProjectTree: React.FC = props => { onSelect(dialogId, createSelectedPath(item.index))} onDelete={() => onDeleteTrigger(dialogId, item.index)} /> diff --git a/Composer/packages/client/src/components/RequireAuth/index.tsx b/Composer/packages/client/src/components/RequireAuth/index.tsx index c9ac11c5d0..2f8ddc1e46 100644 --- a/Composer/packages/client/src/components/RequireAuth/index.tsx +++ b/Composer/packages/client/src/components/RequireAuth/index.tsx @@ -4,11 +4,12 @@ import formatMessage from 'format-message'; import once from 'lodash.once'; import { StoreContext } from '../../store'; +import { BoundAction } from '../../store/types'; import { loading, dialog, consoleStyle } from './styles'; // only attempt to login once -const loginOnce = once((login: () => void) => { +const loginOnce = once((login: BoundAction) => { if (process.env.COMPOSER_REQUIRE_AUTH) { login(); } diff --git a/Composer/packages/client/src/messenger/ApiClient.ts b/Composer/packages/client/src/messenger/ApiClient.ts index 62c7001d4d..950af29932 100644 --- a/Composer/packages/client/src/messenger/ApiClient.ts +++ b/Composer/packages/client/src/messenger/ApiClient.ts @@ -42,10 +42,12 @@ class ApiClient { }; public connect = (target: Window = window) => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises target.addEventListener('message', messenger.receiveMessage, false); }; public disconnect = (target: Window = window) => { + // eslint-disable-next-line @typescript-eslint/no-misused-promises target.removeEventListener('message', messenger.receiveMessage, false); }; } diff --git a/Composer/packages/client/src/pages/design/index.tsx b/Composer/packages/client/src/pages/design/index.tsx index fb0c4b2fb6..a7d715b14c 100644 --- a/Composer/packages/client/src/pages/design/index.tsx +++ b/Composer/packages/client/src/pages/design/index.tsx @@ -101,7 +101,7 @@ function getAllRef(targetId, dialogs) { const getTabFromFragment = () => { const tab = window.location.hash.substring(1); - if (Object.values(PromptTab).includes(tab)) { + if (Object.values(PromptTab).includes(tab)) { return tab; } }; diff --git a/Composer/packages/client/src/pages/home/index.js b/Composer/packages/client/src/pages/home/index.js index 84ff15a95f..6ea9d45913 100644 --- a/Composer/packages/client/src/pages/home/index.js +++ b/Composer/packages/client/src/pages/home/index.js @@ -41,11 +41,11 @@ export const Home = () => { navigate(BASEPATH); }; - const onClickNewBotProject = async () => { + const onClickNewBotProject = () => { setCreationFlowStatus(CreationFlowStatus.NEW_FROM_SCRATCH); }; - const onClickTemplate = async id => { + const onClickTemplate = id => { saveTemplateId(id); setCreationFlowStatus(CreationFlowStatus.NEW_FROM_TEMPLATE); }; diff --git a/Composer/packages/client/src/pages/language-understanding/publish-luis-modal.js b/Composer/packages/client/src/pages/language-understanding/publish-luis-modal.js index 96f4dd71a8..ccae09c008 100644 --- a/Composer/packages/client/src/pages/language-understanding/publish-luis-modal.js +++ b/Composer/packages/client/src/pages/language-understanding/publish-luis-modal.js @@ -48,7 +48,7 @@ const validateForm = data => { dataKeys.forEach(key => { const value = data[key]; - if (validationProperties.indexOf(key) > -1 && (!value || !nameRegex.test(value))) { + if (validationProperties.includes(key) && (!value || !nameRegex.test(value))) { result.errors[key] = formatMessage( 'Spaces and special characters are not allowed. Use letters, numbers, -, or _., numbers, -, and _' ); diff --git a/Composer/packages/client/src/store/action/bot.ts b/Composer/packages/client/src/store/action/bot.ts index dc99f32fb6..bddab0bac7 100644 --- a/Composer/packages/client/src/store/action/bot.ts +++ b/Composer/packages/client/src/store/action/bot.ts @@ -42,7 +42,7 @@ export const reloadBot: ActionCreator = async ({ dispatch, getState }, settings) } }; -export const startBot: ActionCreator = async ({ dispatch }, toStartBot) => { +export const startBot: ActionCreator = ({ dispatch }, toStartBot) => { dispatch({ type: ActionTypes.TO_START_BOT, payload: { diff --git a/Composer/packages/client/src/store/action/setting.ts b/Composer/packages/client/src/store/action/setting.ts index 37bcbbcc37..a267ba49ae 100644 --- a/Composer/packages/client/src/store/action/setting.ts +++ b/Composer/packages/client/src/store/action/setting.ts @@ -7,7 +7,7 @@ import { SensitiveProperties } from '../../constants'; import { BASEURL, ActionTypes } from './../../constants/index'; -const post = debounce(axios.post, 1000); +const post = debounce(axios.post.bind(axios), 1000); export const setSettings: ActionCreator = async ({ dispatch }, botName: string, settings: DialogSetting) => { try { // set value to store diff --git a/Composer/packages/client/src/store/middlewares/undo/history.ts b/Composer/packages/client/src/store/middlewares/undo/history.ts index 02aaf64785..c2bc46f0a0 100644 --- a/Composer/packages/client/src/store/middlewares/undo/history.ts +++ b/Composer/packages/client/src/store/middlewares/undo/history.ts @@ -12,8 +12,8 @@ interface History { class UndoHistory { private stacks: { [key: string]: UndoStack } = {}; private history: History[] = []; - private pointer: number = -1; - private _limit: number = 5; + private pointer = -1; + private _limit = 5; public createStack(undo: ActionCreator, redo: ActionCreator) { const stack = new UndoStack(undo, redo); diff --git a/Composer/packages/client/src/store/middlewares/undo/stack.ts b/Composer/packages/client/src/store/middlewares/undo/stack.ts index a0cee4355d..6d3f1374d6 100644 --- a/Composer/packages/client/src/store/middlewares/undo/stack.ts +++ b/Composer/packages/client/src/store/middlewares/undo/stack.ts @@ -6,7 +6,7 @@ const PREFIX = 'undoStack'; export default class UndoStack { private history: any[] = []; - private pointer: number = -1; + private pointer = -1; private _id: string; private _undo: ActionCreator; private _redo: ActionCreator; diff --git a/Composer/packages/client/src/store/reducer/index.ts b/Composer/packages/client/src/store/reducer/index.ts index d3b8aa328c..5952fec3e1 100644 --- a/Composer/packages/client/src/store/reducer/index.ts +++ b/Composer/packages/client/src/store/reducer/index.ts @@ -112,7 +112,7 @@ const getStorageFileSuccess: ReducerFunc = (state, { response }) => { } else { const path = file.path; const extension = getExtension(path); - if (projectFiles.indexOf(extension) >= 0) { + if (projectFiles.includes(extension)) { files.push(file); } } diff --git a/Composer/packages/client/src/store/types.ts b/Composer/packages/client/src/store/types.ts index dbb9531558..938721d17a 100644 --- a/Composer/packages/client/src/store/types.ts +++ b/Composer/packages/client/src/store/types.ts @@ -15,7 +15,7 @@ export interface Store { export type ActionCreator = (store: Store, ...args: T) => Promise | void; export type ActionHandlers = { [action: string]: ActionCreator }; -export type BoundAction = (...args: any[]) => void; +export type BoundAction = (...args: any[]) => void | Promise; export type BoundActionHandlers = { [action: string]: BoundAction }; interface StateError { diff --git a/Composer/packages/client/src/utils/auth.ts b/Composer/packages/client/src/utils/auth.ts index 063b22345f..ca803bc70b 100644 --- a/Composer/packages/client/src/utils/auth.ts +++ b/Composer/packages/client/src/utils/auth.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ import querystring from 'query-string'; import axios from 'axios'; import jwtDecode from 'jwt-decode'; @@ -18,6 +19,40 @@ export function isTokenExpired(token: string): boolean { } } +export function clearUserTokenFromCache(): void { + storage.remove(USER_TOKEN_STORAGE_KEY); +} + +export function getUserTokenFromCache(): string | null { + let token: string | null = null; + + // first see if there is a token in the hash + const { access_token } = querystring.parse(location.hash); + + if (access_token && access_token.length > 0) { + location.hash = ''; + token = Array.isArray(access_token) ? access_token[0] : access_token; + } + + // next check to see if we have a token in session storage + if (!token) { + const sessionToken = storage.get(USER_TOKEN_STORAGE_KEY); + + if (sessionToken && sessionToken.length > 0) { + token = sessionToken; + } + } + + // return the token only if it is not expired + if (token && !isTokenExpired(token)) { + storage.set(USER_TOKEN_STORAGE_KEY, token); + return token; + } else { + clearUserTokenFromCache(); + return null; + } +} + export function prepareAxios(store: Store) { if (process.env.COMPOSER_REQUIRE_AUTH) { const cancelSource = axios.CancelToken.source(); @@ -59,40 +94,6 @@ export function prepareAxios(store: Store) { } } -export function getUserTokenFromCache(): string | null { - let token: string | null = null; - - // first see if there is a token in the hash - const { access_token } = querystring.parse(location.hash); - - if (access_token && access_token.length > 0) { - location.hash = ''; - token = Array.isArray(access_token) ? access_token[0] : access_token; - } - - // next check to see if we have a token in session storage - if (!token) { - const sessionToken = storage.get(USER_TOKEN_STORAGE_KEY); - - if (sessionToken && sessionToken.length > 0) { - token = sessionToken; - } - } - - // return the token only if it is not expired - if (token && !isTokenExpired(token)) { - storage.set(USER_TOKEN_STORAGE_KEY, token); - return token; - } else { - clearUserTokenFromCache(); - return null; - } -} - -export function clearUserTokenFromCache(): void { - storage.remove(USER_TOKEN_STORAGE_KEY); -} - const MAX_WAIT = 1000 * 60 * 2; // 2 minutes export async function loginPopup(): Promise { @@ -109,6 +110,8 @@ export async function loginPopup(): Promise { const left = width / 2 - 483 / 2 + window.screenX; const top = height / 2 - 600 / 2 + window.screenY; + // loginUrl is not user-generated + // eslint-disable-next-line security/detect-non-literal-fs-filename const popup = window.open(loginUrl, 'Login to Composer', `width=483, height=600, top=${top}, left=${left}`); // if popups are blocked, use a redirect flow diff --git a/Composer/packages/extensions/obiformeditor/.eslintrc.js b/Composer/packages/extensions/obiformeditor/.eslintrc.js index dd593090c0..ccecb8e9c0 100644 --- a/Composer/packages/extensions/obiformeditor/.eslintrc.js +++ b/Composer/packages/extensions/obiformeditor/.eslintrc.js @@ -1,8 +1,7 @@ module.exports = { - extends: [ - '../../../.eslintrc.react.js', - 'plugin:@typescript-eslint/recommended', - 'prettier', - 'prettier/@typescript-eslint', - ], + extends: ['../../../.eslintrc.react.js'], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, }; diff --git a/Composer/packages/extensions/obiformeditor/package.json b/Composer/packages/extensions/obiformeditor/package.json index 5ea3411a49..6831d34ac4 100644 --- a/Composer/packages/extensions/obiformeditor/package.json +++ b/Composer/packages/extensions/obiformeditor/package.json @@ -1,5 +1,5 @@ { - "name": "obieditortest", + "name": "obiformeditor", "version": "1.0.0", "description": "obieditortest React component", "main": "lib/index.js", @@ -67,14 +67,11 @@ "@types/nanoid": "^1.2.1", "@types/react": "16.9.0", "@types/react-dom": "16.9.0", - "@typescript-eslint/eslint-plugin": "^1.10.2", - "@typescript-eslint/parser": "^1.10.2", "autoprefixer": "^9.5.1", "botbuilder-expression-parser": "^4.5.9", "codemirror": "^5.44.0", "copyfiles": "^2.1.0", "css-loader": "^2.1.1", - "eslint-plugin-format-message": "^6.2.3", "html-webpack-plugin": "^3.2.0", "jest": "24.0.0", "jest-dom": "^3.1.3", @@ -89,7 +86,6 @@ "ts-jest": "^24.0.2", "ts-loader": "^5.3.3", "tsconfig-paths-webpack-plugin": "^3.2.0", - "typescript": "^3.5.1", "url-loader": "^1.1.2", "webpack": "^4.30.0", "webpack-cli": "^3.3.0", diff --git a/Composer/packages/extensions/obiformeditor/src/Form/fields/BaseField.tsx b/Composer/packages/extensions/obiformeditor/src/Form/fields/BaseField.tsx index 900da379b4..69e9656c77 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/fields/BaseField.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/fields/BaseField.tsx @@ -11,10 +11,6 @@ import { RootField } from './RootField'; import './styles.css'; -const descriptionMarkup = (description: string): { __html: string } => { - return { __html: description }; -}; - interface BaseFieldProps { children?: React.ReactNode; className?: string; @@ -35,12 +31,16 @@ export function BaseField(props: BaseFieldProps): JSX.Element { const fieldOverrides = get(formContext.editorSchema, `content.SDKOverrides`); let titleOverride = undefined; let descriptionOverride = undefined; + let helpLink = undefined; + let helpLinkText = undefined; let key = idSchema.__id; if (schema.title) { const SDKOverrides = fieldOverrides[`${schema.title}`]; titleOverride = get(SDKOverrides, 'title'); descriptionOverride = get(SDKOverrides, 'description'); + helpLink = get(SDKOverrides, 'helpLink'); + helpLinkText = get(SDKOverrides, 'helpLinkText'); } // use dialogId as the key because the focusPath may not be enough @@ -63,6 +63,7 @@ export function BaseField(props: BaseFieldProps): JSX.Element { return descriptionOverride || description || uiSchema['ui:description'] || schema.description; }; + return isRootBaseField ? ( {children} @@ -72,7 +73,18 @@ export function BaseField(props: BaseFieldProps): JSX.Element {

{getTitle()}

{descriptionOverride !== false && (descriptionOverride || description || schema.description) && ( -

+

+ {getDescription()} + {helpLink && helpLinkText && ( + <> +
+
+ + {helpLinkText} + + + )} +

)}
{children} diff --git a/Composer/packages/extensions/obiformeditor/src/Form/fields/PromptField/styles.ts b/Composer/packages/extensions/obiformeditor/src/Form/fields/PromptField/styles.ts index ed7ca6d68d..9552fe1176 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/fields/PromptField/styles.ts +++ b/Composer/packages/extensions/obiformeditor/src/Form/fields/PromptField/styles.ts @@ -64,7 +64,7 @@ export const settingsFieldInline = css` margin: 0; `; -export const choiceItemContainer = (align: string = 'center') => css` +export const choiceItemContainer = (align = 'center') => css` display: flex; align-items: ${align}; `; diff --git a/Composer/packages/extensions/obiformeditor/src/Form/fields/RootField.tsx b/Composer/packages/extensions/obiformeditor/src/Form/fields/RootField.tsx index ab45ef6327..5c9eb4416e 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/fields/RootField.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/fields/RootField.tsx @@ -11,10 +11,10 @@ import { FormContext } from '../types'; import { EditableField } from './EditableField'; const overrideDefaults = { - collapsable: true, - defaultCollapsed: false, title: undefined, description: undefined, + helpLink: undefined, + helpLinkText: undefined, }; interface RootFieldProps { @@ -61,10 +61,18 @@ export const RootField: React.FC = props => { fontSize={FontSizes.size20} /> {sdkOverrides.description !== false && (description || schema.description) && ( -

+

+ {getDescription()} + {sdkOverrides.helpLink && sdkOverrides.helpLinkText && ( + <> +
+
+ + {sdkOverrides.helpLinkText} + + + )} +

)} diff --git a/Composer/packages/extensions/obiformeditor/src/Form/fields/styles.css b/Composer/packages/extensions/obiformeditor/src/Form/fields/styles.css index 20141b649c..a73d8e3d8c 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/fields/styles.css +++ b/Composer/packages/extensions/obiformeditor/src/Form/fields/styles.css @@ -8,6 +8,7 @@ font-size: 12px; margin: 0; margin-bottom: 20px; + white-space: pre-line; } .RootFieldTitle { border-bottom: 1px solid #c8c6c4; @@ -17,6 +18,7 @@ .RootFieldDescription { margin-top: 0; margin-bottom: 10px; + white-space: pre-line; } .RootFieldMetaData { padding: 18px; diff --git a/Composer/packages/extensions/obiformeditor/src/Form/utils.ts b/Composer/packages/extensions/obiformeditor/src/Form/utils.ts index d0e47d4533..7bc3165e3f 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/utils.ts +++ b/Composer/packages/extensions/obiformeditor/src/Form/utils.ts @@ -53,7 +53,7 @@ export function buildDialogOptions(opts: DialogOptionsOpts = {}): IContextualMen const handleClick = (e, item) => { if (onClick && item) { - onClick(e as any, item); + onClick(e, item); } }; diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index 20f1ccb6fd..ffadb62162 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -10,7 +10,7 @@ const LG_HELP = const getInitialTemplate = (fieldName: string, formData?: string): string => { let newTemplate = formData || ''; - if (newTemplate.indexOf(`bfd${fieldName}-`) !== -1) { + if (newTemplate.includes(`bfd${fieldName}-`)) { return ''; } else if (newTemplate && !newTemplate.startsWith('-')) { newTemplate = `-${newTemplate}`; diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/WidgetLabel.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/WidgetLabel.tsx index 0dbbda1d5e..9055363f37 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/WidgetLabel.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/WidgetLabel.tsx @@ -22,7 +22,7 @@ const DescriptionCallout: React.FC = props => { onRenderContent: () => (

{title}

-

+

{description}

), }} diff --git a/Composer/packages/extensions/package.json b/Composer/packages/extensions/package.json index a99f5d155d..6b078a7fcb 100644 --- a/Composer/packages/extensions/package.json +++ b/Composer/packages/extensions/package.json @@ -6,8 +6,7 @@ "scripts": { "build:visual-designer": "cd visual-designer && yarn build", "build:obiformeditor": "cd obiformeditor && yarn build", - "build:sample-json-editor": "cd sample-json-editor && yarn build", - "build:all": "concurrently --kill-others-on-fail \"yarn:build:obiformeditor\" \"yarn:build:sample-json-editor\" \"yarn:build:visual-designer\"" + "build:all": "concurrently --kill-others-on-fail \"yarn:build:obiformeditor\" \"yarn:build:visual-designer\"" }, "author": "", "license": "ISC" diff --git a/Composer/packages/extensions/sample-json-editor/.eslintrc.js b/Composer/packages/extensions/sample-json-editor/.eslintrc.js deleted file mode 100644 index 85803c10a5..0000000000 --- a/Composer/packages/extensions/sample-json-editor/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ['../../../.eslintrc.react.js'], -}; diff --git a/Composer/packages/extensions/sample-json-editor/.gitignore b/Composer/packages/extensions/sample-json-editor/.gitignore deleted file mode 100644 index c452c58463..0000000000 --- a/Composer/packages/extensions/sample-json-editor/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/coverage -/demo/dist -/es -/lib -/node_modules -/umd -npm-debug.log* diff --git a/Composer/packages/extensions/sample-json-editor/.travis.yml b/Composer/packages/extensions/sample-json-editor/.travis.yml deleted file mode 100644 index 06e30d936d..0000000000 --- a/Composer/packages/extensions/sample-json-editor/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -sudo: false - -language: node_js -node_js: - - 8 - -before_install: - - npm install codecov.io coveralls - -after_success: - - cat ./coverage/lcov.info | ./node_modules/codecov.io/bin/codecov.io.js - - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js - -branches: - only: - - master diff --git a/Composer/packages/extensions/sample-json-editor/CONTRIBUTING.md b/Composer/packages/extensions/sample-json-editor/CONTRIBUTING.md deleted file mode 100644 index a9b8b42a0f..0000000000 --- a/Composer/packages/extensions/sample-json-editor/CONTRIBUTING.md +++ /dev/null @@ -1,25 +0,0 @@ -## Prerequisites - -[Node.js](http://nodejs.org/) >= 6 must be installed. - -## Installation - -- Running `npm install` in the component's root directory will install everything you need for development. - -## Demo Development Server - -- `npm start` will run a development server with the component's demo app at [http://localhost:3000](http://localhost:3000) with hot module reloading. - -## Running Tests - -- `npm test` will run the tests once. - -- `npm run test:coverage` will run the tests and produce a coverage report in `coverage/`. - -- `npm run test:watch` will run the tests on every change. - -## Building - -- `npm run build` will build the component for publishing to npm and also bundle the demo app. - -- `npm run clean` will delete built resources. diff --git a/Composer/packages/extensions/sample-json-editor/README.md b/Composer/packages/extensions/sample-json-editor/README.md deleted file mode 100644 index ab89648e57..0000000000 --- a/Composer/packages/extensions/sample-json-editor/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# JsonEditor - -[![Travis][build-badge]][build] -[![npm package][npm-badge]][npm] -[![Coveralls][coveralls-badge]][coveralls] - -Describe JsonEditor here. - -[build-badge]: https://img.shields.io/travis/user/repo/master.png?style=flat-square -[build]: https://travis-ci.org/user/repo - -[npm-badge]: https://img.shields.io/npm/v/npm-package.png?style=flat-square -[npm]: https://www.npmjs.org/package/npm-package - -[coveralls-badge]: https://img.shields.io/coveralls/user/repo/master.png?style=flat-square -[coveralls]: https://coveralls.io/github/user/repo diff --git a/Composer/packages/extensions/sample-json-editor/__tests__/index.test.js b/Composer/packages/extensions/sample-json-editor/__tests__/index.test.js deleted file mode 100644 index ae64d801d9..0000000000 --- a/Composer/packages/extensions/sample-json-editor/__tests__/index.test.js +++ /dev/null @@ -1,12 +0,0 @@ -import * as React from 'react'; -import { render, waitForElement } from 'react-testing-library'; - -import JsonEditor from '../src'; - -describe('', () => { - it('should render the json editor', async () => { - const { getByText } = render(); - - await waitForElement(() => getByText(/hello world!/)); - }); -}); diff --git a/Composer/packages/extensions/sample-json-editor/babel.config.js b/Composer/packages/extensions/sample-json-editor/babel.config.js deleted file mode 100644 index 8804135af6..0000000000 --- a/Composer/packages/extensions/sample-json-editor/babel.config.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - env: { - test: { - presets: [ - [ - '@babel/preset-env', - { - modules: 'commonjs', - targets: { - node: 'current', - }, - }, - ], - '@babel/preset-react', - ], - plugins: ['@babel/plugin-proposal-class-properties', '@babel/plugin-transform-runtime'], - }, - }, -}; diff --git a/Composer/packages/extensions/sample-json-editor/demo/src/index.js b/Composer/packages/extensions/sample-json-editor/demo/src/index.js deleted file mode 100644 index 6dc0f9aa7c..0000000000 --- a/Composer/packages/extensions/sample-json-editor/demo/src/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import React, { Component } from 'react'; -import { render } from 'react-dom'; - -import JsonEditor from '../../src'; - -class Demo extends Component { - constructor(props) { - super(props); - this.state = { - data: 'hello world', - }; - } - - dataChange = () => { - this.setState({ - data: 'data changed', - }); - }; - - onChange = newValue => { - this.setState({ - data: newValue, - }); - }; - - render() { - return ( -
-

JsonEditor Demo

- - -
- ); - } -} - -render(, document.querySelector('#demo')); diff --git a/Composer/packages/extensions/sample-json-editor/jest.config.js b/Composer/packages/extensions/sample-json-editor/jest.config.js deleted file mode 100644 index 3b684bdde9..0000000000 --- a/Composer/packages/extensions/sample-json-editor/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - testPathIgnorePatterns: ['/node_modules/'], - transform: { - '^.+\\.(j|t)sx?$': 'babel-jest', - }, -}; diff --git a/Composer/packages/extensions/sample-json-editor/nwb.config.js b/Composer/packages/extensions/sample-json-editor/nwb.config.js deleted file mode 100644 index b2755f7e54..0000000000 --- a/Composer/packages/extensions/sample-json-editor/nwb.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - type: 'react-component', - npm: { - esModules: true, - umd: false, - }, -}; diff --git a/Composer/packages/extensions/sample-json-editor/package.json b/Composer/packages/extensions/sample-json-editor/package.json deleted file mode 100644 index 2eca9ed041..0000000000 --- a/Composer/packages/extensions/sample-json-editor/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "sample-json-editor", - "version": "1.0.0", - "description": "JsonEditor React component", - "main": "lib/index.js", - "module": "es/index.js", - "files": [ - "css", - "es", - "lib", - "umd" - ], - "scripts": { - "build": "nwb build-react-component", - "clean": "nwb clean-module && nwb clean-demo", - "prepublishOnly": "npm run build", - "start": "nwb serve-react-demo", - "test": "jest", - "lint": "eslint --quiet --ext .js,.jsx,.ts,.tsx ./src", - "lint:fix": "yarn lint --fix" - }, - "dependencies": { - "prismjs": "^1.15.0", - "react-simple-code-editor": "^0.8.0" - }, - "peerDependencies": { - "react": "16.x" - }, - "devDependencies": { - "@babel/cli": "7.2.3", - "@babel/core": "7.3.4", - "@babel/plugin-proposal-class-properties": "7.3.4", - "@babel/plugin-transform-runtime": "7.4.0", - "@babel/preset-env": "7.3.0", - "@babel/preset-react": "7.0.0", - "babel-jest": "24.0.0", - "jest": "24.0.0", - "nwb": "0.23.x", - "react": "16.9.0", - "react-dom": "16.9.0", - "react-testing-library": "^6.0.1" - }, - "author": "", - "homepage": "", - "license": "MIT", - "repository": "", - "keywords": [ - "react-component" - ] -} diff --git a/Composer/packages/extensions/sample-json-editor/src/index.js b/Composer/packages/extensions/sample-json-editor/src/index.js deleted file mode 100644 index 80220a1f88..0000000000 --- a/Composer/packages/extensions/sample-json-editor/src/index.js +++ /dev/null @@ -1,53 +0,0 @@ -import React, { Component } from 'react'; -import Editor from 'react-simple-code-editor'; -import { highlight, languages } from 'prismjs/components/prism-core'; -import 'prismjs/components/prism-json'; -import 'prismjs/components/prism-clike'; -import 'prismjs/components/prism-javascript'; - -class JsonEditor extends Component { - constructor(props) { - super(props); - this.state = { - data: props.data, - }; - } - - onChange = newContent => { - const newData = { - name: this.state.data.name, - content: newContent, - }; - - this.setState({ - data: newData, - }); - - this.props.onChange(newData); - }; - - componentWillReceiveProps(newProps) { - this.setState({ - data: newProps.data, - }); - } - - render() { - return ( - highlight(code, languages.js)} - padding={10} - style={{ - fontFamily: '"Fira code", "Fira Mono", monospace', - fontSize: 16, - height: '100%', - minHeight: '500px', - }} - /> - ); - } -} - -export default JsonEditor; diff --git a/Composer/packages/extensions/visual-designer/.eslintrc.js b/Composer/packages/extensions/visual-designer/.eslintrc.js index 373a0fa5ee..8234d9c966 100644 --- a/Composer/packages/extensions/visual-designer/.eslintrc.js +++ b/Composer/packages/extensions/visual-designer/.eslintrc.js @@ -1,10 +1,10 @@ module.exports = { - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - extends: ['../../../.eslintrc.react.js', 'plugin:@typescript-eslint/recommended'], + extends: ['../../../.eslintrc.react.js'], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, rules: { - indent: 'off', - '@typescript-eslint/indent': ['warn', 2], '@typescript-eslint/explicit-member-accessibility': 'off', '@typescript-eslint/no-use-before-define': ['warn', { functions: false, classes: true }], }, diff --git a/Composer/packages/extensions/visual-designer/package.json b/Composer/packages/extensions/visual-designer/package.json index af7a9c8f8a..35bc94e3f9 100644 --- a/Composer/packages/extensions/visual-designer/package.json +++ b/Composer/packages/extensions/visual-designer/package.json @@ -45,11 +45,8 @@ "@babel/preset-env": "7.3.0", "@babel/preset-react": "7.0.0", "@types/jest": "^24.0.11", - "@typescript-eslint/eslint-plugin": "^1.11.0", - "@typescript-eslint/parser": "^1.11.0", "babel-jest": "24.0.0", "babel-plugin-emotion": "^10.0.7", - "eslint": "^6.0.1", "jest": "^24.5.0", "json-loader": "^0.5.7", "nwb": "0.23.x", diff --git a/Composer/packages/extensions/visual-designer/src/components/groups/StepGroup.tsx b/Composer/packages/extensions/visual-designer/src/components/groups/StepGroup.tsx index 6d73160904..a59dbf2fb4 100644 --- a/Composer/packages/extensions/visual-designer/src/components/groups/StepGroup.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/groups/StepGroup.tsx @@ -1,12 +1,11 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import React, { useState, useMemo, useEffect, FunctionComponent } from 'react'; +import { useState, useMemo, useEffect, FunctionComponent } from 'react'; import { GraphNode } from '../../models/GraphNode'; import { areBoundariesEqual } from '../../models/Boundary'; import { sequentialLayouter } from '../../layouters/sequentialLayouter'; import { ElementInterval, EdgeAddButtonSize } from '../../constants/ElementSizes'; -import { MenuTypes } from '../../constants/MenuTypes'; import { NodeEventTypes } from '../../constants/NodeEventTypes'; import { transformStepGroup } from '../../transformers/transformStepGroup'; import { NodeProps, defaultNodeProps } from '../nodes/nodeProps'; diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/Trigger.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/Trigger.tsx index 5db1f72ee6..defed19b00 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/Trigger.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/Trigger.tsx @@ -3,7 +3,6 @@ import { ConceptLabels } from 'shared'; import { jsx } from '@emotion/core'; -import { AttrNames } from '../../constants/ElementAttributes'; import { ElementIcon } from '../../utils/obiPropertyResolver'; import { TriggerSize } from '../../constants/ElementSizes'; @@ -23,7 +22,7 @@ function getLabel(data: any): string { return data.$type; } -export const Trigger = ({ id, data, onClick = () => {} }): JSX.Element => ( +export const Trigger = ({ data, onClick = () => {} }): JSX.Element => (
{ +import { NodeMap, BoundaryMap } from './types'; + +const calculateNodeMap = (jsonpath, data): NodeMap => { const result = transformForeach(data, jsonpath); if (!result) return {}; @@ -27,8 +29,8 @@ const calculateNodeMap = (jsonpath, data): { [id: string]: GraphNode } => { }; }; -const calculateLayout = (nodeMap, boundaryMap) => { - (Object.values(nodeMap) as GraphNode[]) +const calculateLayout = (nodeMap: NodeMap, boundaryMap: BoundaryMap) => { + Object.values(nodeMap) .filter(x => !!x) .forEach((x: GraphNode) => { x.boundary = boundaryMap[x.id] || x.boundary; @@ -43,7 +45,7 @@ export const Foreach: FunctionComponent = ({ id, data, onEvent, onRes const layout = useMemo(() => calculateLayout(initialNodeMap, boundaryMap), [initialNodeMap, boundaryMap]); const accumulatedPatches = {}; - const patchBoundary = (id, boundary) => { + const patchBoundary = (id, boundary?: Boundary) => { if (!boundaryMap[id] || !areBoundariesEqual(boundaryMap[id], boundary)) { accumulatedPatches[id] = boundary; setBoundaryMap({ diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/IfCondition.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/IfCondition.tsx index 9a3bf8516f..4733c59afe 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/IfCondition.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/IfCondition.tsx @@ -1,12 +1,12 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import React, { FunctionComponent, useEffect, useState, useMemo } from 'react'; +import { FunctionComponent, useEffect, useState, useMemo } from 'react'; import { transformIfCondtion } from '../../../transformers/transformIfCondition'; import { ifElseLayouter } from '../../../layouters/ifelseLayouter'; import { NodeEventTypes } from '../../../constants/NodeEventTypes'; import { GraphNode } from '../../../models/GraphNode'; -import { areBoundariesEqual } from '../../../models/Boundary'; +import { areBoundariesEqual, Boundary } from '../../../models/Boundary'; import { OffsetContainer } from '../../lib/OffsetContainer'; import { Edge } from '../../lib/EdgeComponents'; import { StepGroup } from '../../groups'; @@ -14,7 +14,9 @@ import { Diamond } from '../templates/Diamond'; import { ElementRenderer } from '../../renderers/ElementRenderer'; import { NodeProps, defaultNodeProps } from '../nodeProps'; -const calculateNodeMap = (path, data): { [id: string]: GraphNode } => { +import { NodeMap, BoundaryMap } from './types'; + +const calculateNodeMap = (path, data): NodeMap => { const result = transformIfCondtion(data, path); if (!result) return {}; @@ -27,8 +29,8 @@ const calculateNodeMap = (path, data): { [id: string]: GraphNode } => { }; }; -const calculateLayout = (nodeMap, boundaryMap) => { - (Object.values(nodeMap) as GraphNode[]) +const calculateLayout = (nodeMap: NodeMap, boundaryMap: BoundaryMap) => { + Object.values(nodeMap) .filter(x => !!x) .forEach((x: GraphNode) => (x.boundary = boundaryMap[x.id] || x.boundary)); @@ -36,12 +38,12 @@ const calculateLayout = (nodeMap, boundaryMap) => { }; export const IfCondition: FunctionComponent = ({ id, data, onEvent, onResize }) => { - const [boundaryMap, setBoundaryMap] = useState({}); + const [boundaryMap, setBoundaryMap] = useState({}); const initialNodeMap = useMemo(() => calculateNodeMap(id, data), [id, data]); const layout = useMemo(() => calculateLayout(initialNodeMap, boundaryMap), [initialNodeMap, boundaryMap]); const accumulatedPatches = {}; - const patchBoundary = (id, boundary) => { + const patchBoundary = (id, boundary?: Boundary) => { if (!boundaryMap[id] || !areBoundariesEqual(boundaryMap[id], boundary)) { accumulatedPatches[id] = boundary; setBoundaryMap({ diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/SwitchCondition.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/SwitchCondition.tsx index b3ab13530b..1a32211348 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/SwitchCondition.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/SwitchCondition.tsx @@ -1,6 +1,6 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import React, { FunctionComponent, useEffect, useState, useMemo } from 'react'; +import { FunctionComponent, useEffect, useState, useMemo } from 'react'; import { NodeEventTypes } from '../../../constants/NodeEventTypes'; import { transformSwitchCondition } from '../../../transformers/transformSwitchCondition'; diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/types.ts b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/types.ts new file mode 100644 index 0000000000..f2070d6d04 --- /dev/null +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/layout-steps/types.ts @@ -0,0 +1,5 @@ +import { GraphNode } from '../../../models/GraphNode'; +import { Boundary } from '../../../models/Boundary'; + +export type NodeMap = { [id: string]: GraphNode }; +export type BoundaryMap = { [id: string]: Boundary }; diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/nodeProps.ts b/Composer/packages/extensions/visual-designer/src/components/nodes/nodeProps.ts index 518f6f4510..9fc788c357 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/nodeProps.ts +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/nodeProps.ts @@ -1,13 +1,25 @@ +import { Boundary } from '../../models/Boundary'; + export interface NodeProps { id: string; data: any; focused?: boolean; onEvent: (action, id, ...rest) => object | void; - onResize: (action?, id?) => object | void; + onResize: (boundary?: Boundary, id?) => object | void; isRoot?: boolean; } +export interface CardProps { + id: string; + data: any; + label: string; + focused?: boolean; + + onEvent: (action, id, ...rest) => object | void; + onResize?: (boundary?: Boundary, id?) => object | void; +} + export const defaultNodeProps = { id: '', data: {}, diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/steps/BotAsks.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/steps/BotAsks.tsx index 4929c448bf..81dbcbc858 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/steps/BotAsks.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/steps/BotAsks.tsx @@ -12,7 +12,7 @@ import { FormCard } from '../templates/FormCard'; import { NodeProps } from '../nodeProps'; import { useLgTemplate } from '../../../utils/hooks'; -export const BotAsks: FC = ({ id, data, onEvent, onResize }): JSX.Element => { +export const BotAsks: FC = ({ id, data, onEvent }): JSX.Element => { const templateText = useLgTemplate(data.prompt, data.$designer && data.$designer.id); return ( diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/steps/InvalidPromptBrick.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/steps/InvalidPromptBrick.tsx index 412fd24d58..ffaa3f42f8 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/steps/InvalidPromptBrick.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/steps/InvalidPromptBrick.tsx @@ -7,6 +7,6 @@ import { NodeProps } from '../nodeProps'; import { IconBrick } from '../../decorations/IconBrick'; import { NodeEventTypes } from '../../../constants/NodeEventTypes'; -export const InvalidPromptBrick: FC = ({ id, data, onEvent, onResize }): JSX.Element => { +export const InvalidPromptBrick: FC = ({ id, onEvent }): JSX.Element => { return onEvent(NodeEventTypes.Focus, { id, tab: PromptTab.EXCEPTIONS })} />; }; diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/templates/RuleCard.tsx b/Composer/packages/extensions/visual-designer/src/components/nodes/templates/RuleCard.tsx index 3d814d15f1..f9d7634800 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/templates/RuleCard.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/templates/RuleCard.tsx @@ -10,6 +10,7 @@ import { EventColor } from '../../../constants/ElementColors'; import { normalizeObiStep } from '../../../utils/stepBuilder'; import { ElementIcon } from '../../../utils/obiPropertyResolver'; import { NodeMenu } from '../../menus/NodeMenu'; +import { CardProps } from '../nodeProps'; import { IconCard } from './IconCard'; @@ -24,11 +25,7 @@ const getDirectJumpDialog = data => { return step.$type === ObiTypes.BeginDialog ? step.dialog : null; }; -export const RuleCard = ({ id, data, label, focused, onEvent }): JSX.Element => { - const focusNode = () => { - return onEvent(NodeEventTypes.Focus, { id }); - }; - +export const RuleCard: React.FC = ({ id, data, label, onEvent }): JSX.Element => { const openNode = () => { return onEvent(NodeEventTypes.Expand, id); }; diff --git a/Composer/packages/extensions/visual-designer/src/components/nodes/utils.ts b/Composer/packages/extensions/visual-designer/src/components/nodes/utils.ts index 6348071ea1..5496ba2c8c 100644 --- a/Composer/packages/extensions/visual-designer/src/components/nodes/utils.ts +++ b/Composer/packages/extensions/visual-designer/src/components/nodes/utils.ts @@ -22,7 +22,7 @@ export function getUserAnswersTitle($type: string): string { return 'ChoiceInput'; } - if ($type.indexOf('Input') > -1) { + if ($type.includes('Input')) { return `User Answers (${$type.replace(/Microsoft.(.*)Input/, '$1')})`; } diff --git a/Composer/packages/extensions/visual-designer/src/components/renderers/EventRenderer.tsx b/Composer/packages/extensions/visual-designer/src/components/renderers/EventRenderer.tsx index fd8b5e38b2..84fee7c98f 100644 --- a/Composer/packages/extensions/visual-designer/src/components/renderers/EventRenderer.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/renderers/EventRenderer.tsx @@ -1,6 +1,6 @@ /** @jsx jsx */ import { jsx, css } from '@emotion/core'; -import React, { FC, ComponentClass, useContext } from 'react'; +import { FC, ComponentClass, useContext } from 'react'; import classnames from 'classnames'; import { ObiTypes } from '../../constants/ObiTypes'; diff --git a/Composer/packages/extensions/visual-designer/src/components/renderers/StepRenderer.tsx b/Composer/packages/extensions/visual-designer/src/components/renderers/StepRenderer.tsx index 70cce27033..72f214d90e 100644 --- a/Composer/packages/extensions/visual-designer/src/components/renderers/StepRenderer.tsx +++ b/Composer/packages/extensions/visual-designer/src/components/renderers/StepRenderer.tsx @@ -1,5 +1,5 @@ /** @jsx jsx */ -import { jsx, css } from '@emotion/core'; +import { jsx } from '@emotion/core'; import { FC, ComponentClass } from 'react'; import { ObiTypes } from '../../constants/ObiTypes'; diff --git a/Composer/packages/extensions/visual-designer/src/constants/KeyboardCommandTypes.ts b/Composer/packages/extensions/visual-designer/src/constants/KeyboardCommandTypes.ts index 67c6e68983..b6984c31d9 100644 --- a/Composer/packages/extensions/visual-designer/src/constants/KeyboardCommandTypes.ts +++ b/Composer/packages/extensions/visual-designer/src/constants/KeyboardCommandTypes.ts @@ -30,7 +30,7 @@ const findCommandAreaByValue = (() => { const cmdsUnderArea = KeyboardCommandTypes[areaKey]; const cmdValues: string[] = Object.values(cmdsUnderArea); for (const cmd of cmdValues) { - cmdAreaByValue[cmd as string] = areaKey; + cmdAreaByValue[cmd] = areaKey; } } diff --git a/Composer/packages/extensions/visual-designer/src/editors/RuleEditor.tsx b/Composer/packages/extensions/visual-designer/src/editors/RuleEditor.tsx index 14023a9769..1e5505d2af 100644 --- a/Composer/packages/extensions/visual-designer/src/editors/RuleEditor.tsx +++ b/Composer/packages/extensions/visual-designer/src/editors/RuleEditor.tsx @@ -1,13 +1,12 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import { useMemo, useRef, useContext } from 'react'; +import { useMemo, useRef } from 'react'; import { isEqual } from 'lodash'; import { Trigger } from '../components/nodes/Trigger'; import { defaultNodeProps } from '../components/nodes/nodeProps'; import { NodeEventTypes } from '../constants/NodeEventTypes'; import { GraphNode } from '../models/GraphNode'; -import { NodeRendererContext } from '../store/NodeRendererContext'; import { transformObiRules } from '../transformers/transformObiRules'; import { outlineObiJson } from '../utils/outlineObiJson'; @@ -40,8 +39,6 @@ export const RuleEditor = ({ id, data, onEvent }): JSX.Element => { return calculateNodeMap(id, data); }, [id, data]); - const { focusedId } = useContext(NodeRendererContext); - const { stepGroup } = nodeMap; return ( @@ -65,7 +62,7 @@ export const RuleEditor = ({ id, data, onEvent }): JSX.Element => { id={stepGroup.id} data={stepGroup.data} onEvent={onEvent} - trigger={} + trigger={} />
); diff --git a/Composer/packages/extensions/visual-designer/src/editors/StepEditor.tsx b/Composer/packages/extensions/visual-designer/src/editors/StepEditor.tsx index e0399d14b9..eba3bbd7a1 100644 --- a/Composer/packages/extensions/visual-designer/src/editors/StepEditor.tsx +++ b/Composer/packages/extensions/visual-designer/src/editors/StepEditor.tsx @@ -1,6 +1,6 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { Terminator } from '../components/decorations/Terminator'; import { StepGroup } from '../components/groups'; @@ -11,7 +11,6 @@ import { ElementInterval, TriggerSize, TerminatorSize } from '../constants/Eleme import { NodeEventTypes } from '../constants/NodeEventTypes'; import { measureJsonBoundary } from '../layouters/measureJsonBoundary'; import { Boundary } from '../models/Boundary'; -import { MenuTypes } from '../constants/MenuTypes'; const HeadSize = { width: TriggerSize.width, @@ -23,7 +22,7 @@ const TailSize = { }; export const StepEditor = ({ id, data, onEvent, trigger }): JSX.Element => { - const [stepGroupBoundary, setStepGroupBoundary] = useState(measureJsonBoundary(data)); + const [stepGroupBoundary, setStepGroupBoundary] = useState(measureJsonBoundary(data)); const hasNoSteps = !data || !Array.isArray(data.children) || data.children.length === 0; const content = hasNoSteps ? ( @@ -38,7 +37,9 @@ export const StepEditor = ({ id, data, onEvent, trigger }): JSX.Element => { data={data} onEvent={onEvent} onResize={boundary => { - setStepGroupBoundary(boundary); + if (boundary) { + setStepGroupBoundary(boundary); + } }} /> ); diff --git a/Composer/packages/extensions/visual-designer/src/index.tsx b/Composer/packages/extensions/visual-designer/src/index.tsx index f3308359fa..f7e2bd4f59 100644 --- a/Composer/packages/extensions/visual-designer/src/index.tsx +++ b/Composer/packages/extensions/visual-designer/src/index.tsx @@ -86,9 +86,9 @@ VisualDesigner.defaultProps = { data: {}, shellApi: { navTo: () => {}, - onFocusEvent: (eventId: string) => {}, - onFocusSteps: (stepIds: string[], fragment?: string) => {}, - onSelect: (ids: string[]) => {}, + onFocusEvent: (_eventId: string) => {}, + onFocusSteps: (_stepIds: string[], _fragment?: string) => {}, + onSelect: (_ids: string[]) => {}, saveData: () => {}, }, }; diff --git a/Composer/packages/extensions/visual-designer/src/layouters/measureJsonBoundary.ts b/Composer/packages/extensions/visual-designer/src/layouters/measureJsonBoundary.ts index da4b6fe8a3..5e5e5632c8 100644 --- a/Composer/packages/extensions/visual-designer/src/layouters/measureJsonBoundary.ts +++ b/Composer/packages/extensions/visual-designer/src/layouters/measureJsonBoundary.ts @@ -18,7 +18,6 @@ import { calculateSequenceBoundary, calculateSwitchCaseBoundary, calculateForeachBoundary, - calculateTextInputBoundary, calculateBaseInputBoundary, } from './calculateNodeBoundary'; @@ -67,10 +66,6 @@ function measureChoiceInputDetailBoundary(data): Boundary { return new Boundary(width, height); } -function measureTextInputBoundary(textInput): Boundary { - return calculateTextInputBoundary(new Boundary(InitNodeSize.width, InitNodeSize.height)); -} - function measureBaseInputBoundary(data): Boundary { const { botAsks, userAnswers } = transformBaseInput(data, ''); return calculateBaseInputBoundary(measureJsonBoundary(botAsks.json), measureJsonBoundary(userAnswers.json)); diff --git a/Composer/packages/extensions/visual-designer/src/models/EdgeData.ts b/Composer/packages/extensions/visual-designer/src/models/EdgeData.ts index efa01144e7..970ec3cf41 100644 --- a/Composer/packages/extensions/visual-designer/src/models/EdgeData.ts +++ b/Composer/packages/extensions/visual-designer/src/models/EdgeData.ts @@ -1,9 +1,9 @@ export class EdgeData { - id: string = ''; + id = ''; direction: 'x' | 'y' = 'x'; - x: number = 0; - y: number = 0; - length: number = 0; + x = 0; + y = 0; + length = 0; text?: string = ''; dashed?: boolean = false; directed?: boolean = false; diff --git a/Composer/packages/extensions/visual-designer/src/models/GraphNode.ts b/Composer/packages/extensions/visual-designer/src/models/GraphNode.ts index 0f7a532814..97687e86de 100644 --- a/Composer/packages/extensions/visual-designer/src/models/GraphNode.ts +++ b/Composer/packages/extensions/visual-designer/src/models/GraphNode.ts @@ -6,7 +6,7 @@ import { Boundary } from './Boundary'; class CoordPoint { x: number; y: number; - constructor(x: number = 0, y: number = 0) { + constructor(x = 0, y = 0) { this.x = x; this.y = y; } diff --git a/Composer/packages/extensions/visual-designer/src/store/ClipboardContext.ts b/Composer/packages/extensions/visual-designer/src/store/ClipboardContext.ts index 4b9e52bb09..c7bf2dbef2 100644 --- a/Composer/packages/extensions/visual-designer/src/store/ClipboardContext.ts +++ b/Composer/packages/extensions/visual-designer/src/store/ClipboardContext.ts @@ -2,5 +2,5 @@ import React from 'react'; export const ClipboardContext = React.createContext({ clipboardActions: [], - setClipboardActions: actions => {}, + setClipboardActions: _actions => {}, }); diff --git a/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts b/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts index 30709c9ac8..11013e5128 100644 --- a/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts +++ b/Composer/packages/extensions/visual-designer/src/utils/cursorTracker.ts @@ -39,7 +39,6 @@ function localeNearestElement( let bounds: ClientRect; let assistMinDistance = 10000; let assistDistance; - const isInvolved = false; elementArr.forEach(element => { bounds = element.getBoundingClientRect(); diff --git a/Composer/packages/extensions/visual-designer/src/utils/jsonTracker.ts b/Composer/packages/extensions/visual-designer/src/utils/jsonTracker.ts index 3daae66cae..885a0762b2 100644 --- a/Composer/packages/extensions/visual-designer/src/utils/jsonTracker.ts +++ b/Composer/packages/extensions/visual-designer/src/utils/jsonTracker.ts @@ -18,7 +18,7 @@ function parseSelector(path: string): null | string[] { const normalizedSelectors = selectors.reduce( (result, selector) => { // e.g. actions[0] - const parseResult = selector.match(/(\w+)\[(\d+)\]/); + const parseResult = /(\w+)\[(\d+)\]/.exec(selector); if (parseResult) { const [, objSelector, arraySelector] = parseResult; diff --git a/Composer/packages/extensions/visual-designer/src/utils/normalizeSelection.ts b/Composer/packages/extensions/visual-designer/src/utils/normalizeSelection.ts index 4713abfcb0..07b68c40c7 100644 --- a/Composer/packages/extensions/visual-designer/src/utils/normalizeSelection.ts +++ b/Composer/packages/extensions/visual-designer/src/utils/normalizeSelection.ts @@ -6,7 +6,7 @@ export const normalizeSelection = (selectedIds: string[]): string[] => { for (let i = 0; i < ascendingIds.length; i++) { const parentId = ascendingIds[i]; for (let j = i + 1; j < ascendingIds.length; j++) { - if (ascendingIds[j].indexOf(parentId) === 0) { + if (ascendingIds[j].startsWith(parentId)) { ascendingIds[j] = ''; } } diff --git a/Composer/packages/lib/code-editor/.eslintrc.js b/Composer/packages/lib/code-editor/.eslintrc.js index dd593090c0..ccecb8e9c0 100644 --- a/Composer/packages/lib/code-editor/.eslintrc.js +++ b/Composer/packages/lib/code-editor/.eslintrc.js @@ -1,8 +1,7 @@ module.exports = { - extends: [ - '../../../.eslintrc.react.js', - 'plugin:@typescript-eslint/recommended', - 'prettier', - 'prettier/@typescript-eslint', - ], + extends: ['../../../.eslintrc.react.js'], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, }; diff --git a/Composer/packages/lib/code-editor/package.json b/Composer/packages/lib/code-editor/package.json index e57f1b03a0..7a14aaf27a 100644 --- a/Composer/packages/lib/code-editor/package.json +++ b/Composer/packages/lib/code-editor/package.json @@ -33,12 +33,9 @@ "@types/lodash.throttle": "^4.1.6", "@types/react": "16.9.0", "@types/react-dom": "16.9.0", - "@typescript-eslint/eslint-plugin": "^1.10.2", - "@typescript-eslint/parser": "^1.10.2", "autoprefixer": "^9.5.1", "copyfiles": "^2.1.0", "css-loader": "^2.1.1", - "eslint-plugin-format-message": "^6.2.3", "html-webpack-plugin": "^3.2.0", "jest": "24.0.0", "jest-dom": "^3.1.3", @@ -51,7 +48,6 @@ "style-loader": "^0.23.1", "ts-jest": "^24.0.2", "ts-loader": "^5.3.3", - "typescript": "^3.5.1", "url-loader": "^1.1.2", "webpack": "^4.30.0", "webpack-cli": "^3.3.2", diff --git a/Composer/packages/lib/component-scaffold/.eslintrc.js b/Composer/packages/lib/component-scaffold/.eslintrc.js index dd593090c0..ccecb8e9c0 100644 --- a/Composer/packages/lib/component-scaffold/.eslintrc.js +++ b/Composer/packages/lib/component-scaffold/.eslintrc.js @@ -1,8 +1,7 @@ module.exports = { - extends: [ - '../../../.eslintrc.react.js', - 'plugin:@typescript-eslint/recommended', - 'prettier', - 'prettier/@typescript-eslint', - ], + extends: ['../../../.eslintrc.react.js'], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, }; diff --git a/Composer/packages/lib/component-scaffold/package.json b/Composer/packages/lib/component-scaffold/package.json index 2a6c8a6f7e..2ad0b5bf5d 100644 --- a/Composer/packages/lib/component-scaffold/package.json +++ b/Composer/packages/lib/component-scaffold/package.json @@ -31,8 +31,6 @@ "@types/jest": "^24.0.11", "@types/react": "16.9.0", "@types/react-dom": "16.9.0", - "@typescript-eslint/eslint-plugin": "^1.10.2", - "@typescript-eslint/parser": "^1.10.2", "autoprefixer": "^9.5.1", "copyfiles": "^2.1.0", "css-loader": "^2.1.1", @@ -48,7 +46,6 @@ "style-loader": "^0.23.1", "ts-jest": "^24.0.2", "ts-loader": "^5.3.3", - "typescript": "^3.5.1", "url-loader": "^1.1.2", "webpack": "^4.30.0", "webpack-cli": "^3.3.0", diff --git a/Composer/packages/lib/shared/.eslintrc.js b/Composer/packages/lib/shared/.eslintrc.js index dd593090c0..ccecb8e9c0 100644 --- a/Composer/packages/lib/shared/.eslintrc.js +++ b/Composer/packages/lib/shared/.eslintrc.js @@ -1,8 +1,7 @@ module.exports = { - extends: [ - '../../../.eslintrc.react.js', - 'plugin:@typescript-eslint/recommended', - 'prettier', - 'prettier/@typescript-eslint', - ], + extends: ['../../../.eslintrc.react.js'], + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, }; diff --git a/Composer/packages/lib/shared/package.json b/Composer/packages/lib/shared/package.json index 3a31d40634..5e0b0afee1 100644 --- a/Composer/packages/lib/shared/package.json +++ b/Composer/packages/lib/shared/package.json @@ -32,12 +32,9 @@ "@types/jest": "^24.0.11", "@types/react": "16.9.0", "@types/react-dom": "16.9.0", - "@typescript-eslint/eslint-plugin": "^1.10.2", - "@typescript-eslint/parser": "^1.10.2", "autoprefixer": "^9.5.1", "copyfiles": "^2.1.0", "css-loader": "^2.1.1", - "eslint-plugin-format-message": "^6.2.3", "html-webpack-plugin": "^3.2.0", "jest": "24.0.0", "jest-dom": "^3.1.3", @@ -51,7 +48,6 @@ "style-loader": "^0.23.1", "ts-jest": "^24.0.2", "ts-loader": "^5.3.3", - "typescript": "^3.5.1", "url-loader": "^1.1.2", "webpack": "^4.30.0", "webpack-cli": "^3.3.0", diff --git a/Composer/packages/lib/shared/src/dialogFactory.ts b/Composer/packages/lib/shared/src/dialogFactory.ts index baefe52b2f..10d18bf867 100644 --- a/Composer/packages/lib/shared/src/dialogFactory.ts +++ b/Composer/packages/lib/shared/src/dialogFactory.ts @@ -74,7 +74,7 @@ export const seedDefaults = (type: string) => { const DEEP_COPY_TYPES = ['Microsoft.SendActivity']; export const needsDeepCopy = $type => { - return DEEP_COPY_TYPES.indexOf($type) !== -1; + return DEEP_COPY_TYPES.includes($type); }; export const deepCopy: any = (_data, _lgApi) => { diff --git a/Composer/packages/lib/shared/src/viewUtils.ts b/Composer/packages/lib/shared/src/viewUtils.ts index d52f59893e..bc0fd125bf 100644 --- a/Composer/packages/lib/shared/src/viewUtils.ts +++ b/Composer/packages/lib/shared/src/viewUtils.ts @@ -220,7 +220,7 @@ export const dialogGroups: DialogGroupsMap = { export const createStepMenu = ( stepLabels, - subMenu: boolean = true, + subMenu = true, handleType: (e: any, item: IContextualMenuItem) => void ): IContextualMenuItem[] => { if (subMenu) { diff --git a/Composer/packages/server/.eslintrc.js b/Composer/packages/server/.eslintrc.js index 4055f6efcf..8cbe448349 100644 --- a/Composer/packages/server/.eslintrc.js +++ b/Composer/packages/server/.eslintrc.js @@ -1,11 +1,10 @@ -const path = require('path'); - module.exports = { - extends: ['../../.eslintrc.js', 'plugin:@typescript-eslint/recommended', 'prettier', 'prettier/@typescript-eslint'], + extends: ['../../.eslintrc.js'], parserOptions: { - project: path.resolve(__dirname, 'tsconfig.json'), + project: './tsconfig.json', + tsconfigRootDir: __dirname, }, rules: { - '@typescript-eslint/explicit-member-accessibility': 'off', + 'security/detect-non-literal-fs-filename': 'off', }, }; diff --git a/Composer/packages/server/__tests__/models/bot/botProject.test.ts b/Composer/packages/server/__tests__/models/bot/botProject.test.ts index 8b057cb183..96a3da7ab9 100644 --- a/Composer/packages/server/__tests__/models/bot/botProject.test.ts +++ b/Composer/packages/server/__tests__/models/bot/botProject.test.ts @@ -24,8 +24,8 @@ beforeEach(async () => { }); describe('index', () => { - it('should index successfully', async () => { - const project: { [key: string]: any } = await proj.getIndexes(); + it('should index successfully', () => { + const project: { [key: string]: any } = proj.getIndexes(); expect(project.dialogs.length).toBe(3); expect(project.lgFiles.length).toBe(1); expect(project.luFiles.length).toBe(3); @@ -113,7 +113,7 @@ describe('copyTo', () => { it('should copy successfully', async () => { const newBotProject = await proj.copyTo(locationRef); await newBotProject.index(); - const project: { [key: string]: any } = await newBotProject.getIndexes(); + const project: { [key: string]: any } = newBotProject.getIndexes(); expect(project.dialogs.length).toBe(3); }); }); diff --git a/Composer/packages/server/__tests__/models/bot/luisPublisher.test.ts b/Composer/packages/server/__tests__/models/bot/luisPublisher.test.ts index 9429d2bbbd..f2918fa765 100644 --- a/Composer/packages/server/__tests__/models/bot/luisPublisher.test.ts +++ b/Composer/packages/server/__tests__/models/bot/luisPublisher.test.ts @@ -50,16 +50,16 @@ describe('get unpublishedFiles', () => { const luPublisher = new LuPublisher(botDir, storage); await luPublisher.loadStatus(['bot1/a.lu', 'bot1/b.lu']); // relative path is key - let files = await luPublisher.getUnpublisedFiles(lufiles); + let files = luPublisher.getUnpublisedFiles(lufiles); expect(files.length).toBe(2); const curTime = Date.now(); luPublisher.status['bot1/a.lu'].lastPublishTime = curTime; // assumming we publish a.lu luPublisher.status['bot1/b.lu'].lastPublishTime = curTime; // and b.lu - files = await luPublisher.getUnpublisedFiles(lufiles); + files = luPublisher.getUnpublisedFiles(lufiles); expect(files.length).toBe(0); await luPublisher.onFileChange('bot1/a.lu', FileUpdateType.UPDATE); - files = await luPublisher.getUnpublisedFiles(lufiles); + files = luPublisher.getUnpublisedFiles(lufiles); expect(files.length).toBe(1); }); }); diff --git a/Composer/packages/server/__tests__/models/environment/hostedEnvironment.tests.ts b/Composer/packages/server/__tests__/models/environment/hostedEnvironment.test.ts similarity index 89% rename from Composer/packages/server/__tests__/models/environment/hostedEnvironment.tests.ts rename to Composer/packages/server/__tests__/models/environment/hostedEnvironment.test.ts index 63e91a4162..3549863b81 100644 --- a/Composer/packages/server/__tests__/models/environment/hostedEnvironment.tests.ts +++ b/Composer/packages/server/__tests__/models/environment/hostedEnvironment.test.ts @@ -6,7 +6,7 @@ const dir = './mocks'; const defaultDir = Path.join(__dirname, dir); describe('getEnvironmentName', () => { - it('return projectName', async () => { + it('return projectName', () => { const e = new HostedEnvironment({ ...absHostedConfig, basePath: defaultDir }, true); const result = e.getEnvironmentName('foo'); expect(result).toBe('foo'); @@ -14,13 +14,13 @@ describe('getEnvironmentName', () => { }); describe('slots', () => { - it('getDefaultSlot', async () => { + it('getDefaultSlot', () => { const e = new HostedEnvironment({ ...absHostedConfig, basePath: defaultDir }, true); const result = e.getDefaultSlot(); expect(result).toBe('integration'); }); - it('getSlotNames', async () => { + it('getSlotNames', () => { const e = new HostedEnvironment({ ...absHostedConfig, basePath: defaultDir }, true); const result = e.getSlotNames(); expect(result.length).toBe(2); diff --git a/Composer/packages/server/__tests__/models/storage/azureBlobStorage.test.ts b/Composer/packages/server/__tests__/models/storage/azureBlobStorage.test.ts index b8fafcf227..fbd2465722 100644 --- a/Composer/packages/server/__tests__/models/storage/azureBlobStorage.test.ts +++ b/Composer/packages/server/__tests__/models/storage/azureBlobStorage.test.ts @@ -86,13 +86,11 @@ describe('test Azure Blob Storage', () => { result = await client.exists('/container/blobname'); expect(result).toBeTruthy(); }); - it('test writeFile function', async () => { + it('test writeFile function', () => { const client = new AzureBlobStorage(mockStorageConnect); - await expect(client.writeFile('/container', 'content')).rejects.toThrow( - 'path must include container name and blob name' - ); + expect(client.writeFile('/container', 'content')).rejects.toThrow('path must include container name and blob name'); - await expect(async () => client.writeFile('/container/blobname', 'content')).not.toThrowError(); + expect(async () => client.writeFile('/container/blobname', 'content')).not.toThrowError(); }); it('test removeFile function', async () => { const client = new AzureBlobStorage(mockStorageConnect); diff --git a/Composer/packages/server/__tests__/utility/jsonWalk.test.ts b/Composer/packages/server/__tests__/utility/jsonWalk.test.ts index e67b5055ee..e5bf2348fd 100644 --- a/Composer/packages/server/__tests__/utility/jsonWalk.test.ts +++ b/Composer/packages/server/__tests__/utility/jsonWalk.test.ts @@ -22,7 +22,7 @@ const data = { }; describe('run json walk', () => { - it('visitor should walk through every node', async () => { + it('visitor should walk through every node', () => { const visitedPath: string[] = []; const visitor: VisitorFunc = (path: string, _value: any) => { visitedPath.push(path); @@ -34,11 +34,11 @@ describe('run json walk', () => { expect(lastPath).toBe('$.phoneNumbers[:1].number'); }); - it('if visitor stop, its children should not be visited', async () => { + it('if visitor stop, its children should not be visited', () => { const visitedPath: string[] = []; const visitor: VisitorFunc = (path: string, _value: any) => { // jump over phoneNumbers - if (path.match('phoneNumbers')) { + if (/phoneNumbers/.exec(path)) { return true; } visitedPath.push(path); diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 78f5a49c0d..ea03cd1b7f 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -51,8 +51,6 @@ "@types/mock-fs": "^3.6.30", "@types/morgan": "^1.7.35", "@types/node": "^11.9.6", - "@typescript-eslint/eslint-plugin": "^1.10.2", - "@typescript-eslint/parser": "^1.10.2", "babel-jest": "24.0.0", "clean-webpack-plugin": "^2.0.1", "copy-webpack-plugin": "^5.0.2", @@ -63,7 +61,6 @@ "rimraf": "^2.6.3", "ts-loader": "^5.3.3", "ts-node": "^8.0.2", - "typescript": "^3.3.3333", "webpack": "^4.29.6", "webpack-cli": "^3.3.0" }, diff --git a/Composer/packages/server/schemas/editor.schema b/Composer/packages/server/schemas/editor.schema index db52a382aa..fb2c5b69aa 100644 --- a/Composer/packages/server/schemas/editor.schema +++ b/Composer/packages/server/schemas/editor.schema @@ -8,12 +8,16 @@ }, "SDKOverrides": { "Activity": { - "description": "What your bot says to the user. This is a template used to create the outgoing message. It can include language generation rules, properties from memory, and other features. Visit the Language Generation reference for more info.

For example, to define variations that will be chosen at random, write:
- hello
- hi", - "title": "Language Generation" + "description": "What your bot says to the user. This is a template used to create the outgoing message. It can include language generation rules, properties from memory, and other features.\n\nFor example, to define variations that will be chosen at random, write:\n- hello\n- hi", + "title": "Language Generation", + "helpLink": "https://aka.ms/lg-file-format", + "helpLinkText": "Visit the Language Generation reference for more info." }, "Microsoft.AdaptiveDialog": { - "description": "This configures a data driven dialog via a collection of events and actions. Learn more", - "title": "AdaptiveDialog" + "description": "This configures a data driven dialog via a collection of events and actions.", + "title": "AdaptiveDialog", + "helpLink": "https://aka.ms/botframework", + "helpLinkText": "Learn more" }, "Microsoft.AttachmentInput": { "title": "Prompt for Attachment" @@ -82,15 +86,19 @@ "title": "Log to console" }, "Microsoft.LuisRecognizer": { - "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use. Learn more", - "title": "Language Understanding" + "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use.", + "title": "Language Understanding", + "helpLink": "https://www.luis.ai/home", + "helpLinkText": "Learn more" }, "Microsoft.MostSpecificSelector": { "title": "MostSpecificSelector" }, "Microsoft.MultiLanguageRecognizer": { - "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use. Learn more", - "title": "Language Understanding" + "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use.", + "title": "Language Understanding", + "helpLink": "https://www.luis.ai/home", + "helpLinkText": "Learn more" }, "Microsoft.NumberInput": { "title": "Prompt for a number" @@ -107,7 +115,9 @@ "Microsoft.OnConversationUpdateActivity": { "title": "Handle ConversationUpdate", "description": - "Handle the events fired when a user begins a new conversation with the bot. Learn more" + "Handle the events fired when a user begins a new conversation with the bot.", + "helpLink": "https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-conversations?view=azure-bot-service-4.0#conversation-lifetime", + "helpLinkText": "Learn more" }, "Microsoft.OnDialogEvent": { "title": "Handle a Dialog Event" @@ -189,8 +199,10 @@ "title": "TrueSelector" }, "Recognizer": { - "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use. Learn more", - "title": "Language Understanding" + "description": "To understand what the user says, your dialog needs a 'Recognizer', that includes example words and sentences that users may use.", + "title": "Language Understanding", + "helpLink": "https://www.luis.ai/home", + "helpLinkText": "Learn more" } } } diff --git a/Composer/packages/server/src/controllers/project.ts b/Composer/packages/server/src/controllers/project.ts index cdbc94ab8b..8834fa3eed 100644 --- a/Composer/packages/server/src/controllers/project.ts +++ b/Composer/packages/server/src/controllers/project.ts @@ -56,7 +56,7 @@ async function getProject(req: Request, res: Response) { const currentProject = BotProjectService.getCurrentBotProject(); if (currentProject !== undefined && (await currentProject.exists())) { await currentProject.index(); - const project = await currentProject.getIndexes(); + const project = currentProject.getIndexes(); res.status(200).json({ ...project, }); @@ -84,7 +84,7 @@ async function openProject(req: Request, res: Response) { await BotProjectService.openProject(location); const currentProject = BotProjectService.getCurrentBotProject(); if (currentProject !== undefined) { - const project = await currentProject.getIndexes(); + const project = currentProject.getIndexes(); res.status(200).json({ ...project, }); @@ -121,7 +121,7 @@ async function saveProjectAs(req: Request, res: Response) { if (currentProject !== undefined) { await currentProject.updateBotInfo(name, description); await currentProject.index(); - const project = await currentProject.getIndexes(); + const project = currentProject.getIndexes(); res.status(200).json({ ...project, }); @@ -137,7 +137,7 @@ async function saveProjectAs(req: Request, res: Response) { } } -async function getRecentProjects(req: Request, res: Response) { +function getRecentProjects(req: Request, res: Response) { const projects = BotProjectService.getRecentBotProjects(); return res.status(200).json(projects); } diff --git a/Composer/packages/server/src/models/bot/botProject.ts b/Composer/packages/server/src/models/bot/botProject.ts index 7b4fd073dc..71af4d943f 100644 --- a/Composer/packages/server/src/models/bot/botProject.ts +++ b/Composer/packages/server/src/models/bot/botProject.ts @@ -183,7 +183,7 @@ export class BotProject { return this.dialogIndexer.getDialogs(); }; - public createDialog = async (id: string, content: string = '', dir: string = ''): Promise => { + public createDialog = async (id: string, content = '', dir = ''): Promise => { const dialog = this.dialogIndexer.getDialogs().find(d => d.id === id); if (dialog) { throw new Error(`${id} dialog already exist`); @@ -222,7 +222,7 @@ export class BotProject { return this.lgIndexer.getLgFiles(); }; - public createLgFile = async (id: string, content: string, dir: string = ''): Promise => { + public createLgFile = async (id: string, content: string, dir = ''): Promise => { const lgFile = this.lgIndexer.getLgFiles().find(lg => lg.id === id); if (lgFile) { throw new Error(`${id} lg file already exist`); @@ -269,7 +269,7 @@ export class BotProject { return this.mergeLuStatus(this.luIndexer.getLuFiles(), this.luPublisher.status); }; - public createLuFile = async (id: string, content: string, dir: string = ''): Promise => { + public createLuFile = async (id: string, content: string, dir = ''): Promise => { const luFile = this.luIndexer.getLuFiles().find(lu => lu.id === id); if (luFile) { throw new Error(`${id} lu file already exist`); @@ -293,9 +293,9 @@ export class BotProject { }; public publishLuis = async (authoringKey: string) => { - await this.luPublisher.setAuthoringKey(authoringKey); + this.luPublisher.setAuthoringKey(authoringKey); const referred = this.luIndexer.getLuFiles().filter(this.isReferred); - const unpublished = await this.luPublisher.getUnpublisedFiles(referred); + const unpublished = this.luPublisher.getUnpublisedFiles(referred); const invalidLuFile = unpublished.filter(file => file.diagnostics.length !== 0); if (invalidLuFile.length !== 0) { @@ -318,12 +318,12 @@ export class BotProject { return this.mergeLuStatus(this.luIndexer.getLuFiles(), this.luPublisher.status); }; - public checkLuisPublished = async () => { + public checkLuisPublished = () => { const referredLuFiles = this.luIndexer.getLuFiles().filter(this.isReferred); if (referredLuFiles.length <= 0) { return true; } else { - return await this.luPublisher.checkLuisPublised(referredLuFiles); + return this.luPublisher.checkLuisPublised(referredLuFiles); } }; diff --git a/Composer/packages/server/src/models/bot/indexers/dialogIndexers.ts b/Composer/packages/server/src/models/bot/indexers/dialogIndexers.ts index 7082a0c7a0..ac10c8bcdc 100644 --- a/Composer/packages/server/src/models/bot/indexers/dialogIndexers.ts +++ b/Composer/packages/server/src/models/bot/indexers/dialogIndexers.ts @@ -45,6 +45,7 @@ export class DialogIndexer { if (target && typeof target === 'string') { // match a template name // match a temlate func e.g. `showDate()` + // eslint-disable-next-line security/detect-unsafe-regex const reg = /\[([A-Za-z_][-\w]+)(\(.*\))?\]/g; let matchResult; while ((matchResult = reg.exec(target)) !== null) { diff --git a/Composer/packages/server/src/models/bot/luPublisher.ts b/Composer/packages/server/src/models/bot/luPublisher.ts index 6abb008d40..84fbbc6e7e 100644 --- a/Composer/packages/server/src/models/bot/luPublisher.ts +++ b/Composer/packages/server/src/models/bot/luPublisher.ts @@ -92,7 +92,7 @@ export class LuPublisher { await this._copyDialogsToTargetFolder(config); }; - public getUnpublisedFiles = async (files: LUFile[]) => { + public getUnpublisedFiles = (files: LUFile[]) => { // unpublished means either // 1. there is no status tracking // 2. the status shows that lastPublishTime < lastUpdateTime @@ -104,8 +104,8 @@ export class LuPublisher { }); }; - public checkLuisPublised = async (files: LUFile[]) => { - const unpublished = await this.getUnpublisedFiles(files); + public checkLuisPublised = (files: LUFile[]) => { + const unpublished = this.getUnpublisedFiles(files); return unpublished.length === 0; }; @@ -120,7 +120,7 @@ export class LuPublisher { } }; - public setAuthoringKey = async (key: string) => { + public setAuthoringKey = (key: string) => { if (this.config) { this.config.authoringKey = key; } diff --git a/Composer/packages/server/src/models/connector/csharpBotConnector.ts b/Composer/packages/server/src/models/connector/csharpBotConnector.ts index 7da7c0315e..d840d2655c 100644 --- a/Composer/packages/server/src/models/connector/csharpBotConnector.ts +++ b/Composer/packages/server/src/models/connector/csharpBotConnector.ts @@ -45,7 +45,7 @@ export class CSharpBotConnector implements IBotConnector { const form = new FormData(); form.append('file', content, 'bot.zip'); - if (luisConfig && luisConfig.authoringKey !== null && !(await currentProject.checkLuisPublished())) { + if (luisConfig && luisConfig.authoringKey !== null && !currentProject.checkLuisPublished()) { throw new Error('Please publish your Luis models'); } diff --git a/Composer/packages/server/src/models/connector/selfHostConnector.ts b/Composer/packages/server/src/models/connector/selfHostConnector.ts index 2445d90b79..3f7ae81221 100644 --- a/Composer/packages/server/src/models/connector/selfHostConnector.ts +++ b/Composer/packages/server/src/models/connector/selfHostConnector.ts @@ -1,5 +1,4 @@ //eslint-disable-next-line @typescript-eslint/no-triple-slash-reference -///. import { resolve } from 'path'; import { ClaimNames } from '../../constants'; @@ -14,8 +13,8 @@ export class SelfHostBotConnector implements IBotConnector { this.buildAsync = require('commands/build').handlerAsync; } else { // for testing - this.buildAsync = async _ => { - return 'done'; + this.buildAsync = _ => { + return Promise.resolve('done'); }; } } diff --git a/Composer/packages/server/src/models/environment/defaultEnvironment.ts b/Composer/packages/server/src/models/environment/defaultEnvironment.ts index 7b9a837642..a70a98e31a 100644 --- a/Composer/packages/server/src/models/environment/defaultEnvironment.ts +++ b/Composer/packages/server/src/models/environment/defaultEnvironment.ts @@ -9,7 +9,7 @@ export class DefaultEnvironment implements IEnvironment { private config: IEnvironmentConfig; private settingManager: DefaultSettingManager; private botConnector: CSharpBotConnector; - private defaultSlot: string = ''; + private defaultSlot = ''; private slots: string[] = ['']; public constructor(config: IEnvironmentConfig) { diff --git a/Composer/packages/server/src/models/environment/hostedEnvironment.ts b/Composer/packages/server/src/models/environment/hostedEnvironment.ts index e20032a488..00f4ea5b05 100644 --- a/Composer/packages/server/src/models/environment/hostedEnvironment.ts +++ b/Composer/packages/server/src/models/environment/hostedEnvironment.ts @@ -9,7 +9,7 @@ export class HostedEnvironment implements IEnvironment { private config: IEnvironmentConfig; private settingManager: HostedSettingManager; private botConnector: SelfHostBotConnector; - private defaultSlot: string = 'integration'; + private defaultSlot = 'integration'; private slots: string[] = ['integration', 'production']; constructor(config: IEnvironmentConfig, skipLoad?: boolean) { diff --git a/Composer/packages/server/src/models/settings/fileSettingManager.ts b/Composer/packages/server/src/models/settings/fileSettingManager.ts index 4a6e3f7218..ffa539c477 100644 --- a/Composer/packages/server/src/models/settings/fileSettingManager.ts +++ b/Composer/packages/server/src/models/settings/fileSettingManager.ts @@ -57,7 +57,7 @@ export class FileSettingManager implements ISettingManager { if (type === 'object') { if (Array.isArray(obj)) { const result: any[] = []; - (obj as any[]).forEach(x => result.push(this.obfuscateValues(x))); + obj.forEach(x => result.push(this.obfuscateValues(x))); return result; } else { const result: any = {}; diff --git a/Composer/packages/server/src/router/api.ts b/Composer/packages/server/src/router/api.ts index 8b2fd117ee..9862eed255 100644 --- a/Composer/packages/server/src/router/api.ts +++ b/Composer/packages/server/src/router/api.ts @@ -41,7 +41,7 @@ router.get('/launcher/status', BotConnectorController.status); //assets router.get('/assets/projectTemplates', AssetController.getProjTemplates); -const ErrorHandler = (handler: RequestHandler) => async (req: Request, res: Response, next: NextFunction) => { +const ErrorHandler = (handler: RequestHandler) => (req: Request, res: Response, next: NextFunction) => { Promise.resolve(handler(req, res, next)).catch(next); }; diff --git a/Composer/packages/server/src/services/project.ts b/Composer/packages/server/src/services/project.ts index 7d746cd716..d29336a20a 100644 --- a/Composer/packages/server/src/services/project.ts +++ b/Composer/packages/server/src/services/project.ts @@ -41,7 +41,7 @@ export class BotProjectService { return BotProjectService.recentBotProjects.reduce((result: any[], item) => { const name = Path.basename(item.path); //remove .botproj. Someone may open project before new folder structure. - if (name.indexOf('.botproj') === -1) { + if (!name.includes('.botproj')) { result.push({ name, ...item }); } return result; diff --git a/Composer/packages/server/src/types/ludown.d.ts b/Composer/packages/server/src/types/ludown.d.ts new file mode 100644 index 0000000000..8094b2d252 --- /dev/null +++ b/Composer/packages/server/src/types/ludown.d.ts @@ -0,0 +1,6 @@ +declare module 'ludown' { + namespace parser { + function parseFile(fileContent: any, log: any, locale: any): any; + function validateLUISBlob(LUISJSONBlob: any): any; + } +} diff --git a/Composer/packages/server/types/selfHostCommands.d.ts b/Composer/packages/server/src/types/selfHostCommands.d.ts similarity index 100% rename from Composer/packages/server/types/selfHostCommands.d.ts rename to Composer/packages/server/src/types/selfHostCommands.d.ts diff --git a/Composer/packages/server/tsconfig.json b/Composer/packages/server/tsconfig.json index ec4ba5418a..3587377f22 100644 --- a/Composer/packages/server/tsconfig.json +++ b/Composer/packages/server/tsconfig.json @@ -1,11 +1,6 @@ { /* Options used for linting (tests included) */ "compilerOptions": { - "paths": { - "*": [ - "types/*" - ] - }, "baseUrl": ".", "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ @@ -23,4 +18,4 @@ "src/**/*.ts", "__tests__/**/*.test.ts" ] -} \ No newline at end of file +} diff --git a/Composer/packages/server/types/ludown.d.ts b/Composer/packages/server/types/ludown.d.ts deleted file mode 100644 index 6070da0a92..0000000000 --- a/Composer/packages/server/types/ludown.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export namespace parser { - function parseFile(fileContent: any, log: any, locale: any): any; - function validateLUISBlob(LUISJSONBlob: any): any; -} diff --git a/Composer/yarn.lock b/Composer/yarn.lock index a859675726..dffabd8633 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -2510,117 +2510,45 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" integrity sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ== -"@typescript-eslint/eslint-plugin@^1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.10.2.tgz#552fc64cfcb19c6162190360217c945e8faa330a" - integrity sha512-7449RhjE1oLFIy5E/5rT4wG5+KsfPzakJuhvpzXJ3C46lq7xywY0/Rjo9ZBcwrfbk0nRZ5xmUHkk7DZ67tSBKw== +"@typescript-eslint/eslint-plugin@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.3.3.tgz#71e06c6887650301e02105c99b4c8f67454157e3" + integrity sha512-12cCbwu5PbQudkq2xCIS/QhB7hCMrsNPXK+vJtqy/zFqtzVkPRGy12O5Yy0gUK086f3VHV/P4a4R4CjMW853pA== dependencies: - "@typescript-eslint/experimental-utils" "1.10.2" - eslint-utils "^1.3.1" + "@typescript-eslint/experimental-utils" "2.3.3" + eslint-utils "^1.4.2" functional-red-black-tree "^1.0.1" regexpp "^2.0.1" - tsutils "^3.7.0" + tsutils "^3.17.1" -"@typescript-eslint/eslint-plugin@^1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz#870f752c520db04db6d3668af7479026a6f2fb9a" - integrity sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw== - dependencies: - "@typescript-eslint/experimental-utils" "1.11.0" - eslint-utils "^1.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^2.0.1" - tsutils "^3.7.0" - -"@typescript-eslint/eslint-plugin@^1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz#22fed9b16ddfeb402fd7bcde56307820f6ebc49f" - integrity sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g== - dependencies: - "@typescript-eslint/experimental-utils" "1.13.0" - eslint-utils "^1.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^2.0.1" - tsutils "^3.7.0" - -"@typescript-eslint/experimental-utils@1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.10.2.tgz#cd548c03fc1a2b3ba5c136d1599001a1ede24215" - integrity sha512-Hf5lYcrnTH5Oc67SRrQUA7KuHErMvCf5RlZsyxXPIT6AXa8fKTyfFO6vaEnUmlz48RpbxO4f0fY3QtWkuHZNjg== - dependencies: - "@typescript-eslint/typescript-estree" "1.10.2" - eslint-scope "^4.0.0" - -"@typescript-eslint/experimental-utils@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz#594abe47091cbeabac1d6f9cfed06d0ad99eb7e3" - integrity sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw== - dependencies: - "@typescript-eslint/typescript-estree" "1.11.0" - eslint-scope "^4.0.0" - -"@typescript-eslint/experimental-utils@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" - integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== +"@typescript-eslint/experimental-utils@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.3.3.tgz#0685613063ff397cfa9209be2e6e81c0382a9b11" + integrity sha512-MQ4jKPMTU1ty4TigJCRKFPye2qyQdH8jzIIkceaHgecKFmkNS1hXPqKiZ+mOehkz6+HcN5Nuvwm+frmWZR9tdg== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "1.13.0" - eslint-scope "^4.0.0" + "@typescript-eslint/typescript-estree" "2.3.3" + eslint-scope "^5.0.0" -"@typescript-eslint/parser@^1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.10.2.tgz#36cfe8c6bf1b6c1dd81da56f88c8588f4b1a852b" - integrity sha512-xWDWPfZfV0ENU17ermIUVEVSseBBJxKfqBcRCMZ8nAjJbfA5R7NWMZmFFHYnars5MjK4fPjhu4gwQv526oZIPQ== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "1.10.2" - "@typescript-eslint/typescript-estree" "1.10.2" - eslint-visitor-keys "^1.0.0" - -"@typescript-eslint/parser@^1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.11.0.tgz#2f6d4f7e64eeb1e7c25b422f8df14d0c9e508e36" - integrity sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "1.11.0" - "@typescript-eslint/typescript-estree" "1.11.0" - eslint-visitor-keys "^1.0.0" - -"@typescript-eslint/parser@^1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.13.0.tgz#61ac7811ea52791c47dc9fd4dd4a184fae9ac355" - integrity sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ== +"@typescript-eslint/parser@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.3.3.tgz#af519d6572bdee3e9610e21c8362766858976bc1" + integrity sha512-+cV53HuYFeeyrNW8x/rgPmbVrzzp/rpRmwbJnNtwn4K8mroL1BdjxwQh7X9cUHp9rm4BBiEWmD3cSBjKG7d5mw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "1.13.0" - "@typescript-eslint/typescript-estree" "1.13.0" - eslint-visitor-keys "^1.0.0" - -"@typescript-eslint/typescript-estree@1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.10.2.tgz#8403585dd74b6cfb6f78aa98b6958de158b5897b" - integrity sha512-Kutjz0i69qraOsWeI8ETqYJ07tRLvD9URmdrMoF10bG8y8ucLmPtSxROvVejWvlJUGl2et/plnMiKRDW+rhEhw== - dependencies: - lodash.unescape "4.0.1" - semver "5.5.0" - -"@typescript-eslint/typescript-estree@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz#b7b5782aab22e4b3b6d84633652c9f41e62d37d5" - integrity sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA== - dependencies: - lodash.unescape "4.0.1" - semver "5.5.0" + "@typescript-eslint/experimental-utils" "2.3.3" + "@typescript-eslint/typescript-estree" "2.3.3" + eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e" - integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw== +"@typescript-eslint/typescript-estree@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.3.3.tgz#be802220876bedfb80384cde1d46fe57ae7abf71" + integrity sha512-GkACs12Xp8d/STunNv/iSMYJFQrkrax9vuPZySlgSzoJJtw1cp6tbEw4qsLskQv6vloLrkFJHcTJ0a/yCB5cIA== dependencies: + glob "^7.1.4" + is-glob "^4.0.1" lodash.unescape "4.0.1" - semver "5.5.0" + semver "^6.3.0" "@uifabric/example-data@^7.0.1": version "7.0.1" @@ -3330,7 +3258,7 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.7.0, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.5.5, ajv@^6.7.0, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -5820,11 +5748,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - circular-json@^0.5.4: version "0.5.9" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" @@ -5916,15 +5839,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -clipboard@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d" - integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -7674,11 +7588,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -8254,7 +8163,7 @@ eslint-config-react-app@^3.0.7: dependencies: confusing-browser-globals "^1.0.6" -eslint-import-resolver-node@^0.3.1: +eslint-import-resolver-node@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== @@ -8273,21 +8182,14 @@ eslint-loader@2.1.1: object-hash "^1.1.4" rimraf "^2.6.1" -eslint-module-utils@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" - integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== +eslint-module-utils@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz#7b4675875bf96b0dbf1b21977456e5bb1f5e018c" + integrity sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw== dependencies: debug "^2.6.8" pkg-dir "^2.0.0" -eslint-plugin-flowtype@2.50.1: - version "2.50.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz#36d4c961ac8b9e9e1dc091d3fba0537dad34ae8a" - integrity sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ== - dependencies: - lodash "^4.17.10" - 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" @@ -8299,21 +8201,22 @@ eslint-plugin-format-message@^6.2.3: format-message-parse "^6.2.3" lookup-closest-locale "^6.2.0" -eslint-plugin-import@2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" - integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== +eslint-plugin-import@^2.16.0: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== dependencies: + array-includes "^3.0.3" contains-path "^0.1.0" - debug "^2.6.8" + debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" read-pkg-up "^2.0.0" - resolve "^1.6.0" + resolve "^1.11.0" eslint-plugin-jsx-a11y@6.1.2: version "6.1.2" @@ -8363,6 +8266,13 @@ eslint-plugin-react@7.12.4: prop-types "^15.6.2" resolve "^1.9.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-plugin-typescript@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/eslint-plugin-typescript/-/eslint-plugin-typescript-0.14.0.tgz#068549c3f4c7f3f85d88d398c29fa96bf500884c" @@ -8386,66 +8296,43 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== +eslint-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@5.12.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.12.0.tgz#fab3b908f60c52671fb14e996a450b96c743c859" - integrity sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.5.3" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^2.1.0" - eslint-scope "^4.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.0" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.1.0" - js-yaml "^3.12.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.5" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.0.2" - text-table "^0.2.0" +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7" - integrity sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w== +eslint@^5.15.1: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" + ajv "^6.9.1" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" @@ -8453,19 +8340,18 @@ eslint@^6.0.1: eslint-scope "^4.0.3" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^6.0.0" + espree "^5.0.1" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^3.1.0" + glob "^7.1.2" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" inquirer "^6.2.2" - is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.11" @@ -8473,6 +8359,7 @@ eslint@^6.0.1: mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" + path-is-inside "^1.0.2" progress "^2.0.0" regexpp "^2.0.1" semver "^5.5.1" @@ -8481,7 +8368,7 @@ eslint@^6.0.1: table "^5.2.3" text-table "^0.2.0" -espree@^5.0.0: +espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== @@ -8490,15 +8377,6 @@ espree@^5.0.0: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" - integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -8995,14 +8873,6 @@ figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - 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" @@ -9185,16 +9055,6 @@ findup-sync@^2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -9687,6 +9547,18 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -9798,13 +9670,6 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -10644,25 +10509,6 @@ inquirer@6.2.1: strip-ansi "^5.0.0" through "^2.3.6" -inquirer@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.0.0" - through "^2.3.6" - inquirer@^6.2.2: version "6.4.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" @@ -11002,6 +10848,13 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-installed-globally@0.1.0, is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -11871,7 +11724,7 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.9.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.13.1: +js-yaml@^3.13.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -14930,11 +14783,6 @@ please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: dependencies: semver-compare "^1.0.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -15715,13 +15563,6 @@ pretty-format@^24.8.0: ansi-styles "^3.2.0" react-is "^16.8.4" -prismjs@^1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" - integrity sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA== - optionalDependencies: - clipboard "^2.0.0" - private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -16174,11 +16015,6 @@ react-proxy@^1.1.7: lodash "^4.6.1" react-deep-force-update "^1.0.0" -react-simple-code-editor@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.8.0.tgz#c0c36df276c49d3d4410b8457f7a0a15396acbbf" - integrity sha512-H3HknuOqH2h8Kbg+vCUXf7YwDMC8UI0pEx2j5sODFVdX/RBeGX+w0vB+7LLrCh1qaQ1nTycyXXKWZifL3Dt0gg== - react-testing-library@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.0.2.tgz#afd7ddaa174e21cf672605e4e4f6f8156c4c9ef9" @@ -16790,7 +16626,7 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.10.0, resolve@1.x, resolve@^1.10.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1, resolve@^1.9.0: +resolve@1.10.0, resolve@1.x, resolve@^1.10.0, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== @@ -16804,6 +16640,13 @@ resolve@1.8.1: dependencies: path-parse "^1.0.5" +resolve@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -16842,7 +16685,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2, 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== @@ -16987,11 +16830,6 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - selfsigned@^1.10.4, selfsigned@^1.9.1: version "1.10.4" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" @@ -17036,6 +16874,11 @@ semver@^6.1.0, semver@^6.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -18041,16 +17884,6 @@ synchronous-promise@^2.0.5: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.6.tgz#de76e0ea2b3558c1e673942e47e714a930fa64aa" integrity sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g== -table@^5.0.2: - version "5.2.3" - resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" - integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== - dependencies: - ajv "^6.9.1" - lodash "^4.17.11" - slice-ansi "^2.1.0" - string-width "^3.0.0" - table@^5.2.3: version "5.4.1" resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" @@ -18222,11 +18055,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tmatch@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/tmatch/-/tmatch-2.0.1.tgz#0c56246f33f30da1b8d3d72895abaf16660f38cf" @@ -18497,10 +18325,10 @@ tsscmp@~1.0.0: resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsutils@^3.7.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.9.1.tgz#2a40dc742943c71eca6d5c1994fcf999956be387" - integrity sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== dependencies: tslib "^1.8.1" @@ -18564,10 +18392,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.3.3333, typescript@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.1.tgz#ba72a6a600b2158139c5dd8850f700e231464202" - integrity sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw== +typescript@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== ua-parser-js@^0.7.18: version "0.7.19" @@ -19783,13 +19611,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"