+
{children}
);
diff --git a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/NodeRendererContext.ts b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/NodeRendererContext.ts
index 4a8cc7d126..d78c9e64e5 100644
--- a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/NodeRendererContext.ts
+++ b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/NodeRendererContext.ts
@@ -13,11 +13,12 @@ export interface NodeRendererContextValue {
customSchemas: OBISchema[];
}
-export const NodeRendererContext = React.createContext
({
+export const defaultRendererContextValue = {
focusedId: '',
focusedEvent: '',
focusedTab: '',
clipboardActions: [],
- dialogFactory: new DialogFactory(),
+ dialogFactory: new DialogFactory({}),
customSchemas: [],
-});
+};
+export const NodeRendererContext = React.createContext(defaultRendererContextValue);
diff --git a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/SelectionContext.ts b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/SelectionContext.ts
index a7b576af26..c3a48ee572 100644
--- a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/SelectionContext.ts
+++ b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/contexts/SelectionContext.ts
@@ -13,10 +13,11 @@ export interface SelectionContextData {
selectableElements: SelectorElement[];
}
-export const SelectionContext = React.createContext({
+export const defaultSelectionContextValue = {
getNodeIndex: (_: string): number => 0,
getSelectableIds: () => [],
selectedIds: [] as string[],
setSelectedIds: () => null,
selectableElements: [],
-});
+};
+export const SelectionContext = React.createContext(defaultSelectionContextValue);
diff --git a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/hooks/useWindowDimensions.ts b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/hooks/useWindowDimensions.ts
deleted file mode 100644
index 6707cce97a..0000000000
--- a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/hooks/useWindowDimensions.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT License.
-
-import { useState, useEffect, useRef } from 'react';
-import debounce from 'lodash/debounce';
-
-const getWindowDimensions = () => {
- const { innerWidth: width, innerHeight: height } = window;
- return {
- width,
- height,
- };
-};
-
-export const useWindowDimensions = () => {
- const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());
- const handleResize = useRef(debounce(() => setWindowDimensions(getWindowDimensions()), 200)).current;
-
- useEffect(() => {
- window.addEventListener('resize', handleResize);
- return () => window.removeEventListener('resize', handleResize);
- }, []);
-
- return windowDimensions;
-};
diff --git a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/renderers/NodeWrapper.tsx b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/renderers/NodeWrapper.tsx
index 3255718da8..c8799f64df 100644
--- a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/renderers/NodeWrapper.tsx
+++ b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/renderers/NodeWrapper.tsx
@@ -74,6 +74,7 @@ export const ActionNodeWrapper: FC = ({ id, tab, data, onEvent
${!nodeFocused && nodeBorderHoveredStyle}
}
`}
+ data-testid="ActionNodeWrapper"
{...declareElementAttributes(selectableId, id)}
aria-label={generateSDKTitle(data, '', tab)}
onClick={(e) => {
diff --git a/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/utils/mapKeyboardCommandToEditorEvent.ts.ts b/Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/utils/mapKeyboardCommandToEditorEvent.ts
similarity index 100%
rename from Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/utils/mapKeyboardCommandToEditorEvent.ts.ts
rename to Composer/packages/extensions/adaptive-flow/src/adaptive-flow-editor/utils/mapKeyboardCommandToEditorEvent.ts
diff --git a/Composer/packages/extensions/extension/src/index.ts b/Composer/packages/extensions/extension/src/index.ts
index 3ecebc1a7c..931425d29c 100644
--- a/Composer/packages/extensions/extension/src/index.ts
+++ b/Composer/packages/extensions/extension/src/index.ts
@@ -1,9 +1,12 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import { Extension } from './components';
+import extensionContext from './extensionContext';
export * from './components';
export * from './hooks';
export * from './types';
export default Extension;
+
+export const ExtensionContext = extensionContext;
From ab5dc06f936af7910235850aa4b66d2bb5bbcd12 Mon Sep 17 00:00:00 2001
From: liweitian
Date: Thu, 2 Jul 2020 00:57:47 +0800
Subject: [PATCH 2/3] update a test case (#3531)
Co-authored-by: Chris Whitten
---
.../CreationFlow/LocationBrowser/FileSelector.test.tsx | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/Composer/packages/client/__tests__/components/CreationFlow/LocationBrowser/FileSelector.test.tsx b/Composer/packages/client/__tests__/components/CreationFlow/LocationBrowser/FileSelector.test.tsx
index 4454a51810..2cd9b23ebc 100644
--- a/Composer/packages/client/__tests__/components/CreationFlow/LocationBrowser/FileSelector.test.tsx
+++ b/Composer/packages/client/__tests__/components/CreationFlow/LocationBrowser/FileSelector.test.tsx
@@ -82,14 +82,18 @@ describe('', () => {
expect(await component.findByText('You do not have permission to save bots here')).toBeInTheDocument();
});
- it('should update folder name', async () => {
+ it('should create a new folder', async () => {
const component = renderComponent();
const createFolderBtn = await component.findByText('create new folder');
fireEvent.click(createFolderBtn);
const textField = await component.findByTestId('newFolderTextField');
fireEvent.change(textField, { target: { value: 'newFolder' } });
fireEvent.keyDown(textField, { key: 'Enter' });
- //locally this should be 'C:\\test-folder\\Desktop', but it should be 'C:/test-folder/Desktop' online
- expect(createFolder).toBeCalledWith('C:/test-folder/Desktop', 'newFolder');
+ //locally this should be 'C:\\test-folder\\Desktop', but online it should be 'C:/test-folder/Desktop'
+ expect(
+ createFolder.mock.calls[0][0] === 'C:/test-folder/Desktop' ||
+ createFolder.mock.calls[0][0] === 'C:\\test-folder\\Desktop'
+ ).toBeTruthy();
+ expect(createFolder.mock.calls[0][1]).toBe('newFolder');
});
});
From 4242f7c990c0866823f1c2996689eefbc9971552 Mon Sep 17 00:00:00 2001
From: Zhixiang Zhan
Date: Thu, 2 Jul 2020 01:46:01 +0800
Subject: [PATCH 3/3] fix lgWorker test failure (#3529)
Co-authored-by: Chris Whitten
---
.../language-generation/src/lgParser.ts | 42 +++++++++++++++----
1 file changed, 35 insertions(+), 7 deletions(-)
diff --git a/Composer/packages/tools/language-servers/language-generation/src/lgParser.ts b/Composer/packages/tools/language-servers/language-generation/src/lgParser.ts
index 9a2621802d..07a597bd6b 100644
--- a/Composer/packages/tools/language-servers/language-generation/src/lgParser.ts
+++ b/Composer/packages/tools/language-servers/language-generation/src/lgParser.ts
@@ -4,28 +4,51 @@
import { fork, ChildProcess } from 'child_process';
import path from 'path';
+import { Templates, Diagnostic } from 'botbuilder-lg';
+import { importResolverGenerator } from '@bfc/shared';
import { ResolverResource } from '@bfc/shared';
import uniqueId from 'lodash/uniqueId';
const isTest = process.env?.NODE_ENV === 'test';
-
export interface WorkerMsg {
id: string;
error?: any;
payload?: any;
}
-// Wrapper class
-export class LgParser {
+function createDiagnostic(diagnostic: Diagnostic) {
+ const { code, range, severity, source, message } = diagnostic;
+ const { start, end } = range;
+ return {
+ code,
+ range: {
+ start: { line: start.line, character: start.character },
+ end: { line: end.line, character: end.character },
+ },
+ severity,
+ source,
+ message,
+ };
+}
+
+class LgParserWithoutWorker {
+ public async parseText(content: string, id: string, resources: ResolverResource[]) {
+ const resolver = importResolverGenerator(resources, '.lg');
+ const { allTemplates, allDiagnostics } = Templates.parseText(content, id, resolver);
+ const templates = allTemplates.map((item) => ({ name: item.name, parameters: item.parameters, body: item.body }));
+ const diagnostics = allDiagnostics.map((item) => createDiagnostic(item));
+ return { templates, diagnostics };
+ }
+}
+
+class LgParserWithWorker {
private worker: ChildProcess;
private resolves = {};
private rejects = {};
constructor() {
- const fileName = isTest ? 'lgWorker.ts' : 'lgWorker.js';
- const execArgv = isTest ? ['-r', 'ts-node/register'] : [];
- const workerScriptPath = path.join(__dirname, fileName);
- this.worker = fork(workerScriptPath, [], { execArgv });
+ const workerScriptPath = path.join(__dirname, 'lgWorker.js');
+ this.worker = fork(workerScriptPath, []);
this.worker.on('message', this.handleMsg.bind(this));
}
@@ -55,3 +78,8 @@ export class LgParser {
delete this.rejects[id];
}
}
+
+// Do not use worker when running test.
+const LgParser = isTest ? LgParserWithoutWorker : LgParserWithWorker;
+
+export { LgParser };