diff --git a/.travis.yml b/.travis.yml index 8e0c14ec9760..a67cab3004ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,7 +65,7 @@ before_install: | install: - travis_wait 5 npm ci - npm run clean - - npm run vscode:prepublish + - npx gulp prePublishNonBundle - npx gulp hygiene-modified - python -m pip install --upgrade -r requirements.txt - python -m pip install -t ./pythonFiles/experimental/ptvsd git+https://github.com/Microsoft/ptvsd/ @@ -131,6 +131,8 @@ script: npm run clean; vsce package; azure storage blob upload python*.vsix $AZURE_STORAGE_CONTAINER ms-python-insiders.vsix --account-name $AZURE_STORAGE_ACCOUNT --account-key $AZURE_STORAGE_ACCESS_KEY --quiet; + npm run package; + azure storage blob upload python*.vsix $AZURE_STORAGE_CONTAINER ms-python-insiders-bundled.vsix --account-name $AZURE_STORAGE_ACCOUNT --account-key $AZURE_STORAGE_ACCESS_KEY --quiet; fi - if [[ $AZURE_STORAGE_ACCOUNT && "$TRAVIS_BRANCH" == release* && "$TRAVIS_PULL_REQUEST" == "false" ]]; then npm run clean; diff --git a/.vscodeignore b/.vscodeignore index 285ada34cf13..874fa7010476 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,4 +1,6 @@ +!out/**/*.map **/*.map +*.vsix .appveyor.yml .editorconfig .eslintrc @@ -26,7 +28,7 @@ typings.json vsc-extension-quickstart.md vscode-python-signing.* webpack.config.js -webpack.default.config.js +webpack.datascience-ui.config.js .github/** .mocha-reporter/** diff --git a/build/constants.js b/build/constants.js index 4f4ec35998d7..e0a56db3e4a3 100644 --- a/build/constants.js +++ b/build/constants.js @@ -11,3 +11,4 @@ function getListOfExcludedFiles() { return files.map(file => path.join(exports.ExtensionRootDir, file.replace(/\//g, path.sep))); } exports.filesNotToCheck = getListOfExcludedFiles(); +exports.isCI = process.env.TRAVIS === 'true' || process.env.TF_BUILD !== undefined; diff --git a/build/constants.ts b/build/constants.ts index 4b8ba9fb07dd..7866cdedc2e8 100644 --- a/build/constants.ts +++ b/build/constants.ts @@ -15,3 +15,5 @@ function getListOfExcludedFiles() { } export const filesNotToCheck: string[] = getListOfExcludedFiles(); + +export const isCI = process.env.TRAVIS === 'true' || process.env.TF_BUILD !== undefined; diff --git a/build/datascience/inlinePlugin.js b/build/datascience/inlinePlugin.js deleted file mode 100644 index b14e08e56c26..000000000000 --- a/build/datascience/inlinePlugin.js +++ /dev/null @@ -1,52 +0,0 @@ -class HelloWorldPlugin { - apply(compiler) { - compiler.hooks.done.tap('Hello World Plugin', ( - stats /* stats is passed as argument when done hook is tapped. */ - ) => { - console.log('Hello World!'); - }); - } -} - -//module.exports = HelloWorldPlugin; - -class InlineResolverPlugin { - constructor(regex) { - this.source = 'described-resolve'; // Before plugin - this.target = 'resolve'; // After plugin - this.regex = regex; - } - - apply(resolver) { - const normal = resolver.ensureHook(this.target) - const skip = resolver.ensureHook('resolved'); - resolver.getHook(this.source).tapAsync('InlineResolverPlugin', (request, resolveContext, callback) => { - const parsed = resolver.parse(request.request); - if (parsed.request == './block-elements.json') { - const source = { - foo: 'bar' - }; - console.log(`Skipping request for ${parsed.request}\n`); - return callback(null, `${JSON.stringify(source)}`); - } - - resolver.doResolve(normal, request, null, resolveContext, callback); - }); - } -} - -// module.exports = InlineResolverPlugin; - -class InlineCompilerPlugin { - constructor(regex) { - this.regex = regex; - } - - apply(compiler) { - compiler.plugin("after-emit", function(compilation) { - console.log('Done emitting'); - }); - } -} - -module.exports = InlineCompilerPlugin; diff --git a/build/webpack/common.js b/build/webpack/common.js new file mode 100644 index 000000000000..8e990bb6d4be --- /dev/null +++ b/build/webpack/common.js @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const webpack_bundle_analyzer_1 = require("webpack-bundle-analyzer"); +const constants_1 = require("../constants"); +exports.nodeModulesToExternalize = [ + 'unicode/category/Lu', + 'unicode/category/Ll', + 'unicode/category/Lt', + 'unicode/category/Lo', + 'unicode/category/Lm', + 'unicode/category/Nl', + 'unicode/category/Mn', + 'unicode/category/Mc', + 'unicode/category/Nd', + 'unicode/category/Pc' +]; +function getDefaultPlugins(name) { + const plugins = []; + if (!constants_1.isCI) { + plugins.push(new webpack_bundle_analyzer_1.BundleAnalyzerPlugin({ + analyzerMode: 'static', + reportFilename: `${name}.html` + })); + } + return plugins; +} +exports.getDefaultPlugins = getDefaultPlugins; diff --git a/build/webpack/common.ts b/build/webpack/common.ts new file mode 100644 index 000000000000..c1d7b92c31ca --- /dev/null +++ b/build/webpack/common.ts @@ -0,0 +1,33 @@ + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; +import { isCI } from '../constants'; +export const nodeModulesToExternalize = [ + 'unicode/category/Lu', + 'unicode/category/Ll', + 'unicode/category/Lt', + 'unicode/category/Lo', + 'unicode/category/Lm', + 'unicode/category/Nl', + 'unicode/category/Mn', + 'unicode/category/Mc', + 'unicode/category/Nd', + 'unicode/category/Pc' +]; + +export function getDefaultPlugins(name: 'extension' | 'debugger' | 'dependencies' | 'datascience-ui') { + const plugins = []; + if (!isCI) { + plugins.push( + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + reportFilename: `${name}.html` + }) + ); + } + return plugins; +} diff --git a/build/webpack/loaders/externalizeDependencies.js b/build/webpack/loaders/externalizeDependencies.js new file mode 100644 index 000000000000..9ae5ec711517 --- /dev/null +++ b/build/webpack/loaders/externalizeDependencies.js @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const common_1 = require("../common"); +function replaceModule(contents, moduleName, quotes) { + const stringToSearch = `${quotes}${moduleName}${quotes}`; + const stringToReplaceWith = `${quotes}./node_modules/${moduleName}${quotes}`; + return contents.replace(new RegExp(stringToSearch, 'gm'), stringToReplaceWith); +} +// tslint:disable:no-default-export no-invalid-this +function default_1(source) { + common_1.nodeModulesToExternalize.forEach(moduleName => { + if (source.indexOf(moduleName) > 0) { + source = replaceModule(source, moduleName, '"'); + source = replaceModule(source, moduleName, '\''); + } + }); + return source; +} +exports.default = default_1; diff --git a/build/webpack/loaders/externalizeDependencies.ts b/build/webpack/loaders/externalizeDependencies.ts new file mode 100644 index 000000000000..a6771cad5ad3 --- /dev/null +++ b/build/webpack/loaders/externalizeDependencies.ts @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { nodeModulesToExternalize } from '../common'; + +function replaceModule(contents: string, moduleName: string, quotes: '"' | '\''): string { + const stringToSearch = `${quotes}${moduleName}${quotes}`; + const stringToReplaceWith = `${quotes}./node_modules/${moduleName}${quotes}`; + return contents.replace(new RegExp(stringToSearch, 'gm'), stringToReplaceWith); +} +// tslint:disable:no-default-export no-invalid-this +export default function (source: string) { + nodeModulesToExternalize.forEach(moduleName => { + if (source.indexOf(moduleName) > 0) { + source = replaceModule(source, moduleName, '"'); + source = replaceModule(source, moduleName, '\''); + } + }); + return source; +} diff --git a/build/webpack/loaders/fixEvalRequire.js b/build/webpack/loaders/fixEvalRequire.js new file mode 100644 index 000000000000..53ae03e46b84 --- /dev/null +++ b/build/webpack/loaders/fixEvalRequire.js @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +// tslint:disable:no-default-export no-invalid-this +function default_1(source) { + if (source.indexOf('eval') > 0) { + let matches = source.match(/eval\('require'\)\('.*'\)/gm) || []; + matches.forEach(item => { + const moduleName = item.split('\'')[3]; + const stringToReplaceWith = `require('${moduleName}')`; + source = source.replace(item, stringToReplaceWith); + }); + matches = source.match(/eval\("require"\)\(".*"\)/gm) || []; + matches.forEach(item => { + const moduleName = item.split('\'')[3]; + const stringToReplaceWith = `require("${moduleName}")`; + source = source.replace(item, stringToReplaceWith); + }); + } + return source; +} +exports.default = default_1; diff --git a/build/webpack/loaders/fixEvalRequire.ts b/build/webpack/loaders/fixEvalRequire.ts new file mode 100644 index 000000000000..7cdc031d830a --- /dev/null +++ b/build/webpack/loaders/fixEvalRequire.ts @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +// tslint:disable:no-default-export no-invalid-this +export default function (source: string) { + if (source.indexOf('eval') > 0) { + let matches = source.match(/eval\('require'\)\('.*'\)/gm) || []; + matches.forEach(item => { + const moduleName = item.split('\'')[3]; + const stringToReplaceWith = `require('${moduleName}')`; + source = source.replace(item, stringToReplaceWith); + }); + matches = source.match(/eval\("require"\)\(".*"\)/gm) || []; + matches.forEach(item => { + const moduleName = item.split('\'')[3]; + const stringToReplaceWith = `require("${moduleName}")`; + source = source.replace(item, stringToReplaceWith); + }); + } + return source; +} diff --git a/build/datascience/jsonloader.js b/build/webpack/loaders/jsonloader.js similarity index 97% rename from build/datascience/jsonloader.js rename to build/webpack/loaders/jsonloader.js index d8198617422d..a5c8927a7d3a 100644 --- a/build/datascience/jsonloader.js +++ b/build/webpack/loaders/jsonloader.js @@ -1,8 +1,8 @@ -// For some reason this has to be in commonjs format - -module.exports = function(source) { - - // Just inline the source and fix up defaults so that they don't - // mess up the logic in the setOptions.js file - return `module.exports = ${source}\nmodule.exports.default = false`; -} +// For some reason this has to be in commonjs format + +module.exports = function(source) { + + // Just inline the source and fix up defaults so that they don't + // mess up the logic in the setOptions.js file + return `module.exports = ${source}\nmodule.exports.default = false`; +} diff --git a/build/datascience/remarkLoader.js b/build/webpack/loaders/remarkLoader.js similarity index 72% rename from build/datascience/remarkLoader.js rename to build/webpack/loaders/remarkLoader.js index 6abc812f60a6..8dde61d300ea 100644 --- a/build/datascience/remarkLoader.js +++ b/build/webpack/loaders/remarkLoader.js @@ -1,8 +1,9 @@ -// For some reason this has to be in commonjs format - -module.exports = function(source) { - - // Just inline the source and fix up defaults so that they don't - // mess up the logic in the setOptions.js file - return `module.exports = ${source}\nmodule.exports.default = false`; - } +// For some reason this has to be in commonjs format + +module.exports = function(source) { + + // Just inline the source and fix up defaults so that they don't + // mess up the logic in the setOptions.js file + return `module.exports = ${source}\nmodule.exports.default = false`; + + } diff --git a/build/webpack/webpack.datascience-ui.config.js b/build/webpack/webpack.datascience-ui.config.js new file mode 100644 index 000000000000..1e1956db220b --- /dev/null +++ b/build/webpack/webpack.datascience-ui.config.js @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const path = require("path"); +const common_1 = require("./common"); +// tslint:disable-next-line:no-var-requires no-require-imports +const FixDefaultImportPlugin = require('webpack-fix-default-import-plugin'); +const configFileName = 'tsconfig.datascience-ui.json'; +const config = { + entry: ['babel-polyfill', './src/datascience-ui/history-react/index.tsx'], + output: { + path: path.join(__dirname, '..', '..', 'out'), + filename: 'datascience-ui/history-react/index_bundle.js', + publicPath: path.join(__dirname, '..', '..') + }, + mode: 'production', + // Use 'eval' for release and `eval-source-map` for development. + // We need to use one where source is embedded, due to webviews (they restrict resources to specific schemes, + // this seems to prevent chrome from downloading the source maps) + devtool: 'eval', + node: { + fs: 'empty' + }, + plugins: [ + ...common_1.getDefaultPlugins('datascience-ui'), + new HtmlWebpackPlugin({ template: 'src/datascience-ui/history-react/index.html', filename: 'datascience-ui/history-react/index.html' }), + new FixDefaultImportPlugin(), + new CopyWebpackPlugin([ + { from: './**/*.png', to: '.' }, + { from: './**/*.svg', to: '.' }, + { from: './**/*.css', to: '.' }, + { from: './**/*theme*.json', to: '.' } + ]) + ], + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ['.ts', '.tsx', '.js', '.json'] + }, + module: { + rules: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. + { + test: /\.tsx?$/, + use: { + loader: 'awesome-typescript-loader', + options: { + configFileName, + reportFiles: [ + 'src/datascience-ui/**/*.{ts,tsx}' + ] + } + } + }, + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader' + ] + }, + { + test: /\.js$/, + include: /node_modules.*remark.*default.*js/, + use: [ + { + loader: path.resolve('./build/datascience/remarkLoader.js'), + options: {} + } + ] + }, + { + test: /\.json$/, + type: 'javascript/auto', + include: /node_modules.*remark.*/, + use: [ + { + loader: path.resolve('./build/webpack/loaders/jsonloader.js'), + options: {} + } + ] + } + ] + } +}; +// tslint:disable-next-line:no-default-export +exports.default = config; diff --git a/build/webpack/webpack.datascience-ui.config.ts b/build/webpack/webpack.datascience-ui.config.ts new file mode 100644 index 000000000000..d531ae4a6c83 --- /dev/null +++ b/build/webpack/webpack.datascience-ui.config.ts @@ -0,0 +1,96 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as CopyWebpackPlugin from 'copy-webpack-plugin'; +import * as HtmlWebpackPlugin from 'html-webpack-plugin'; +import * as path from 'path'; +import * as webpack from 'webpack'; +import { getDefaultPlugins } from './common'; + +// tslint:disable-next-line:no-var-requires no-require-imports +const FixDefaultImportPlugin = require('webpack-fix-default-import-plugin'); + +const configFileName = 'tsconfig.datascience-ui.json'; + +const config: webpack.Configuration = { + entry: ['babel-polyfill', './src/datascience-ui/history-react/index.tsx'], + output: { + path: path.join(__dirname, '..', '..', 'out'), + filename: 'datascience-ui/history-react/index_bundle.js', + publicPath: path.join(__dirname, '..', '..') + }, + mode: 'production', // Leave as is, we'll need to see stack traces when there are errors. + // Use 'eval' for release and `eval-source-map` for development. + // We need to use one where source is embedded, due to webviews (they restrict resources to specific schemes, + // this seems to prevent chrome from downloading the source maps) + devtool: 'eval', + node: { + fs: 'empty' + }, + plugins: [ + ...getDefaultPlugins('datascience-ui'), + new HtmlWebpackPlugin({ template: 'src/datascience-ui/history-react/index.html', filename: 'datascience-ui/history-react/index.html' }), + new FixDefaultImportPlugin(), + new CopyWebpackPlugin([ + { from: './**/*.png', to: '.' }, + { from: './**/*.svg', to: '.' }, + { from: './**/*.css', to: '.' }, + { from: './**/*theme*.json', to: '.' } + ]) + ], + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ['.ts', '.tsx', '.js', '.json'] + }, + + module: { + rules: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. + { + test: /\.tsx?$/, + use: { + loader: 'awesome-typescript-loader', + options: { + configFileName, + reportFiles: [ + 'src/datascience-ui/**/*.{ts,tsx}' + ] + } + } + }, + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader' + ] + }, + { + test: /\.js$/, + include: /node_modules.*remark.*default.*js/, + use: [ + { + loader: path.resolve('./build/datascience/remarkLoader.js'), + options: {} + } + ] + }, + { + test: /\.json$/, + type: 'javascript/auto', + include: /node_modules.*remark.*/, + use: [ + { + loader: path.resolve('./build/webpack/loaders/jsonloader.js'), + options: {} + } + ] + } + ] + } +}; + +// tslint:disable-next-line:no-default-export +export default config; diff --git a/build/webpack/webpack.extension.config.js b/build/webpack/webpack.extension.config.js new file mode 100644 index 000000000000..fbe7e687ae70 --- /dev/null +++ b/build/webpack/webpack.extension.config.js @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const glob = require("glob"); +const path = require("path"); +const tsconfig_paths_webpack_plugin_1 = require("tsconfig-paths-webpack-plugin"); +const constants_1 = require("../constants"); +const common_1 = require("./common"); +// tslint:disable-next-line:no-var-requires no-require-imports +const configFileName = path.join(constants_1.ExtensionRootDir, 'tsconfig.extension.json'); +// Some modules will be pre-genearted and stored in out/.. dir and they'll be referenced via NormalModuleReplacementPlugin +// We need to ensure they do not get bundled into the output (as they are large). +const existingModulesInOutDir = getListOfExistingModulesInOutDir(); +function getListOfExistingModulesInOutDir() { + const outDir = path.join(constants_1.ExtensionRootDir, 'out', 'client'); + const files = glob.sync('**/*.js', { sync: true, cwd: outDir }); + return files.map(filePath => `./${filePath.slice(0, -3)}`); +} +const config = { + mode: 'production', + target: 'node', + entry: { + extension: './src/client/extension.ts', + 'debugger/debugAdapter/main': './src/client/debugger/debugAdapter/main.ts' + }, + devtool: 'source-map', + node: { + __dirname: false + }, + module: { + rules: [ + { + // JupyterServices imports node-fetch using `eval`. + test: /@jupyterlab\/services\/.*js$/, + use: [ + { + loader: path.join(__dirname, 'loaders', 'fixEvalRequire.js') + } + ] + }, + { + test: /\.ts$/, + use: [ + { + loader: path.join(__dirname, 'loaders', 'externalizeDependencies.js') + } + ] + }, + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + externals: [ + 'vscode', + 'commonjs', + ...existingModulesInOutDir + ], + plugins: [ + ...common_1.getDefaultPlugins('extension') + ], + resolve: { + extensions: ['.ts', '.js'], + plugins: [ + new tsconfig_paths_webpack_plugin_1.TsconfigPathsPlugin({ configFile: configFileName }) + ] + }, + output: { + filename: '[name].js', + path: path.resolve(constants_1.ExtensionRootDir, 'out', 'client'), + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]' + } +}; +// tslint:disable-next-line:no-default-export +exports.default = config; diff --git a/build/webpack/webpack.extension.config.ts b/build/webpack/webpack.extension.config.ts new file mode 100644 index 000000000000..1ce78feb3b77 --- /dev/null +++ b/build/webpack/webpack.extension.config.ts @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as glob from 'glob'; +import * as path from 'path'; +import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin'; +import * as webpack from 'webpack'; +import { ExtensionRootDir } from '../constants'; +import { getDefaultPlugins } from './common'; + +// tslint:disable-next-line:no-var-requires no-require-imports +const configFileName = path.join(ExtensionRootDir, 'tsconfig.extension.json'); + +// Some modules will be pre-genearted and stored in out/.. dir and they'll be referenced via NormalModuleReplacementPlugin +// We need to ensure they do not get bundled into the output (as they are large). +const existingModulesInOutDir = getListOfExistingModulesInOutDir(); +function getListOfExistingModulesInOutDir() { + const outDir = path.join(ExtensionRootDir, 'out', 'client'); + const files = glob.sync('**/*.js', { sync: true, cwd: outDir }); + return files.map(filePath => `./${filePath.slice(0, -3)}`); +} + +const config: webpack.Configuration = { + mode: 'production', + target: 'node', + entry: { + extension: './src/client/extension.ts', + 'debugger/debugAdapter/main': './src/client/debugger/debugAdapter/main.ts' + }, + devtool: 'source-map', + node: { + __dirname: false + }, + module: { + rules: [ + { + // JupyterServices imports node-fetch using `eval`. + test: /@jupyterlab\/services\/.*js$/, + use: [ + { + loader: path.join(__dirname, 'loaders', 'fixEvalRequire.js') + } + ] + }, + { + test: /\.ts$/, + use: [ + { + loader: path.join(__dirname, 'loaders', 'externalizeDependencies.js') + } + ] + }, + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + externals: [ + 'vscode', + 'commonjs', + ...existingModulesInOutDir + ], + plugins: [ + ...getDefaultPlugins('extension') + ], + resolve: { + extensions: ['.ts', '.js'], + plugins: [ + new TsconfigPathsPlugin({ configFile: configFileName }) + ] + }, + output: { + filename: '[name].js', + path: path.resolve(ExtensionRootDir, 'out', 'client'), + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]' + } +}; + +// tslint:disable-next-line:no-default-export +export default config; diff --git a/build/webpack/webpack.extension.dependencies.config.js b/build/webpack/webpack.extension.dependencies.config.js new file mode 100644 index 000000000000..560bb0f1821c --- /dev/null +++ b/build/webpack/webpack.extension.dependencies.config.js @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const constants_1 = require("../constants"); +const common_1 = require("./common"); +const entryItems = {}; +common_1.nodeModulesToExternalize.forEach(moduleName => { + entryItems[`node_modules/${moduleName}`] = `./node_modules/${moduleName}`; +}); +const config = { + mode: 'production', + target: 'node', + entry: entryItems, + devtool: 'source-map', + node: { + __dirname: false + }, + externals: [ + 'vscode', + 'commonjs' + ], + plugins: [ + ...common_1.getDefaultPlugins('dependencies') + ], + resolve: { + extensions: ['.js'] + }, + output: { + filename: '[name].js', + path: path.resolve(constants_1.ExtensionRootDir, 'out', 'client'), + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]' + } +}; +// tslint:disable-next-line:no-default-export +exports.default = config; diff --git a/build/webpack/webpack.extension.dependencies.config.ts b/build/webpack/webpack.extension.dependencies.config.ts new file mode 100644 index 000000000000..a31c5388185d --- /dev/null +++ b/build/webpack/webpack.extension.dependencies.config.ts @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as path from 'path'; +import * as webpack from 'webpack'; +import { ExtensionRootDir } from '../constants'; +import { getDefaultPlugins, nodeModulesToExternalize } from './common'; + +const entryItems: { [key: string]: string } = {}; +nodeModulesToExternalize.forEach(moduleName => { + entryItems[`node_modules/${moduleName}`] = `./node_modules/${moduleName}`; +}); + +const config: webpack.Configuration = { + mode: 'production', + target: 'node', + entry: entryItems, + devtool: 'source-map', + node: { + __dirname: false + }, + externals: [ + 'vscode', + 'commonjs' + ], + plugins: [ + ...getDefaultPlugins('dependencies') + ], + resolve: { + extensions: ['.js'] + }, + output: { + filename: '[name].js', + path: path.resolve(ExtensionRootDir, 'out', 'client'), + libraryTarget: 'commonjs2', + devtoolModuleFilenameTemplate: '../../[resource-path]' + } +}; + +// tslint:disable-next-line:no-default-export +export default config; diff --git a/gulpfile.js b/gulpfile.js index 89de5ceb5171..88e8419bbb17 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -101,6 +101,9 @@ gulp.task('cover:clean', () => del(['coverage', 'debug_coverage*'])); gulp.task('output:clean', () => del(['coverage', 'debug_coverage*'])); +gulp.task('clean:cleanExceptTests', () => del(['out/client', 'out/datascience-ui', 'out/server'])); +gulp.task('clean:out', () => del(['out'])); + gulp.task('clean', gulp.parallel('output:clean', 'cover:clean')); gulp.task('clean:ptvsd', () => del(['coverage', 'pythonFiles/experimental/ptvsd/*'])); @@ -142,6 +145,74 @@ gulp.task('inlinesource', () => { gulp.task('check-datascience-dependencies', () => checkDatascienceDependencies()); + +gulp.task("compile", () => { + const tsProject = ts.createProject("tsconfig.json"); + return tsProject.src() + .pipe(tsProject()) + .js.pipe(gulp.dest("out")); +}); + + +gulp.task('compile-webviews', async () => spawnAsync('npx', ['webpack', '--config', 'webpack.datascience-ui.config.js', '--mode', 'production'])); +gulp.task('webpack', async () => { + await spawnAsync('npx', ['webpack', '--mode', 'production', '--inline', '--progress']); + await spawnAsync('npx', ['webpack', '--config', './build/webpack/webpack.extension.config.js', '--mode', 'production', '--inline', '--progress']); +}); + +gulp.task('updateVSCodeIgnore', (done) => { + // Temporary work around, we need to old technique of building extension is still supported. + // Once Azure DevOps has been updated, we can hard code this value in `.vscodeignore` + fs.appendFileSync(path.join(__dirname, '.vscodeignore'), '\nnode_modules/**'); + done(); +}); + +gulp.task('removePrePublishScript', (done) => { + // Temporary work around + const packageJson = require('./package.json'); + const scripts = packageJson.scripts; + if (scripts['vscode:prepublish']) { + scripts['vscode:prepublish_Old'] = scripts['vscode:prepublish']; + delete scripts['vscode:prepublish']; + fs.writeFileSync(path.join(__dirname, 'package.json'), JSON.stringify(packageJson, undefined, 4)); + } + done(); +}); + +gulp.task('restorePrePublishScript', (done) => { + // Temporary work around + const packageJson = require('./package.json'); + const scripts = packageJson.scripts; + if (scripts['vscode:prepublish_Old']) { + scripts['vscode:prepublish'] = scripts['vscode:prepublish_Old']; + delete scripts['vscode:prepublish_Old']; + fs.writeFileSync(path.join(__dirname, 'package.json'), JSON.stringify(packageJson, undefined, 4)); + } + done(); +}); + +gulp.task('webpack', async () => { + await spawnAsync('npx', ['webpack', '--mode', 'production']); + await spawnAsync('npx', ['webpack', '--config', './build/webpack/webpack.extension.config.js', '--mode', 'production']); +}); + +gulp.task('prePublishBundle', gulp.series('checkNativeDependencies', 'check-datascience-dependencies', 'compile', 'clean:cleanExceptTests', 'webpack')); +gulp.task('prePublishNonBundle', gulp.series('checkNativeDependencies', 'check-datascience-dependencies', 'compile', 'compile-webviews')); + +function spawnAsync(command, args) { + return new Promise((resolve, reject) => { + const proc = spawn(command, args, { cwd: __dirname }); + proc.stdout.on('data', data => { + // Log output on CI. + if (isCI) { + console.log(data.toString()); + } + }); + proc.stderr.on('data', data => console.error(data.toString())); + proc.on('close', () => resolve()); + proc.on('error', error => reject(error)); + }); +} function buildDatascienceDependencies() { fsExtra.ensureDirSync(path.join(__dirname, 'tmp')); spawn.sync('npm', ['run', 'dump-datascience-webpack-stats']); @@ -170,7 +241,7 @@ async function checkDatascienceDependencies() { if (modulesInPackageLock.some(dependency => dependency.indexOf('/') !== dependency.lastIndexOf('/'))) { throwAndLogError('Dependencies detected with more than one \'/\', please update this script.'); } - json.children[0].modules.forEach(m => { + json.chunks[0].modules.forEach(m => { const name = m.name; if (!name.startsWith('./node_modules')) { return; diff --git a/package-lock.json b/package-lock.json index 92b44a77f158..fdc827e354c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1263,6 +1263,12 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@types/anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha512-7WcbyctkE8GTzogDb0ulRAEw7v8oIS54ft9mQTU7PfM0hp5e+8kpa+HeQ7IQrFbKtJXBKcZ4bh+Em9dTw5L6AQ==", + "dev": true + }, "@types/caseless": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", @@ -1299,6 +1305,12 @@ "integrity": "sha512-q6LuBI0t5u04f0Q4/R+cGBqIbZMtJkVvCSF+nTfFBBdQqQvJR/mNHeWjRkszyLl7oyf2rDoKUYMEjTw5AV0hiw==", "dev": true }, + "@types/clean-css": { + "version": "3.4.30", + "resolved": "http://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz", + "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=", + "dev": true + }, "@types/commander": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.12.2.tgz", @@ -1308,6 +1320,16 @@ "commander": "*" } }, + "@types/copy-webpack-plugin": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-4.4.2.tgz", + "integrity": "sha512-/L0m5kc7pKGpsu97TTgAP6YcVRmau2Wj0HpRPQBGEbZXT1DZkdozZPCZHGDWXpxcvWDFTxob2JmYJj3RC7CwFA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/webpack": "*" + } + }, "@types/decompress": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/decompress/-/decompress-4.2.2.tgz", @@ -1424,6 +1446,28 @@ "@types/node": "*" } }, + "@types/html-minifier": { + "version": "3.5.2", + "resolved": "http://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz", + "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==", + "dev": true, + "requires": { + "@types/clean-css": "*", + "@types/relateurl": "*", + "@types/uglify-js": "*" + } + }, + "@types/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-in9rViBsTRB4ZApndZ12It68nGzSMHVK30JD7c49iLIHMFeTPbP7I7wevzMv7re2o0k5TlU6Ry/beyrmgWX7Bg==", + "dev": true, + "requires": { + "@types/html-minifier": "*", + "@types/tapable": "*", + "@types/webpack": "*" + } + }, "@types/iconv-lite": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@types/iconv-lite/-/iconv-lite-0.0.1.tgz", @@ -1459,6 +1503,22 @@ } } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "http://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/loader-utils": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz", + "integrity": "sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/webpack": "*" + } + }, "@types/lodash": { "version": "4.14.109", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz", @@ -1539,6 +1599,12 @@ "@types/react": "*" } }, + "@types/relateurl": { + "version": "0.2.28", + "resolved": "http://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", + "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=", + "dev": true + }, "@types/request": { "version": "2.47.0", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.0.tgz", @@ -1569,6 +1635,12 @@ "integrity": "sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==", "dev": true }, + "@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "dev": true + }, "@types/temp": { "version": "0.8.32", "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.8.32.tgz", @@ -1590,6 +1662,23 @@ "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", "dev": true }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "@types/untildify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/untildify/-/untildify-3.0.0.tgz", @@ -1605,6 +1694,36 @@ "@types/node": "*" } }, + "@types/webpack": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.19.tgz", + "integrity": "sha512-vO/PuQ9iF9Gy8spN8RUUjt5reu9Z+Tb7iWxeAopCmXaIZaIsOgtY5U6UE2ELlcRUBO1HbNWhy+lQE9G92IJcmQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-bundle-analyzer": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.0.tgz", + "integrity": "sha512-+qy5xatScNZW4NbIVaiV38XOeHbKRa4FIPeMf2VDpZEon9W/cxjaVR080vRrRGvfq4tRvOusTEypSMxTvjcSzw==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, "@types/winreg": { "version": "1.2.30", "resolved": "https://registry.npmjs.org/@types/winreg/-/winreg-1.2.30.tgz", @@ -1826,6 +1945,16 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, "acorn": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", @@ -2218,6 +2347,12 @@ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, "array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", @@ -2882,6 +3017,18 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -2963,6 +3110,35 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3179,6 +3355,12 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, "cacache": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", @@ -3378,6 +3560,12 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", @@ -3870,12 +4058,30 @@ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", "dev": true }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -4832,6 +5038,12 @@ "dev": true, "optional": true }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -4842,6 +5054,12 @@ "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -5168,6 +5386,18 @@ } } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, "electron-to-chromium": { "version": "1.3.71", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.71.tgz", @@ -5205,6 +5435,12 @@ "create-emotion": "^9.2.12" } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -5392,6 +5628,12 @@ "integrity": "sha1-Nc5Rp5YO/LWui7Wbg/VmqYyUbf0=", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -5475,6 +5717,12 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -5632,6 +5880,44 @@ "homedir-polyfill": "^1.0.1" } }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -5927,6 +6213,21 @@ } } }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, "find-cache-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", @@ -6045,6 +6346,12 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -6053,6 +6360,12 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", @@ -6309,8 +6622,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -8641,6 +8953,12 @@ "parse-passwd": "^1.0.0" } }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", @@ -8744,6 +9062,18 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, "http-parser-js": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", @@ -9140,6 +9470,12 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, "is": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", @@ -10632,6 +10968,12 @@ "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", "dev": true }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, "mem": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", @@ -10675,6 +11017,12 @@ "readable-stream": "^2.0.1" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -10684,6 +11032,12 @@ "readable-stream": "^2.0.1" } }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -11026,6 +11380,12 @@ "semver": "^5.4.1" } }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, "neo-async": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", @@ -11477,6 +11837,15 @@ "has": "^1.0.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -11494,6 +11863,12 @@ "mimic-fn": "^1.0.0" } }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, "opn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", @@ -11825,6 +12200,12 @@ "@types/node": "*" } }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -11894,6 +12275,12 @@ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -12275,6 +12662,16 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -12459,6 +12856,35 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "raw-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", @@ -13497,12 +13923,53 @@ "sver-compat": "^1.5.0" } }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, "serialize-javascript": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", "dev": true }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -13542,6 +14009,12 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, "sha.js": { "version": "2.4.11", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -13768,9 +14241,9 @@ } }, "source-map-support": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", - "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -13912,6 +14385,12 @@ } } }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -14094,6 +14573,12 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-bom-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", @@ -14679,6 +15164,62 @@ "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==", "dev": true }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-loader": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.0.tgz", + "integrity": "sha512-lGSNs7szRFj/rK9T1EQuayE3QNLg6izDUxt5jpmq0RG1rU2bapAt7E7uLckLCUPeO1jwxCiet2oRaWovc53UAg==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "ts-mockito": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/ts-mockito/-/ts-mockito-2.3.1.tgz", @@ -14688,6 +15229,78 @@ "lodash": "^4.17.5" } }, + "tsconfig-paths": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.7.0.tgz", + "integrity": "sha512-7iE+Q/2E1lgvxD+c0Ot+GFFmgmfIjt/zCayyruXkXQ84BLT85gHXy0WSoQSiuFX9+d+keE/jiON7notV74ZY+A==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "deepmerge": "^2.0.1", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "tsconfig-paths": "^3.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "tslib": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", @@ -14838,6 +15451,16 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, "typed-react-markdown": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/typed-react-markdown/-/typed-react-markdown-0.1.0.tgz", @@ -15288,6 +15911,12 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -15460,6 +16089,12 @@ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", "dev": true }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -15507,6 +16142,12 @@ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -16105,6 +16746,106 @@ } } }, + "webpack-bundle-analyzer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz", + "integrity": "sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "ws": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz", + "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "webpack-cli": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", @@ -16387,6 +17128,15 @@ } } }, + "wrapper-webpack-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wrapper-webpack-plugin/-/wrapper-webpack-plugin-2.0.0.tgz", + "integrity": "sha512-HiykPJTuiaPiR9Q89sRbTjWJ9J/AkriPTbIYaAAW5ulfaK7p5GqK9cB+RWwFhfa17Sn5ehqJ2/qxF4XbQCDGvg==", + "dev": true, + "requires": { + "webpack-sources": "^1.1.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.datascience-ui.dependencies.json b/package.datascience-ui.dependencies.json index 4175452faa9b..7e32b49a61ad 100644 --- a/package.datascience-ui.dependencies.json +++ b/package.datascience-ui.dependencies.json @@ -84,8 +84,8 @@ "lodash.set", "lodash.uniq", "lodash", - "markdown-escapes", "martinez-polygon-clipping", + "markdown-escapes", "material-colors", "mdast-add-list-metadata", "memoize-one", diff --git a/package.json b/package.json index 7eafa0f67fad..84df26d45651 100644 --- a/package.json +++ b/package.json @@ -1673,11 +1673,12 @@ ] }, "scripts": { - "vscode:prepublish": "gulp checkNativeDependencies && gulp check-datascience-dependencies && tsc -p ./ && webpack", + "vscode:prepublish": "gulp checkNativeDependencies && gulp check-datascience-dependencies && gulp compile && webpack --inline --progress", + "package": "gulp clean:cleanExceptTests && gulp prePublishBundle && gulp updateVSCodeIgnore && gulp removePrePublishScript && vsce package && gulp restorePrePublishScript", "compile": "tsc -watch -p ./", "compile-webviews-watch": "npx webpack --config webpack.datascience-ui.config.js --watch", - "dump-datascience-webpack-stats": "webpack --profile --json > tmp/ds-stats.json", - "compile-webviews": "npx webpack --config webpack.datascience-ui.config.js", + "dump-datascience-webpack-stats": "webpack --config webpack.datascience-ui.config.js --profile --json > tmp/ds-stats.json", + "compile-webviews": "gulp compile-webviews", "postinstall": "node ./node_modules/vscode/bin/install", "test": "node ./out/test/standardTest.js && node ./out/test/multiRootTest.js", "test:unittests": "node ./out/test/unittests.js", @@ -1750,6 +1751,7 @@ "@types/chai": "^4.1.2", "@types/chai-arrays": "^1.0.2", "@types/chai-as-promised": "^7.1.0", + "@types/copy-webpack-plugin": "^4.4.2", "@types/del": "^3.0.0", "@types/dotenv": "^4.0.3", "@types/download": "^6.2.2", @@ -1759,9 +1761,11 @@ "@types/fs-extra": "^5.0.1", "@types/get-port": "^3.2.0", "@types/glob": "^5.0.35", + "@types/html-webpack-plugin": "^3.2.0", "@types/iconv-lite": "^0.0.1", "@types/istanbul": "^0.4.29", "@types/jsdom": "^11.12.0", + "@types/loader-utils": "^1.1.3", "@types/lodash": "^4.14.104", "@types/md5": "^2.1.32", "@types/mocha": "^2.2.48", @@ -1779,6 +1783,7 @@ "@types/tmp": "0.0.33", "@types/untildify": "^3.0.0", "@types/uuid": "^3.4.3", + "@types/webpack-bundle-analyzer": "^2.13.0", "@types/winreg": "^1.2.30", "@types/xml2js": "^0.4.2", "JSONStream": "^1.3.2", @@ -1819,6 +1824,7 @@ "istanbul": "^0.4.5", "jsdom": "^12.2.0", "json-loader": "^0.5.7", + "loader-utils": "^1.1.0", "mocha": "^5.0.4", "mocha-junit-reporter": "^1.17.0", "node-has-native-dependencies": "^1.0.2", @@ -1832,10 +1838,13 @@ "remap-istanbul": "^0.10.1", "retyped-diff-match-patch-tsd-ambient": "^1.0.0-0", "shortid": "^2.2.8", + "source-map-support": "^0.5.9", "style-loader": "^0.23.1", "styled-jsx": "^3.1.0", "svg-inline-loader": "^0.8.0", + "ts-loader": "^5.3.0", "ts-mockito": "^2.3.1", + "tsconfig-paths-webpack-plugin": "^3.2.0", "tslint": "^5.9.1", "tslint-eslint-rules": "^5.1.0", "tslint-microsoft-contrib": "^5.0.3", @@ -1848,10 +1857,12 @@ "vscode": "^1.1.21", "vscode-debugadapter-testsupport": "^1.27.0", "webpack": "^4.20.2", + "webpack-bundle-analyzer": "^3.0.3", "webpack-cli": "^3.1.2", "webpack-fix-default-import-plugin": "^1.0.3", "webpack-merge": "^4.1.4", "webpack-node-externals": "^1.7.2", + "wrapper-webpack-plugin": "^2.0.0", "yargs": "^12.0.2" }, "__metadata": { diff --git a/resources/defaultTheme.json b/resources/defaultTheme.json index 71c7e74ffcd2..c73f4e01b0b0 100644 --- a/resources/defaultTheme.json +++ b/resources/defaultTheme.json @@ -1,370 +1,370 @@ -{ - "$schema": "vscode://schemas/color-theme", - "name": "Embedded Light Theme", - "tokenColors": [ - { - "scope": ["meta.embedded", "source.groovy.embedded"], - "settings": { - "foreground": "#000000ff" - } - }, - { - "scope": "emphasis", - "settings": { - "fontStyle": "italic" - } - }, - { - "scope": "strong", - "settings": { - "fontStyle": "bold" - } - }, - { - "scope": "meta.diff.header", - "settings": { - "foreground": "#000080" - } - }, - { - "scope": "comment", - "settings": { - "foreground": "#008000" - } - }, - { - "scope": "constant.language", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": [ - "constant.numeric" - ], - "settings": { - "foreground": "#09885a" - } - }, - { - "scope": "constant.regexp", - "settings": { - "foreground": "#811f3f" - } - }, - { - "name": "css tags in selectors, xml tags", - "scope": "entity.name.tag", - "settings": { - "foreground": "#800000" - } - }, - { - "scope": "entity.name.selector", - "settings": { - "foreground": "#800000" - } - }, - { - "scope": "entity.other.attribute-name", - "settings": { - "foreground": "#ff0000" - } - }, - { - "scope": [ - "entity.other.attribute-name.class.css", - "entity.other.attribute-name.class.mixin.css", - "entity.other.attribute-name.id.css", - "entity.other.attribute-name.parent-selector.css", - "entity.other.attribute-name.pseudo-class.css", - "entity.other.attribute-name.pseudo-element.css", - "source.css.less entity.other.attribute-name.id", - "entity.other.attribute-name.attribute.scss", - "entity.other.attribute-name.scss" - ], - "settings": { - "foreground": "#800000" - } - }, - { - "scope": "invalid", - "settings": { - "foreground": "#cd3131" - } - }, - { - "scope": "markup.underline", - "settings": { - "fontStyle": "underline" - } - }, - { - "scope": "markup.bold", - "settings": { - "fontStyle": "bold", - "foreground": "#000080" - } - }, - { - "scope": "markup.heading", - "settings": { - "fontStyle": "bold", - "foreground": "#800000" - } - }, - { - "scope": "markup.italic", - "settings": { - "fontStyle": "italic" - } - }, - { - "scope": "markup.inserted", - "settings": { - "foreground": "#09885a" - } - }, - { - "scope": "markup.deleted", - "settings": { - "foreground": "#a31515" - } - }, - { - "scope": "markup.changed", - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": [ - "punctuation.definition.quote.begin.markdown", - "punctuation.definition.list.begin.markdown" - ], - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": "markup.inline.raw", - "settings": { - "foreground": "#800000" - } - }, - { - "name": "brackets of XML/HTML tags", - "scope": "punctuation.definition.tag", - "settings": { - "foreground": "#800000" - } - }, - { - "scope": "meta.preprocessor", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "meta.preprocessor.string", - "settings": { - "foreground": "#a31515" - } - }, - { - "scope": "meta.preprocessor.numeric", - "settings": { - "foreground": "#09885a" - } - }, - { - "scope": "meta.structure.dictionary.key.python", - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": "storage", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "storage.type", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "storage.modifier", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "string", - "settings": { - "foreground": "#a31515" - } - }, - { - "scope": [ - "string.comment.buffered.block.pug", - "string.quoted.pug", - "string.interpolated.pug", - "string.unquoted.plain.in.yaml", - "string.unquoted.plain.out.yaml", - "string.unquoted.block.yaml", - "string.quoted.single.yaml", - "string.quoted.double.xml", - "string.quoted.single.xml", - "string.unquoted.cdata.xml", - "string.quoted.double.html", - "string.quoted.single.html", - "string.unquoted.html", - "string.quoted.single.handlebars", - "string.quoted.double.handlebars" - ], - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "string.regexp", - "settings": { - "foreground": "#811f3f" - } - }, - { - "name": "String interpolation", - "scope": [ - "punctuation.definition.template-expression.begin", - "punctuation.definition.template-expression.end", - "punctuation.section.embedded" - ], - "settings": { - "foreground": "#0000ff" - } - }, - { - "name": "Reset JavaScript string interpolation expression", - "scope": [ - "meta.template.expression" - ], - "settings": { - "foreground": "#000000" - } - }, - { - "scope": [ - "support.constant.property-value", - "support.constant.font-name", - "support.constant.media-type", - "support.constant.media", - "constant.other.color.rgb-value", - "constant.other.rgb-value", - "support.constant.color" - ], - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": [ - "support.type.vendored.property-name", - "support.type.property-name", - "variable.css", - "variable.scss", - "variable.other.less", - "source.coffee.embedded" - ], - "settings": { - "foreground": "#ff0000" - } - }, - { - "scope": [ - "support.type.property-name.json" - ], - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": "keyword", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "keyword.control", - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "keyword.operator", - "settings": { - "foreground": "#000000" - } - }, - { - "scope": [ - "keyword.operator.new", - "keyword.operator.expression", - "keyword.operator.cast", - "keyword.operator.sizeof", - "keyword.operator.instanceof", - "keyword.operator.logical.python" - ], - "settings": { - "foreground": "#0000ff" - } - }, - { - "scope": "keyword.other.unit", - "settings": { - "foreground": "#09885a" - } - }, - { - "scope": [ - "punctuation.section.embedded.begin.php", - "punctuation.section.embedded.end.php" - ], - "settings": { - "foreground": "#800000" - } - }, - { - "scope": "support.function.git-rebase", - "settings": { - "foreground": "#0451a5" - } - }, - { - "scope": "constant.sha.git-rebase", - "settings": { - "foreground": "#09885a" - } - }, - { - "name": "coloring of the Java import and package identifiers", - "scope": [ - "storage.modifier.import.java", - "variable.language.wildcard.java", - "storage.modifier.package.java" - ], - "settings": { - "foreground": "#000000" - } - }, - { - "name": "this.self", - "scope": "variable.language", - "settings": { - "foreground": "#0000ff" - } - } - ] -} +{ + "$schema": "vscode://schemas/color-theme", + "name": "Embedded Light Theme", + "tokenColors": [ + { + "scope": ["meta.embedded", "source.groovy.embedded"], + "settings": { + "foreground": "#000000ff" + } + }, + { + "scope": "emphasis", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "strong", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "meta.diff.header", + "settings": { + "foreground": "#000080" + } + }, + { + "scope": "comment", + "settings": { + "foreground": "#008000" + } + }, + { + "scope": "constant.language", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": [ + "constant.numeric" + ], + "settings": { + "foreground": "#09885a" + } + }, + { + "scope": "constant.regexp", + "settings": { + "foreground": "#811f3f" + } + }, + { + "name": "css tags in selectors, xml tags", + "scope": "entity.name.tag", + "settings": { + "foreground": "#800000" + } + }, + { + "scope": "entity.name.selector", + "settings": { + "foreground": "#800000" + } + }, + { + "scope": "entity.other.attribute-name", + "settings": { + "foreground": "#ff0000" + } + }, + { + "scope": [ + "entity.other.attribute-name.class.css", + "entity.other.attribute-name.class.mixin.css", + "entity.other.attribute-name.id.css", + "entity.other.attribute-name.parent-selector.css", + "entity.other.attribute-name.pseudo-class.css", + "entity.other.attribute-name.pseudo-element.css", + "source.css.less entity.other.attribute-name.id", + "entity.other.attribute-name.attribute.scss", + "entity.other.attribute-name.scss" + ], + "settings": { + "foreground": "#800000" + } + }, + { + "scope": "invalid", + "settings": { + "foreground": "#cd3131" + } + }, + { + "scope": "markup.underline", + "settings": { + "fontStyle": "underline" + } + }, + { + "scope": "markup.bold", + "settings": { + "fontStyle": "bold", + "foreground": "#000080" + } + }, + { + "scope": "markup.heading", + "settings": { + "fontStyle": "bold", + "foreground": "#800000" + } + }, + { + "scope": "markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "markup.inserted", + "settings": { + "foreground": "#09885a" + } + }, + { + "scope": "markup.deleted", + "settings": { + "foreground": "#a31515" + } + }, + { + "scope": "markup.changed", + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": [ + "punctuation.definition.quote.begin.markdown", + "punctuation.definition.list.begin.markdown" + ], + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": "markup.inline.raw", + "settings": { + "foreground": "#800000" + } + }, + { + "name": "brackets of XML/HTML tags", + "scope": "punctuation.definition.tag", + "settings": { + "foreground": "#800000" + } + }, + { + "scope": "meta.preprocessor", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "meta.preprocessor.string", + "settings": { + "foreground": "#a31515" + } + }, + { + "scope": "meta.preprocessor.numeric", + "settings": { + "foreground": "#09885a" + } + }, + { + "scope": "meta.structure.dictionary.key.python", + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": "storage", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "storage.type", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "storage.modifier", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "string", + "settings": { + "foreground": "#a31515" + } + }, + { + "scope": [ + "string.comment.buffered.block.pug", + "string.quoted.pug", + "string.interpolated.pug", + "string.unquoted.plain.in.yaml", + "string.unquoted.plain.out.yaml", + "string.unquoted.block.yaml", + "string.quoted.single.yaml", + "string.quoted.double.xml", + "string.quoted.single.xml", + "string.unquoted.cdata.xml", + "string.quoted.double.html", + "string.quoted.single.html", + "string.unquoted.html", + "string.quoted.single.handlebars", + "string.quoted.double.handlebars" + ], + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "string.regexp", + "settings": { + "foreground": "#811f3f" + } + }, + { + "name": "String interpolation", + "scope": [ + "punctuation.definition.template-expression.begin", + "punctuation.definition.template-expression.end", + "punctuation.section.embedded" + ], + "settings": { + "foreground": "#0000ff" + } + }, + { + "name": "Reset JavaScript string interpolation expression", + "scope": [ + "meta.template.expression" + ], + "settings": { + "foreground": "#000000" + } + }, + { + "scope": [ + "support.constant.property-value", + "support.constant.font-name", + "support.constant.media-type", + "support.constant.media", + "constant.other.color.rgb-value", + "constant.other.rgb-value", + "support.constant.color" + ], + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": [ + "support.type.vendored.property-name", + "support.type.property-name", + "variable.css", + "variable.scss", + "variable.other.less", + "source.coffee.embedded" + ], + "settings": { + "foreground": "#ff0000" + } + }, + { + "scope": [ + "support.type.property-name.json" + ], + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": "keyword", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "keyword.control", + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "keyword.operator", + "settings": { + "foreground": "#000000" + } + }, + { + "scope": [ + "keyword.operator.new", + "keyword.operator.expression", + "keyword.operator.cast", + "keyword.operator.sizeof", + "keyword.operator.instanceof", + "keyword.operator.logical.python" + ], + "settings": { + "foreground": "#0000ff" + } + }, + { + "scope": "keyword.other.unit", + "settings": { + "foreground": "#09885a" + } + }, + { + "scope": [ + "punctuation.section.embedded.begin.php", + "punctuation.section.embedded.end.php" + ], + "settings": { + "foreground": "#800000" + } + }, + { + "scope": "support.function.git-rebase", + "settings": { + "foreground": "#0451a5" + } + }, + { + "scope": "constant.sha.git-rebase", + "settings": { + "foreground": "#09885a" + } + }, + { + "name": "coloring of the Java import and package identifiers", + "scope": [ + "storage.modifier.import.java", + "variable.language.wildcard.java", + "storage.modifier.package.java" + ], + "settings": { + "foreground": "#000000" + } + }, + { + "name": "this.self", + "scope": "variable.language", + "settings": { + "foreground": "#0000ff" + } + } + ] +} diff --git a/src/client/common/nuget/azureBlobStoreNugetRepository.ts b/src/client/common/nuget/azureBlobStoreNugetRepository.ts index f3f995a4d7d3..66874b2bceac 100644 --- a/src/client/common/nuget/azureBlobStoreNugetRepository.ts +++ b/src/client/common/nuget/azureBlobStoreNugetRepository.ts @@ -3,7 +3,6 @@ 'use strict'; -import * as azStorageTypes from 'azure-storage'; import { inject, injectable, unmanaged } from 'inversify'; import { IServiceContainer } from '../../ioc/types'; import { captureTelemetry } from '../../telemetry'; @@ -23,15 +22,15 @@ export class AzureBlobStoreNugetRepository implements INugetRepository { @captureTelemetry(PYTHON_LANGUAGE_SERVER_LIST_BLOB_STORE_PACKAGES) @traceVerbose('Listing Nuget Packages') - protected listPackages(azureBlobStorageAccount: string, azureBlobStorageContainer: string, packageName: string, azureCDNBlobStorageAccount: string) { + protected async listPackages(azureBlobStorageAccount: string, azureBlobStorageContainer: string, packageName: string, azureCDNBlobStorageAccount: string) { // tslint:disable-next-line:no-require-imports - const az = require('azure-storage') as typeof azStorageTypes; + const az = await import('azure-storage') as typeof import('azure-storage'); const blobStore = az.createBlobServiceAnonymous(azureBlobStorageAccount); const nugetService = this.serviceContainer.get(INugetService); return new Promise((resolve, reject) => { // We must pass undefined according to docs, but type definition doesn't all it to be undefined or null!!! // tslint:disable-next-line:no-any - const token = undefined as any as azStorageTypes.common.ContinuationToken; + const token = undefined as any; blobStore.listBlobsSegmentedWithPrefix(azureBlobStorageContainer, packageName, token, (error, result) => { if (error) { diff --git a/src/client/constants.ts b/src/client/constants.ts index a355e25d7233..d0b1f89025b6 100644 --- a/src/client/constants.ts +++ b/src/client/constants.ts @@ -4,4 +4,8 @@ 'use strict'; import * as path from 'path'; -export const EXTENSION_ROOT_DIR = path.join(__dirname, '..', '..'); + +// This file is also used by the debug adapter. +// When bundling, the bundle file for the debug adapter ends up elsewhere. +const folderName = path.basename(__dirname); +export const EXTENSION_ROOT_DIR = folderName === 'client' ? path.join(__dirname, '..', '..') : path.join(__dirname, '..', '..', '..', '..'); diff --git a/src/test/common.ts b/src/test/common.ts index c044fcf4a25c..8a7445e294bb 100644 --- a/src/test/common.ts +++ b/src/test/common.ts @@ -2,6 +2,8 @@ // Licensed under the MIT License. 'use strict'; +// tslint:disable:no-console no-require-imports no-var-requires + import * as fs from 'fs-extra'; import * as glob from 'glob'; import * as path from 'path'; @@ -18,6 +20,7 @@ import { noop } from '../client/common/utils/misc'; import { getOSType, OSType } from '../client/common/utils/platform'; import { IServiceContainer } from '../client/ioc/types'; import { IS_MULTI_ROOT_TEST } from './initialize'; +const StreamZip = require('node-stream-zip'); export { sleep } from './core'; @@ -305,3 +308,23 @@ export async function isPythonVersion(...versions: string[]): Promise { export interface IExtensionTestApi extends IExtensionApi { serviceContainer: IServiceContainer; } + +export async function unzip(zipFile: string, targetFolder: string): Promise { + await fs.ensureDir(targetFolder); + return new Promise((resolve, reject) => { + const zip = new StreamZip({ + file: zipFile, + storeEntries: true + }); + zip.on('ready', async () => { + zip.extract('extension', targetFolder, err => { + if (err) { + reject(err); + } else { + resolve(); + } + zip.close(); + }); + }); + }); +} diff --git a/src/testMultiRootWkspc/multi.code-workspace b/src/testMultiRootWkspc/multi.code-workspace index 66d2f293689d..65859ed0254a 100644 --- a/src/testMultiRootWkspc/multi.code-workspace +++ b/src/testMultiRootWkspc/multi.code-workspace @@ -15,6 +15,9 @@ { "path": "workspace5" }, + { + "path": "smokeTests" + }, { "path": "parent\\child" }, diff --git a/src/testMultiRootWkspc/smokeTests/testExecInTerminal.py b/src/testMultiRootWkspc/smokeTests/testExecInTerminal.py new file mode 100644 index 000000000000..84c0c03d6ba0 --- /dev/null +++ b/src/testMultiRootWkspc/smokeTests/testExecInTerminal.py @@ -0,0 +1,7 @@ +import sys +import os + + +log_file = os.path.splitext(sys.argv[0])[0] + '.log' +with open(log_file, "a") as f: + f.write(sys.executable) diff --git a/tsconfig.extension.json b/tsconfig.extension.json new file mode 100644 index 000000000000..22a940225adf --- /dev/null +++ b/tsconfig.extension.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "jsx": "react", + "sourceMap": true, + "rootDir": "src", + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "noImplicitThis": false + }, + "exclude": [ + "node_modules", + ".vscode-test", + "src/datascience-ui", + "build" + ] +} diff --git a/webpack.config.js b/webpack.config.js index 7188b10ab0a1..7955a6f511f6 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,6 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + const merge = require('webpack-merge'); const datascience = require('./webpack.datascience-ui.config.js'); +const extensionDependencies = require('./build/webpack/webpack.extension.dependencies.config.js').default; -module.exports = [merge(datascience, { - devtool: 'eval' -})]; +module.exports = [ + merge(datascience, { + devtool: 'eval' + }), + merge(extensionDependencies, { + mode: 'production', + devtool: 'source-map', + }) +]; diff --git a/webpack.datascience-ui.config.js b/webpack.datascience-ui.config.js index 9fab6027ed4f..b133f01805cb 100644 --- a/webpack.datascience-ui.config.js +++ b/webpack.datascience-ui.config.js @@ -63,7 +63,7 @@ module.exports = { include: /node_modules.*remark.*default.*js/, use: [ { - loader: path.resolve('./build/datascience/remarkLoader.js'), + loader: path.resolve('./build/webpack/loaders/remarkLoader.js'), options: {} } ] @@ -74,7 +74,7 @@ module.exports = { include: /node_modules.*remark.*/, use: [ { - loader: path.resolve('./build/datascience/jsonloader.js'), + loader: path.resolve('./build/webpack/loaders/jsonloader.js'), options: {} } ]