From 78010729aa913471c4d66d9f5ef6f4a19dd5c3b6 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Thu, 31 Oct 2019 17:49:45 -0700 Subject: [PATCH 01/17] add prod dependency for packaging --- Composer/packages/server/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 0351f2c010..7deaf85ce5 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -80,6 +80,8 @@ "axios": "^0.18.0", "azure-storage": "^2.10.3", "body-parser": "^1.18.3", + "botbuilder-expression-parser": "^4.5.11", + "botbuilder-lg": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/botbuilder-lg/-/4.7.0-preview0.tgz", "cookie-parser": "^1.4.4", "debug": "^4.1.1", "dotenv": "^8.1.0", @@ -99,6 +101,7 @@ "lodash.uniq": "^4.5.0", "lodash": "^4.17.11", "lubuild": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/lubuild/-/1.0.3-preview.tgz", + "ludown": "^1.3.4", "luis-apis": "2.5.1", "minimatch": "^3.0.4", "morgan": "^1.9.1", From 3f747facba5a3fe5462bf72d22d005bd56bd1ba3 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Thu, 28 Nov 2019 15:13:12 -0800 Subject: [PATCH 02/17] explicitly adding format-message-parse to work around yarn workspace install issue --- Composer/packages/server/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 752eed0399..8cee5a4682 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -66,6 +66,7 @@ "express": "^4.16.4", "form-data": "^2.3.3", "format-message": "^6.2.1", + "format-message-parse": "6.2.3", "globby": "^9.1.0", "http-errors": "^1.7.2", "immer": "^2.1.4", From bee898bfe5feacb2d7c4623ae4cf20fe6c8ebd9b Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Fri, 6 Dec 2019 13:53:04 -0800 Subject: [PATCH 03/17] allow prepare-prod to use local .tgz install path --- Composer/packages/lib/indexers/package.json | 2 +- Composer/packages/server/package.json | 1 - Composer/packages/server/prepare-prod.js | 19 ++++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Composer/packages/lib/indexers/package.json b/Composer/packages/lib/indexers/package.json index aede41bb43..b8abd540b9 100644 --- a/Composer/packages/lib/indexers/package.json +++ b/Composer/packages/lib/indexers/package.json @@ -25,7 +25,7 @@ "ts-jest": "^24.1.0" }, "dependencies": { - "botbuilder-expression-parser": "^4.5.11", + "botbuilder-expression-parser": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/botbuilder-expression-parser/-/botbuilder-expression-parser-4.5.11.tgz", "botbuilder-lg": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/botbuilder-lg/-/4.7.0-preview2.tgz", "lodash": "^4.17.15", "ludown": "^1.3.4" diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 8cee5a4682..752eed0399 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -66,7 +66,6 @@ "express": "^4.16.4", "form-data": "^2.3.3", "format-message": "^6.2.1", - "format-message-parse": "6.2.3", "globby": "^9.1.0", "http-errors": "^1.7.2", "immer": "^2.1.4", diff --git a/Composer/packages/server/prepare-prod.js b/Composer/packages/server/prepare-prod.js index 239530851b..6f549be8e2 100644 --- a/Composer/packages/server/prepare-prod.js +++ b/Composer/packages/server/prepare-prod.js @@ -7,18 +7,27 @@ const fs = require('fs'); const path = require('path'); +const packagesDir = process.argv[2] || path.resolve(__dirname, '..'); const packageJsonPath = path.resolve(__dirname, 'package.json'); +function getInstallPath(scope, name) { + const data = require(path.resolve(packagesDir, `./lib/${name}/package.json`)); + const tgzName = `${scope}-${name}-${data.version}.tgz`; + const tgzPath = path.resolve(packagesDir, `./lib/${name}`, tgzName); + const childPath = path.resolve(__dirname, `./lib/${name}`); + const childInstallPath = fs.existsSync(childPath) ? childPath : null; + const tgzInstallPath = fs.existsSync(tgzPath) ? tgzPath : null; + return { [`@${scope}/${name}`]: childInstallPath || tgzInstallPath }; +} + const localPackages = { - '@bfc/indexers': path.resolve(__dirname, './lib/indexers'), - '@bfc/shared': path.resolve(__dirname, './lib/shared'), + ...getInstallPath('bfc', 'indexers'), + ...getInstallPath('bfc', 'shared'), }; const packageJson = require(packageJsonPath); -Object.keys(localPackages).forEach(p => { - packageJson.dependencies[p] = localPackages[p]; -}); +packageJson.dependencies = { ...packageJson.dependencies, ...localPackages }; fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); From c8cbf8e2ddd5571b6d1e38ee489e275ccfb98585 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Fri, 6 Dec 2019 14:10:23 -0800 Subject: [PATCH 04/17] remove ludown to align with stable branch --- Composer/packages/server/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 752eed0399..9eb7ba7a42 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -73,7 +73,6 @@ "jwks-rsa": "^1.6.0", "lodash": "^4.17.15", "lubuild": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/lubuild/-/1.0.3-preview.tgz", - "ludown": "^1.3.4", "luis-apis": "2.5.1", "minimatch": "^3.0.4", "morgan": "^1.9.1" From 262397b4dbe76780bada2229e78daaf6dd02b649 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Thu, 12 Dec 2019 11:10:33 -0800 Subject: [PATCH 05/17] integrate with grpc based app insights --- Composer/packages/server/package.json | 2 ++ Composer/packages/server/src/server.ts | 13 ++++++++++++- .../packages/server/src/types/selfHostCommands.d.ts | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 9eb7ba7a42..8cee5a4682 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -66,6 +66,7 @@ "express": "^4.16.4", "form-data": "^2.3.3", "format-message": "^6.2.1", + "format-message-parse": "6.2.3", "globby": "^9.1.0", "http-errors": "^1.7.2", "immer": "^2.1.4", @@ -73,6 +74,7 @@ "jwks-rsa": "^1.6.0", "lodash": "^4.17.15", "lubuild": "https://botbuilder.myget.org/F/botbuilder-declarative/npm/lubuild/-/1.0.3-preview.tgz", + "ludown": "^1.3.4", "luis-apis": "2.5.1", "minimatch": "^3.0.4", "morgan": "^1.9.1" diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index 58d74569c9..f26b1259e6 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -1,6 +1,5 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. - import 'dotenv/config'; import path from 'path'; import crypto from 'crypto'; @@ -35,6 +34,16 @@ const CS_POLICIES = [ 'upgrade-insecure-requests;', ]; +function useAppInsights() { + const key = process.env.SharedAppInsightsKey; + if (key) { + const configAppInsights = require('commands/configAppInsights') as SelfHostCommands.SetupTelemetry; + if (configAppInsights) { + configAppInsights(key); + } + } +} + app.all('*', function(req: Request, res: Response, next: NextFunction) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE'); @@ -94,6 +103,8 @@ app.get('*', function(req, res) { res.render(path.resolve(__dirname, './public/index.ejs'), { __nonce__: req.__nonce__ }); }); +useAppInsights(); + const port = process.env.PORT || 5000; app.listen(port, () => { if (process.env.NODE_ENV === 'production') { diff --git a/Composer/packages/server/src/types/selfHostCommands.d.ts b/Composer/packages/server/src/types/selfHostCommands.d.ts index e9b36340c8..73b5969482 100644 --- a/Composer/packages/server/src/types/selfHostCommands.d.ts +++ b/Composer/packages/server/src/types/selfHostCommands.d.ts @@ -51,4 +51,7 @@ declare namespace SelfHostCommands { export interface Publish { (argv: PublishARGV): Promise; } + export interface SetupTelemetry { + (key: string): void; + } } From 3149a2099ac96a9fe9b94ce8944621833499eca2 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Thu, 12 Dec 2019 13:30:18 -0800 Subject: [PATCH 06/17] fix importing of commands/configAppInsights --- Composer/packages/server/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index f26b1259e6..7d96d900c8 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -37,7 +37,7 @@ const CS_POLICIES = [ function useAppInsights() { const key = process.env.SharedAppInsightsKey; if (key) { - const configAppInsights = require('commands/configAppInsights') as SelfHostCommands.SetupTelemetry; + const configAppInsights = require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry; if (configAppInsights) { configAppInsights(key); } From 30a49844d7e641be7e01f3acc019895acbc81e6a Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Sat, 14 Dec 2019 11:26:27 -0800 Subject: [PATCH 07/17] revert change to package.json --- Composer/packages/server/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/Composer/packages/server/package.json b/Composer/packages/server/package.json index 70a6f5b656..aea893c42d 100644 --- a/Composer/packages/server/package.json +++ b/Composer/packages/server/package.json @@ -68,7 +68,6 @@ "express": "^4.16.4", "form-data": "^2.3.3", "format-message": "^6.2.1", - "format-message-parse": "6.2.3", "globby": "^9.1.0", "http-errors": "^1.7.2", "immer": "^2.1.4", From cb4e9e055795b1bce08ad1393f9225dd7b673617 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Sat, 14 Dec 2019 16:09:01 -0800 Subject: [PATCH 08/17] add myget feed --- Composer/.npmrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Composer/.npmrc b/Composer/.npmrc index 2ae06b6797..73bd4f6121 100644 --- a/Composer/.npmrc +++ b/Composer/.npmrc @@ -1 +1,3 @@ @bfcomposer:registry=https://botbuilder.myget.org/F/botbuilder-declarative/npm/ +registry=https://botbuilder.myget.org/F/botbuilder-v4-js-daily/npm/ +registry=https://registry.npmjs.org/ From daec326b33c4210be7fa17695a674c273e3d590f Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Sat, 14 Dec 2019 17:29:31 -0800 Subject: [PATCH 09/17] revert .npmrc --- Composer/.npmrc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Composer/.npmrc b/Composer/.npmrc index 73bd4f6121..7f27cb3216 100644 --- a/Composer/.npmrc +++ b/Composer/.npmrc @@ -1,3 +1 @@ -@bfcomposer:registry=https://botbuilder.myget.org/F/botbuilder-declarative/npm/ -registry=https://botbuilder.myget.org/F/botbuilder-v4-js-daily/npm/ -registry=https://registry.npmjs.org/ +@bfcomposer:registry=https://botbuilder.myget.org/F/botbuilder-declarative/npm/ \ No newline at end of file From 6404d73b0287393de7a0a1dd91591ed861f81cb5 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Sun, 15 Dec 2019 15:20:24 -0800 Subject: [PATCH 10/17] add missing dependency --- .../tools/language-servers/language-generation/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Composer/packages/tools/language-servers/language-generation/package.json b/Composer/packages/tools/language-servers/language-generation/package.json index 317bdfa940..e906b1d613 100644 --- a/Composer/packages/tools/language-servers/language-generation/package.json +++ b/Composer/packages/tools/language-servers/language-generation/package.json @@ -17,7 +17,8 @@ "dependencies": { "botbuilder-lg": "4.7.0-preview.93464", "request-light": "^0.2.2", - "vscode-languageserver": "^5.3.0-next" + "vscode-languageserver": "^5.3.0-next", + "vscode-uri": "^1.0.5" }, "devDependencies": { "@types/node": "^12.0.4", From 3606f3734961790f09c7a9095e95566a3b1aca27 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Mon, 16 Dec 2019 10:40:33 -0800 Subject: [PATCH 11/17] enable eslint-node-plugin to enforce node/no-extraneous-import rule --- Composer/.eslintrc.js | 18 ++++++++ Composer/package.json | 1 + Composer/packages/client/.eslintrc.js | 11 +++++ .../extensions/obiformeditor/package.json | 2 + .../extensions/visual-designer/package.json | 2 + .../packages/lib/code-editor/.eslintrc.js | 4 ++ Composer/packages/lib/indexers/package.json | 1 + Composer/packages/lib/shared/package.json | 1 + Composer/packages/server/.eslintrc.js | 2 + .../src/models/connector/selfHostConnector.ts | 4 ++ Composer/packages/server/src/server.ts | 1 + .../language-generation/package.json | 4 ++ Composer/yarn.lock | 41 +++++++++++++++---- 13 files changed, 84 insertions(+), 8 deletions(-) diff --git a/Composer/.eslintrc.js b/Composer/.eslintrc.js index 39a1885f6e..83f5cf32dc 100644 --- a/Composer/.eslintrc.js +++ b/Composer/.eslintrc.js @@ -4,6 +4,7 @@ module.exports = { 'plugin:prettier/recommended', 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:node/recommended', 'prettier/@typescript-eslint', 'plugin:@bfc/bfcomposer/recommended', ], @@ -43,6 +44,17 @@ module.exports = { 'import/first': 'error', 'import/order': ['error', { 'newlines-between': 'always' }], + // node + 'node/no-unsupported-features/es-syntax': 'off', + 'node/no-missing-import': ['error', { + tryExtensions: ['.js', '.tsx', '.ts'] + }], + 'node/no-extraneous-import': 'error', + 'node/no-unpublished-import': 'off', + 'node/no-deprecated-api': ['error', { + ignoreModuleItems: ['url.parse'] + }], + // security 'security/detect-buffer-noassert': 'error', 'security/detect-child-process': 'error', @@ -105,5 +117,11 @@ module.exports = { 'security/detect-unsafe-regex': 'off', }, }, + { + files: ['__tests__/**/*'], + rules: { + 'node/no-missing-import': 'off' + } + } ], }; diff --git a/Composer/package.json b/Composer/package.json index 58cde06e03..48523c786c 100644 --- a/Composer/package.json +++ b/Composer/package.json @@ -85,6 +85,7 @@ "eslint-plugin-import": "^2.18.2", "eslint-plugin-jsx-a11y": "^6.1.3", "eslint-plugin-lodash": "^6.0.0", + "eslint-plugin-node": "^10.0.0", "eslint-plugin-notice": "^0.8.9", "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-react": "^7.17.0", diff --git a/Composer/packages/client/.eslintrc.js b/Composer/packages/client/.eslintrc.js index 5a86f04754..6d8b26f0f3 100644 --- a/Composer/packages/client/.eslintrc.js +++ b/Composer/packages/client/.eslintrc.js @@ -4,4 +4,15 @@ module.exports = { project: './tsconfig.json', tsconfigRootDir: __dirname, }, + rules: { + 'node/no-extraneous-import': 'off', + }, + overrides: [ + { + files: ['__tests__/**/*.js'], + rules: { + 'node/no-missing-import': 'off', + }, + }, + ], }; diff --git a/Composer/packages/extensions/obiformeditor/package.json b/Composer/packages/extensions/obiformeditor/package.json index a74aae2939..e380cd9c64 100644 --- a/Composer/packages/extensions/obiformeditor/package.json +++ b/Composer/packages/extensions/obiformeditor/package.json @@ -31,12 +31,14 @@ "@bfc/indexers": "*", "@bfc/shared": "*", "@bfcomposer/react-jsonschema-form": "1.6.5", + "@emotion/cache": "^10.0.17", "@emotion/core": "^10.0.17", "@types/vscode": "^1.40.0", "@uifabric/fluent-theme": "7.1.4", "@uifabric/styling": "7.7.1", "classnames": "^2.2.6", "format-message": "^6.2.1", + "json-schema": "^0.2.5", "lodash": "^4.17.15", "nanoid": "^2.0.1", "office-ui-fabric-react": "7.62.0", diff --git a/Composer/packages/extensions/visual-designer/package.json b/Composer/packages/extensions/visual-designer/package.json index 10909e14cc..5e169a54b7 100644 --- a/Composer/packages/extensions/visual-designer/package.json +++ b/Composer/packages/extensions/visual-designer/package.json @@ -24,7 +24,9 @@ "lint:fix": "yarn lint --fix" }, "dependencies": { + "@bfc/indexers": "*", "@bfc/shared": "*", + "@emotion/cache": "^10.0.17", "@emotion/core": "^10.0.7", "@types/react": "16.9.0", "classnames": "^2.2.6", diff --git a/Composer/packages/lib/code-editor/.eslintrc.js b/Composer/packages/lib/code-editor/.eslintrc.js index ccecb8e9c0..03d3b403a2 100644 --- a/Composer/packages/lib/code-editor/.eslintrc.js +++ b/Composer/packages/lib/code-editor/.eslintrc.js @@ -4,4 +4,8 @@ module.exports = { project: './tsconfig.json', tsconfigRootDir: __dirname, }, + rules: { + 'node/no-missing-import': 'off', + 'node/no-extraneous-import': 'off', + }, }; diff --git a/Composer/packages/lib/indexers/package.json b/Composer/packages/lib/indexers/package.json index ede73be87b..d8386aea4e 100644 --- a/Composer/packages/lib/indexers/package.json +++ b/Composer/packages/lib/indexers/package.json @@ -30,6 +30,7 @@ "dependencies": { "botbuilder-lg": "4.7.0-preview.93464", "botframework-expressions": "4.7.0-preview.93464", + "format-message": "^6.2.3", "lodash": "^4.17.15", "ludown": "^1.3.4" } diff --git a/Composer/packages/lib/shared/package.json b/Composer/packages/lib/shared/package.json index 0468b585c0..a16101e931 100644 --- a/Composer/packages/lib/shared/package.json +++ b/Composer/packages/lib/shared/package.json @@ -48,6 +48,7 @@ "ts-jest": "^24.1.0" }, "dependencies": { + "botbuilder-lg": "4.7.0-preview.93464", "json-schema": "^0.2.5", "nanoid": "^2.1.6" } diff --git a/Composer/packages/server/.eslintrc.js b/Composer/packages/server/.eslintrc.js index 8cbe448349..51d0ab4ac7 100644 --- a/Composer/packages/server/.eslintrc.js +++ b/Composer/packages/server/.eslintrc.js @@ -3,6 +3,8 @@ module.exports = { parserOptions: { project: './tsconfig.json', tsconfigRootDir: __dirname, + ecmaVersion: 6, + sourceType: 'module', }, rules: { 'security/detect-non-literal-fs-filename': 'off', diff --git a/Composer/packages/server/src/models/connector/selfHostConnector.ts b/Composer/packages/server/src/models/connector/selfHostConnector.ts index 1bd6715497..0eb6dd1f7e 100644 --- a/Composer/packages/server/src/models/connector/selfHostConnector.ts +++ b/Composer/packages/server/src/models/connector/selfHostConnector.ts @@ -13,9 +13,13 @@ export class SelfHostBotConnector implements IBotConnector { constructor(skipLoad?: boolean) { if (!skipLoad) { // for production + //eslint-disable-next-line node/no-missing-require this.buildAsync = require('commands/build').handlerAsync; + //eslint-disable-next-line node/no-missing-require this.publishAsync = require('commands/publish').handlerAsync; + //eslint-disable-next-line node/no-missing-require this.getEditingStatusAsync = require('commands/editingStatus').handlerAsync; + //eslint-disable-next-line node/no-missing-require this.getPublishHistoryAsync = require('commands/getPublishHistory').handlerAsync; } else { // for testing this class diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index f7648682dc..96bac7958f 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -43,6 +43,7 @@ const CS_POLICIES = [ function useAppInsights() { const key = process.env.SharedAppInsightsKey; if (key) { + //eslint-disable-next-line node/no-missing-require const configAppInsights = require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry; if (configAppInsights) { configAppInsights(key); diff --git a/Composer/packages/tools/language-servers/language-generation/package.json b/Composer/packages/tools/language-servers/language-generation/package.json index e906b1d613..f0ab1733ed 100644 --- a/Composer/packages/tools/language-servers/language-generation/package.json +++ b/Composer/packages/tools/language-servers/language-generation/package.json @@ -16,8 +16,12 @@ }, "dependencies": { "botbuilder-lg": "4.7.0-preview.93464", + "botframework-expressions": "4.7.0-preview.93464", + "lodash": "^4.17.13", "request-light": "^0.2.2", "vscode-languageserver": "^5.3.0-next", + "vscode-languageserver-protocol": "^3.15.0-next.8", + "vscode-languageserver-types": "^3.15.0-next.4", "vscode-uri": "^1.0.5" }, "devDependencies": { diff --git a/Composer/yarn.lock b/Composer/yarn.lock index cf73cdd724..2fed5fb69d 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -7229,6 +7229,14 @@ eslint-plugin-emotion@^10.0.14: resolved "https://registry.yarnpkg.com/eslint-plugin-emotion/-/eslint-plugin-emotion-10.0.14.tgz#c643ff2f34f85ae77a65b2056915e939cf7e8129" integrity sha512-kI0hTPA5oo7MAc2YcdF1JcT36TZ1Ci0S5sbA9aojZ3leEPyCH34YBB76/8NQ3/9gybqrekIEuEhr8MP6JZf95Q== +eslint-plugin-es@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976" + integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ== + dependencies: + eslint-utils "^1.4.2" + regexpp "^3.0.0" + eslint-plugin-eslint-plugin@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5" @@ -7284,6 +7292,18 @@ eslint-plugin-lodash@^6.0.0: dependencies: lodash "^4.17.15" +eslint-plugin-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" + integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ== + dependencies: + eslint-plugin-es "^2.0.0" + eslint-utils "^1.4.2" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + eslint-plugin-notice@^0.8.9: version "0.8.9" resolved "https://registry.yarnpkg.com/eslint-plugin-notice/-/eslint-plugin-notice-0.8.9.tgz#b3b55ba218b36a01fd4de998f68c66a8bf238a82" @@ -7352,7 +7372,7 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: +eslint-utils@^1.4.2, eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== @@ -9057,6 +9077,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + immer@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" @@ -14395,6 +14420,13 @@ resolve@1.x, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: dependencies: path-parse "^1.0.6" +resolve@^1.10.1, resolve@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== + dependencies: + path-parse "^1.0.6" + resolve@^1.11.0: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" @@ -14402,13 +14434,6 @@ resolve@^1.11.0: dependencies: path-parse "^1.0.6" -resolve@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" - integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== - 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" From c9573f2c447279254fe35f4fcc29658e20b601f1 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Mon, 16 Dec 2019 16:02:15 -0800 Subject: [PATCH 12/17] streamline eslint settings --- Composer/.eslintrc.js | 10 +++------- Composer/packages/client/.eslintrc.js | 8 -------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/Composer/.eslintrc.js b/Composer/.eslintrc.js index 83f5cf32dc..e92493d57d 100644 --- a/Composer/.eslintrc.js +++ b/Composer/.eslintrc.js @@ -93,7 +93,7 @@ module.exports = { }, overrides: [ { - files: ['**/*.+(test|spec).+(js|jsx|ts|tsx)'], + files: ['**/*.+(test|spec).+(js|jsx|ts|tsx)', 'jest.d.ts'], env: { jest: true, }, @@ -102,6 +102,8 @@ module.exports = { '@typescript-eslint/no-object-literal-type-assertion': 'off', '@typescript-eslint/unbound-method': 'off', + 'node/no-missing-import': 'off', + 'security/detect-buffer-noassert': 'off', 'security/detect-child-process': 'off', 'security/detect-disable-mustache-escape': 'off', @@ -116,12 +118,6 @@ module.exports = { 'security/detect-pseudoRandomBytes': 'off', 'security/detect-unsafe-regex': 'off', }, - }, - { - files: ['__tests__/**/*'], - rules: { - 'node/no-missing-import': 'off' - } } ], }; diff --git a/Composer/packages/client/.eslintrc.js b/Composer/packages/client/.eslintrc.js index 6d8b26f0f3..314e55e83c 100644 --- a/Composer/packages/client/.eslintrc.js +++ b/Composer/packages/client/.eslintrc.js @@ -7,12 +7,4 @@ module.exports = { rules: { 'node/no-extraneous-import': 'off', }, - overrides: [ - { - files: ['__tests__/**/*.js'], - rules: { - 'node/no-missing-import': 'off', - }, - }, - ], }; From b63d33547d6b51a16100c329c73a08d3e5c1043e Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Mon, 16 Dec 2019 17:59:45 -0800 Subject: [PATCH 13/17] integrate async telemetry setup --- Composer/packages/server/src/server.ts | 27 ++++++++++--------- .../server/src/types/selfHostCommands.d.ts | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index 96bac7958f..7feb50e6c1 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -40,15 +40,16 @@ const CS_POLICIES = [ 'upgrade-insecure-requests;', ]; -function useAppInsights() { - const key = process.env.SharedAppInsightsKey; - if (key) { - //eslint-disable-next-line node/no-missing-require - const configAppInsights = require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry; - if (configAppInsights) { - configAppInsights(key); - } - } +const appInsightsKey = process.env.SharedAppInsightsKey; +// default configAppInsights is no-op +let configAppInsights = () => Promise.resolve(); + +if (appInsightsKey) { + //eslint-disable-next-line node/no-missing-require + configAppInsights = (require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry).bind( + null, + appInsightsKey + ); } app.all('*', function(req: Request, res: Response, next: NextFunction) { @@ -69,7 +70,11 @@ app.all('*', function(req: Request, res: Response, next: NextFunction) { ); } - next(); + // configAppInsights can be call many many times (only the first time does sth though) + configAppInsights().then( + () => next(), + err => next(err) + ); }); app.use(`${BASEURL}/`, express.static(path.join(__dirname, './public'), { immutable: true, maxAge: 31536000 })); @@ -110,8 +115,6 @@ app.get('*', function(req, res) { res.render(path.resolve(__dirname, './public/index.ejs'), { __nonce__: req.__nonce__ }); }); -useAppInsights(); - const port = process.env.PORT || 5000; const server = app.listen(port, () => { if (process.env.NODE_ENV === 'production') { diff --git a/Composer/packages/server/src/types/selfHostCommands.d.ts b/Composer/packages/server/src/types/selfHostCommands.d.ts index 73b5969482..f0ec598f69 100644 --- a/Composer/packages/server/src/types/selfHostCommands.d.ts +++ b/Composer/packages/server/src/types/selfHostCommands.d.ts @@ -52,6 +52,6 @@ declare namespace SelfHostCommands { (argv: PublishARGV): Promise; } export interface SetupTelemetry { - (key: string): void; + (key: string): Promise; } } From 3ead03953efd068e22d23c86330967bd7ccb0f36 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Tue, 17 Dec 2019 20:08:59 -0800 Subject: [PATCH 14/17] fix lg-language-server path --- .../client/src/pages/language-generation/code-editor.tsx | 4 +++- Composer/packages/server/src/server.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Composer/packages/client/src/pages/language-generation/code-editor.tsx b/Composer/packages/client/src/pages/language-generation/code-editor.tsx index 7dab5c8265..f4e98a49e6 100644 --- a/Composer/packages/client/src/pages/language-generation/code-editor.tsx +++ b/Composer/packages/client/src/pages/language-generation/code-editor.tsx @@ -11,7 +11,9 @@ import { LgFile } from '@bfc/indexers'; import { editor } from '@bfcomposer/monaco-editor/esm/vs/editor/editor.api'; import { lgIndexer, Diagnostic, combineMessage, isValid } from '@bfc/indexers'; +import { BASEPATH } from '../../constants/index'; import { StoreContext } from '../../store'; +import { resolveToBasePath } from '../../utils/fileUtil'; import * as lgUtil from '../../utils/lgUtil'; const { check } = lgIndexer; @@ -22,7 +24,7 @@ interface CodeEditorProps { line: number; } -const lspServerPath = '/lg-language-server'; +const lspServerPath = resolveToBasePath(BASEPATH, '/lg-language-server'); export default function CodeEditor(props: CodeEditorProps) { const { actions } = useContext(StoreContext); diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index 7feb50e6c1..984c4f063c 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -136,7 +136,7 @@ function launchLanguageServer(socket: rpc.IWebSocket) { server.start(); } -attachLSPServer(wss, server, '/lg-language-server', webSocket => { +attachLSPServer(wss, server, `${BASEURL}/lg-language-server`, webSocket => { // launch language server when the web socket is opened if (webSocket.readyState === webSocket.OPEN) { launchLanguageServer(webSocket); From 88aed66b3302b4fd053bdd44d9fa562acee5f678 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Tue, 17 Dec 2019 22:37:09 -0800 Subject: [PATCH 15/17] allow languageServer to take basePath --- .../packages/lib/code-editor/src/LgEditor.tsx | 24 +++++++++++-------- .../lib/code-editor/src/utils/lspUtil.ts | 6 ++--- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Composer/packages/lib/code-editor/src/LgEditor.tsx b/Composer/packages/lib/code-editor/src/LgEditor.tsx index 02d6f69b7d..94cfc1d79b 100644 --- a/Composer/packages/lib/code-editor/src/LgEditor.tsx +++ b/Composer/packages/lib/code-editor/src/LgEditor.tsx @@ -27,20 +27,24 @@ export interface LGOption { }; } +export type LanguageServer = + | string + | { + host?: string; + hostname?: string; + port?: number | string; + basePath?: string; + path: string; + }; + export interface LGLSPEditorProps extends RichEditorProps { lgOption?: LGOption; - languageServer?: - | { - host?: string; - hostname?: string; - port?: number | string; - path: string; - } - | string; + languageServer?: LanguageServer; } -const defaultLGServer = { +const defaultLGServer: LanguageServer = { path: '/lg-language-server', + basePath: process.env.PUBLIC_URL || '', }; declare global { interface Window { @@ -68,7 +72,7 @@ export function LgEditor(props: LGLSPEditorProps) { }; const { lgOption, languageServer, ...restProps } = props; - const lgServer = languageServer || defaultLGServer; + const lgServer: LanguageServer = languageServer || defaultLGServer; const editorWillMount = (monaco: typeof monacoEditor) => { registerLGLanguage(monaco); diff --git a/Composer/packages/lib/code-editor/src/utils/lspUtil.ts b/Composer/packages/lib/code-editor/src/utils/lspUtil.ts index b45203adbd..f2c4d463f4 100644 --- a/Composer/packages/lib/code-editor/src/utils/lspUtil.ts +++ b/Composer/packages/lib/code-editor/src/utils/lspUtil.ts @@ -12,14 +12,14 @@ import { LanguageClientOptions, } from 'monaco-languageclient'; -export function createUrl(server: { [key: string]: string } | string): string { +export function createUrl(server: { [key: string]: string | number | undefined } | string): string { if (typeof server === 'string') { return normalizeUrl.default(server).replace(/^http/, 'ws'); } - const { host, hostname = location.hostname, port = location.port, path = '/' } = server; + const { host, hostname = location.hostname, port = location.port, path = '/', basePath = '' } = server; const protocol = location.protocol === 'https:' ? 'wss' : 'ws'; const endHost = host || `${hostname}:${port}`; - return normalizeUrl.default(`${protocol}://${endHost}/${path}`); + return normalizeUrl.default(`${protocol}://${endHost}/${basePath}/${path}`); } export function createWebSocket(url: string): WebSocket { From 1d5f658d4b4f0ff279e9fa0c65ccc88c6eeb1c19 Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Wed, 18 Dec 2019 13:11:19 -0800 Subject: [PATCH 16/17] use LgEditorContext to inject language server base path --- .../ExtensionContainer.tsx | 16 ++++++++++---- .../src/Form/widgets/LgEditorWidget.tsx | 3 ++- .../packages/lib/code-editor/src/LgEditor.tsx | 21 +++++++++---------- .../packages/lib/code-editor/src/index.ts | 1 + .../code-editor/src/utils/LgEditorContext.ts | 8 +++++++ 5 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 Composer/packages/lib/code-editor/src/utils/LgEditorContext.ts diff --git a/Composer/packages/client/src/extension-container/ExtensionContainer.tsx b/Composer/packages/client/src/extension-container/ExtensionContainer.tsx index bb37bc25b1..5abc76c03c 100644 --- a/Composer/packages/client/src/extension-container/ExtensionContainer.tsx +++ b/Composer/packages/client/src/extension-container/ExtensionContainer.tsx @@ -3,12 +3,12 @@ import React, { useState, useEffect } from 'react'; import { initializeIcons } from '@uifabric/icons'; +import { LgEditorContext } from '@bfc/code-editor'; import { ShellData, ShellApi } from '@bfc/shared'; -import ApiClient from '../messenger/ApiClient'; - import getEditor from './EditorMap'; - +import { BASEPATH } from './../constants'; +import ApiClient from './../messenger/ApiClient'; import './extensionContainer.css'; initializeIcons(undefined, { disableWarnings: true }); @@ -157,7 +157,15 @@ function ExtensionContainer() { const RealEditor = shellData.data ? getEditor() : null; - return RealEditor && ; + if (RealEditor === null) { + return null; + } + + return ( + + + + ); } export default ExtensionContainer; diff --git a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx index b898618943..b0dc208863 100644 --- a/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx +++ b/Composer/packages/extensions/obiformeditor/src/Form/widgets/LgEditorWidget.tsx @@ -39,6 +39,7 @@ interface LgEditorWidgetProps { name: string; value?: string; height?: number | string; + lgServerPath?: string; onChange: (template?: string) => void; } @@ -119,7 +120,7 @@ export const LgEditorWidget: React.FC = props => { hidePlaceholder={true} helpURL={LG_HELP} languageServer={{ - path: lspServerPath, + path: props.lgServerPath || lspServerPath, }} height={height} /> diff --git a/Composer/packages/lib/code-editor/src/LgEditor.tsx b/Composer/packages/lib/code-editor/src/LgEditor.tsx index 94cfc1d79b..e25b371911 100644 --- a/Composer/packages/lib/code-editor/src/LgEditor.tsx +++ b/Composer/packages/lib/code-editor/src/LgEditor.tsx @@ -11,6 +11,7 @@ import { MonacoServices, MonacoLanguageClient } from 'monaco-languageclient'; import { registerLGLanguage } from './languages'; import { createUrl, createWebSocket, createLanguageClient } from './utils/lspUtil'; import { RichEditor, RichEditorProps } from './RichEditor'; +import LgEditorContext from './utils/LgEditorContext'; const LG_HELP = 'https://github.com/microsoft/BotBuilder-Samples/blob/master/experimental/language-generation/docs/lg-file-format.md'; @@ -27,15 +28,13 @@ export interface LGOption { }; } -export type LanguageServer = - | string - | { - host?: string; - hostname?: string; - port?: number | string; - basePath?: string; - path: string; - }; +export type LanguageServer = { + host?: string; + hostname?: string; + port?: number | string; + basePath?: string; + path: string; +}; export interface LGLSPEditorProps extends RichEditorProps { lgOption?: LGOption; @@ -44,7 +43,6 @@ export interface LGLSPEditorProps extends RichEditorProps { const defaultLGServer: LanguageServer = { path: '/lg-language-server', - basePath: process.env.PUBLIC_URL || '', }; declare global { interface Window { @@ -66,13 +64,14 @@ async function initializeDocuments(lgOption: LGOption | undefined, uri: string) } export function LgEditor(props: LGLSPEditorProps) { + const config = React.useContext(LgEditorContext); const options = { quickSuggestions: true, ...props.options, }; const { lgOption, languageServer, ...restProps } = props; - const lgServer: LanguageServer = languageServer || defaultLGServer; + const lgServer: LanguageServer = { basePath: config.basePath, ...(languageServer || defaultLGServer) }; const editorWillMount = (monaco: typeof monacoEditor) => { registerLGLanguage(monaco); diff --git a/Composer/packages/lib/code-editor/src/index.ts b/Composer/packages/lib/code-editor/src/index.ts index b5a5ed4a21..14512a63a3 100644 --- a/Composer/packages/lib/code-editor/src/index.ts +++ b/Composer/packages/lib/code-editor/src/index.ts @@ -6,3 +6,4 @@ export * from './JsonEditor'; export * from './LgEditor'; export * from './LuEditor'; export * from './RichEditor'; +export { default as LgEditorContext } from './utils/LgEditorContext'; diff --git a/Composer/packages/lib/code-editor/src/utils/LgEditorContext.ts b/Composer/packages/lib/code-editor/src/utils/LgEditorContext.ts new file mode 100644 index 0000000000..06a01e6ad8 --- /dev/null +++ b/Composer/packages/lib/code-editor/src/utils/LgEditorContext.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import React from 'react'; + +const LgEditorContext = React.createContext<{ basePath: string }>({ basePath: '/' }); + +export default LgEditorContext; From f79adcc7099bce365eac5772a8d6d4f4ad52b6ca Mon Sep 17 00:00:00 2001 From: Hai Liu Date: Wed, 18 Dec 2019 16:03:04 -0800 Subject: [PATCH 17/17] refactor how to config app insights --- Composer/packages/server/src/server.ts | 57 +++++++++++++------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/Composer/packages/server/src/server.ts b/Composer/packages/server/src/server.ts index 984c4f063c..c2a8178057 100644 --- a/Composer/packages/server/src/server.ts +++ b/Composer/packages/server/src/server.ts @@ -40,16 +40,17 @@ const CS_POLICIES = [ 'upgrade-insecure-requests;', ]; -const appInsightsKey = process.env.SharedAppInsightsKey; -// default configAppInsights is no-op -let configAppInsights = () => Promise.resolve(); - -if (appInsightsKey) { - //eslint-disable-next-line node/no-missing-require - configAppInsights = (require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry).bind( - null, - appInsightsKey - ); +async function configAppInsightsAsNeeded(): Promise { + const appInsightsKey = process.env.SharedAppInsightsKey; + if (appInsightsKey) { + //eslint-disable-next-line node/no-missing-require + const configAppInsights = require('commands/configAppInsights').default as SelfHostCommands.SetupTelemetry; + await configAppInsights(appInsightsKey); + + return true; + } + + return false; } app.all('*', function(req: Request, res: Response, next: NextFunction) { @@ -70,11 +71,7 @@ app.all('*', function(req: Request, res: Response, next: NextFunction) { ); } - // configAppInsights can be call many many times (only the first time does sth though) - configAppInsights().then( - () => next(), - err => next(err) - ); + next(); }); app.use(`${BASEURL}/`, express.static(path.join(__dirname, './public'), { immutable: true, maxAge: 31536000 })); @@ -116,12 +113,6 @@ app.get('*', function(req, res) { }); const port = process.env.PORT || 5000; -const server = app.listen(port, () => { - if (process.env.NODE_ENV === 'production') { - // eslint-disable-next-line no-console - console.log(`\n\nComposer now running at:\n\nhttp://localhost:${port}\n`); - } -}); const wss: ws.Server = new ws.Server({ noServer: true, @@ -136,13 +127,21 @@ function launchLanguageServer(socket: rpc.IWebSocket) { server.start(); } -attachLSPServer(wss, server, `${BASEURL}/lg-language-server`, webSocket => { - // launch language server when the web socket is opened - if (webSocket.readyState === webSocket.OPEN) { - launchLanguageServer(webSocket); - } else { - webSocket.on('open', () => { +configAppInsightsAsNeeded().then(() => { + const server = app.listen(port, () => { + if (process.env.NODE_ENV === 'production') { + // eslint-disable-next-line no-console + console.log(`\n\nComposer now running at:\n\nhttp://localhost:${port}\n`); + } + }); + attachLSPServer(wss, server, `${BASEURL}/lg-language-server`, webSocket => { + // launch language server when the web socket is opened + if (webSocket.readyState === webSocket.OPEN) { launchLanguageServer(webSocket); - }); - } + } else { + webSocket.on('open', () => { + launchLanguageServer(webSocket); + }); + } + }); });