diff --git a/Composer/.eslintrc.js b/Composer/.eslintrc.js index 39a1885f6e..e92493d57d 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', @@ -81,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, }, @@ -90,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', @@ -104,6 +118,6 @@ module.exports = { 'security/detect-pseudoRandomBytes': 'off', 'security/detect-unsafe-regex': 'off', }, - }, + } ], }; diff --git a/Composer/.npmrc b/Composer/.npmrc index 2ae06b6797..7f27cb3216 100644 --- a/Composer/.npmrc +++ b/Composer/.npmrc @@ -1 +1 @@ -@bfcomposer:registry=https://botbuilder.myget.org/F/botbuilder-declarative/npm/ +@bfcomposer:registry=https://botbuilder.myget.org/F/botbuilder-declarative/npm/ \ No newline at end of file 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..314e55e83c 100644 --- a/Composer/packages/client/.eslintrc.js +++ b/Composer/packages/client/.eslintrc.js @@ -4,4 +4,7 @@ module.exports = { project: './tsconfig.json', tsconfigRootDir: __dirname, }, + rules: { + 'node/no-extraneous-import': 'off', + }, }; 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/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/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/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/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/code-editor/src/LgEditor.tsx b/Composer/packages/lib/code-editor/src/LgEditor.tsx index 02d6f69b7d..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,19 +28,20 @@ export interface LGOption { }; } +export type LanguageServer = { + 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', }; declare global { @@ -62,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 || 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; 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 { diff --git a/Composer/packages/lib/indexers/package.json b/Composer/packages/lib/indexers/package.json index 7389d35561..8c38bf05b0 100644 --- a/Composer/packages/lib/indexers/package.json +++ b/Composer/packages/lib/indexers/package.json @@ -31,6 +31,8 @@ "@bfcomposer/bf-lu": "1.1.2", "botbuilder-lg": "4.7.0-preview.93464", "botframework-expressions": "4.7.0-preview.93464", - "lodash": "^4.17.15" + "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 2c0e980fa1..c2a8178057 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'; @@ -41,6 +40,19 @@ const CS_POLICIES = [ 'upgrade-insecure-requests;', ]; +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) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE'); @@ -101,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, @@ -121,13 +127,21 @@ function launchLanguageServer(socket: rpc.IWebSocket) { server.start(); } -attachLSPServer(wss, server, '/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); + }); + } + }); }); diff --git a/Composer/packages/server/src/types/selfHostCommands.d.ts b/Composer/packages/server/src/types/selfHostCommands.d.ts index e9b36340c8..f0ec598f69 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): Promise; + } } diff --git a/Composer/packages/tools/language-servers/language-generation/package.json b/Composer/packages/tools/language-servers/language-generation/package.json index 317bdfa940..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,13 @@ }, "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": "^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": { "@types/node": "^12.0.4", diff --git a/Composer/yarn.lock b/Composer/yarn.lock index fa75a114bf..59d4f197fc 100644 --- a/Composer/yarn.lock +++ b/Composer/yarn.lock @@ -7661,6 +7661,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" @@ -7716,6 +7724,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" @@ -7784,7 +7804,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== @@ -9494,6 +9514,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" @@ -14797,6 +14822,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" @@ -14804,13 +14836,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"