diff --git a/.eslintignore b/.eslintignore index 8a42eaabd662..67d11f76df47 100644 --- a/.eslintignore +++ b/.eslintignore @@ -393,7 +393,6 @@ src/client/common/nuget/types.ts src/client/common/nuget/nugetService.ts src/client/common/cancellation.ts src/client/common/interpreterPathService.ts -src/client/common/startPage/startPageMessageListener.ts src/client/common/application/applicationShell.ts src/client/common/application/languageService.ts src/client/common/application/notebook.ts @@ -511,25 +510,3 @@ src/client/workspaceSymbols/generator.ts src/client/workspaceSymbols/parser.ts src/client/workspaceSymbols/provider.ts -src/client/common/startPage/codeCssGenerator.ts -src/client/common/startPage/themeFinder.ts -src/client/common/startPage/webviewHost.ts -src/client/common/startPage/webviewPanelHost.ts -src/startPage-ui/common/main.ts -src/startPage-ui/react-common/image.tsx -src/startPage-ui/react-common/locReactSide.ts -src/startPage-ui/react-common/logger.ts -src/startPage-ui/react-common/postOffice.ts -src/startPage-ui/startPage/index.tsx -src/test/startPage/mockCommandManager.ts -src/test/startPage/mockDocument.ts -src/test/startPage/mockDocumentManager.ts -src/test/startPage/mockExtensions.ts -src/test/startPage/mockTextEditor.ts -src/test/startPage/mockWorkspaceConfig.ts -src/test/startPage/mockWorkspaceFolder.ts -src/test/startPage/mountedWebView.ts -src/test/startPage/mountedWebViewFactory.ts -src/test/startPage/reactHelpers.ts -src/test/startPage/webBrowserPanel.ts -src/test/startPage/webBrowserPanelProvider.ts diff --git a/.eslintrc b/.eslintrc index 65bbf6d507bb..62e2aa6c52ba 100644 --- a/.eslintrc +++ b/.eslintrc @@ -77,7 +77,6 @@ "selector": "ForInStatement", "message": "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array." }, - { "selector": "LabeledStatement", "message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand." @@ -97,12 +96,6 @@ } ], "operator-assignment": "off", - "react/jsx-filename-extension": [ - 1, - { - "extensions": [".tsx"] - } - ], "strict": "off" } } diff --git a/.sonarcloud.properties b/.sonarcloud.properties index a5ccae9a98e7..9e466689a90a 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -1,4 +1,4 @@ -sonar.sources=src/client,src/startPage-ui +sonar.sources=src/client sonar.tests=src/test sonar.cfamily.build-wrapper-output.bypass=true sonar.cpd.exclusions=src/client/activation/**/*.ts diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ddab6a202525..e1468bdfc2ad 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -12,23 +12,14 @@ "type": "npm", "script": "compile", "isBackground": true, - "problemMatcher": ["$tsc-watch"], + "problemMatcher": [ + "$tsc-watch" + ], "group": { "kind": "build", "isDefault": true } }, - { - "label": "Compile Web Views", - "type": "npm", - "script": "compile-webviews-watch", - "isBackground": true, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": ["$tsc-watch"] - }, { "label": "Run Unit Tests", "type": "npm", diff --git a/.vscodeignore b/.vscodeignore index 7c5cb570ab04..d33521e3e642 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,6 +1,5 @@ **/*.map **/*.analyzer.html -!out/startPage-ui/viewers/ *.vsix .editorconfig .env diff --git a/build/webpack/plugins/less-plugin-base64.js b/build/webpack/plugins/less-plugin-base64.js deleted file mode 100644 index 37ae3bd77017..000000000000 --- a/build/webpack/plugins/less-plugin-base64.js +++ /dev/null @@ -1,72 +0,0 @@ -/* eslint-disable max-classes-per-file */ -// Most of this was based on https://github.com/less/less-plugin-inline-urls -// License for this was included in the ThirdPartyNotices-Repository.txt -const less = require('less'); - -class Base64MimeTypeNode { - constructor() { - this.value = 'image/svg+xml;base64'; - this.type = 'Base64MimeTypeNode'; - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - eval(context) { - return this; - } -} - -class Base64Visitor { - constructor() { - this.visitor = new less.visitors.Visitor(this); - - // Set to a preEval visitor to make sure this runs before - // any evals - this.isPreEvalVisitor = true; - - // Make sure this is a replacing visitor so we remove the old data. - this.isReplacing = true; - } - - run(root) { - return this.visitor.visit(root); - } - - // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars - visitUrl(URLNode, visitArgs) { - // Return two new nodes in the call. One that has the mime type and other with the node. The data-uri - // evaluator will transform this into a base64 string - return new less.tree.Call( - 'data-uri', - [new Base64MimeTypeNode(), URLNode.value], - URLNode.index || 0, - URLNode.currentFileInfo, - ); - } -} -/* - * This was originally used to perform less on uris and turn them into base64 encoded so they can be loaded into - * a webpack html. There's one caveat though. Less and webpack don't play well together. It runs the less at the root - * dir. This means in order to use this in a less file, you need to qualify the urls as if they come from the root dir. - * Example: - * url("./foo.svg") - * becomes - * url("./src/startPage-ui/react-common/images/foo.svg") - */ -class Base64Plugin { - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - constructor() { - // No body. - } - - // eslint-disable-next-line no-shadow, class-methods-use-this - install(less, pluginManager) { - pluginManager.addVisitor(new Base64Visitor()); - } - - // eslint-disable-next-line class-methods-use-this - printUsage() { - console.log('Base64 Plugin. Add to your webpack.config.js as a plugin to convert URLs to base64 inline'); - } -} - -module.exports = Base64Plugin; diff --git a/build/webpack/webpack.startPage-ui-viewers.config.js b/build/webpack/webpack.startPage-ui-viewers.config.js deleted file mode 100644 index 94d870166db6..000000000000 --- a/build/webpack/webpack.startPage-ui-viewers.config.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -const builder = require('./webpack.startPage-ui.config.builder'); - -module.exports = [builder.viewers]; diff --git a/build/webpack/webpack.startPage-ui.config.builder.js b/build/webpack/webpack.startPage-ui.config.builder.js deleted file mode 100644 index 8cafd71d080c..000000000000 --- a/build/webpack/webpack.startPage-ui.config.builder.js +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -// Note to editors, if you change this file you have to restart compile-webviews. -// It doesn't reload the config otherwise. - -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const FixDefaultImportPlugin = require('webpack-fix-default-import-plugin'); -const path = require('path'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); - -const configFileName = 'tsconfig.startPage-ui.json'; -const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -const constants = require('../constants'); -const common = require('./common'); - -// Any build on the CI is considered production mode. -const isProdBuild = constants.isCI || process.argv.includes('--mode'); - -function getEntry(bundle) { - switch (bundle) { - case 'viewers': - return { - startPage: ['./src/startPage-ui/startPage/index.tsx'], - }; - default: - throw new Error(`Bundle not supported ${bundle}`); - } -} - -function getPlugins(bundle) { - const plugins = [ - new ForkTsCheckerWebpackPlugin({ - checkSyntacticErrors: true, - tsconfig: configFileName, - reportFiles: ['src/startPage-ui/**/*.{ts,tsx}'], - memoryLimit: 9096, - }), - ]; - if (isProdBuild) { - plugins.push(...common.getDefaultPlugins(bundle)); - } - switch (bundle) { - case 'viewers': { - const definePlugin = new webpack.DefinePlugin({ - 'process.env': { - NODE_ENV: JSON.stringify('production'), - }, - }); - - plugins.push( - ...(isProdBuild ? [definePlugin] : []), - ...[ - new HtmlWebpackPlugin({ - template: 'src/startPage-ui/startPage/index.html', - indexUrl: `${constants.ExtensionRootDir}/out/1`, - chunks: ['commons', 'startPage'], - filename: 'index.startPage.html', - }), - ], - ); - break; - } - default: - throw new Error(`Bundle not supported ${bundle}`); - } - - return plugins; -} - -function buildConfiguration(bundle) { - // Folder inside `startPage-ui` that will be created and where the files will be dumped. - const bundleFolder = bundle; - const filesToCopy = []; - if (bundle === 'notebook') { - // Include files only for notebooks. - filesToCopy.push( - ...[ - { - from: path.join(constants.ExtensionRootDir, 'node_modules/font-awesome/**/*'), - to: path.join(constants.ExtensionRootDir, 'out', 'startPage-ui', bundleFolder, 'node_modules'), - }, - ], - ); - } - const config = { - context: constants.ExtensionRootDir, - entry: getEntry(bundle), - output: { - path: path.join(constants.ExtensionRootDir, 'out', 'startPage-ui', bundleFolder), - filename: '[name].js', - chunkFilename: '[name].bundle.js', - }, - mode: 'development', // Leave as is, we'll need to see stack traces when there are errors. - devtool: isProdBuild ? 'source-map' : 'inline-source-map', - optimization: { - minimize: isProdBuild, - minimizer: isProdBuild ? [new TerserPlugin({ sourceMap: true })] : [], - // (doesn't re-generate bundles unnecessarily) - // https://webpack.js.org/configuration/optimization/#optimizationmoduleids. - moduleIds: 'hashed', - splitChunks: { - chunks: 'all', - cacheGroups: { - // These are bundles that will be created and loaded when page first loads. - // These must be added to the page along with the main entry point. - // Smaller they are, the faster the load in SSH. - // Interactive and native editors will share common code in commons. - commons: { - name: 'commons', - chunks: 'initial', - // We want at least one shared bundle (2 for notebooks, as we want monago split into another) - minChunks: bundle === 'notebook' ? 2 : 1, - filename: '[name].initial.bundle.js', - }, - // Even though nteract has been split up, some of them are large as nteract alone is large. - // This will ensure nteract (just some of the nteract) goes into a separate bundle. - // Webpack will bundle others separately when loading them asynchronously using `await import(...)` - nteract: { - name: 'nteract', - chunks: 'all', - minChunks: 2, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - // eslint-disable-next-line no-shadow, global-require - const path = require('path'); - return ( - module.resource && - module.resource.includes(`${path.sep}node_modules${path.sep}@nteract`) - ); - }, - }, - // Bundling `plotly` with nteract isn't the best option, as this plotly alone is 6mb. - // This will ensure it is in a seprate bundle, hence small files for SSH scenarios. - plotly: { - name: 'plotly', - chunks: 'all', - minChunks: 1, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - // eslint-disable-next-line no-shadow, global-require - const path = require('path'); - return ( - module.resource && module.resource.includes(`${path.sep}node_modules${path.sep}plotly`) - ); - }, - }, - // Monaco is a monster. For SSH again, we pull this into a seprate bundle. - // This is only a solution for SSH. - // Ideal solution would be to dynamically load monaoc `await import`, that way it will benefit UX - // and SSH. This solution doesn't improve UX, as we still need to wait for monaco to load. - monaco: { - name: 'monaco', - chunks: 'all', - minChunks: 1, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - test(module, _chunks) { - // `module.resource` contains the absolute path of the file on disk. - // Look for `node_modules/monaco...`. - // eslint-disable-next-line global-require, no-shadow - const path = require('path'); - return ( - module.resource && module.resource.includes(`${path.sep}node_modules${path.sep}monaco`) - ); - }, - }, - }, - }, - chunkIds: 'named', - }, - node: { - fs: 'empty', - }, - plugins: [ - new FixDefaultImportPlugin(), - new CopyWebpackPlugin( - [ - { from: './**/*.png', to: '.' }, - { from: './**/*.svg', to: '.' }, - { from: './**/*.css', to: '.' }, - { from: './**/*theme*.json', to: '.' }, - { - from: path.join(constants.ExtensionRootDir, 'node_modules/requirejs/require.js'), - to: path.join(constants.ExtensionRootDir, 'out', 'startPage-ui', bundleFolder), - }, - ...filesToCopy, - ], - { context: 'src' }, - ), - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 100, - }), - ...getPlugins(bundle), - ], - externals: ['log4js'], - resolve: { - // Add '.ts' and '.tsx' as resolvable extensions. - extensions: ['.ts', '.tsx', '.js', '.json', '.svg'], - }, - - module: { - rules: [ - { - test: /\.tsx?$/, - use: [ - { loader: 'cache-loader' }, - { - loader: 'thread-loader', - options: { - // there should be 1 cpu for the fork-ts-checker-webpack-plugin - // eslint-disable-next-line global-require - workers: require('os').cpus().length - 1, - workerNodeArgs: ['--max-old-space-size=9096'], - // set this to Infinity in watch mode; - // see https://github.com/webpack-contrib/thread-loader - poolTimeout: isProdBuild ? 1000 : Infinity, - }, - }, - { - loader: 'ts-loader', - options: { - // IMPORTANT! use happyPackMode mode to speed-up compilation and reduce errors reported - // to webpack - happyPackMode: true, - configFile: configFileName, - // Faster (turn on only on CI, for dev we don't need this). - transpileOnly: true, - reportFiles: ['src/startPage-ui/**/*.{ts,tsx}'], - }, - }, - ], - }, - { - test: /\.svg$/, - use: ['svg-inline-loader'], - }, - { - test: /\.css$/, - use: ['style-loader', 'css-loader'], - }, - { - test: /\.js$/, - include: /node_modules.*remark.*default.*js/, - use: [ - { - loader: path.resolve('./build/webpack/loaders/remarkLoader.js'), - options: {}, - }, - ], - }, - { - test: /\.json$/, - type: 'javascript/auto', - include: /node_modules.*remark.*/, - use: [ - { - loader: path.resolve('./build/webpack/loaders/jsonloader.js'), - options: {}, - }, - ], - }, - { - test: /\.(png|woff|woff2|eot|gif|ttf)$/, - use: [ - { - loader: 'url-loader?limit=100000', - options: { esModule: false }, - }, - ], - }, - { - test: /\.less$/, - use: ['style-loader', 'css-loader', 'less-loader'], - }, - ], - }, - }; - - if (bundle === 'renderers') { - delete config.optimization; - } - return config; -} - -exports.viewers = buildConfiguration('viewers'); diff --git a/gulpfile.js b/gulpfile.js index 36c1734d9e9c..f2a1dccd2efb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -13,7 +13,6 @@ const ts = require('gulp-typescript'); const spawn = require('cross-spawn'); const path = require('path'); const del = require('del'); -const fs = require('fs-extra'); const fsExtra = require('fs-extra'); const glob = require('glob'); const _ = require('lodash'); @@ -42,7 +41,7 @@ gulp.task('precommit', (done) => run({ exitOnError: true, mode: 'staged' }, done gulp.task('output:clean', () => del(['coverage'])); -gulp.task('clean:cleanExceptTests', () => del(['clean:vsix', 'out/client', 'out/startPage-ui', 'out/server'])); +gulp.task('clean:cleanExceptTests', () => del(['clean:vsix', 'out/client'])); gulp.task('clean:vsix', () => del(['*.vsix'])); gulp.task('clean:out', () => del(['out'])); @@ -57,12 +56,6 @@ gulp.task('checkNativeDependencies', (done) => { const webpackEnv = { NODE_OPTIONS: '--max_old_space_size=9096' }; -gulp.task('compile-viewers', async () => { - await buildWebPackForDevOrProduction('./build/webpack/webpack.startPage-ui-viewers.config.js'); -}); - -gulp.task('compile-webviews', gulp.series('compile-viewers')); - async function buildWebPackForDevOrProduction(configFile, configNameForProductionBuilds) { if (configNameForProductionBuilds) { await buildWebPack(configNameForProductionBuilds, ['--config', configFile], webpackEnv); @@ -73,7 +66,6 @@ async function buildWebPackForDevOrProduction(configFile, configNameForProductio gulp.task('webpack', async () => { // Build node_modules. await buildWebPackForDevOrProduction('./build/webpack/webpack.extension.dependencies.config.js', 'production'); - await buildWebPackForDevOrProduction('./build/webpack/webpack.startPage-ui-viewers.config.js', 'production'); await buildWebPackForDevOrProduction('./build/webpack/webpack.extension.config.js', 'extension'); }); @@ -207,7 +199,7 @@ gulp.task('renameSourceMaps', async () => { // By default source maps will be disabled in the extension. // Users will need to use the command `python.enableSourceMapSupport` to enable source maps. const extensionSourceMap = path.join(__dirname, 'out', 'client', 'extension.js.map'); - await fs.rename(extensionSourceMap, `${extensionSourceMap}.disabled`); + await fsExtra.rename(extensionSourceMap, `${extensionSourceMap}.disabled`); }); gulp.task('verifyBundle', async () => { @@ -221,7 +213,7 @@ gulp.task('verifyBundle', async () => { gulp.task('prePublishBundle', gulp.series('webpack', 'renameSourceMaps')); gulp.task('checkDependencies', gulp.series('checkNativeDependencies')); -gulp.task('prePublishNonBundle', gulp.series('compile', 'compile-webviews')); +gulp.task('prePublishNonBundle', gulp.series('compile')); gulp.task('installPythonRequirements', async () => { let args = [ @@ -370,7 +362,7 @@ function hasNativeDependencies() { path.dirname(item.substring(item.indexOf('node_modules') + 'node_modules'.length)).split(path.sep), ) .filter((item) => item.length > 0) - .filter((item) => !item.includes('zeromq') && item !== 'fsevents' && !item.includes('canvas')) // This is a known native. Allow this one for now + .filter((item) => item !== 'fsevents') .filter( (item) => jsonProperties.findIndex((flattenedDependency) => diff --git a/news/3 Code Health/16453.md b/news/3 Code Health/16453.md new file mode 100644 index 000000000000..c6e101f3127a --- /dev/null +++ b/news/3 Code Health/16453.md @@ -0,0 +1 @@ +Remove custom start page experience in favor of VSCode's built-in walkthrough support. diff --git a/package-lock.json b/package-lock.json index d119eafb7a2b..39e294fc9f74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,15 +30,6 @@ "js-tokens": "^4.0.0" } }, - "@babel/runtime": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", - "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, "@babel/runtime-corejs3": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz", @@ -264,32 +255,6 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" - } - }, "@npmcli/move-file": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", @@ -470,15 +435,6 @@ "@types/node": "*" } }, - "@types/clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-A1HQhQ0hkvqqByJMgg+Wiv9p9XdoYEzuwm11SVo1mX2/4PSdhjcrUlilJQoqLscIheC51t1D5g+EFWCXZ2VTQQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -577,15 +533,6 @@ "@types/react": "*" } }, - "@types/enzyme-adapter-react-16": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.5.tgz", - "integrity": "sha512-K7HLFTkBDN5RyRmU90JuYt8OWEY2iKUn43SDWEoBOXd/PowUWjLZ3Q6qMBiQuZeFYK/TOstaZxsnI0fXoAfLpg==", - "dev": true, - "requires": { - "@types/enzyme": "*" - } - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -672,28 +619,6 @@ "@types/node": "*" } }, - "@types/html-minifier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.3.tgz", - "integrity": "sha512-j1P/4PcWVVCPEy5lofcHnQ6BtXz9tHGiFPWzqm7TtGuWZEfCHEP446HlkSNc9fQgNJaJZ6ewPtp2aaFla/Uerg==", - "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", @@ -703,18 +628,6 @@ "@types/node": "*" } }, - "@types/jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-XHMNZFQ0Ih3A4/NTWAO15+OsQafPKnQCanN0FYGbsTM/EoI5EoEAvvkF51/DQC2BT5low4tomp7k2RLMlriA5Q==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^4.0.0" - } - }, "@types/json-schema": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", @@ -809,30 +722,6 @@ "csstype": "^2.2.0" } }, - "@types/react-dom": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.4.tgz", - "integrity": "sha512-eIRpEW73DCzPIMaNBDP5pPIpK1KXyZwNgfxiVagb5iGiz6da+9A5hslSX6GAQKdO7SayVCS/Fr2kjqprgAvkfA==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-json-tree": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@types/react-json-tree/-/react-json-tree-0.6.11.tgz", - "integrity": "sha512-HP0Sf0ZHjCi1FHLJxh/pLaxaevEW6ILlV2C5Dn3EZFTkLjWkv+EVf/l/zvtmoU9ZwuO/3TKVeWK/700UDxunTw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/relateurl": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz", - "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=", - "dev": true - }, "@types/request": { "version": "2.48.1", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", @@ -1387,18 +1276,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1415,16 +1292,6 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, - "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, "acorn-jsx": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", @@ -1437,12 +1304,6 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "dev": true - }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -1459,24 +1320,6 @@ "indent-string": "^4.0.0" } }, - "airbnb-prop-types": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz", - "integrity": "sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ==", - "dev": true, - "requires": { - "array.prototype.find": "^2.0.4", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.1.0", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.8.6" - } - }, "ajv": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", @@ -1626,7 +1469,8 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "arch": { "version": "2.1.1", @@ -1766,48 +1610,6 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", @@ -1865,12 +1667,6 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, "array-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", @@ -2046,16 +1842,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" - } - }, "array.prototype.flat": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", @@ -2068,33 +1854,40 @@ } }, "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", + "es-abstract": "^1.18.0-next.1", "function-bind": "^1.1.1" }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -2109,18 +1902,63 @@ } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } } } @@ -2568,12 +2406,6 @@ "decache": "^4.5.1" } }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, "babel-plugin-transform-runtime": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", @@ -2632,26 +2464,6 @@ } } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, "bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", @@ -2974,12 +2786,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -3070,32 +2876,6 @@ } } }, - "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30001198", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz", - "integrity": "sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.686", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.686.tgz", - "integrity": "sha512-SOJT3m00NX/gT3sD6E3PcZX6u3+zUmQq4+yp8QCKLOwf2ECnmh9eAY+eonhC/AAu5Gg2WrtUU2m7/+e85O0l6A==", - "dev": true - } - } - }, "buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", @@ -3447,16 +3227,6 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3493,17 +3263,6 @@ "integrity": "sha512-/llD1bZ6qwNkt41AsvjsmwNOoA4ZB+8iqmf5LVyeSXuBODT/hAMFNVOh84NdUzoiYiSKqo5vQ3ZzeYHSi/olDQ==", "dev": true }, - "canvas": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz", - "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==", - "optional": true, - "requires": { - "nan": "^2.14.0", - "node-pre-gyp": "^0.15.0", - "simple-get": "^3.0.3" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -3838,7 +3597,8 @@ "chownr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true }, "chrome-trace-event": { "version": "1.0.2", @@ -3894,15 +3654,6 @@ } } }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -4026,7 +3777,8 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "collection-map": { "version": "1.0.0", @@ -4290,12 +4042,6 @@ "date-now": "^0.1.4" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4834,21 +4580,6 @@ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.3.0.tgz", - "integrity": "sha512-wXsoRfsRfsLVNaVzoKdqvEmK/5PFaEXNspVT22Ots6K/cnJdpoDKuQFw+qlMiXnmaif1OgeC466X1zISgAOcGg==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - } - }, "csstype": { "version": "2.6.6", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", @@ -4871,33 +4602,6 @@ "type": "^1.0.1" } }, - "d3-color": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", - "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==", - "dev": true - }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==", - "dev": true - }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", - "dev": true, - "requires": { - "d3-color": "1" - } - }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==", - "dev": true - }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -4912,17 +4616,6 @@ "assert-plus": "^1.0.0" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -5208,12 +4901,6 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -5373,12 +5060,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, "denodeify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", @@ -5413,28 +5094,12 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, "diagnostic-channel": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", @@ -5495,13 +5160,13 @@ "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", "dev": true }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "utila": "~0.4" + "esutils": "^2.0.2" } }, "domain-browser": { @@ -5510,15 +5175,6 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", @@ -5916,36 +5572,6 @@ "string.prototype.trim": "^1.1.2" } }, - "enzyme-adapter-react-16": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz", - "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.12.0", - "has": "^1.0.3", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "react-is": "^16.8.6", - "react-test-renderer": "^16.0.0-0", - "semver": "^5.7.0" - } - }, - "enzyme-adapter-utils": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", - "dev": true, - "requires": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" - } - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -6127,12 +5753,6 @@ "es6-symbol": "^3.1.1" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6941,50 +6561,61 @@ } }, "eslint-plugin-react": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.20.6.tgz", - "integrity": "sha512-kidMTE5HAEBSLu23CUDvj8dc3LdBU0ri1scwHBZjI41oDv4tjsWZKU7MQccFzH1QYPYhsnTF2ovh7JlcIcmxgg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.4.1", - "object.entries": "^1.1.2", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", "prop-types": "^15.7.2", - "resolve": "^1.17.0", - "string.prototype.matchall": "^4.0.2" + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" }, "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, "requires": { - "esutils": "^2.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -6999,70 +6630,103 @@ } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, - "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "has": "^1.0.3" + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } } } }, "eslint-plugin-react-hooks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.0.tgz", - "integrity": "sha512-YKBY+kilK5wrwIdQnCF395Ya6nDro3EAMoe+2xFkmyklyhF16fH83TrQOo9zbZIDxBsXFgBbywta/0JKRNFDkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", + "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", "dev": true }, "eslint-scope": { @@ -7109,12 +6773,6 @@ } } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, "esquery": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", @@ -7482,74 +7140,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -7584,15 +7174,6 @@ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -7769,12 +7350,6 @@ "trim-repeated": "^1.0.0" } }, - "filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", - "dev": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -8192,15 +7767,6 @@ } } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -8326,39 +7892,6 @@ "resolved": "https://registry.npmjs.org/fuzzy/-/fuzzy-0.1.3.tgz", "integrity": "sha1-THbsL/CsGjap3M+aAN+GIweNTtg=" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -9061,6 +8594,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -9111,12 +8650,6 @@ "has-symbol-support-x": "^1.4.1" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -9232,85 +8765,12 @@ "array-filter": "^1.0.0" } }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, "html-escaper": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", "dev": true }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -9437,15 +8897,6 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -9453,12 +8904,6 @@ "dev": true, "optional": true }, - "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", - "dev": true - }, "immutable": { "version": "4.0.0-rc.12", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", @@ -9550,64 +8995,18 @@ "ini": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true }, "internal-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", - "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", + "get-intrinsic": "^1.1.0", "has": "^1.0.3", - "side-channel": "^1.0.2" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } + "side-channel": "^1.0.4" } }, "interpret": { @@ -9690,6 +9089,12 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -9724,6 +9129,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -9775,12 +9189,6 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -9796,6 +9204,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -9835,6 +9244,12 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -9942,12 +9357,6 @@ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", "dev": true }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true - }, "is-set": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", @@ -10490,72 +9899,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsdom": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", - "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.1.1", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.3.6", - "cssstyle": "^1.2.2", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.4", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10690,12 +10033,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, "kuler": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", @@ -10844,16 +10181,6 @@ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", @@ -11029,12 +10356,6 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -11127,12 +10448,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -11407,12 +10722,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -11511,24 +10820,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - } - } - }, "minipass-collect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", @@ -11607,15 +10898,6 @@ } } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -12236,6 +11518,7 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, "optional": true }, "nanoid": { @@ -12288,34 +11571,6 @@ "semver": "^5.4.1" } }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - } - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -12360,15 +11615,6 @@ "path-to-regexp": "^1.7.0" } }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, "nocache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", @@ -12595,35 +11841,6 @@ } } }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -12633,27 +11850,11 @@ "process-on-spawn": "^1.0.0" } }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, "node-stream-zip": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz", "integrity": "sha512-zwP2F/R28Oqtl0gOLItk5QjJ6jEU8XO4kaUMgeqvCyXPgdCZlm8T/5qLMiNy+moJCBCiMQAaX7aVMRhT0t2vkQ==" }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -12708,15 +11909,6 @@ "once": "^1.3.2" } }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -12735,23 +11927,6 @@ } } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -12761,18 +11936,6 @@ "path-key": "^2.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -12782,12 +11945,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "nyc": { @@ -12949,7 +12107,8 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-copy": { "version": "0.1.0", @@ -13057,25 +12216,113 @@ } }, "object.fromentries": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", - "function-bind": "^1.1.1", - "has": "^1.0.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } } }, "object.map": { @@ -13169,47 +12416,12 @@ "integrity": "sha512-YZSypViXzu3ul5LMu/m6XjJ9ol8qAy9S2VjHl5E6UlhUH1KGKWabyEJifn0Jjpw23bYDzC2ucKMPGiH5kfwSGQ==", "dev": true }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.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 }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -13260,7 +12472,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", @@ -13280,6 +12493,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -13418,15 +12632,6 @@ } } }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -13500,12 +12705,6 @@ "semver": "^5.1.0" } }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, "parse5-htmlparser2-tree-adapter": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", @@ -13745,15 +12944,6 @@ "find-up": "^3.0.0" } }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "please-upgrade-node": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", @@ -13838,12 +13028,6 @@ } } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", @@ -14803,12 +13987,6 @@ "integrity": "sha512-vPvPe8TKgp4FLgY3+DfxCE5PIfoXBK2lyLfNCxsRbDsV6vS4oU5RG/IWxrblMn6heagbnMED3MemUQllQ2bQUg==", "dev": true }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -14821,16 +13999,6 @@ "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", "dev": true }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -14939,16 +14107,6 @@ } } }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -14960,17 +14118,6 @@ "react-is": "^16.8.1" } }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, "propagate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", @@ -15087,12 +14234,6 @@ "inherits": "~2.0.0" } }, - "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", - "dev": true - }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -15188,381 +14329,12 @@ "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", - "dev": true, - "requires": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true - }, - "react-motion": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", - "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", - "dev": true, - "requires": { - "performance-now": "^0.2.0", - "prop-types": "^15.5.8", - "raf": "^3.1.0" - }, - "dependencies": { - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - } - } - }, - "react-move": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-move/-/react-move-2.9.1.tgz", - "integrity": "sha512-5qKYsJrKKpSypEaaYyR2HBbBgX65htRqKDa8o5OGDkq2VfklmTCbLawtYFpdmcJRqbz4jCYpzo2Rrsazq9HA8Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.2.0", - "d3-interpolate": "^1.3.2", - "d3-timer": "^1.0.9", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - }, - "react-svgmt": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/react-svgmt/-/react-svgmt-1.1.8.tgz", - "integrity": "sha512-3xu7iWuHIbqM2hv4eMsAN1mZKz6EnXTPAcE4mMX/NwuYY5uUKJBoKDAmxY+I6KXHx2SpYJtKAqe1a5jEehteZg==", - "dev": true, - "requires": { - "d3-ease": "^1.0.3", - "react-motion": "^0.5.2", - "react-move": "^2.7.0" - } - }, - "react-test-renderer": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", - "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.13.6" - } - }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -15677,15 +14449,6 @@ "resolve": "^1.1.6" } }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -15719,24 +14482,12 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -15748,60 +14499,13 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpp": { @@ -15810,12 +14514,6 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -15878,119 +14576,6 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "renderkid": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.6.tgz", - "integrity": "sha512-GIis2GBr/ho0pFNf57D4XM4+PgnQuTii0WCPjEZmZfKivzUfGuRdjN2aQYtYMiNggHmNyBve+thFnNR1iBRcKg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", - "dev": true - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -16055,26 +14640,6 @@ "throttleit": "^1.0.0" } }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -16154,13 +14719,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "rewiremock": { @@ -16231,15 +14790,6 @@ "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", "dev": true }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -16286,25 +14836,6 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "requires": { - "xmlchars": "^2.1.1" - } - }, - "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -16409,7 +14940,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "set-value": { "version": "2.0.1", @@ -16525,41 +15057,8 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "optional": true - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "optional": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true - } - } + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "simple-html-tokenizer": { "version": "0.1.1", @@ -16607,12 +15106,6 @@ } } }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -17104,12 +15597,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -17280,16 +15767,11 @@ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==" }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -17299,12 +15781,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -17312,36 +15796,44 @@ } }, "string.prototype.matchall": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", - "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "has-symbols": "^1.0.1", - "internal-slot": "^1.0.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.2" + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" }, "dependencies": { "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.4.tgz", + "integrity": "sha512-xjDAPJRxKc1uoTkdW8MEk7Fq/2bzz3YoCADYniDV7+KITCUdu9c90fj1aKI7nEZFZxRrHlDo3wtma/C6QkhlXQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -17356,18 +15848,63 @@ } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } } } @@ -17440,26 +15977,6 @@ } } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "string.prototype.trimstart": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", @@ -17563,12 +16080,6 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -17588,42 +16099,6 @@ "schema-utils": "^1.0.0" } }, - "styled-jsx": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.2.1.tgz", - "integrity": "sha512-gM/WOrWYRpWReivzQqetEGohUc/TJSvUoZ5T/UJxJZIsVIPlRQLnp7R8Oue4q49sI08EBRQjQl2oBL3sfdrw2g==", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-types": "6.26.0", - "convert-source-map": "1.6.0", - "loader-utils": "1.2.3", - "source-map": "0.7.3", - "string-hash": "1.1.3", - "stylis": "3.5.4", - "stylis-rule-sheet": "0.0.10" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", - "dev": true - }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "dev": true - }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -17753,21 +16228,6 @@ } } }, - "svg-inline-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/svg-inline-react/-/svg-inline-react-3.1.0.tgz", - "integrity": "sha512-c39AIRQOUXLMD8fQ2rHmK1GOSO3tVuZk61bAXqIT05uhhm3z4VtQFITQSwyhL0WA2uxoJAIhPd2YV0CYQOolSA==", - "dev": true, - "requires": { - "prop-types": "^15.5.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -17823,29 +16283,6 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - } - } - }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -18412,12 +16849,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -18434,15 +16865,6 @@ } } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "transform-loader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz", @@ -18659,15 +17081,6 @@ "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", "dev": true }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -18690,23 +17103,6 @@ "mime-types": "~2.1.24" } }, - "typed-react-markdown": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/typed-react-markdown/-/typed-react-markdown-0.1.0.tgz", - "integrity": "sha1-HDra9CvB8NjGoJsKyAhfNt8KNn8=", - "dev": true, - "requires": { - "@types/react": "^0.14.44" - }, - "dependencies": { - "@types/react": { - "version": "0.14.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-0.14.57.tgz", - "integrity": "sha1-GHioZU+v3R04G4RXKStkM0mMW2I=", - "dev": true - } - } - }, "typed-rest-client": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", @@ -18788,29 +17184,23 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - }, "uint64be": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-1.0.1.tgz", "integrity": "sha1-H3FUIC8qG4rzU4cd2mUb80zpPpU=" }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "unbzip2-stream": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", @@ -19062,12 +17452,6 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -19177,22 +17561,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "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", @@ -19499,26 +17867,6 @@ "tas-client": "0.1.21" } }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -19637,12 +17985,6 @@ } } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, "webpack": { "version": "4.35.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.3.tgz", @@ -19980,32 +18322,6 @@ "source-map": "~0.6.1" } }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -20015,6 +18331,51 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "dependencies": { + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + } + } + }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", @@ -20034,6 +18395,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -20118,12 +18480,6 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -20249,12 +18605,6 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -20276,12 +18626,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, - "xmlchars": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", - "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==", - "dev": true - }, "xmlhttprequest-ssl": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz", diff --git a/package.json b/package.json index 4c67a2b648e7..343a20d4e124 100644 --- a/package.json +++ b/package.json @@ -1962,9 +1962,6 @@ "compile": "tsc -watch -p ./", "compiled": "deemon npm run compile", "kill-compiled": "deemon --kill npm run compile", - "compile-webviews-watch": "cross-env NODE_OPTIONS=--max_old_space_size=9096 webpack --config ./build/webpack/webpack.startPage-ui-viewers.config.js --watch", - "compile-webviews-watchd": "deemon npm run compile-webviews-watch", - "kill-compile-webviews-watchd": "deemon --kill npm run compile-webviews-watch", "checkDependencies": "gulp checkDependencies", "test": "node ./out/test/standardTest.js && node ./out/test/multiRootTest.js", "test:unittests": "mocha --config ./build/.mocha.unittests.json", @@ -1985,10 +1982,10 @@ "testSmoke": "cross-env INSTALL_JUPYTER_EXTENSION=true \"node ./out/test/smokeTest.js\"", "testInsiders": "cross-env VSC_PYTHON_CI_TEST_VSC_CHANNEL=insiders INSTALL_PYLANCE_EXTENSION=true TEST_FILES_SUFFIX=insiders.test CODE_TESTS_WORKSPACE=src/testMultiRootWkspc/smokeTests \"node ./out/test/standardTest.js\"", "lint-staged": "node gulpfile.js", - "lint": "eslint --ext .ts,.tsx,.js src build", - "lint-fix": "eslint --fix --ext .ts,.tsx,.js src build gulpfile.js", - "format-check": "prettier --check 'src/**/*.ts' 'src/**/*.tsx' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", - "format-fix": "prettier --write 'src/**/*.ts' 'src/**/*.tsx' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", + "lint": "eslint --ext .ts,.js src build", + "lint-fix": "eslint --fix --ext .ts,.js src build gulpfile.js", + "format-check": "prettier --check 'src/**/*.ts' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", + "format-fix": "prettier --write 'src/**/*.ts' 'build/**/*.js' '.github/**/*.yml' gulpfile.js", "clean": "gulp clean", "addExtensionPackDependencies": "gulp addExtensionPackDependencies", "updateBuildNumber": "gulp updateBuildNumber", @@ -2061,14 +2058,11 @@ "@types/diff-match-patch": "^1.0.32", "@types/download": "^6.2.2", "@types/enzyme": "^3.1.14", - "@types/enzyme-adapter-react-16": "^1.0.3", "@types/event-stream": "^3.3.33", "@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/jsdom": "^11.12.0", "@types/lodash": "^4.14.104", "@types/md5": "^2.1.32", "@types/memoize-one": "^4.1.1", @@ -2076,9 +2070,6 @@ "@types/nock": "^10.0.3", "@types/node": "^12.19.12", "@types/promisify-node": "^0.4.0", - "@types/react": "^16.4.14", - "@types/react-dom": "^16.0.8", - "@types/react-json-tree": "^0.6.8", "@types/request": "^2.47.0", "@types/semver": "^5.5.0", "@types/shortid": "^0.0.29", @@ -2118,7 +2109,6 @@ "del": "^3.0.0", "download": "^7.0.0", "enzyme": "^3.7.0", - "enzyme-adapter-react-16": "^1.6.0", "eslint": "^7.2.0", "eslint-config-airbnb": "^18.2.0", "eslint-config-prettier": "^8.3.0", @@ -2143,10 +2133,8 @@ "gulp-typescript": "^4.0.1", "gulp-untar": "0.0.8", "gulp-vinyl-zip": "^2.1.2", - "html-webpack-plugin": "^3.2.0", "husky": "^1.1.2", "immutable": "^4.0.0-rc.12", - "jsdom": "^15.0.0", "json-loader": "^0.5.7", "less": "^3.9.0", "less-loader": "^5.0.0", @@ -2174,10 +2162,6 @@ "prettier": "^2.0.2", "range-inclusive": "^1.0.2", "raw-loader": "^0.5.1", - "react": "^16.5.2", - "react-dev-utils": "^11.0.4", - "react-dom": "^16.5.2", - "react-svgmt": "^1.1.8", "remove-files-webpack-plugin": "^1.4.0", "requirejs": "^2.3.6", "rewiremock": "^3.13.0", @@ -2188,9 +2172,7 @@ "socket.io": "^2.4.0", "source-map-support": "^0.5.12", "style-loader": "^0.23.1", - "styled-jsx": "^3.1.0", "svg-inline-loader": "^0.8.0", - "svg-inline-react": "^3.1.0", "terser-webpack-plugin": "^3.1.0", "thread-loader": "^2.1.3", "transform-loader": "^0.2.4", @@ -2199,7 +2181,6 @@ "ts-mockito": "^2.5.0", "ts-node": "^8.3.0", "tsconfig-paths-webpack-plugin": "^3.2.0", - "typed-react-markdown": "^0.1.0", "typemoq": "^2.1.0", "typescript": "4.1.5", "typescript-formatter": "^7.1.0", @@ -2224,8 +2205,5 @@ "id": "f1f59ae4-9318-4f3c-a9b5-81b2eaa5f8a5", "publisherDisplayName": "Microsoft", "publisherId": "998b010b-e2af-44a5-a6cd-0b5fd3b9b6f8" - }, - "optionalDependencies": { - "canvas": "^2.7.0" } } diff --git a/package.nls.json b/package.nls.json index 30c4e6cdaa8b..771a31a16929 100644 --- a/package.nls.json +++ b/package.nls.json @@ -27,7 +27,6 @@ "python.command.python.runLinting.title": "Run Linting", "python.command.python.enableSourceMapSupport.title": "Enable Source Map Support For Extension Debugging", "python.command.python.clearPersistentStorage.title": "Clear Internal Extension Cache", - "python.command.python.startPage.open.title": "Open Start Page", "python.command.python.analysis.clearCache.title": "Clear Module Analysis Cache", "python.command.python.analysis.restartLanguageServer.title": "Restart Language Server", "python.command.python.launchTensorBoard.title": "Launch TensorBoard", @@ -205,25 +204,7 @@ "downloading.file.progress": "{0}{1} of {2} KB ({3}%)", "products.installingModule": "Installing {0}", "OutdatedDebugger.updateDebuggerMessage": "We noticed you are attaching to ptvsd (Python debugger), which was deprecated on May 1st, 2020. Please switch to [debugpy](https://aka.ms/migrateToDebugpy).", - "StartPage.getStarted": "Python - Get Started", - "StartPage.pythonExtensionTitle": "Python Extension", - "StartPage.createJupyterNotebook": "Create a Jupyter Notebook", - "StartPage.notebookDescription": "- Run \"\" in the Command Palette (
Shift + Command + P
)
- Explore our
sample notebook
to learn about notebook features", - "StartPage.createAPythonFile": "Create a Python File", - "StartPage.pythonFileDescription": "- Create a
new file
with a .py extension", - "StartPage.openInteractiveWindow": "Use the Interactive Window to develop Python Scripts", - "StartPage.interactiveWindowDesc": "- You can create cells on a Python file by typing \"#%%\". Make sure you have the Jupyter extension installed.
- Use \"
Shift + Enter
\" to run a cell, the output will be shown in the interactive window", - "StartPage.releaseNotes": "Take a look at our Release Notes to learn more about the latest features.", - "StartPage.mailingList": "Sign up for tips and tutorials through our mailing list.", - "StartPage.tutorialAndDoc": "Explore more features in our Tutorials or check Documentation for tips and troubleshooting.", - "StartPage.dontShowAgain": "Don't show this page again", - "StartPage.helloWorld": "Hello world", - "StartPage.sampleNotebook": "Notebooks intro", - "StartPage.openFolder": "Open a Folder or Workspace", - "StartPage.folderDesc": "- Open a
Folder

- Open a
Workspace
", - "StartPage.badWebPanelFormatString": "

{0} is not a valid file name

", "Jupyter.extensionRequired": "The Jupyter extension is required to perform that task. Click Yes to open the Jupyter extension installation page.", - "Jupyter.extensionNotInstalled": "This feature is available in the Jupyter extension, which isn't currently installed.", "TensorBoard.missingSourceFile": "We could not locate the requested source file on disk. Please manually specify the file.", "TensorBoard.selectMissingSourceFile": "Choose File", "TensorBoard.selectMissingSourceFileDescription": "The source file's contents may not match the original contents in the trace.", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index a4d93c2d9b00..02fc3647ccda 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -27,7 +27,6 @@ "python.command.python.runLinting.title": "执行代码检查", "python.command.python.enableSourceMapSupport.title": "为扩展调试启用 Source Map 支持", "python.command.python.clearPersistentStorage.title": "清空扩展内部缓存", - "python.command.python.startPage.open.title": "打开起始页", "python.command.python.analysis.clearCache.title": "清除模块分析缓存", "python.command.python.analysis.restartLanguageServer.title": "重启语言服务器", "python.command.python.launchTensorBoard.title": "启动 TensorBoard", @@ -205,23 +204,6 @@ "downloading.file.progress": "{2} 中的 {0}{1} KB ({3}%)", "products.installingModule": "正在安装 {0}", "OutdatedDebugger.updateDebuggerMessage": "您正在连接至 ptvsd (Python 调试器),而 ptvsd 已于2020年5月1日停止更新。请切换至 [debugpy](https://aka.ms/migrateToDebugpy)。", - "StartPage.getStarted": "Python - 开始", - "StartPage.pythonExtensionTitle": "Python 扩展", - "StartPage.createJupyterNotebook": "创建 Jupyter 笔记本", - "StartPage.notebookDescription": "- 在命令面板 (
Shift + Command + P
) 中运行 \"\"
- 探索
示例笔记本
来了解笔记本的功能", - "StartPage.createAPythonFile": "创建 Python 文件", - "StartPage.pythonFileDescription": "- 创建以 .py 为扩展名的
新文件
", - "StartPage.openInteractiveWindow": "使用交互式窗口开发 Python 脚本", - "StartPage.interactiveWindowDesc": "- 您可以在 Python 文件中输入 \"#%%\" 来创建一个单元
- 使用 \"
Shift + Enter
\" 来运行一个单元,输出将显示在交互式窗口中", - "StartPage.releaseNotes": "请查看 发行说明,了解更多最新功能。", - "StartPage.mailingList": "订阅 邮件获取提示和教程。", - "StartPage.tutorialAndDoc": "在 教程 中探索更多的功能,或查看 文档 以获得提示和排除故障。", - "StartPage.dontShowAgain": "不再显示此页面", - "StartPage.helloWorld": "Hello world", - "StartPage.sampleNotebook": "笔记本介绍", - "StartPage.openFolder": "打开文件夹或工作区", - "StartPage.folderDesc": "- 打开
文件夹

- 打开
工作区
", - "StartPage.badWebPanelFormatString": "

{0} 文件名无效

", "Jupyter.extensionRequired": "执行该任务需要 Jupyter 扩展。点击\"是 \"打开 Jupyter 扩展的安装页面。", "Jupyter.extensionNotInstalled": "该功能需要安装 Jupyter 扩展才能使用。", "TensorBoard.missingSourceFile": "源文件缺失,请手动定位文件。", diff --git a/resources/report_issue_user_settings.json b/resources/report_issue_user_settings.json index b2e45bb7b08e..8c8f6b0297a2 100644 --- a/resources/report_issue_user_settings.json +++ b/resources/report_issue_user_settings.json @@ -4,7 +4,6 @@ "onDidChange": false, "defaultInterpreterPath": "placeholder", "defaultLS": true, - "showStartPage": true, "downloadLanguageServer": true, "jediPath": false, "jediMemoryLimit": false, @@ -38,7 +37,7 @@ "lintOnSave": true, "maxNumberOfProblems": false, "banditArgs": "placeholder", - "banditEnabled" : true, + "banditEnabled": true, "banditPath": "placeholder", "mypyArgs": "placeholder", "mypyCategorySeverity": false, @@ -104,7 +103,7 @@ "typeshedPaths": "placeholder" }, "workspaceSymbols": { - "ctagsPath":"placeholder", + "ctagsPath": "placeholder", "enabled": true, "exclusionPatterns": true, "rebuildOnFileSave": true, diff --git a/src/client/application/diagnostics/checks/pylanceDefault.ts b/src/client/application/diagnostics/checks/pylanceDefault.ts index 08b1ca2499e9..3ffb11830adc 100644 --- a/src/client/application/diagnostics/checks/pylanceDefault.ts +++ b/src/client/application/diagnostics/checks/pylanceDefault.ts @@ -4,7 +4,6 @@ // eslint-disable-next-line max-classes-per-file import { inject, named } from 'inversify'; import { DiagnosticSeverity } from 'vscode'; -import { IStartPage } from '../../../common/startPage/types'; import { IDisposableRegistry, IExtensionContext, Resource } from '../../../common/types'; import { Diagnostics, Common } from '../../../common/utils/localize'; import { IServiceContainer } from '../../../ioc/types'; @@ -14,6 +13,7 @@ import { DiagnosticCommandPromptHandlerServiceId, MessageCommandPrompt } from '. import { DiagnosticScope, IDiagnostic, IDiagnosticHandlerService } from '../types'; export const PYLANCE_PROMPT_MEMENTO = 'pylanceDefaultPromptMemento'; +const EXTENSION_VERSION_MEMENTO = 'extensionVersion'; export class PylanceDefaultDiagnostic extends BaseDiagnostic { constructor(message: string, resource: Resource) { @@ -30,16 +30,19 @@ export class PylanceDefaultDiagnostic extends BaseDiagnostic { export const PylanceDefaultDiagnosticServiceId = 'PylanceDefaultDiagnosticServiceId'; export class PylanceDefaultDiagnosticService extends BaseDiagnosticsService { + public initialMementoValue: string | undefined = undefined; + constructor( @inject(IServiceContainer) serviceContainer: IServiceContainer, @inject(IExtensionContext) private readonly context: IExtensionContext, - @inject(IStartPage) private readonly startPage: IStartPage, @inject(IDiagnosticHandlerService) @named(DiagnosticCommandPromptHandlerServiceId) protected readonly messageService: IDiagnosticHandlerService, @inject(IDisposableRegistry) disposableRegistry: IDisposableRegistry, ) { super([DiagnosticCodes.PylanceDefaultDiagnostic], serviceContainer, disposableRegistry, true); + + this.initialMementoValue = this.context.globalState.get(EXTENSION_VERSION_MEMENTO); } public async diagnose(resource: Resource): Promise { @@ -73,7 +76,7 @@ export class PylanceDefaultDiagnosticService extends BaseDiagnosticsService { } private async shouldShowPrompt(): Promise { - const savedVersion: string | undefined = this.startPage.initialMementoValue; + const savedVersion: string | undefined = this.initialMementoValue; const promptShown: boolean | undefined = this.context.globalState.get(PYLANCE_PROMPT_MEMENTO); // savedVersion being undefined means that this is the first time the user activates the extension, diff --git a/src/client/common/application/commands.ts b/src/client/common/application/commands.ts index 6302ce01b12a..e4f98597eb3a 100644 --- a/src/client/common/application/commands.ts +++ b/src/client/common/application/commands.ts @@ -40,7 +40,6 @@ interface ICommandNameWithoutArgumentTypeMapping { [Commands.Exec_Selection_In_Django_Shell]: []; [Commands.Create_Terminal]: []; [Commands.PickLocalProcess]: []; - [Commands.OpenStartPage]: []; [Commands.ClearStorage]: []; [Commands.ReportIssue]: []; [Commands.RefreshTensorBoard]: []; diff --git a/src/client/common/application/types.ts b/src/client/common/application/types.ts index 59388517417a..eac770efafa6 100644 --- a/src/client/common/application/types.ts +++ b/src/client/common/application/types.ts @@ -52,7 +52,6 @@ import { UIKind, Uri, ViewColumn, - WebviewPanel, WindowState, WorkspaceConfiguration, WorkspaceEdit, @@ -63,7 +62,7 @@ import { import type { NotebookConcatTextDocument, NotebookDocument } from 'vscode-proposed'; import { Channel } from '../constants'; -import { IAsyncDisposable, Resource } from '../types'; +import { Resource } from '../types'; import { ICommandNameArgumentTypeMapping } from './commands'; import { ExtensionContextKey } from './contextKeys'; @@ -1044,119 +1043,6 @@ export interface IApplicationEnvironment { readonly uiKind: UIKind; } -export interface IWebviewMessageListener { - /** - * Listens to webview messages - * @param message: the message being sent - * @param payload: extra data that came with the message - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage(message: string, payload: any): void; -} - -export const IWebviewPanelMessageListener = Symbol('IWebviewPanelMessageListener'); -export interface IWebviewPanelMessageListener extends IWebviewMessageListener, IAsyncDisposable { - /** - * Listens to web panel state changes - */ - onChangeViewState(panel: IWebviewPanel): void; -} - -export type WebviewMessage = { - /** - * Message type - */ - type: string; - - /** - * Payload - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - payload?: any; -}; - -// Wraps a VS Code webview -export const IWebview = Symbol('IWebview'); -export interface IWebview { - /** - * Sends a message to the hosted html page - */ - postMessage(message: WebviewMessage): void; - /** - * Convert a uri for the local file system to one that can be used inside webviews. - * - * Webviews cannot directly load resources from the workspace or local file system using `file:` uris. The - * `asWebviewUri` function takes a local `file:` uri and converts it into a uri that can be used inside of - * a webview to load the same resource: - * - * ```ts - * webview.html = `` - * ``` - */ - asWebviewUri(localResource: Uri): Uri; -} - -// Wraps the VS Code webview panel -export const IWebviewPanel = Symbol('IWebviewPanel'); -export interface IWebviewPanel extends IWebview { - /** - * Event is fired when the load for a web panel fails - */ - readonly loadFailed: Event; - setTitle(val: string): void; - /** - * Makes the webpanel show up. - * @return A Promise that can be waited on - */ - show(preserveFocus: boolean): Promise; - - /** - * Indicates if this web panel is visible or not. - */ - isVisible(): boolean; - - /** - * Attempts to close the panel if it's visible - */ - close(): void; - /** - * Indicates if the webview has the focus or not. - */ - isActive(): boolean; - /** - * Updates the current working directory for serving up files. - * @param cwd - */ - updateCwd(cwd: string): void; -} - -export interface IWebviewOptions { - rootPath: string; - cwd: string; - scripts: string[]; -} - -export interface IWebviewPanelOptions extends IWebviewOptions { - viewColumn: ViewColumn; - listener: IWebviewPanelMessageListener; - title: string; - /** - * Additional paths apart from cwd and rootPath, that webview would allow loading resources/files from. - * E.g. required for webview to serve images from worksapces when nb is in a nested folder. - */ - additionalPaths?: string[]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - settings?: any; - // Web panel to use if supplied by VS code instead - webViewPanel?: WebviewPanel; -} - -// Wraps the VS Code api for creating a web panel -export const IWebviewPanelProvider = Symbol('IWebviewPanelProvider'); -export interface IWebviewPanelProvider { - create(options: IWebviewPanelOptions): Promise; -} - export const ILanguageService = Symbol('ILanguageService'); export interface ILanguageService { /** @@ -1188,287 +1074,6 @@ export interface IActiveResourceService { getActiveResource(): Resource; } -// Temporary hack to get the nyc compiler to find these types. vscode.proposed.d.ts doesn't work for some reason. - -// #region Custom editor https://github.com/microsoft/vscode/issues/77131 - -/** - * Represents a custom document used by a [`CustomEditorProvider`](#CustomEditorProvider). - * - * Custom documents are only used within a given `CustomEditorProvider`. The lifecycle of a `CustomDocument` is - * managed by VS Code. When no more references remain to a `CustomDocument`, it is disposed of. - */ -export interface CustomDocument { - /** - * The associated uri for this document. - */ - readonly uri: Uri; - - /** - * Dispose of the custom document. - * - * This is invoked by VS Code when there are no more references to a given `CustomDocument` (for example when - * all editors associated with the document have been closed.) - */ - dispose(): void; -} - -/** - * Event triggered by extensions to signal to VS Code that an edit has occurred on an [`CustomDocument`](#CustomDocument). - * - * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). - */ -export interface CustomDocumentEditEvent { - /** - * The document that the edit is for. - */ - readonly document: T; - - /** - * Display name describing the edit. - * - * This is shown in the UI to users. - */ - readonly label?: string; - - /** - * Undo the edit operation. - * - * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your - * extension should restore the document and editor to the state they were in just before this - * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. - */ - undo(): Thenable | void; - - /** - * Redo the edit operation. - * - * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your - * extension should restore the document and editor to the state they were in just after this - * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. - */ - redo(): Thenable | void; -} - -/** - * Event triggered by extensions to signal to VS Code that the content of a [`CustomDocument`](#CustomDocument) - * has changed. - * - * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). - */ -export interface CustomDocumentContentChangeEvent { - /** - * The document that the change is for. - */ - readonly document: T; -} - -/** - * A backup for an [`CustomDocument`](#CustomDocument). - */ -export interface CustomDocumentBackup { - /** - * Unique identifier for the backup. - * - * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. - */ - readonly id: string; - - /** - * Delete the current backup. - * - * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup - * is made or when the file is saved. - */ - delete(): void; -} - -/** - * Additional information used to implement [`CustomEditableDocument.backup`](#CustomEditableDocument.backup). - */ -export interface CustomDocumentBackupContext { - /** - * Suggested file location to write the new backup. - * - * Note that your extension is free to ignore this and use its own strategy for backup. - * - * For editors for workspace resource, this destination will be in the workspace storage. The path may not - */ - readonly destination: Uri; -} - -/** - * Additional information about the opening custom document. - */ -export interface CustomDocumentOpenContext { - /** - * The id of the backup to restore the document from or `undefined` if there is no backup. - * - * If this is provided, your extension should restore the editor from the backup instead of reading the file - * the user's workspace. - */ - readonly backupId?: string; -} - -/** - * Provider for readonly custom editors that use a custom document model. - * - * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. - * - * @param T Type of the custom document returned by this provider. - */ -export interface CustomReadonlyEditorProvider { - /** - * Create a new document for a given resource. - * - * `openCustomDocument` is called when the first editor for a given resource is opened, and the resolve document - * is passed to `resolveCustomEditor`. The resolved `CustomDocument` is re-used for subsequent editor opens. - * If all editors for a given resource are closed, the `CustomDocument` is disposed of. Opening an editor at - * this point will trigger another call to `openCustomDocument`. - * - * @param uri Uri of the document to open. - * @param openContext Additional information about the opening custom document. - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return The custom document. - */ - openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): Thenable | T; - - /** - * Resolve a custom editor for a given resource. - * - * This is called whenever the user opens a new editor for this `CustomEditorProvider`. - * - * To resolve a custom editor, the provider must fill in its initial html content and hook up all - * the event listeners it is interested it. The provider can also hold onto the `WebviewPanel` to use later, - * for example in a command. See [`WebviewPanel`](#WebviewPanel) for additional details. - * - * @param document Document for the resource being resolved. - * @param webviewPanel Webview to resolve. - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return Optional thenable indicating that the custom editor has been resolved. - */ - resolveCustomEditor(document: T, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; -} - -/** - * Provider for editiable custom editors that use a custom document model. - * - * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). - * This gives extensions full control over actions such as edit, save, and backup. - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. - * - * @param T Type of the custom document returned by this provider. - */ -export interface CustomEditorProvider - extends CustomReadonlyEditorProvider { - /** - * Signal that an edit has occurred inside a custom editor. - * - * This event must be fired by your extension whenever an edit happens in a custom editor. An edit can be - * anything from changing some text, to cropping an image, to reordering a list. Your extension is free to - * define what an edit is and what data is stored on each edit. - * - * Firing `onDidChange` causes VS Code to mark the editors as being dirty. This is cleared when the user either - * saves or reverts the file. - * - * Editors that support undo/redo must fire a `CustomDocumentEditEvent` whenever an edit happens. This allows - * users to undo and redo the edit using VS Code's standard VS Code keyboard shortcuts. VS Code will also mark - * the editor as no longer being dirty if the user undoes all edits to the last saved state. - * - * Editors that support editing but cannot use VS Code's standard undo/redo mechanism must fire a `CustomDocumentContentChangeEvent`. - * The only way for a user to clear the dirty state of an editor that does not support undo/redo is to either - * `save` or `revert` the file. - * - * An editor should only ever fire `CustomDocumentEditEvent` events, or only ever fire `CustomDocumentContentChangeEvent` events. - */ - readonly onDidChangeCustomDocument: Event> | Event>; - - /** - * Save a custom document. - * - * This method is invoked by VS Code when the user saves a custom editor. This can happen when the user - * triggers save while the custom editor is active, by commands such as `save all`, or by auto save if enabled. - * - * To implement `save`, the implementer must persist the custom editor. This usually means writing the - * file data for the custom document to disk. After `save` completes, any associated editor instances will - * no longer be marked as dirty. - * - * @param document Document to save. - * @param cancellation Token that signals the save is no longer required (for example, if another save was triggered). - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Save a custom document to a different location. - * - * This method is invoked by VS Code when the user triggers 'save as' on a custom editor. The implementer must - * persist the custom editor to `destination`. - * - * When the user accepts save as, the current editor is be replaced by an non-dirty editor for the newly saved file. - * - * @param document Document to save. - * @param destination Location to save to. - * @param cancellation Token that signals the save is no longer required. - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocumentAs(document: T, destination: Uri, cancellation: CancellationToken): Thenable; - - /** - * Revert a custom document to its last saved state. - * - * This method is invoked by VS Code when the user triggers `File: Revert File` in a custom editor. (Note that - * this is only used using VS Code's `File: Revert File` command and not on a `git revert` of the file). - * - * To implement `revert`, the implementer must make sure all editor instances (webviews) for `document` - * are displaying the document in the same state is saved in. This usually means reloading the file from the - * workspace. - * - * @param document Document to revert. - * @param cancellation Token that signals the revert is no longer required. - * - * @return Thenable signaling that the change has completed. - */ - revertCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Back up a dirty custom document. - * - * Backups are used for hot exit and to prevent data loss. Your `backup` method should persist the resource in - * its current state, i.e. with the edits applied. Most commonly this means saving the resource to disk in - * the `ExtensionContext.storagePath`. When VS Code reloads and your custom editor is opened for a resource, - * your extension should first check to see if any backups exist for the resource. If there is a backup, your - * extension should load the file contents from there instead of from the resource in the workspace. - * - * `backup` is triggered whenever an edit it made. Calls to `backup` are debounced so that if multiple edits are - * made in quick succession, `backup` is only triggered after the last one. `backup` is not invoked when - * `auto save` is enabled (since auto save already persists resource ). - * - * @param document Document to backup. - * @param context Information that can be used to backup the document. - * @param cancellation Token that signals the current backup since a new backup is coming in. It is up to your - * extension to decided how to respond to cancellation. If for example your extension is backing up a large file - * in an operation that takes time to complete, your extension may decide to finish the ongoing backup rather - * than cancelling it to ensure that VS Code has some valid backup. - */ - backupCustomDocument( - document: T, - context: CustomDocumentBackupContext, - cancellation: CancellationToken, - ): Thenable; -} - -// #endregion - export const IClipboard = Symbol('IClipboard'); export interface IClipboard { /** diff --git a/src/client/common/application/webviewPanels/webviewPanel.ts b/src/client/common/application/webviewPanels/webviewPanel.ts deleted file mode 100644 index 6413e6a66026..000000000000 --- a/src/client/common/application/webviewPanels/webviewPanel.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -/* eslint-disable */ -'use strict'; -import '../../extensions'; - -import { Event, EventEmitter, Uri, WebviewOptions, WebviewPanel as vscodeWebviewPanel, window } from 'vscode'; -import { traceError } from '../../logger'; -import { IFileSystem } from '../../platform/types'; -import { IDisposableRegistry } from '../../types'; -import * as localize from '../../utils/localize'; -import { IWebviewPanel, IWebviewPanelOptions } from '../types'; -import { Webview } from '../webviews/webview'; - -export class WebviewPanel extends Webview implements IWebviewPanel { - private panel: vscodeWebviewPanel | undefined; - private loadPromise: Promise; - private loadFailedEmitter = new EventEmitter(); - - constructor( - fs: IFileSystem, - private disposableRegistry: IDisposableRegistry, - private panelOptions: IWebviewPanelOptions, - additionalRootPaths: Uri[] = [], - ) { - super(fs, panelOptions); - - const webViewOptions: WebviewOptions = { - enableScripts: true, - localResourceRoots: [ - Uri.file(this.panelOptions.rootPath), - Uri.file(this.panelOptions.cwd), - ...additionalRootPaths, - ], - }; - if (panelOptions.webViewPanel) { - this.panel = panelOptions.webViewPanel; - this.panel.webview.options = webViewOptions; - } else { - this.panel = window.createWebviewPanel( - panelOptions.title.toLowerCase().replace(' ', ''), - panelOptions.title, - { viewColumn: panelOptions.viewColumn, preserveFocus: true }, - { - retainContextWhenHidden: true, - enableFindWidget: true, - ...webViewOptions, - }, - ); - } - - // Set our base webview from the panel - this.webview = this.panel.webview; - - this.loadPromise = this.load(); - } - - public get loadFailed(): Event { - return this.loadFailedEmitter.event; - } - public async show(preserveFocus: boolean) { - await this.loadPromise; - if (this.panel) { - this.panel.reveal(this.panel.viewColumn, preserveFocus); - } - } - - public updateCwd(_cwd: string) { - // See issue https://github.com/microsoft/vscode-python/issues/8933 for implementing this. - } - - public close() { - if (this.panel) { - this.panel.dispose(); - } - } - - public isVisible(): boolean { - return this.panel ? this.panel.visible : false; - } - - public isActive(): boolean { - return this.panel ? this.panel.active : false; - } - - public setTitle(newTitle: string) { - this.panelOptions.title = newTitle; - if (this.panel) { - this.panel.title = newTitle; - } - } - - private async load() { - try { - if (this.panel) { - const localFilesExist = await Promise.all(this.panelOptions.scripts.map((s) => this.fs.fileExists(s))); - if (localFilesExist.every((exists) => exists === true)) { - // Call our special function that sticks this script inside of an html page - // and translates all of the paths to vscode-resource URIs - this.panel.webview.html = await this.generateLocalReactHtml(); - - // Reset when the current panel is closed - this.disposableRegistry.push( - this.panel.onDidDispose(() => { - this.panel = undefined; - this.panelOptions.listener.dispose().ignoreErrors(); - }), - ); - - this.disposableRegistry.push( - this.panel.webview.onDidReceiveMessage((message) => { - // Pass the message onto our listener - this.panelOptions.listener.onMessage(message.type, message.payload); - }), - ); - - this.disposableRegistry.push( - this.panel.onDidChangeViewState((_e) => { - // Pass the state change onto our listener - this.panelOptions.listener.onChangeViewState(this); - }), - ); - - // Set initial state - this.panelOptions.listener.onChangeViewState(this); - } else { - // Indicate that we can't load the file path - const badPanelString = localize.StartPage.badWebPanelFormatString(); - this.panel.webview.html = badPanelString.format(this.panelOptions.scripts.join(', ')); - } - } - } catch (error) { - // If our web panel failes to load, report that out so whatever - // is hosting the panel can clean up - traceError(`Error Loading WebPanel: ${error}`); - this.loadFailedEmitter.fire(); - } - } -} diff --git a/src/client/common/application/webviewPanels/webviewPanelProvider.ts b/src/client/common/application/webviewPanels/webviewPanelProvider.ts deleted file mode 100644 index 68207bb6b3fc..000000000000 --- a/src/client/common/application/webviewPanels/webviewPanelProvider.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import * as path from 'path'; -import { Uri } from 'vscode'; -import { IFileSystem } from '../../platform/types'; -import { IDisposableRegistry, IExtensionContext } from '../../types'; -import { IWebviewPanel, IWebviewPanelOptions, IWebviewPanelProvider } from '../types'; -import { WebviewPanel } from './webviewPanel'; - -@injectable() -export class WebviewPanelProvider implements IWebviewPanelProvider { - constructor( - @inject(IDisposableRegistry) private readonly disposableRegistry: IDisposableRegistry, - @inject(IFileSystem) private readonly fs: IFileSystem, - @inject(IExtensionContext) private readonly context: IExtensionContext, - ) {} - - public async create(options: IWebviewPanelOptions): Promise { - // Allow loading resources from the `/tmp` folder when in webiviews. - // Used by widgets to place files that are not otherwise accessible. - const additionalRootPaths = [Uri.file(path.join(this.context.extensionPath, 'tmp'))]; - if (Array.isArray(options.additionalPaths)) { - additionalRootPaths.push(...options.additionalPaths.map((item) => Uri.file(item))); - } - return new WebviewPanel(this.fs, this.disposableRegistry, options, additionalRootPaths); - } -} diff --git a/src/client/common/application/webviews/webview.ts b/src/client/common/application/webviews/webview.ts deleted file mode 100644 index df675d1d396f..000000000000 --- a/src/client/common/application/webviews/webview.ts +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import '../../extensions'; - -import * as path from 'path'; -import { Uri, Webview as vscodeWebview } from 'vscode'; -import { IFileSystem } from '../../platform/types'; -import { IWebview, IWebviewOptions, WebviewMessage } from '../types'; - -// Wrapper over a vscode webview. To be used with either WebviewPanel or WebviewView -export class Webview implements IWebview { - protected webview?: vscodeWebview; - - constructor(protected fs: IFileSystem, protected options: IWebviewOptions) {} - - public asWebviewUri(localResource: Uri): Uri { - if (!this.webview) { - throw new Error('WebView not initialized, too early to get a Uri'); - } - return this.webview.asWebviewUri(localResource); - } - - public postMessage(message: WebviewMessage): void { - if (this.webview) { - this.webview.postMessage(message); - } - } - - protected async generateLocalReactHtml(): Promise { - let webview: vscodeWebview; - if (!this.webview) { - throw new Error('WebView not initialized, too early to get a Uri'); - } else { - webview = this.webview; - } - - const uriBase = this.webview.asWebviewUri(Uri.file(this.options.cwd)).toString(); - const uris = this.options.scripts.map((script) => webview.asWebviewUri(Uri.file(script))); // NOSONAR - const testFiles = await this.fs.getFiles(this.options.rootPath); - - // This method must be called so VSC is aware of files that can be pulled. - // Allow js and js.map files to be loaded by webpack in the webview. - testFiles - .filter((f) => f.toLowerCase().endsWith('.js') || f.toLowerCase().endsWith('.js.map')) - .forEach((f) => webview.asWebviewUri(Uri.file(f))); - - const rootPath = webview.asWebviewUri(Uri.file(this.options.rootPath)).toString(); - const fontAwesomePath = webview - .asWebviewUri( - Uri.file( - path.join(this.options.rootPath, 'node_modules', 'font-awesome', 'css', 'font-awesome.min.css'), - ), - ) - .toString(); - return ` - - - - - - - VS Code Python React UI - - - - - -
- - ${uris.map((uri) => ``).join('\n')} - - `; - } -} diff --git a/src/client/common/configSettings.ts b/src/client/common/configSettings.ts index 15239764306c..07437327635a 100644 --- a/src/client/common/configSettings.ts +++ b/src/client/common/configSettings.ts @@ -92,8 +92,6 @@ export class PythonSettings implements IPythonSettings { private static pythonSettings: Map = new Map(); - public showStartPage = true; - public downloadLanguageServer = true; public jediPath = ''; @@ -581,11 +579,6 @@ export class PythonSettings implements IPythonSettings { optOutFrom: [], }; - const showStartPage = pythonSettings.get('showStartPage'); - if (showStartPage !== undefined) { - this.showStartPage = showStartPage; - } - this.insidersChannel = pythonSettings.get('insidersChannel')!; this.tensorBoard = pythonSettings.get('tensorBoard'); } diff --git a/src/client/common/constants.ts b/src/client/common/constants.ts index 62a6d6051716..288e4a71ebb2 100644 --- a/src/client/common/constants.ts +++ b/src/client/common/constants.ts @@ -57,7 +57,6 @@ export namespace Commands { export const GetSelectedInterpreterPath = 'python.interpreterPath'; export const ClearStorage = 'python.clearPersistentStorage'; export const ClearWorkspaceInterpreter = 'python.clearWorkspaceInterpreter'; - export const OpenStartPage = 'python.startPage.open'; export const LaunchTensorBoard = 'python.launchTensorBoard'; export const RefreshTensorBoard = 'python.refreshTensorBoard'; export const ReportIssue = 'python.reportIssue'; @@ -95,8 +94,6 @@ export function isUnitTestExecution(): boolean { return process.env.VSC_PYTHON_UNIT_TEST === '1'; } -// Temporary constant, used to indicate whether we're using custom editor api or not. -export const UseCustomEditorApi = Symbol('USE_CUSTOM_EDITOR'); export const UseProposedApi = Symbol('USE_VSC_PROPOSED_API'); export * from '../constants'; diff --git a/src/client/common/installer/serviceRegistry.ts b/src/client/common/installer/serviceRegistry.ts index a7c7dee08866..539d448698e2 100644 --- a/src/client/common/installer/serviceRegistry.ts +++ b/src/client/common/installer/serviceRegistry.ts @@ -3,8 +3,6 @@ 'use strict'; import { IServiceManager } from '../../ioc/types'; -import { IWebviewPanelProvider } from '../application/types'; -import { WebviewPanelProvider } from '../application/webviewPanels/webviewPanelProvider'; import { ProductType } from '../types'; import { InstallationChannelManager } from './channelManager'; import { CondaInstaller } from './condaInstaller'; @@ -75,5 +73,4 @@ export function registerTypes(serviceManager: IServiceManager) { DataScienceProductPathService, ProductType.DataScience, ); - serviceManager.addSingleton(IWebviewPanelProvider, WebviewPanelProvider); } diff --git a/src/client/common/serviceRegistry.ts b/src/client/common/serviceRegistry.ts index 9f5b79b61d5d..ec5fbdebfde8 100644 --- a/src/client/common/serviceRegistry.ts +++ b/src/client/common/serviceRegistry.ts @@ -89,10 +89,6 @@ import { PathUtils } from './platform/pathUtils'; import { CurrentProcess } from './process/currentProcess'; import { ProcessLogger } from './process/logger'; import { IProcessLogger } from './process/types'; -import { CodeCssGenerator } from './startPage/codeCssGenerator'; -import { StartPage } from './startPage/startPage'; -import { ThemeFinder } from './startPage/themeFinder'; -import { ICodeCssGenerator, IStartPage, IThemeFinder } from './startPage/types'; import { TerminalActivator } from './terminal/activator'; import { PowershellTerminalActivationFailedHandler } from './terminal/activator/powershellFailedHandler'; import { Bash } from './terminal/environmentActivationProviders/bash'; @@ -118,8 +114,6 @@ import { import { IMultiStepInputFactory, MultiStepInputFactory } from './utils/multiStepInput'; import { Random } from './utils/random'; -import { JupyterNotInstalledNotificationHelper } from '../jupyter/jupyterNotInstalledNotificationHelper'; -import { IJupyterNotInstalledNotificationHelper } from '../jupyter/types'; import { InterpreterPathProxyService } from './interpreterPathProxyService'; import { ContextKeyManager } from './application/contextKeyManager'; @@ -147,10 +141,6 @@ export function registerTypes(serviceManager: IServiceManager): void { IJupyterExtensionDependencyManager, JupyterExtensionDependencyManager, ); - serviceManager.addSingleton( - IJupyterNotInstalledNotificationHelper, - JupyterNotInstalledNotificationHelper, - ); serviceManager.addSingleton(ICommandManager, CommandManager); serviceManager.addSingleton(IContextKeyManager, ContextKeyManager); serviceManager.addSingleton(IConfigurationService, ConfigurationService); @@ -243,7 +233,4 @@ export function registerTypes(serviceManager: IServiceManager): void { IExtensionSingleActivationService, DebugSessionTelemetry, ); - serviceManager.addSingleton(IStartPage, StartPage, undefined, [IExtensionSingleActivationService]); - serviceManager.addSingleton(ICodeCssGenerator, CodeCssGenerator); - serviceManager.addSingleton(IThemeFinder, ThemeFinder); } diff --git a/src/client/common/startPage/codeCssGenerator.ts b/src/client/common/startPage/codeCssGenerator.ts deleted file mode 100644 index 270c1f201783..000000000000 --- a/src/client/common/startPage/codeCssGenerator.ts +++ /dev/null @@ -1,507 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import { parse } from 'jsonc-parser'; -import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api'; -import * as path from 'path'; -import { IWorkspaceService } from '../application/types'; -import { traceError, traceInfo, traceWarning } from '../logger'; - -import { IFileSystem } from '../platform/types'; -import { ICodeCssGenerator, IThemeFinder, JSONArray, JSONObject } from './types'; - -const DarkTheme = 'dark'; -const LightTheme = 'light'; - -const MonacoColorRegEx = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/; -const ThreeColorRegEx = /^#?([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/; - -// These are based on the colors generated by 'Default Light+' and are only set when we -// are ignoring themes. - -const DefaultCssVars: { [key: string]: string } = { - light: ` - :root { - --override-widget-background: #f3f3f3; - --override-foreground: #000000; - --override-background: #FFFFFF; - --override-selection-background: #add6ff; - --override-watermark-color: rgba(66, 66, 66, 0.75); - --override-tabs-background: #f3f3f3; - --override-progress-background: #0066bf; - --override-badge-background: #c4c4c4; - --override-lineHighlightBorder: #eeeeee; - --override-peek-background: #f2f8fc; - } -`, - dark: ` - :root { - --override-widget-background: #1e1e1e; - --override-foreground: #d4d4d4; - --override-background: #1e1e1e; - --override-selection-background: #264f78; - --override-watermark-color: rgba(231, 231, 231, 0.6); - --override-tabs-background: #252526; - --override-progress-background: #0066bf; - --override-badge-background: #4d4d4d; - --override-lineHighlightBorder: #282828; - --override-peek-background: #001f33; - } -`, -}; - -// These colors below should match colors that come from either the Default Light+ theme or the Default Dark+ theme. -// They are used when we can't find a theme json file. -const DefaultColors: { [key: string]: string } = { - 'light.comment': '#008000', - 'light.constant.numeric': '#09885a', - 'light.string': '#a31515', - 'light.keyword.control': '#AF00DB', - 'light.keyword.operator': '#000000', - 'light.variable': '#001080', - 'light.entity.name.type': '#267f99', - 'light.support.function': '#795E26', - 'light.punctuation': '#000000', - 'dark.comment': '#6A9955', - 'dark.constant.numeric': '#b5cea8', - 'dark.string': '#ce9178', - 'dark.keyword.control': '#C586C0', - 'dark.keyword.operator': '#d4d4d4', - 'dark.variable': '#9CDCFE', - 'dark.entity.name.type': '#4EC9B0', - 'dark.support.function': '#DCDCAA', - 'dark.punctuation': '#1e1e1e', -}; - -interface IApplyThemeArgs { - tokenColors?: JSONArray | null; - baseColors?: JSONObject | null; - fontFamily: string; - fontSize: number; - isDark: boolean; - defaultStyle: string | undefined; -} - -// This class generates css using the current theme in order to colorize code. -// -// NOTE: This is all a big hack. It's relying on the theme json files to have a certain format -// in order for this to work. -// See this vscode issue for the real way we think this should happen: -// https://github.com/Microsoft/vscode/issues/32813 -@injectable() -export class CodeCssGenerator implements ICodeCssGenerator { - constructor( - @inject(IWorkspaceService) private workspaceService: IWorkspaceService, - @inject(IThemeFinder) private themeFinder: IThemeFinder, - @inject(IFileSystem) private fs: IFileSystem, - ) {} - - public generateThemeCss(isDark: boolean, theme: string): Promise { - return this.applyThemeData(isDark, theme, '', this.generateCss.bind(this)); - } - - public generateMonacoTheme(isDark: boolean, theme: string): Promise { - return this.applyThemeData(isDark, theme, {} as any, this.generateMonacoThemeObject.bind(this)); - } - - private async applyThemeData( - isDark: boolean, - theme: string, - defaultT: T, - applier: (args: IApplyThemeArgs) => T, - ): Promise { - let result = defaultT; - try { - const editor = this.workspaceService.getConfiguration('editor', undefined); - const fontFamily = editor - ? editor.get('fontFamily', "Consolas, 'Courier New', monospace") - : "Consolas, 'Courier New', monospace"; - const fontSize = editor ? editor.get('fontSize', 14) : 14; - const isDarkUpdated = isDark; - - // Then we have to find where the theme resources are loaded from - if (theme) { - traceInfo('Searching for token colors ...'); - const tokenColors = await this.findTokenColors(theme); - const baseColors = await this.findBaseColors(theme); - - // The tokens object then contains the necessary data to generate our css - if (tokenColors && fontFamily && fontSize) { - traceInfo('Using colors to generate CSS ...'); - result = applier({ - tokenColors, - baseColors, - fontFamily, - fontSize, - isDark: isDarkUpdated, - defaultStyle: LightTheme, - }); - } else if (tokenColors === null && fontFamily && fontSize) { - // No colors found. See if we can figure out what type of theme we have - const style = isDark ? DarkTheme : LightTheme; - result = applier({ - fontFamily, - fontSize, - isDark: isDarkUpdated, - defaultStyle: style, - }); - } - } - } catch (err) { - // On error don't fail, just log - traceError(err); - } - - return result; - } - - private getScopes(entry: any): JSONArray { - if (entry && entry.scope) { - return Array.isArray(entry.scope) ? (entry.scope as JSONArray) : entry.scope.toString().split(','); - } - return []; - } - - private matchTokenColor(tokenColors: JSONArray, scope: string): number { - return tokenColors.findIndex((entry: any) => { - const scopeArray = this.getScopes(entry); - if (scopeArray.find((v) => v !== null && v !== undefined && v.toString().trim() === scope)) { - return true; - } - return false; - }); - } - - private getScopeStyle = ( - tokenColors: JSONArray | null | undefined, - scope: string, - secondary: string, - defaultStyle: string | undefined, - ): { color: string; fontStyle: string } => { - // Search through the scopes on the json object - if (tokenColors) { - let match = this.matchTokenColor(tokenColors, scope); - if (match < 0 && secondary) { - match = this.matchTokenColor(tokenColors, secondary); - } - const found = match >= 0 ? (tokenColors[match] as any) : null; - if (found !== null) { - const { settings } = found; - if (settings && settings !== null) { - const fontStyle = settings.fontStyle ? settings.fontStyle : 'normal'; - const foreground = settings.foreground ? settings.foreground : 'var(--vscode-editor-foreground)'; - - return { fontStyle, color: foreground }; - } - } - } - - // Default to editor foreground - return { color: this.getDefaultColor(defaultStyle, scope), fontStyle: 'normal' }; - }; - - private getDefaultColor(style: string | undefined, scope: string): string { - return style - ? DefaultColors[`${style}.${scope}`] - : 'var(--override-foreground, var(--vscode-editor-foreground))'; - } - - private generateCss(args: IApplyThemeArgs): string { - // There's a set of values that need to be found - const commentStyle = this.getScopeStyle(args.tokenColors, 'comment', 'comment', args.defaultStyle); - const numericStyle = this.getScopeStyle(args.tokenColors, 'constant.numeric', 'constant', args.defaultStyle); - const stringStyle = this.getScopeStyle(args.tokenColors, 'string', 'string', args.defaultStyle); - const variableStyle = this.getScopeStyle(args.tokenColors, 'variable', 'variable', args.defaultStyle); - const entityTypeStyle = this.getScopeStyle( - args.tokenColors, - 'entity.name.type', - 'entity.name.type', - args.defaultStyle, - ); - - // Use these values to fill in our format string - return ` -:root { - --code-comment-color: ${commentStyle.color}; - --code-numeric-color: ${numericStyle.color}; - --code-string-color: ${stringStyle.color}; - --code-variable-color: ${variableStyle.color}; - --code-type-color: ${entityTypeStyle.color}; - --code-font-family: ${args.fontFamily}; - --code-font-size: ${args.fontSize}px; -} - -${args.defaultStyle ? DefaultCssVars[args.defaultStyle] : ''} -`; - } - - // Based on this data here: - // https://github.com/Microsoft/vscode/blob/master/src/vs/editor/standalone/common/themes.ts#L13 - - private generateMonacoThemeObject(args: IApplyThemeArgs): monacoEditor.editor.IStandaloneThemeData { - const result: monacoEditor.editor.IStandaloneThemeData = { - base: args.isDark ? 'vs-dark' : 'vs', - inherit: false, - rules: [], - colors: {}, - }; - // If we have token colors enumerate them and add them into the rules - if (args.tokenColors && args.tokenColors.length) { - const tokenSet = new Set(); - args.tokenColors.forEach((t: any) => { - const scopes = this.getScopes(t); - const settings = t && t.settings ? t.settings : undefined; - if (scopes && settings) { - scopes.forEach((s) => { - const token = s ? s.toString() : ''; - if (!tokenSet.has(token)) { - tokenSet.add(token); - - if (settings.foreground) { - // Make sure matches the monaco requirements of having 6 values - if (!MonacoColorRegEx.test(settings.foreground)) { - const match = ThreeColorRegEx.exec(settings.foreground); - if (match && match.length > 3) { - settings.foreground = `#${match[1]}${match[1]}${match[2]}${match[2]}${match[3]}${match[3]}`; - } else { - settings.foreground = undefined; - } - } - } - - if (settings.foreground) { - result.rules.push({ - token, - foreground: settings.foreground, - background: settings.background, - fontStyle: settings.fontStyle, - }); - } else { - result.rules.push({ - token, - background: settings.background, - fontStyle: settings.fontStyle, - }); - } - - // Special case some items. punctuation.definition.comment doesn't seem to - // be listed anywhere. Add it manually when we find a 'comment' - - if (token === 'comment') { - result.rules.push({ - token: 'punctuation.definition.comment', - foreground: settings.foreground, - background: settings.background, - fontStyle: settings.fontStyle, - }); - } - - // Same for string - - if (token === 'string') { - result.rules.push({ - token: 'punctuation.definition.string', - foreground: settings.foreground, - background: settings.background, - fontStyle: settings.fontStyle, - }); - } - } - }); - } - }); - - result.rules = result.rules.sort( - (a: monacoEditor.editor.ITokenThemeRule, b: monacoEditor.editor.ITokenThemeRule) => - a.token.localeCompare(b.token), - ); - } else { - // Otherwise use our default values. - result.base = args.defaultStyle === DarkTheme ? 'vs-dark' : 'vs'; - result.inherit = true; - - if (args.defaultStyle) { - // Special case. We need rules for the comment beginning and the string beginning - result.rules.push({ - token: 'punctuation.definition.comment', - foreground: DefaultColors[`${args.defaultStyle}.comment`], - }); - result.rules.push({ - token: 'punctuation.definition.string', - foreground: DefaultColors[`${args.defaultStyle}.string`], - }); - } - } - // If we have base colors enumerate them and add them to the colors - if (args.baseColors) { - const keys = Object.keys(args.baseColors); - keys.forEach((k) => { - const color = args.baseColors && args.baseColors[k] ? args.baseColors[k] : '#000000'; - result.colors[k] = color ? color.toString() : '#000000'; - }); - } // The else case here should end up inheriting. - return result; - } - - private mergeColors = (colors1: JSONArray, colors2: JSONArray): JSONArray => [...colors1, ...colors2]; - - private mergeBaseColors = (colors1: JSONObject, colors2: JSONObject): JSONObject => ({ ...colors1, ...colors2 }); - - private readTokenColors = async (themeFile: string): Promise => { - try { - const tokenContent = await this.fs.readFile(themeFile); - const theme = parse(tokenContent); - let tokenColors: JSONArray = []; - - if (typeof theme.tokenColors === 'string') { - const style = await this.fs.readFile(theme.tokenColors); - tokenColors = JSON.parse(style); - } else { - tokenColors = theme.tokenColors as JSONArray; - } - - if (tokenColors && tokenColors.length > 0) { - // This theme may include others. If so we need to combine the two together - const include = theme ? theme.include : undefined; - if (include) { - const includePath = path.join(path.dirname(themeFile), include.toString()); - const includedColors = await this.readTokenColors(includePath); - return this.mergeColors(tokenColors, includedColors); - } - - // Theme is a root, don't need to include others - return tokenColors; - } - - // Might also have a 'settings' object that equates to token colors - const settings = theme.settings as JSONArray; - if (settings && settings.length > 0) { - return settings; - } - - return []; - } catch (e) { - traceError('Python Extension: Error reading custom theme', e); - return []; - } - }; - - private readBaseColors = async (themeFile: string): Promise => { - const tokenContent = await this.fs.readFile(themeFile); - const theme = parse(tokenContent); - const colors = theme.colors as JSONObject; - - // This theme may include others. If so we need to combine the two together - const include = theme ? theme.include : undefined; - if (include) { - const includePath = path.join(path.dirname(themeFile), include.toString()); - const includedColors = await this.readBaseColors(includePath); - return this.mergeBaseColors(colors, includedColors); - } - - // Theme is a root, don't need to include others - return colors; - }; - - private findTokenColors = async (theme: string): Promise => { - try { - traceInfo('Attempting search for colors ...'); - const themeRoot = await this.themeFinder.findThemeRootJson(theme); - - // Use the first result if we have one - if (themeRoot) { - traceInfo(`Loading colors from ${themeRoot} ...`); - - // This should be the path to the file. Load it as a json object - const contents = await this.fs.readFile(themeRoot); - const json = parse(contents); - - // There should be a theme colors section - const contributes = json.contributes as JSONObject; - - // If no contributes section, see if we have a tokenColors section. This means - // this is a direct token colors file - if (!contributes) { - const tokenColors = json.tokenColors as JSONObject; - if (tokenColors) { - return await this.readTokenColors(themeRoot); - } - } - - // This should have a themes section - const themes = contributes.themes as JSONArray; - - // One of these (it's an array), should have our matching theme entry - const index = themes.findIndex((e: any) => e !== null && (e.id === theme || e.name === theme)); - - const found = index >= 0 ? (themes[index] as any) : null; - if (found !== null) { - // Then the path entry should contain a relative path to the json file with - // the tokens in it - const themeFile = path.join(path.dirname(themeRoot), found.path); - traceInfo(`Reading colors from ${themeFile}`); - return await this.readTokenColors(themeFile); - } - } else { - traceWarning(`Color theme ${theme} not found. Using default colors.`); - } - } catch (err) { - // Swallow any exceptions with searching or parsing - traceError(err); - } - - // Force the colors to the defaults - return null; - }; - - private findBaseColors = async (theme: string): Promise => { - try { - traceInfo('Attempting search for colors ...'); - const themeRoot = await this.themeFinder.findThemeRootJson(theme); - - // Use the first result if we have one - if (themeRoot) { - traceInfo(`Loading base colors from ${themeRoot} ...`); - - // This should be the path to the file. Load it as a json object - const contents = await this.fs.readFile(themeRoot); - const json = parse(contents); - - // There should be a theme colors section - const contributes = json.contributes as JSONObject; - - // If no contributes section, see if we have a tokenColors section. This means - // this is a direct token colors file - if (!contributes) { - return await this.readBaseColors(themeRoot); - } - - // This should have a themes section - const themes = contributes.themes as JSONArray; - - // One of these (it's an array), should have our matching theme entry - const index = themes.findIndex((e: any) => e !== null && (e.id === theme || e.name === theme)); - - const found = index >= 0 ? (themes[index] as any) : null; - if (found !== null) { - // Then the path entry should contain a relative path to the json file with - // the tokens in it - const themeFile = path.join(path.dirname(themeRoot), found.path); - traceInfo(`Reading base colors from ${themeFile}`); - return await this.readBaseColors(themeFile); - } - } else { - traceWarning(`Color theme ${theme} not found. Using default colors.`); - } - } catch (err) { - // Swallow any exceptions with searching or parsing - traceError(err); - } - - // Force the colors to the defaults - return null; - }; -} diff --git a/src/client/common/startPage/constants.ts b/src/client/common/startPage/constants.ts deleted file mode 100644 index 20d62d8e3a66..000000000000 --- a/src/client/common/startPage/constants.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -export const DefaultTheme = 'Default Light+'; -export const GatherExtension = 'ms-python.gather'; - -export enum Telemetry { - // DS_INTERNAL and DATASCIENCE names must be preserved to maintain telemetry continuity - ShiftEnterBannerShown = 'DS_INTERNAL.SHIFTENTER_BANNER_SHOWN', - EnableInteractiveShiftEnter = 'DATASCIENCE.ENABLE_INTERACTIVE_SHIFT_ENTER', - DisableInteractiveShiftEnter = 'DATASCIENCE.DISABLE_INTERACTIVE_SHIFT_ENTER', - WebviewStartup = 'DS_INTERNAL.WEBVIEW_STARTUP', - WebviewStyleUpdate = 'DS_INTERNAL.WEBVIEW_STYLE_UPDATE', - WebviewMonacoStyleUpdate = 'DS_INTERNAL.WEBVIEW_MONACO_STYLE_UPDATE', - StartPageViewed = 'DS_INTERNAL.STARTPAGE_VIEWED', - StartPageOpenedFromCommandPalette = 'DS_INTERNAL.STARTPAGE_OPENED_FROM_COMMAND_PALETTE', - StartPageOpenedFromNewInstall = 'DS_INTERNAL.STARTPAGE_OPENED_FROM_NEW_INSTALL', - StartPageOpenedFromNewUpdate = 'DS_INTERNAL.STARTPAGE_OPENED_FROM_NEW_UPDATE', - StartPageWebViewError = 'DS_INTERNAL.STARTPAGE_WEBVIEWERROR', - StartPageTime = 'DS_INTERNAL.STARTPAGE_TIME', - StartPageClickedDontShowAgain = 'DATASCIENCE.STARTPAGE_DONT_SHOW_AGAIN', - StartPageClosedWithoutAction = 'DATASCIENCE.STARTPAGE_CLOSED_WITHOUT_ACTION', - StartPageUsedAnActionOnFirstTime = 'DATASCIENCE.STARTPAGE_USED_ACTION_ON_FIRST_TIME', - StartPageOpenBlankNotebook = 'DATASCIENCE.STARTPAGE_OPEN_BLANK_NOTEBOOK', - StartPageOpenBlankPythonFile = 'DATASCIENCE.STARTPAGE_OPEN_BLANK_PYTHON_FILE', - StartPageOpenInteractiveWindow = 'DATASCIENCE.STARTPAGE_OPEN_INTERACTIVE_WINDOW', - StartPageOpenCommandPalette = 'DATASCIENCE.STARTPAGE_OPEN_COMMAND_PALETTE', - StartPageOpenCommandPaletteWithOpenNBSelected = 'DATASCIENCE.STARTPAGE_OPEN_COMMAND_PALETTE_WITH_OPENNBSELECTED', - StartPageOpenSampleNotebook = 'DATASCIENCE.STARTPAGE_OPEN_SAMPLE_NOTEBOOK', - StartPageOpenFileBrowser = 'DATASCIENCE.STARTPAGE_OPEN_FILE_BROWSER', - StartPageOpenFolder = 'DATASCIENCE.STARTPAGE_OPEN_FOLDER', - StartPageOpenWorkspace = 'DATASCIENCE.STARTPAGE_OPEN_WORKSPACE', -} diff --git a/src/client/common/startPage/messages.ts b/src/client/common/startPage/messages.ts deleted file mode 100644 index 66eba958f8ff..000000000000 --- a/src/client/common/startPage/messages.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -export enum CssMessages { - GetCssRequest = 'get_css_request', - GetCssResponse = 'get_css_response', - GetMonacoThemeRequest = 'get_monaco_theme_request', - GetMonacoThemeResponse = 'get_monaco_theme_response', -} - -export enum SharedMessages { - UpdateSettings = 'update_settings', - Started = 'started', - LocInit = 'loc_init', - StyleUpdate = 'style_update', -} - -export interface IGetCssRequest { - isDark: boolean; -} - -export interface IGetMonacoThemeRequest { - isDark: boolean; -} - -export interface IGetCssResponse { - css: string; - theme: string; - knownDark?: boolean; -} diff --git a/src/client/common/startPage/startPage.ts b/src/client/common/startPage/startPage.ts deleted file mode 100644 index 00dc7bd773eb..000000000000 --- a/src/client/common/startPage/startPage.ts +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable, named } from 'inversify'; -import * as path from 'path'; -import { ConfigurationTarget, EventEmitter, UIKind, Uri, ViewColumn } from 'vscode'; -import { IExtensionSingleActivationService } from '../../activation/types'; -import { EXTENSION_ROOT_DIR } from '../../constants'; -import { IJupyterNotInstalledNotificationHelper, JupyterNotInstalledOrigin } from '../../jupyter/types'; -import { sendTelemetryEvent } from '../../telemetry'; -import { - IApplicationEnvironment, - IApplicationShell, - ICommandManager, - IDocumentManager, - IJupyterExtensionDependencyManager, - IWebviewPanelProvider, - IWorkspaceService, -} from '../application/types'; -import { CommandSource, STANDARD_OUTPUT_CHANNEL } from '../constants'; -import { IFileSystem } from '../platform/types'; -import { IConfigurationService, IExtensionContext, IOutputChannel, Resource } from '../types'; -import * as localize from '../utils/localize'; -import { Jupyter } from '../utils/localize'; -import { StopWatch } from '../utils/stopWatch'; -import { Telemetry } from './constants'; -import { StartPageMessageListener } from './startPageMessageListener'; -import { ICodeCssGenerator, IStartPage, IStartPageMapping, IThemeFinder, StartPageMessages } from './types'; -import { WebviewPanelHost } from './webviewPanelHost'; - -const startPageDir = path.join(EXTENSION_ROOT_DIR, 'out', 'startPage-ui', 'viewers'); - -export const EXTENSION_VERSION_MEMENTO = 'extensionVersion'; - -// Class that opens, disposes and handles messages and actions for the Python Extension Start Page. -// It also runs when the extension activates. -@injectable() -export class StartPage extends WebviewPanelHost - implements IStartPage, IExtensionSingleActivationService { - protected closedEvent: EventEmitter = new EventEmitter(); - - private timer: StopWatch; - - private actionTaken = false; - - private actionTakenOnFirstTime = false; - - private firstTime = false; - - private webviewDidLoad = false; - - public initialMementoValue: string | undefined = undefined; - - constructor( - @inject(IWebviewPanelProvider) provider: IWebviewPanelProvider, - @inject(ICodeCssGenerator) cssGenerator: ICodeCssGenerator, - @inject(IThemeFinder) themeFinder: IThemeFinder, - @inject(IConfigurationService) protected configuration: IConfigurationService, - @inject(IWorkspaceService) workspaceService: IWorkspaceService, - @inject(IFileSystem) private file: IFileSystem, - @inject(ICommandManager) private readonly commandManager: ICommandManager, - @inject(IDocumentManager) private readonly documentManager: IDocumentManager, - @inject(IApplicationShell) private appShell: IApplicationShell, - @inject(IExtensionContext) private readonly context: IExtensionContext, - @inject(IApplicationEnvironment) private appEnvironment: IApplicationEnvironment, - @inject(IJupyterNotInstalledNotificationHelper) - private notificationHelper: IJupyterNotInstalledNotificationHelper, - @inject(IJupyterExtensionDependencyManager) private depsManager: IJupyterExtensionDependencyManager, - @inject(IOutputChannel) @named(STANDARD_OUTPUT_CHANNEL) private readonly output: IOutputChannel, - ) { - super( - configuration, - provider, - cssGenerator, - themeFinder, - workspaceService, - (c, v, d) => new StartPageMessageListener(c, v, d), - startPageDir, - [path.join(startPageDir, 'commons.initial.bundle.js'), path.join(startPageDir, 'startPage.js')], - localize.StartPage.getStarted(), - ViewColumn.One, - false, - ); - this.timer = new StopWatch(); - this.initialMementoValue = this.context.globalState.get(EXTENSION_VERSION_MEMENTO); - } - - public async activate(): Promise { - if (this.appEnvironment.uiKind === UIKind.Web) { - // We're running in Codespaces browser-based editor, do not open start page. - } - } - - public dispose(): Promise { - if (!this.isDisposed) { - super.dispose(); - } - return this.close(); - } - - public async open(): Promise { - sendTelemetryEvent(Telemetry.StartPageViewed); - setTimeout(async () => { - await this.loadWebPanel(process.cwd()); - // open webview - await super.show(true); - - setTimeout(() => { - if (!this.webviewDidLoad) { - sendTelemetryEvent(Telemetry.StartPageWebViewError); - } - }, 5000); - }, 3000); - } - - // eslint-disable-next-line class-methods-use-this - public get owningResource(): Resource { - return undefined; - } - - public async close(): Promise { - if (!this.actionTaken) { - sendTelemetryEvent(Telemetry.StartPageClosedWithoutAction); - } - if (this.actionTakenOnFirstTime) { - sendTelemetryEvent(Telemetry.StartPageUsedAnActionOnFirstTime); - } - sendTelemetryEvent(Telemetry.StartPageTime, this.timer.elapsedTime); - // Fire our event - this.closedEvent.fire(this); - } - - public async onMessage(message: string, payload: unknown): Promise { - const shouldShowJupyterNotInstalledPrompt = await this.notificationHelper.shouldShowJupypterExtensionNotInstalledPrompt(); - const isJupyterInstalled = this.depsManager.isJupyterExtensionInstalled; - - switch (message) { - case StartPageMessages.Started: - this.webviewDidLoad = true; - break; - case StartPageMessages.RequestShowAgainSetting: { - const settings = this.configuration.getSettings(); - await this.postMessage(StartPageMessages.SendSetting, { - showAgainSetting: settings.showStartPage, - }); - break; - } - case StartPageMessages.OpenBlankNotebook: { - if (!isJupyterInstalled) { - this.output.appendLine(Jupyter.jupyterExtensionNotInstalled()); - - if (shouldShowJupyterNotInstalledPrompt) { - await this.notificationHelper.showJupyterNotInstalledPrompt( - JupyterNotInstalledOrigin.StartPageOpenBlankNotebook, - ); - } - } else { - sendTelemetryEvent(Telemetry.StartPageOpenBlankNotebook); - this.setTelemetryFlags(); - - const savedVersion: string | undefined = this.context.globalState.get(EXTENSION_VERSION_MEMENTO); - - if (savedVersion) { - await this.commandManager.executeCommand( - 'jupyter.opennotebook', - undefined, - CommandSource.commandPalette, - ); - } else { - this.openSampleNotebook().ignoreErrors(); - } - } - break; - } - case StartPageMessages.OpenBlankPythonFile: { - sendTelemetryEvent(Telemetry.StartPageOpenBlankPythonFile); - this.setTelemetryFlags(); - - const doc = await this.documentManager.openTextDocument({ - language: 'python', - content: `print("${localize.StartPage.helloWorld()}")`, - }); - await this.documentManager.showTextDocument(doc, 1, true); - break; - } - case StartPageMessages.OpenInteractiveWindow: { - if (!isJupyterInstalled) { - this.output.appendLine(Jupyter.jupyterExtensionNotInstalled()); - - if (shouldShowJupyterNotInstalledPrompt) { - await this.notificationHelper.showJupyterNotInstalledPrompt( - JupyterNotInstalledOrigin.StartPageOpenInteractiveWindow, - ); - } - } else { - sendTelemetryEvent(Telemetry.StartPageOpenInteractiveWindow); - this.setTelemetryFlags(); - - const doc2 = await this.documentManager.openTextDocument({ - language: 'python', - content: `#%%\nprint("${localize.StartPage.helloWorld()}")`, - }); - await this.documentManager.showTextDocument(doc2, 1, true); - await this.commandManager.executeCommand('jupyter.runallcells', doc2.uri); - } - break; - } - case StartPageMessages.OpenCommandPalette: - sendTelemetryEvent(Telemetry.StartPageOpenCommandPalette); - this.setTelemetryFlags(); - - await this.commandManager.executeCommand('workbench.action.showCommands'); - break; - case StartPageMessages.OpenCommandPaletteWithOpenNBSelected: - sendTelemetryEvent(Telemetry.StartPageOpenCommandPaletteWithOpenNBSelected); - this.setTelemetryFlags(); - - await this.commandManager.executeCommand('workbench.action.quickOpen', '>Create New Blank Notebook'); - break; - case StartPageMessages.OpenSampleNotebook: - if (!isJupyterInstalled) { - this.output.appendLine(Jupyter.jupyterExtensionNotInstalled()); - - if (shouldShowJupyterNotInstalledPrompt) { - await this.notificationHelper.showJupyterNotInstalledPrompt( - JupyterNotInstalledOrigin.StartPageOpenSampleNotebook, - ); - } - } else { - sendTelemetryEvent(Telemetry.StartPageOpenSampleNotebook); - this.setTelemetryFlags(); - - this.openSampleNotebook().ignoreErrors(); - } - break; - case StartPageMessages.OpenFileBrowser: { - sendTelemetryEvent(Telemetry.StartPageOpenFileBrowser); - this.setTelemetryFlags(); - - const uri = await this.appShell.showOpenDialog({ - filters: { - Python: ['py', 'ipynb'], - }, - canSelectMany: false, - }); - if (uri) { - const doc3 = await this.documentManager.openTextDocument(uri[0]); - await this.documentManager.showTextDocument(doc3); - } - break; - } - case StartPageMessages.OpenFolder: - sendTelemetryEvent(Telemetry.StartPageOpenFolder); - this.setTelemetryFlags(); - this.commandManager.executeCommand('workbench.action.files.openFolder'); - break; - case StartPageMessages.OpenWorkspace: - sendTelemetryEvent(Telemetry.StartPageOpenWorkspace); - this.setTelemetryFlags(); - this.commandManager.executeCommand('workbench.action.openWorkspace'); - break; - case StartPageMessages.UpdateSettings: - if (payload === false) { - sendTelemetryEvent(Telemetry.StartPageClickedDontShowAgain); - } - await this.configuration.updateSetting('showStartPage', payload, undefined, ConfigurationTarget.Global); - break; - default: - break; - } - - super.onMessage(message, payload); - } - - // Public for testing - public async extensionVersionChanged(): Promise { - const savedVersion: string | undefined = this.context.globalState.get(EXTENSION_VERSION_MEMENTO); - const { version } = this.appEnvironment.packageJson; - let shouldShowStartPage: boolean; - - if (savedVersion) { - if (savedVersion === version || this.savedVersionisOlder(savedVersion, version)) { - // There has not been an update - shouldShowStartPage = false; - } else { - sendTelemetryEvent(Telemetry.StartPageOpenedFromNewUpdate); - shouldShowStartPage = true; - } - } else { - sendTelemetryEvent(Telemetry.StartPageOpenedFromNewInstall); - shouldShowStartPage = true; - } - - // savedVersion being undefined means this is the first time the user activates the extension. - // if savedVersion != version, there was an update - await this.context.globalState.update(EXTENSION_VERSION_MEMENTO, version); - return shouldShowStartPage; - } - - // eslint-disable-next-line class-methods-use-this - private savedVersionisOlder(savedVersion: string, actualVersion: string): boolean { - const saved = savedVersion.split('.'); - const actual = actualVersion.split('.'); - - switch (true) { - case Number(actual[0]) > Number(saved[0]): - return false; - case Number(actual[0]) < Number(saved[0]): - return true; - case Number(actual[1]) > Number(saved[1]): - return false; - case Number(actual[1]) < Number(saved[1]): - return true; - case Number(actual[2][0]) > Number(saved[2][0]): - return false; - case Number(actual[2][0]) < Number(saved[2][0]): - return true; - default: - return false; - } - } - - private async openSampleNotebook(): Promise { - const ipynb = '.ipynb'; - const localizedFilePath = path.join( - EXTENSION_ROOT_DIR, - 'pythonFiles', - localize.StartPage.sampleNotebook() + ipynb, - ); - let sampleNotebookPath: string; - - if (await this.file.fileExists(localizedFilePath)) { - sampleNotebookPath = localizedFilePath; - } else { - sampleNotebookPath = path.join(EXTENSION_ROOT_DIR, 'pythonFiles', 'Notebooks intro.ipynb'); - } - - await this.commandManager.executeCommand( - 'jupyter.opennotebook', - Uri.file(sampleNotebookPath), - CommandSource.commandPalette, - ); - } - - private setTelemetryFlags() { - if (this.firstTime) { - this.actionTakenOnFirstTime = true; - } - this.actionTaken = true; - } -} diff --git a/src/client/common/startPage/startPageMessageListener.ts b/src/client/common/startPage/startPageMessageListener.ts deleted file mode 100644 index 7c8e6688f004..000000000000 --- a/src/client/common/startPage/startPageMessageListener.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -'use strict'; -import { IWebviewPanel, IWebviewPanelMessageListener } from '../application/types'; -import '../extensions'; - -// This class listens to messages that come from the local Python Interactive window -export class StartPageMessageListener implements IWebviewPanelMessageListener { - private disposedCallback: () => void; - private callback: (message: string, payload: any) => void; - private viewChanged: (panel: IWebviewPanel) => void; - - constructor( - callback: (message: string, payload: any) => void, - viewChanged: (panel: IWebviewPanel) => void, - disposed: () => void, - ) { - // Save our dispose callback so we remove our interactive window - this.disposedCallback = disposed; - - // Save our local callback so we can handle the non broadcast case(s) - this.callback = callback; - - // Save view changed so we can forward view change events. - this.viewChanged = viewChanged; - } - - public async dispose() { - this.disposedCallback(); - } - - public onMessage(message: string, payload: any) { - // Send to just our local callback. - this.callback(message, payload); - } - - public onChangeViewState(panel: IWebviewPanel) { - // Forward this onto our callback - this.viewChanged(panel); - } -} diff --git a/src/client/common/startPage/themeFinder.ts b/src/client/common/startPage/themeFinder.ts deleted file mode 100644 index 1b812940bc26..000000000000 --- a/src/client/common/startPage/themeFinder.ts +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { inject, injectable } from 'inversify'; -import * as path from 'path'; - -import { LanguageConfiguration } from 'vscode'; -import { EXTENSION_ROOT_DIR, PYTHON_LANGUAGE } from '../constants'; -import { traceError } from '../logger'; - -import { getLanguageConfiguration } from '../../language/languageConfiguration'; -import { IFileSystem } from '../platform/types'; -import { ICurrentProcess, IExtensions } from '../types'; -import { IThemeFinder } from './types'; - -interface IThemeData { - rootFile: string; - isDark: boolean; -} - -@injectable() -export class ThemeFinder implements IThemeFinder { - private themeCache: { [key: string]: IThemeData | undefined } = {}; - - private languageCache: { [key: string]: string | undefined } = {}; - - constructor( - @inject(IExtensions) private extensions: IExtensions, - @inject(ICurrentProcess) private currentProcess: ICurrentProcess, - @inject(IFileSystem) private fs: IFileSystem, - ) {} - - public async findThemeRootJson(themeName: string): Promise { - // find our data - const themeData = await this.findThemeData(themeName); - - // Use that data if it worked - if (themeData) { - return themeData.rootFile; - } - } - - public async findTmLanguage(language: string): Promise { - // See if already found it or not - if (!this.themeCache.hasOwnProperty(language)) { - try { - this.languageCache[language] = await this.findMatchingLanguage(language); - } catch (exc) { - traceError(exc); - } - } - return this.languageCache[language]; - } - - public async findLanguageConfiguration(language: string): Promise { - if (language === PYTHON_LANGUAGE) { - // Custom for python. Some of these are required by monaco. - const config: unknown = { - comments: { - lineComment: '#', - blockComment: ['"""', '"""'], - }, - brackets: [ - ['{', '}'], - ['[', ']'], - ['(', ')'], - ], - autoClosingPairs: [ - { open: '{', close: '}' }, - { open: '[', close: ']' }, - { open: '(', close: ')' }, - { open: '"', close: '"', notIn: ['string'] }, - { open: "'", close: "'", notIn: ['string', 'comment'] }, - ], - surroundingPairs: [ - { open: '{', close: '}' }, - { open: '[', close: ']' }, - { open: '(', close: ')' }, - { open: '"', close: '"' }, - { open: "'", close: "'" }, - ], - folding: { - offSide: true, - markers: { - start: new RegExp('^\\s*#region\\b'), - end: new RegExp('^\\s*#endregion\\b'), - }, - }, - ...getLanguageConfiguration(), - }; - - return config as LanguageConfiguration; - } - return this.findMatchingLanguageConfiguration(language); - } - - public async isThemeDark(themeName: string): Promise { - // find our data - const themeData = await this.findThemeData(themeName); - - // Use that data if it worked - if (themeData) { - return themeData.isDark; - } - } - - private async findThemeData(themeName: string): Promise { - // See if already found it or not - if (!this.themeCache.hasOwnProperty(themeName)) { - try { - this.themeCache[themeName] = await this.findMatchingTheme(themeName); - } catch (exc) { - traceError(exc); - } - } - return this.themeCache[themeName]; - } - - private async findMatchingLanguage(language: string): Promise { - const currentExe = this.currentProcess.execPath; - let currentPath = path.dirname(currentExe); - - // Should be somewhere under currentPath/resources/app/extensions inside of a json file - let extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions'); - if (!(await this.fs.directoryExists(extensionsPath))) { - // Might be on mac or linux. try a different path - currentPath = path.resolve(currentPath, '../../../..'); - extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions'); - } - - // Search through all of the files in this folder - let results = await this.findMatchingLanguages(language, extensionsPath); - - // If that didn't work, see if it's our MagicPython predefined tmLanguage - if (!results && language === PYTHON_LANGUAGE) { - results = await this.fs.readFile(path.join(EXTENSION_ROOT_DIR, 'resources', 'MagicPython.tmLanguage.json')); - } - - return results; - } - - private async findMatchingLanguageConfiguration(language: string): Promise { - try { - const currentExe = this.currentProcess.execPath; - let currentPath = path.dirname(currentExe); - - // Should be somewhere under currentPath/resources/app/extensions inside of a json file - let extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions', language); - if (!(await this.fs.directoryExists(extensionsPath))) { - // Might be on mac or linux. try a different path - currentPath = path.resolve(currentPath, '../../../..'); - extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions', language); - } - - // See if the 'language-configuration.json' file exists - const filePath = path.join(extensionsPath, 'language-configuration.json'); - if (await this.fs.fileExists(filePath)) { - const contents = await this.fs.readFile(filePath); - return JSON.parse(contents) as LanguageConfiguration; - } - } catch { - // Do nothing if an error - } - - return {}; - } - - private async findMatchingLanguages(language: string, rootPath: string): Promise { - // Environment variable to mimic missing json problem - if (process.env.VSC_PYTHON_MIMIC_REMOTE) { - return undefined; - } - - // Search through all package.json files in the directory and below, looking - // for the themeName in them. - const foundPackages = await this.fs.search('**/package.json', rootPath); - if (foundPackages && foundPackages.length > 0) { - // For each one, open it up and look for the theme name. - for (const f of foundPackages) { - const fpath = path.join(rootPath, f); - const data = await this.findMatchingLanguageFromJson(fpath, language); - if (data) { - return data; - } - } - } - } - - private async findMatchingTheme(themeName: string): Promise { - // Environment variable to mimic missing json problem - if (process.env.VSC_PYTHON_MIMIC_REMOTE) { - return undefined; - } - - // Look through all extensions to find the theme. This will search - // the default extensions folder and our installed extensions. - const extensions = this.extensions.all; - for (const e of extensions) { - const result = await this.findMatchingThemeFromJson(path.join(e.extensionPath, 'package.json'), themeName); - if (result) { - return result; - } - } - - // If didn't find in the extensions folder, then try searching manually. This shouldn't happen, but - // this is our backup plan in case vscode changes stuff. - const currentExe = this.currentProcess.execPath; - let currentPath = path.dirname(currentExe); - - // Should be somewhere under currentPath/resources/app/extensions inside of a json file - let extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions'); - if (!(await this.fs.directoryExists(extensionsPath))) { - // Might be on mac or linux. try a different path - currentPath = path.resolve(currentPath, '../../../..'); - extensionsPath = path.join(currentPath, 'resources', 'app', 'extensions'); - } - const other = await this.findMatchingThemes(extensionsPath, themeName); - if (other) { - return other; - } - } - - private async findMatchingThemes(rootPath: string, themeName: string): Promise { - // Search through all package.json files in the directory and below, looking - // for the themeName in them. - const foundPackages = await this.fs.search('**/package.json', rootPath); - if (foundPackages && foundPackages.length > 0) { - // For each one, open it up and look for the theme name. - for (const f of foundPackages) { - const fpath = path.join(rootPath, f); - const data = await this.findMatchingThemeFromJson(fpath, themeName); - if (data) { - return data; - } - } - } - } - - private async findMatchingLanguageFromJson(packageJson: string, language: string): Promise { - // Read the contents of the json file - const text = await this.fs.readFile(packageJson); - const json = JSON.parse(text); - - // Should have a name entry and a contributes entry - if (json.hasOwnProperty('name') && json.hasOwnProperty('contributes')) { - // See if contributes has a grammars - const { contributes } = json; - if (contributes.hasOwnProperty('grammars')) { - const grammars = contributes.grammars as any[]; - // Go through each theme, seeing if the label matches our theme name - for (const t of grammars) { - if (t.hasOwnProperty('language') && t.language === language) { - // Path is relative to the package.json file. - const rootFile = t.hasOwnProperty('path') - ? path.join(path.dirname(packageJson), t.path.toString()) - : ''; - return this.fs.readFile(rootFile); - } - } - } - } - } - - private async findMatchingThemeFromJson(packageJson: string, themeName: string): Promise { - // Read the contents of the json file - const text = await this.fs.readFile(packageJson); - const json = JSON.parse(text); - - // Should have a name entry and a contributes entry - if (json.hasOwnProperty('name') && json.hasOwnProperty('contributes')) { - // See if contributes has a theme - const { contributes } = json; - if (contributes.hasOwnProperty('themes')) { - const themes = contributes.themes as any[]; - // Go through each theme, seeing if the label matches our theme name - for (const t of themes) { - if ( - (t.hasOwnProperty('label') && t.label === themeName) || - (t.hasOwnProperty('id') && t.id === themeName) - ) { - const isDark = t.hasOwnProperty('uiTheme') && t.uiTheme === 'vs-dark'; - // Path is relative to the package.json file. - const rootFile = t.hasOwnProperty('path') - ? path.join(path.dirname(packageJson), t.path.toString()) - : ''; - - return { isDark, rootFile }; - } - } - } - } - } -} diff --git a/src/client/common/startPage/types.ts b/src/client/common/startPage/types.ts deleted file mode 100644 index 589c53c7389b..000000000000 --- a/src/client/common/startPage/types.ts +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { LanguageConfiguration } from 'vscode'; - -export type JSONPrimitive = string | number | boolean | null; -export type JSONValue = JSONPrimitive | JSONObject | JSONArray; -export type JSONObject = { [member: string]: JSONValue }; -export type JSONArray = JSONValue[]; - -export const IStartPage = Symbol('IStartPage'); -export interface IStartPage { - readonly initialMementoValue?: string; - open(): Promise; - extensionVersionChanged(): Promise; -} - -export interface ISettingPackage { - showAgainSetting: boolean; -} - -export enum StartPageMessages { - Started = 'started', - UpdateSettings = 'update_settings', - RequestShowAgainSetting = 'RequestShowAgainSetting', - SendSetting = 'SendSetting', - OpenBlankNotebook = 'OpenBlankNotebook', - OpenBlankPythonFile = 'OpenBlankPythonFile', - OpenInteractiveWindow = 'OpenInteractiveWindow', - OpenCommandPalette = 'OpenCommandPalette', - OpenCommandPaletteWithOpenNBSelected = 'OpenCommandPaletteWithOpenNBSelected', - OpenSampleNotebook = 'OpenSampleNotebook', - OpenFileBrowser = 'OpenFileBrowser', - OpenFolder = 'OpenFolder', - OpenWorkspace = 'OpenWorkspace', -} - -export class IStartPageMapping { - public [StartPageMessages.RequestShowAgainSetting]: ISettingPackage; - - public [StartPageMessages.SendSetting]: ISettingPackage; - - public [StartPageMessages.Started]: never | undefined; - - public [StartPageMessages.UpdateSettings]: boolean; - - public [StartPageMessages.OpenBlankNotebook]: never | undefined; - - public [StartPageMessages.OpenBlankPythonFile]: never | undefined; - - public [StartPageMessages.OpenInteractiveWindow]: never | undefined; - - public [StartPageMessages.OpenCommandPalette]: never | undefined; - - public [StartPageMessages.OpenCommandPaletteWithOpenNBSelected]: never | undefined; - - public [StartPageMessages.OpenSampleNotebook]: never | undefined; - - public [StartPageMessages.OpenFileBrowser]: never | undefined; - - public [StartPageMessages.OpenFolder]: never | undefined; - - public [StartPageMessages.OpenWorkspace]: never | undefined; -} - -type WebViewViewState = { - readonly visible: boolean; - readonly active: boolean; -}; -export type WebViewViewChangeEventArgs = { current: WebViewViewState; previous: WebViewViewState }; - -export const ICodeCssGenerator = Symbol('ICodeCssGenerator'); -export interface ICodeCssGenerator { - generateThemeCss(isDark: boolean, theme: string): Promise; - generateMonacoTheme(isDark: boolean, theme: string): Promise; -} - -export const IThemeFinder = Symbol('IThemeFinder'); -export interface IThemeFinder { - findThemeRootJson(themeName: string): Promise; - findTmLanguage(language: string): Promise; - findLanguageConfiguration(language: string): Promise; - isThemeDark(themeName: string): Promise; -} diff --git a/src/client/common/startPage/webviewHost.ts b/src/client/common/startPage/webviewHost.ts deleted file mode 100644 index 40227b0a7d17..000000000000 --- a/src/client/common/startPage/webviewHost.ts +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import '../extensions'; - -import { injectable, unmanaged } from 'inversify'; -import { ConfigurationChangeEvent, Uri } from 'vscode'; - -import { captureTelemetry } from '../../telemetry'; -import { IWebview, IWorkspaceService } from '../application/types'; -import { createDeferred, Deferred } from '../utils/async'; -import * as localize from '../utils/localize'; -import { DefaultTheme, Telemetry } from './constants'; -import { ICodeCssGenerator, IThemeFinder } from './types'; - -import { PythonSettings } from '../configSettings'; -import { isTestExecution } from '../constants'; -import { IConfigurationService, IDisposable, IPythonSettings, Resource } from '../types'; -import { CssMessages, IGetCssRequest, IGetMonacoThemeRequest, SharedMessages } from './messages'; - -@injectable() // For some reason this is necessary to get the class hierarchy to work. -export abstract class WebviewHost implements IDisposable { - protected webview?: IWebview; - - protected disposed = false; - - protected themeIsDarkPromise: Deferred | undefined = createDeferred(); - - protected webviewInit: Deferred | undefined = createDeferred(); - - protected readonly _disposables: IDisposable[] = []; - - constructor( - @unmanaged() protected configService: IConfigurationService, - @unmanaged() private cssGenerator: ICodeCssGenerator, - @unmanaged() protected themeFinder: IThemeFinder, - @unmanaged() protected workspaceService: IWorkspaceService, - @unmanaged() protected readonly useCustomEditorApi: boolean, - ) { - // Listen for settings changes from vscode. - this._disposables.push(this.workspaceService.onDidChangeConfiguration(this.onPossibleSettingsChange, this)); - - // Listen for settings changes - this._disposables.push( - this.configService.getSettings(undefined).onDidChange(this.onSettingsChanged.bind(this)), - ); - } - - public dispose(): void { - if (!this.disposed) { - this.disposed = true; - this.themeIsDarkPromise = undefined; - this._disposables.forEach((item) => item.dispose()); - } - - this.webviewInit = undefined; - } - - public setTheme(isDark: boolean): void { - if (this.themeIsDarkPromise && !this.themeIsDarkPromise.resolved) { - this.themeIsDarkPromise.resolve(isDark); - } else { - this.themeIsDarkPromise = createDeferred(); - this.themeIsDarkPromise.resolve(isDark); - } - } - - // Post a message to our webview and update our new settings - protected onSettingsChanged = async (): Promise => { - // Stringify our settings to send over to the panel - const settings = JSON.stringify(await this.generateExtraSettings()); - this.postMessageInternal(SharedMessages.UpdateSettings, settings).ignoreErrors(); - }; - - protected asWebviewUri(localResource: Uri): Uri { - if (!this.webview) { - throw new Error('asWebViewUri called too early'); - } - return this.webview?.asWebviewUri(localResource); - } - - protected abstract get owningResource(): Resource; - - protected postMessage(type: T, payload?: M[T]): Promise { - // Then send it the message - return this.postMessageInternal(type.toString(), payload); - } - - protected onMessage(message: string, payload: any): void { - switch (message) { - case CssMessages.GetCssRequest: - this.handleCssRequest(payload as IGetCssRequest).ignoreErrors(); - break; - - case CssMessages.GetMonacoThemeRequest: - this.handleMonacoThemeRequest(payload as IGetMonacoThemeRequest).ignoreErrors(); - break; - - default: - break; - } - } - - protected async generateExtraSettings(): Promise { - const settings = this.configService.getSettings(this.owningResource); - return PythonSettings.toSerializable(settings); - } - - protected async sendLocStrings() { - const locStrings = isTestExecution() ? '{}' : localize.getCollectionJSON(); - this.postMessageInternal(SharedMessages.LocInit, locStrings).ignoreErrors(); - } - - protected async postMessageInternal(type: string, payload?: any): Promise { - if (this.webviewInit) { - // Make sure the webpanel is up before we send it anything. - await this.webviewInit.promise; - - // Then send it the message - this.webview?.postMessage({ type: type.toString(), payload }); - } - } - - protected isDark(): Promise { - return this.themeIsDarkPromise ? this.themeIsDarkPromise.promise : Promise.resolve(false); - } - - @captureTelemetry(Telemetry.WebviewStyleUpdate) - private async handleCssRequest(request: IGetCssRequest): Promise { - const workbench = this.workspaceService.getConfiguration('workbench'); - const theme = !workbench ? DefaultTheme : workbench.get('colorTheme', DefaultTheme); - const requestIsDark = request?.isDark; - this.setTheme(requestIsDark); - const isDark = await this.themeFinder.isThemeDark(theme); - const css = await this.cssGenerator.generateThemeCss(requestIsDark, theme); - return this.postMessageInternal(CssMessages.GetCssResponse, { - css, - theme: theme, - knownDark: isDark, - }); - } - - @captureTelemetry(Telemetry.WebviewMonacoStyleUpdate) - private async handleMonacoThemeRequest(request: IGetMonacoThemeRequest): Promise { - const workbench = this.workspaceService.getConfiguration('workbench'); - const theme = !workbench ? DefaultTheme : workbench.get('colorTheme', DefaultTheme); - const isDark = request?.isDark; - this.setTheme(isDark); - const monacoTheme = await this.cssGenerator.generateMonacoTheme(isDark, theme); - return this.postMessageInternal(CssMessages.GetMonacoThemeResponse, { theme: monacoTheme }); - } - - // Post a message to our webpanel and update our new settings - private onPossibleSettingsChange = async (event: ConfigurationChangeEvent) => { - if (event.affectsConfiguration('workbench.colorTheme')) { - // See if the theme changed - const newSettings = await this.generateExtraSettings(); - if (newSettings) { - const dsSettings = JSON.stringify(newSettings); - this.postMessageInternal(SharedMessages.UpdateSettings, dsSettings).ignoreErrors(); - } - } - }; -} diff --git a/src/client/common/startPage/webviewPanelHost.ts b/src/client/common/startPage/webviewPanelHost.ts deleted file mode 100644 index 100989c3caec..000000000000 --- a/src/client/common/startPage/webviewPanelHost.ts +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import '../extensions'; - -import { injectable, unmanaged } from 'inversify'; -import { Uri, ViewColumn, WebviewPanel } from 'vscode'; - -import { - IWebviewPanel, - IWebviewPanelMessageListener, - IWebviewPanelProvider, - IWorkspaceService, -} from '../application/types'; -import { traceInfo } from '../logger'; -import { createDeferred } from '../utils/async'; -import { noop } from '../utils/misc'; -import { StopWatch } from '../utils/stopWatch'; -import { ICodeCssGenerator, IThemeFinder, WebViewViewChangeEventArgs } from './types'; - -import { sendTelemetryEvent } from '../../telemetry'; -import { IConfigurationService, IDisposable } from '../types'; -import { Telemetry } from './constants'; -import { SharedMessages } from './messages'; -import { WebviewHost } from './webviewHost'; - -@injectable() // For some reason this is necessary to get the class hierarchy to work. -export abstract class WebviewPanelHost extends WebviewHost implements IDisposable { - protected get isDisposed(): boolean { - return this.disposed; - } - - protected viewState: { visible: boolean; active: boolean } = { visible: false, active: false }; - - private webPanel: IWebviewPanel | undefined; - - private messageListener: IWebviewPanelMessageListener; - - private startupStopwatch = new StopWatch(); - - constructor( - @unmanaged() protected configService: IConfigurationService, - @unmanaged() private provider: IWebviewPanelProvider, - @unmanaged() cssGenerator: ICodeCssGenerator, - @unmanaged() protected themeFinder: IThemeFinder, - @unmanaged() protected workspaceService: IWorkspaceService, - @unmanaged() - messageListenerCtor: ( - callback: (message: string, payload: {}) => void, - viewChanged: (panel: IWebviewPanel) => void, - disposed: () => void, - ) => IWebviewPanelMessageListener, - @unmanaged() private rootPath: string, - @unmanaged() private scripts: string[], - @unmanaged() private _title: string, - @unmanaged() private viewColumn: ViewColumn, - @unmanaged() protected readonly useCustomEditorApi: boolean, - ) { - super(configService, cssGenerator, themeFinder, workspaceService, useCustomEditorApi); - - // Create our message listener for our web panel. - this.messageListener = messageListenerCtor( - this.onMessage.bind(this), - this.webPanelViewStateChanged.bind(this), - this.dispose.bind(this), - ); - } - - public async show(preserveFocus: boolean): Promise { - if (!this.isDisposed) { - // Then show our web panel. - if (this.webPanel) { - await this.webPanel.show(preserveFocus); - } - } - } - - public updateCwd(cwd: string): void { - if (this.webPanel) { - this.webPanel.updateCwd(cwd); - } - } - - public dispose() { - if (!this.isDisposed) { - this.disposed = true; - if (this.webPanel) { - this.webPanel.close(); - this.webPanel = undefined; - } - } - - super.dispose(); - } - - public get title() { - return this._title; - } - - public setTitle(newTitle: string) { - this._title = newTitle; - if (!this.isDisposed && this.webPanel) { - this.webPanel.setTitle(newTitle); - } - } - - protected onMessage(message: string, payload: any) { - switch (message) { - case SharedMessages.Started: - this.webPanelRendered(); - break; - - default: - // Forward unhandled messages to the base class - super.onMessage(message, payload); - break; - } - } - - protected shareMessage(type: T, payload?: M[T]) { - // Send our remote message. - this.messageListener.onMessage(type.toString(), payload); - } - - protected onViewStateChanged(_args: WebViewViewChangeEventArgs) { - noop(); - } - - protected async loadWebPanel(cwd: string, webViewPanel?: WebviewPanel) { - // Make not disposed anymore - this.disposed = false; - - // Setup our init promise for the web panel. We use this to make sure we're in sync with our - // react control. - this.webviewInit = this.webviewInit || createDeferred(); - - // Setup a promise that will wait until the webview passes back - // a message telling us what them is in use - this.themeIsDarkPromise = this.themeIsDarkPromise ? this.themeIsDarkPromise : createDeferred(); - - // Load our actual web panel - - traceInfo(`Loading web panel. Panel is ${this.webPanel ? 'set' : 'notset'}`); - - // Create our web panel (it's the UI that shows up for the history) - if (this.webPanel === undefined) { - // Get our settings to pass along to the react control - const settings = await this.generateExtraSettings(); - - traceInfo('Loading web view...'); - - const workspaceFolder = this.workspaceService.getWorkspaceFolder(Uri.file(cwd))?.uri; - - // Use this script to create our web view panel. It should contain all of the necessary - // script to communicate with this class. - this.webPanel = await this.provider.create({ - viewColumn: this.viewColumn, - listener: this.messageListener, - title: this.title, - rootPath: this.rootPath, - scripts: this.scripts, - settings, - cwd, - webViewPanel, - additionalPaths: workspaceFolder ? [workspaceFolder.fsPath] : [], - }); - - // Set our webview after load - this.webview = this.webPanel; - - // Track to seee if our web panel fails to load - this._disposables.push(this.webPanel.loadFailed(this.onWebPanelLoadFailed, this)); - - traceInfo('Web view created.'); - } - - // Send the first settings message - this.onSettingsChanged().ignoreErrors(); - - // Send the loc strings (skip during testing as it takes up a lot of memory) - this.sendLocStrings().ignoreErrors(); - } - - // If our webpanel fails to load then just dispose ourselves - private onWebPanelLoadFailed = async () => { - this.dispose(); - }; - - private webPanelViewStateChanged = (webPanel: IWebviewPanel) => { - const visible = webPanel.isVisible(); - const active = webPanel.isActive(); - const current = { visible, active }; - const previous = { visible: this.viewState.visible, active: this.viewState.active }; - this.viewState.visible = visible; - this.viewState.active = active; - this.onViewStateChanged({ current, previous }); - }; - - private webPanelRendered() { - if (this.webviewInit && !this.webviewInit.resolved) { - // Send telemetry for startup - sendTelemetryEvent(Telemetry.WebviewStartup, this.startupStopwatch.elapsedTime, { type: this.title }); - - // Resolve our started promise. This means the webpanel is ready to go. - this.webviewInit.resolve(); - - traceInfo('Web view react rendered'); - } - - // On started, resend our init data. - this.sendLocStrings().ignoreErrors(); - this.onSettingsChanged().ignoreErrors(); - } -} diff --git a/src/client/common/types.ts b/src/client/common/types.ts index 7ff71aa96aea..5cccc64a22c5 100644 --- a/src/client/common/types.ts +++ b/src/client/common/types.ts @@ -175,7 +175,6 @@ export interface IPythonSettings { readonly poetryPath: string; readonly insidersChannel: ExtensionChannels; readonly downloadLanguageServer: boolean; - readonly showStartPage: boolean; readonly jediPath: string; readonly jediMemoryLimit: number; readonly devOptions: string[]; @@ -510,17 +509,6 @@ export interface IAsyncDisposableRegistry extends IAsyncDisposable { push(disposable: IDisposable | IAsyncDisposable): void; } -/* ABExperiments field carries the identity, and the range of the experiment, - where the experiment is valid for users falling between the number 'min' and 'max' - More details: https://en.wikipedia.org/wiki/A/B_testing -*/ -export type ABExperiments = { - name: string; // Name of the experiment - salt: string; // Salt string for the experiment - min: number; // Lower limit for the experiment - max: number; // Upper limit for the experiment -}[]; - /** * Experiment service leveraging VS Code's experiment framework. */ diff --git a/src/client/common/utils/localize.ts b/src/client/common/utils/localize.ts index 5506c58b7f15..a9aecbfec9f5 100644 --- a/src/client/common/utils/localize.ts +++ b/src/client/common/utils/localize.ts @@ -131,13 +131,6 @@ export namespace Pylance { export const pylanceRevertToJedi = localize('Pylance.pylanceRevertToJedi', 'Revert to Jedi'); } -export namespace Jupyter { - export const jupyterExtensionNotInstalled = localize( - 'Jupyter.extensionNotInstalled', - "This feature is available in the Jupyter extension, which isn't currently installed.", - ); -} - export namespace TensorBoard { export const enterRemoteUrl = localize('TensorBoard.enterRemoteUrl', 'Enter remote URL'); export const enterRemoteUrlDetail = localize( @@ -426,57 +419,6 @@ export namespace ExtensionSurveyBanner { export namespace Products { export const installingModule = localize('products.installingModule', 'Installing {0}'); } - -export namespace StartPage { - export const getStarted = localize('StartPage.getStarted', 'Python - Get Started'); - export const pythonExtensionTitle = localize('StartPage.pythonExtensionTitle', 'Python Extension'); - export const createJupyterNotebook = localize('StartPage.createJupyterNotebook', 'Create a Jupyter Notebook'); - export const notebookDescription = localize( - 'StartPage.notebookDescription', - '- Run "" in the Command Palette (
Shift + Command + P
)
- Explore our to learn about notebook features', - ); - export const createAPythonFile = localize('StartPage.createAPythonFile', 'Create a Python File'); - export const pythonFileDescription = localize( - 'StartPage.pythonFileDescription', - '- Create a with a .py extension', - ); - export const openInteractiveWindow = localize( - 'StartPage.openInteractiveWindow', - 'Use the Interactive Window to develop Python Scripts', - ); - export const interactiveWindowDesc = localize( - 'StartPage.interactiveWindowDesc', - '- You can create cells on a Python file by typing "#%%". Make sure you have the Jupyter extension installed.
- Use "
Shift + Enter
" to run a cell, the output will be shown in the interactive window', - ); - - export const releaseNotes = localize( - 'StartPage.releaseNotes', - 'Take a look at our Release Notes to learn more about the latest features.', - ); - export const tutorialAndDoc = localize( - 'StartPage.tutorialAndDoc', - 'Explore more features in our Tutorials or check Documentation for tips and troubleshooting.', - ); - export const mailingList = localize( - 'StartPage.mailingList', - 'Sign up for tips and tutorials through our mailing list.', - ); - export const dontShowAgain = localize('StartPage.dontShowAgain', "Don't show this page again"); - export const helloWorld = localize('StartPage.helloWorld', 'Hello world'); - // When localizing sampleNotebook, the translated notebook must also be included in - // pythonFiles\* - export const sampleNotebook = localize('StartPage.sampleNotebook', 'Notebooks intro'); - export const openFolder = localize('StartPage.openFolder', 'Open a Folder or Workspace'); - export const folderDesc = localize( - 'StartPage.folderDesc', - '- Open a
- Open a ', - ); - export const badWebPanelFormatString = localize( - 'StartPage.badWebPanelFormatString', - '

{0} is not a valid file name

', - ); -} - export namespace DebugConfigStrings { export const selectConfiguration = { title: localize('debug.selectConfigurationTitle'), diff --git a/src/client/extensionActivation.ts b/src/client/extensionActivation.ts index f45440645879..b7bb614ded18 100644 --- a/src/client/extensionActivation.ts +++ b/src/client/extensionActivation.ts @@ -15,8 +15,6 @@ import { Commands, PYTHON, PYTHON_LANGUAGE, STANDARD_OUTPUT_CHANNEL, UseProposed import { registerTypes as installerRegisterTypes } from './common/installer/serviceRegistry'; import { traceError } from './common/logger'; import { IFileSystem } from './common/platform/types'; -import { StartPage } from './common/startPage/startPage'; -import { IStartPage } from './common/startPage/types'; import { IConfigurationService, IDisposableRegistry, @@ -152,8 +150,6 @@ async function activateLegacy(ext: ExtensionState): Promise { const cmdManager = serviceContainer.get(ICommandManager); const outputChannel = serviceManager.get(IOutputChannel, STANDARD_OUTPUT_CHANNEL); disposables.push(cmdManager.registerCommand(Commands.ViewOutput, () => outputChannel.show())); - const startPage = serviceManager.get(IStartPage); - cmdManager.registerCommand(Commands.OpenStartPage, () => startPage.open()); cmdManager.executeCommand('setContext', 'python.vscode.channel', applicationEnv.channel).then(noop, noop); serviceContainer.get(IApplicationDiagnostics).register(); diff --git a/src/client/jupyter/jupyterNotInstalledNotificationHelper.ts b/src/client/jupyter/jupyterNotInstalledNotificationHelper.ts deleted file mode 100644 index c3c7ec578702..000000000000 --- a/src/client/jupyter/jupyterNotInstalledNotificationHelper.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { injectable, inject } from 'inversify'; -import { IApplicationShell, IJupyterExtensionDependencyManager } from '../common/application/types'; -import { IPersistentStateFactory } from '../common/types'; -import { Common, Jupyter } from '../common/utils/localize'; -import { sendTelemetryEvent } from '../telemetry'; -import { EventName } from '../telemetry/constants'; -import { IJupyterNotInstalledNotificationHelper, JupyterNotInstalledOrigin } from './types'; - -export const jupyterExtensionNotInstalledKey = 'jupyterExtensionNotInstalledKey'; - -@injectable() -export class JupyterNotInstalledNotificationHelper implements IJupyterNotInstalledNotificationHelper { - constructor( - @inject(IApplicationShell) private appShell: IApplicationShell, - @inject(IPersistentStateFactory) private persistentState: IPersistentStateFactory, - @inject(IJupyterExtensionDependencyManager) private depsManager: IJupyterExtensionDependencyManager, - ) {} - - public shouldShowJupypterExtensionNotInstalledPrompt(): boolean { - const doNotShowAgain = this.persistentState.createGlobalPersistentState(jupyterExtensionNotInstalledKey, false); - - if (doNotShowAgain.value) { - return false; - } - - const isInstalled = this.depsManager.isJupyterExtensionInstalled; - - return !isInstalled; - } - - public async showJupyterNotInstalledPrompt(entrypoint: JupyterNotInstalledOrigin): Promise { - sendTelemetryEvent(EventName.JUPYTER_NOT_INSTALLED_NOTIFICATION_DISPLAYED, undefined, { entrypoint }); - - const prompts = [Common.doNotShowAgain()]; - const telemetrySelections: ['Do not show again'] = ['Do not show again']; - - const selection = await this.appShell.showInformationMessage( - Jupyter.jupyterExtensionNotInstalled(), - ...prompts, - ); - - sendTelemetryEvent(EventName.JUPYTER_NOT_INSTALLED_NOTIFICATION_ACTION, undefined, { - selection: selection ? telemetrySelections[prompts.indexOf(selection)] : undefined, - }); - - if (!selection) { - return; - } - - // Never show this prompt again - await this.persistentState - .createGlobalPersistentState(jupyterExtensionNotInstalledKey, false) - .updateValue(true); - } -} diff --git a/src/client/jupyter/types.ts b/src/client/jupyter/types.ts index fdd28ea3df7b..5eb58c7cf2b2 100644 --- a/src/client/jupyter/types.ts +++ b/src/client/jupyter/types.ts @@ -45,15 +45,3 @@ enum ColumnType { // eslint-disable-next-line @typescript-eslint/no-explicit-any type IRowsResponse = any[]; - -export enum JupyterNotInstalledOrigin { - StartPageOpenBlankNotebook = 'startpage_open_blank_notebook', - StartPageOpenSampleNotebook = 'startpage_open_sample_notebook', - StartPageOpenInteractiveWindow = 'startpage_open_interactive_window', -} - -export const IJupyterNotInstalledNotificationHelper = Symbol('IJupyterNotInstalledNotificationHelper'); -export interface IJupyterNotInstalledNotificationHelper { - shouldShowJupypterExtensionNotInstalledPrompt(): boolean; - showJupyterNotInstalledPrompt(entrypoint: JupyterNotInstalledOrigin): Promise; -} diff --git a/src/client/telemetry/constants.ts b/src/client/telemetry/constants.ts index 262bb0d14bfa..95a2c299e673 100644 --- a/src/client/telemetry/constants.ts +++ b/src/client/telemetry/constants.ts @@ -116,9 +116,6 @@ export enum EventName { JEDI_LANGUAGE_SERVER_READY = 'JEDI_LANGUAGE_SERVER.READY', JEDI_LANGUAGE_SERVER_REQUEST = 'JEDI_LANGUAGE_SERVER.REQUEST', - JUPYTER_NOT_INSTALLED_NOTIFICATION_DISPLAYED = 'JUPYTER_NOT_INSTALLED_NOTIFICATION_DISPLAYED', - JUPYTER_NOT_INSTALLED_NOTIFICATION_ACTION = 'JUPYTER_NOT_INSTALLED_NOTIFICATION_ACTION', - TENSORBOARD_SESSION_LAUNCH = 'TENSORBOARD.SESSION_LAUNCH', TENSORBOARD_SESSION_DURATION = 'TENSORBOARD.SESSION_DURATION', TENSORBOARD_SESSION_DAEMON_STARTUP_DURATION = 'TENSORBOARD.SESSION_DAEMON_STARTUP_DURATION', diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index bc5940ec03cd..b5812ec09798 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -9,7 +9,6 @@ import { DiagnosticCodes } from '../application/diagnostics/constants'; import { IWorkspaceService } from '../common/application/types'; import { AppinsightsKey, isTestExecution, isUnitTestExecution, PVSC_EXTENSION_ID } from '../common/constants'; import { traceError, traceInfo } from '../common/logger'; -import { Telemetry } from '../common/startPage/constants'; import type { TerminalShellType } from '../common/terminal/types'; import { StopWatch } from '../common/utils/stopWatch'; import { isPromise } from '../common/utils/async'; @@ -26,7 +25,6 @@ import { } from '../tensorBoard/constants'; import { EventName, PlatformErrors } from './constants'; import type { LinterTrigger, TestTool } from './types'; -import { JupyterNotInstalledOrigin } from '../jupyter/types'; /** * Checks whether telemetry is supported. @@ -1635,58 +1633,6 @@ export interface IEventNamePropertyMapping { terminal: TerminalShellType; }; - /** - * Telemetry event sent when the notification about the Jupyter extension not being installed is displayed. - * Since this notification will only be displayed after an action that requires the Jupyter extension, - * the telemetry event will include the action the user took, under the `entrypoint` property. - */ - [EventName.JUPYTER_NOT_INSTALLED_NOTIFICATION_DISPLAYED]: { - /** - * Action that the user took to trigger the notification. - */ - entrypoint: JupyterNotInstalledOrigin; - }; - - /** - * Telemetry event sent when the notification about the Jupyter extension not being installed is closed. - */ - [EventName.JUPYTER_NOT_INSTALLED_NOTIFICATION_ACTION]: { - /** - * Action selected by the user in response to the notification: - * close the notification using the close button, or "Do not show again". - * - * @type {('Do not show again' | undefined)} - */ - selection: 'Do not show again' | undefined; - }; - - [Telemetry.WebviewStyleUpdate]: never | undefined; - [Telemetry.WebviewMonacoStyleUpdate]: never | undefined; - [Telemetry.WebviewStartup]: { type: string }; - [Telemetry.EnableInteractiveShiftEnter]: never | undefined; - [Telemetry.DisableInteractiveShiftEnter]: never | undefined; - [Telemetry.ShiftEnterBannerShown]: never | undefined; - - // Start Page Events - [Telemetry.StartPageViewed]: never | undefined; - [Telemetry.StartPageOpenedFromCommandPalette]: never | undefined; - [Telemetry.StartPageOpenedFromNewInstall]: never | undefined; - [Telemetry.StartPageOpenedFromNewUpdate]: never | undefined; - [Telemetry.StartPageWebViewError]: never | undefined; - [Telemetry.StartPageTime]: never | undefined; - [Telemetry.StartPageClickedDontShowAgain]: never | undefined; - [Telemetry.StartPageClosedWithoutAction]: never | undefined; - [Telemetry.StartPageUsedAnActionOnFirstTime]: never | undefined; - [Telemetry.StartPageOpenBlankNotebook]: never | undefined; - [Telemetry.StartPageOpenBlankPythonFile]: never | undefined; - [Telemetry.StartPageOpenInteractiveWindow]: never | undefined; - [Telemetry.StartPageOpenCommandPalette]: never | undefined; - [Telemetry.StartPageOpenCommandPaletteWithOpenNBSelected]: never | undefined; - [Telemetry.StartPageOpenSampleNotebook]: never | undefined; - [Telemetry.StartPageOpenFileBrowser]: never | undefined; - [Telemetry.StartPageOpenFolder]: never | undefined; - [Telemetry.StartPageOpenWorkspace]: never | undefined; - // TensorBoard integration events /** * Telemetry event sent after the user has clicked on an option in the prompt we display diff --git a/src/startPage-ui/common/index.css b/src/startPage-ui/common/index.css deleted file mode 100644 index 22f8f1897100..000000000000 --- a/src/startPage-ui/common/index.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - margin: 0; - padding: 0; - font-family: sans-serif; -} diff --git a/src/startPage-ui/common/main.ts b/src/startPage-ui/common/main.ts deleted file mode 100644 index c709d726672b..000000000000 --- a/src/startPage-ui/common/main.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -declare let __webpack_public_path__: string; - -if ((window as any).__PVSC_Public_Path) { - // This variable tells Webpack to this as the root path used to request webpack bundles. - - __webpack_public_path__ = (window as any).__PVSC_Public_Path; -} diff --git a/src/startPage-ui/react-common/image.tsx b/src/startPage-ui/react-common/image.tsx deleted file mode 100644 index afeabf6854f6..000000000000 --- a/src/startPage-ui/react-common/image.tsx +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import * as React from 'react'; - -import InlineSVG from 'svg-inline-react'; - -// This react component loads our svg files inline so that we can load them in vscode as it no longer -// supports loading svgs from disk. Please put new images in this list as appropriate. -export enum ImageName { - Notebook, - Interactive, - Python, - PythonColor, - OpenFolder, -} - -// All of the images must be 'require' so that webpack doesn't rewrite the import as requiring a .default. - -const images: { [key: string]: { light: string; dark: string } } = { - Notebook: { - light: require('./images/StartPage/Notebook.svg'), - dark: require('./images/StartPage/Notebook-inverse.svg'), - }, - Interactive: { - light: require('./images/StartPage/Interactive.svg'), - dark: require('./images/StartPage/Interactive-inverse.svg'), - }, - Python: { - light: require('./images/StartPage/Python.svg'), - dark: require('./images/StartPage/Python-inverse.svg'), - }, - PythonColor: { - light: require('./images/StartPage/Python-color.svg'), - dark: require('./images/StartPage/Python-color.svg'), - }, - OpenFolder: { - light: require('./images/StartPage/OpenFolder.svg'), - dark: require('./images/StartPage/OpenFolder-inverse.svg'), - }, -}; - -interface IImageProps { - baseTheme: string; - image: ImageName; - class: string; - title?: string; -} - -export class Image extends React.Component { - constructor(props: IImageProps) { - super(props); - } - - public render() { - const key = ImageName[this.props.image].toString(); - const image = images.hasOwnProperty(key) ? images[key] : images.Cancel; // Default is cancel. - const source = this.props.baseTheme.includes('dark') ? image.dark : image.light; - return ; - } -} diff --git a/src/startPage-ui/react-common/images/StartPage/Interactive-inverse.svg b/src/startPage-ui/react-common/images/StartPage/Interactive-inverse.svg deleted file mode 100644 index 87819244977e..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Interactive-inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Interactive.svg b/src/startPage-ui/react-common/images/StartPage/Interactive.svg deleted file mode 100644 index 6731d50fee39..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Interactive.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Notebook-inverse.svg b/src/startPage-ui/react-common/images/StartPage/Notebook-inverse.svg deleted file mode 100644 index 12b217d48fb8..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Notebook-inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Notebook.svg b/src/startPage-ui/react-common/images/StartPage/Notebook.svg deleted file mode 100644 index 5e058afb30eb..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Notebook.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/OpenFolder-inverse.svg b/src/startPage-ui/react-common/images/StartPage/OpenFolder-inverse.svg deleted file mode 100644 index e3d0f3e933e7..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/OpenFolder-inverse.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/OpenFolder.svg b/src/startPage-ui/react-common/images/StartPage/OpenFolder.svg deleted file mode 100644 index 309858c9f469..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/OpenFolder.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Python-color.svg b/src/startPage-ui/react-common/images/StartPage/Python-color.svg deleted file mode 100644 index e9b909eab46b..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Python-color.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Python-inverse.svg b/src/startPage-ui/react-common/images/StartPage/Python-inverse.svg deleted file mode 100644 index 73708a57db29..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Python-inverse.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/startPage-ui/react-common/images/StartPage/Python.svg b/src/startPage-ui/react-common/images/StartPage/Python.svg deleted file mode 100644 index 9a4d621e91c0..000000000000 --- a/src/startPage-ui/react-common/images/StartPage/Python.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/startPage-ui/react-common/locReactSide.ts b/src/startPage-ui/react-common/locReactSide.ts deleted file mode 100644 index dec1f5fa6946..000000000000 --- a/src/startPage-ui/react-common/locReactSide.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; -// The react code can't use the localize.ts module because it reads from -// disk. This isn't allowed inside a browser, so we pass the collection -// through the javascript. -let loadedCollection: Record | undefined; - -export function getLocString(key: string, defValue: string): string { - if (loadedCollection && loadedCollection.hasOwnProperty(key)) { - return loadedCollection[key]; - } - - return defValue; -} - -export function storeLocStrings(collection: Record) { - loadedCollection = collection; -} diff --git a/src/startPage-ui/react-common/logger.ts b/src/startPage-ui/react-common/logger.ts deleted file mode 100644 index 9d0fc55b5758..000000000000 --- a/src/startPage-ui/react-common/logger.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; -import { isTestExecution } from '../../client/common/constants'; - -const enableLogger = !isTestExecution() || process.env.VSC_PYTHON_FORCE_LOGGING || process.env.VSC_PYTHON_LOG_FILE; - -// Might want to post this back to the other side too. This was -export function logMessage(message: string) { - // put here to prevent having to disable the console log warning - if (enableLogger) { - console.log(message); - } -} diff --git a/src/startPage-ui/react-common/postOffice.ts b/src/startPage-ui/react-common/postOffice.ts deleted file mode 100644 index 6c3e6e4943c1..000000000000 --- a/src/startPage-ui/react-common/postOffice.ts +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -import { Observable } from 'rxjs/Observable'; -import { Subject } from 'rxjs/Subject'; -import { WebviewMessage } from '../../client/common/application/types'; -import { IDisposable } from '../../client/common/types'; -import { logMessage } from './logger'; - -export interface IVsCodeApi { - postMessage(msg: any): void; - - setState(state: any): void; - - getState(): any; -} - -export interface IMessageHandler { - handleMessage(type: string, payload?: any): boolean; - dispose?(): void; -} - -// This special function talks to vscode from a web panel -export declare function acquireVsCodeApi(): IVsCodeApi; - -export type PostOfficeMessage = { type: string; payload?: any }; - -export class PostOffice implements IDisposable { - private registered: boolean = false; - private vscodeApi: IVsCodeApi | undefined; - private handlers: IMessageHandler[] = []; - private baseHandler = this.handleMessages.bind(this); - private readonly subject = new Subject(); - private readonly observable: Observable; - constructor() { - this.observable = this.subject.asObservable(); - } - public asObservable(): Observable { - return this.observable; - } - public dispose() { - if (this.registered) { - this.registered = false; - window.removeEventListener('message', this.baseHandler); - } - } - - public sendMessage(type: T, payload?: M[T]) { - return this.sendUnsafeMessage(type.toString(), payload); - } - - public sendUnsafeMessage(type: string, payload?: any) { - const api = this.acquireApi(); - if (api) { - api.postMessage({ type: type, payload }); - } else { - logMessage(`No vscode API to post message ${type}`); - } - } - - public addHandler(handler: IMessageHandler) { - // Acquire here too so that the message handlers are setup during tests. - this.acquireApi(); - this.handlers.push(handler); - } - - public removeHandler(handler: IMessageHandler) { - this.handlers = this.handlers.filter((f) => f !== handler); - } - - private acquireApi(): IVsCodeApi | undefined { - // Only do this once as it crashes if we ask more than once - - if (!this.vscodeApi && typeof acquireVsCodeApi !== 'undefined') { - this.vscodeApi = acquireVsCodeApi(); // NOSONAR - } - if (!this.registered) { - this.registered = true; - window.addEventListener('message', this.baseHandler); - - try { - // For testing, we might use a browser to load the stuff. - // In such instances the `acquireVSCodeApi` will return the event handler to get messages from extension. - // See ./src/startPage-ui/startPage/index.html - - const api = (this.vscodeApi as any) as { handleMessage?: Function }; - if (api && api.handleMessage) { - api.handleMessage(this.handleMessages.bind(this)); - } - } catch { - // Ignore. - } - } - - return this.vscodeApi; - } - - private async handleMessages(ev: MessageEvent) { - if (this.handlers) { - const msg = ev.data as WebviewMessage; - if (msg) { - this.subject.next({ type: msg.type, payload: msg.payload }); - this.handlers.forEach((h: IMessageHandler | null) => { - if (h) { - h.handleMessage(msg.type, msg.payload); - } - }); - } - } - } -} diff --git a/src/startPage-ui/react-common/themeDetector.ts b/src/startPage-ui/react-common/themeDetector.ts deleted file mode 100644 index 35df18efaadc..000000000000 --- a/src/startPage-ui/react-common/themeDetector.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -// From here: -// https://stackoverflow.com/questions/37257911/detect-light-dark-theme-programatically-in-visual-studio-code -// Detect vscode-light, vscode-dark, and vscode-high-contrast class name on the body element. -export function detectBaseTheme(): 'vscode-light' | 'vscode-dark' | 'vscode-high-contrast' { - const { body } = document; - if (body) { - switch (body.className) { - case 'vscode-light': - return 'vscode-light'; - case 'vscode-dark': - return 'vscode-dark'; - case 'vscode-high-contrast': - return 'vscode-high-contrast'; - default: - return 'vscode-light'; - } - } - - return 'vscode-light'; -} diff --git a/src/startPage-ui/startPage/index.html b/src/startPage-ui/startPage/index.html deleted file mode 100644 index b405e61a8e80..000000000000 --- a/src/startPage-ui/startPage/index.html +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - Python Extension Plot Viewer - - - - -
- - - diff --git a/src/startPage-ui/startPage/index.tsx b/src/startPage-ui/startPage/index.tsx deleted file mode 100644 index e26d8a6821f3..000000000000 --- a/src/startPage-ui/startPage/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -// This must be on top, do not change. Required by webpack. -import '../common/main'; -// This must be on top, do not change. Required by webpack. - -import '../common/index.css'; - -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; - -import { IVsCodeApi } from '../react-common/postOffice'; -import { detectBaseTheme } from '../react-common/themeDetector'; -import { StartPage } from './startPage'; - -// This special function talks to vscode from a web panel -export declare function acquireVsCodeApi(): IVsCodeApi; - -const baseTheme = detectBaseTheme(); - -const testMode = (window as any).inTestMode; - -const skipDefault = testMode ? false : typeof acquireVsCodeApi !== 'undefined'; - -ReactDOM.render( - , - document.getElementById('root') as HTMLElement, -); diff --git a/src/startPage-ui/startPage/startPage.css b/src/startPage-ui/startPage/startPage.css deleted file mode 100644 index 035610dcebf8..000000000000 --- a/src/startPage-ui/startPage/startPage.css +++ /dev/null @@ -1,93 +0,0 @@ -.main-page { - margin: 50px; - font-family: var(--font-family); - min-width: 700px; -} - -.title-icon { - display: inline-block; - vertical-align: top; - width: 40px; - margin-right: 10px; -} - -.icon { - display: inline-block; - width: 45px; - padding: 20px 25px 20px 25px; - margin-right: 30px; - background-color: var(--vscode-titleBar-activeBackground); -} - -.icon:hover, -.text:hover { - background-color: var(--vscode-editorIndentGuide-activeBackground); - cursor: pointer; -} - -.title { - display: inline-block; - vertical-align: top; - font-size: xx-large; -} - -.title-row { - display: block; - height: 80px; -} - -.text { - font-weight: 100; - font-size: x-large; - width: fit-content; -} - -.block { - display: inline-block; - vertical-align: top; -} - -.row { - display: block; - min-height: 120px; - white-space: nowrap; -} - -.releaseNotesRow { - display: block; - min-height: 50px; - white-space: nowrap; -} - -.link { - display: inline; - color: var(--vscode-debugIcon-continueForeground); - text-decoration: none; -} - -.link:hover { - cursor: pointer; - color: var(--vscode-button-hoverBackground); -} - -.italics { - display: inline; - font-style: italic; -} - -.checkbox { - margin: 1em 1em 1em 0em; -} - -.paragraph { - display: block; - margin-block-start: 5px; - margin-block-end: 5px; - margin-inline-start: 0px; - margin-inline-end: 0px; -} - -.list { - line-height: 1.5; - white-space: initial; -} diff --git a/src/startPage-ui/startPage/startPage.tsx b/src/startPage-ui/startPage/startPage.tsx deleted file mode 100644 index 54a08d7fd51a..000000000000 --- a/src/startPage-ui/startPage/startPage.tsx +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -/* eslint-disable react/sort-comp */ - -import * as React from 'react'; -import '../../client/common/extensions'; -import { SharedMessages } from '../../client/common/startPage/messages'; -import { ISettingPackage, IStartPageMapping, StartPageMessages } from '../../client/common/startPage/types'; -import { Image, ImageName } from '../react-common/image'; -import { getLocString, storeLocStrings } from '../react-common/locReactSide'; -import { IMessageHandler, PostOffice } from '../react-common/postOffice'; -import './startPage.css'; - -export interface IStartPageProps { - skipDefault?: boolean; - baseTheme: string; - testMode?: boolean; -} - -type StartPageWindowType = typeof window & { - openBlankNotebook(): void; - createPythonFile(): void; - openFileBrowser(): void; - openFolder(): void; - openWorkspace(): void; - openCommandPalette(): void; - openCommandPaletteWithSelection(): void; - openSampleNotebook(): void; -}; - -// Front end of the Python extension start page. -// In general it consists of its render method and methods that send and receive messages. -export class StartPage extends React.Component implements IMessageHandler { - private releaseNotes: ISettingPackage = { - showAgainSetting: false, - }; - - private postOffice: PostOffice = new PostOffice(); - - public componentWillMount(): void { - // Add ourselves as a handler for the post office - this.postOffice.addHandler(this); - - // Tell the start page code we have started. - this.postOffice.sendMessage(StartPageMessages.Started); - - // Bind some functions to the window, as we need them to be accessible with clean HTML to use translations - (window as StartPageWindowType).openBlankNotebook = this.openBlankNotebook.bind(this); - (window as StartPageWindowType).createPythonFile = this.createPythonFile.bind(this); - (window as StartPageWindowType).openFileBrowser = this.openFileBrowser.bind(this); - (window as StartPageWindowType).openFolder = this.openFolder.bind(this); - (window as StartPageWindowType).openWorkspace = this.openWorkspace.bind(this); - (window as StartPageWindowType).openCommandPalette = this.openCommandPalette.bind(this); - (window as StartPageWindowType).openCommandPaletteWithSelection = this.openCommandPaletteWithSelection.bind( - this, - ); - (window as StartPageWindowType).openSampleNotebook = this.openSampleNotebook.bind(this); - } - - public componentDidMount(): void { - this.postOffice.sendMessage(StartPageMessages.RequestShowAgainSetting); - } - - public render(): React.ReactNode { - const { baseTheme } = this.props; - - return ( -
-
-
- -
-
{getLocString('StartPage.pythonExtensionTitle', 'Python Extension')}
-
-
-
- -
-
-
- {getLocString('StartPage.createJupyterNotebook', 'Create a Jupyter Notebook')} -
- {this.renderNotebookDescription()} -
-
-
-
- -
-
-
- {getLocString('StartPage.createAPythonFile', 'Create a Python File')} -
- {this.renderPythonFileDescription()} -
-
-
-
- -
-
-
- {getLocString('StartPage.openFolder', 'Open a Folder or Workspace')} -
- {this.renderFolderDescription()} -
-
-
-
- -
-
-
- {getLocString( - 'StartPage.openInteractiveWindow', - 'Use the Interactive Window to develop Python Scripts', - )} -
- {this.renderInteractiveWindowDescription()} -
-
-
- {this.renderReleaseNotesLink()} - {this.renderTutorialAndDoc()} - {this.renderMailingList()} -
-
- -
-
-

{getLocString('StartPage.dontShowAgain', "Don't show this page again")}

-
-
- ); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types - public handleMessage = (msg: string, payload?: any): boolean => { - switch (msg) { - case StartPageMessages.SendSetting: - this.releaseNotes.showAgainSetting = payload.showAgainSetting; - this.setState({}); - break; - - case SharedMessages.LocInit: - { - // Initialize localization. - const locJSON = JSON.parse(payload); - storeLocStrings(locJSON); - } - break; - - default: - break; - } - - return false; - }; - - public openFileBrowser(): void { - this.postOffice.sendMessage(StartPageMessages.OpenFileBrowser); - } - - public openFolder = (): void => { - this.postOffice.sendMessage(StartPageMessages.OpenFolder); - }; - - public openWorkspace(): void { - this.postOffice.sendMessage(StartPageMessages.OpenWorkspace); - } - - // eslint-disable-next-line class-methods-use-this - private renderNotebookDescription(): JSX.Element { - return ( - " in the Command Palette (
Shift + Command + P
)
- Explore our to learn about notebook features', - ).format('openCommandPaletteWithSelection()', 'openSampleNotebook()'), - }} - /> - ); - } - - // eslint-disable-next-line class-methods-use-this - private renderPythonFileDescription(): JSX.Element { - return ( - with a .py extension', - ).format('createPythonFile()'), - }} - /> - ); - } - - // eslint-disable-next-line class-methods-use-this - private renderInteractiveWindowDescription(): JSX.Element { - return ( -
- Use "
Shift + Enter
" to run a cell, the output will be shown in the interactive window', - ), - }} - /> - ); - } - - // eslint-disable-next-line class-methods-use-this - private renderFolderDescription(): JSX.Element { - return ( -
- Open a ', - ).format('openFolder()', 'openWorkspace()'), - }} - /> - ); - } - - // eslint-disable-next-line class-methods-use-this - private renderReleaseNotesLink(): JSX.Element { - return ( -